[
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control\n#\nPods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\nCarthage/Checkouts\n\nCarthage/Build\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nosx_image: xcode8.3\n\nenv:\n  - >\n    xcode_project=Gaikan.xcodeproj\n    xcode_scheme=Gaikan\n    xcode_sdk=iphonesimulator\n    xcode_platform=\"platform=iOS Simulator,name=iPhone 6\"\n\nbefore_install:\n  - brew update\n  - brew upgrade carthage\n\ninstall: carthage update --platform iOS\n\nscript:\n  - >\n    set -o pipefail && xcodebuild\n    -project ${xcode_project}\n    -scheme ${xcode_scheme}\n    -sdk ${xcode_sdk}\n    -destination \"${xcode_platform}\" test | xcpretty -c\n\nbranches:\n  except:\n    - /^tags.+/\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG\n\n## 0.9.1\n\n### Added\n\n- Added shadow property.\n\n### Fixed\n\n- Border not correctly set when all sides were defined by [viteinfinite](https://github.com/viteinfinite) [#PR-16](https://github.com/akane/Gaikan/pull/16)\n\n# 0.9.0\n\n## Added\n\n- [Border] you can now set only one border side (top, right, bottom, left) if you want.\n\n## Changed\n\n## Fixed\n\n- [UIView] Fixed rendering which was triggered every time frames changed\n- [Background] Correctly render background when frames change\n\n# 0.8.0\n\n## Added\n\n- Swift 3 support!\nBy [mcaylus](https://github.com/mcaylus)\n[#PR-12](https://github.com/akane/Gaikan/pull/12)\n\n# 0.7.0\n\n## Added\n\n- Added height, minHeight, maxHeight\n- Added width, minWidth, maxWidth\n\n## Changed\n\n- Migrated to Swift 2.3\n\n# 0.6.0\n\n## Added\n\n- Added Carthage support.\nBy [siemensikkema](https://github.com/siemensikkema)\n[#PR-7](https://github.com/akane/Gaikan/pull/7)\n- [Style] Added `textAttributes` on `StyleRule` which converts a style into `NSAttributedString` style attributes.\n- [Style] Added `margin` attribute.\n- [Style] Added `textOverflow` attribute.\n\n## Changed\n\n## Fixed\n\n- [Property] Fixed `clip` attribute not setted correctly.\n\n# 0.5.0\n\n## Added\n\n## Changed\n\n- [Theme] Themes are now simple `AnyObject`. You just define (non static) attributes\non it and apply them on a `UIView` usting the new `styleClass` attribute.\n- [IB] To apply a style right from InterfaceBuilder, you now define `themeClassName`\nin addition to `styleName`.\n- [Style] Replaced `applyStyle` with `styleInline`.\nWhile the former was totally replacing the style, the newer appends style to `styleClass`.\n\n## Fixed\n\n# 0.4.0\n\n## Added\n\n- [Property] Added `CornerRadius`.\n- [Property] Added `Clip`.\n- [Property] Added `Opacity`.\n- [Property] Added `Transform`.\n\n## Changed\n\n## Fixed\n\n- [Background] Fixed renderer positions for `Gradient`.\n"
  },
  {
    "path": "Cartfile",
    "content": "github \"facebook/KVOController\"\n"
  },
  {
    "path": "Cartfile.private",
    "content": "github \"Quick/Nimble\"\ngithub \"Quick/Quick\"\n"
  },
  {
    "path": "Cartfile.resolved",
    "content": "github \"facebook/KVOController\" \"v1.1.0\"\ngithub \"Quick/Nimble\" \"v4.1.0\"\ngithub \"Quick/Quick\" \"v0.9.3\"\n"
  },
  {
    "path": "Doc/Properties.md",
    "content": "# Style properties\n\n## Background\n- __**since**__: 0.3\n- __**description**__: Sets a background to your view (color, gradient and or image)\n- __**applies**__: `UIView`\n- __**usage**__:\n\n  ```swift\n    style.background = UIColor.redColor()\n    style.background = Background(UIImage(named: \"bg\"), UIColor.orangeGradient())\n```\n\n## Border\n- __**since**__: 0.1\n- __**description**__: Sets view border color and width\n- __**applies**__: `UIView`\n- __**usage**__:\n\n  ```swift\n    // until 0.7\n    style.border = Border(width: 1, color: UIColor.blueColor())\n\n    // after 0.7 you can define one or all borders\n    style.border = Border(all: (width: 1, color: UIColor.blue))\n    style.border = Border(.left, style: (width: 1, color: UIColor.blue))\n    style.border = Border([.left, .right] : (width: 1, color: UIColor.blue))\n    ```\n\n## Clip\n- __**since**__: 0.4\n- __**description**__: enables/disables view overflow clipping\n- __**applies**__: `UIView`\n- __**default**__: false\n- __**usage**__:\n\n ```swift\n   style.clip = true\n   ```\n\n## Color\n\n- __**since**__: 0.1\n- __**description**__: Sets text color\n- __**applies**__: `UILabel`\n- __**usage**__:\n\n ```swift\n   style.color = UIColor.redColor()\n   ```\n\n## CornerRadius\n\n- __**since**__: 0.4\n- __**description**__: Sets view corner radius\n- __**applies**__: `UIView`\n- __**usage**__:\n\n ```swift\n   style.corners = Corners(radius: 4)\n   ```\n\n## Font\n\n- __**since**__: 0.1\n- __**description**__: Sets text font\n- __**applies**__: `UILabel`\n- __**usage**__:\n\n ```swift\n   style.font = UIFont.systemFontOfSize(15)\n   ```\n\n## Height\n\n- __**since**__: 0.7\n- __**description**__: Sets a view height using AutoLayout.\n- __**applies**__: `UIView`\n- __**usage**__:\n\n ```swift\n  style.height = 42\n  style.height = 50 ~ UILayoutPriorityDefaultHigh\n ```\n\n## Margin\n\n- __**since**__: 0.6\n- __**description**__: Sets a view internal margin/padding, i.e. `UIView.layoutMargins` or `UIButton.contentEdgeInsets`.\n- __**applies**__: `UIView`, `UIButton`\n- __**usage**__:\n\n ```swift\n   style.margin = UIEdgeInsetsMake(4, 4, 2, 2)\n   /// sets UIView.layoutMargins\n   /// or UIButton.contentEdgeInsets\n   ```\n\n## MaxHeight\n\n- __**since**__: 0.7\n- __**description**__: Sets a view maximum height using AutoLayout.\n- __**applies**__: `UIView`\n- __**usage**__:\n\n ```swift\n  style.maxHeight = 42\n  style.maxHeight = 50 ~ UILayoutPriorityDefaultHigh\n ```\n\n## MaxWidth\n\n- __**since**__: 0.7\n- __**description**__: Sets a view maximum width using AutoLayout.\n- __**applies**__: `UIView`\n- __**see**__: maxHeight\n\n## MinHeight\n\n- __**since**__: 0.7\n- __**description**__: Sets a view minimum height using AutoLayout.\n- __**applies**__: `UIView`\n- __**usage**__:\n\n ```swift\n  style.minHeight = 42\n  style.minHeight = 50 ~ UILayoutPriorityDefaultHigh\n ```\n\n## MinWidth\n\n- __**since**__: 0.7\n- __**description**__: Sets a view minimum width using AutoLayout.\n- __**applies**__: `UIView`\n- __**see**__: minHeight\n\n## Opacity\n\n- __**since**__: 0.4\n- __**description**__: Changes view alpha.\n- __**applies**__: `UIView`\n- __**range**__: 0 (tranparent) ... 100 (opaque)\n- __**usage**__:\n\n ```swift\n   style.opacity = 80\n   ```\n\n## Shadow\n\n- __**since**__: xxx\n- __**description**__: Applies shadow to view.\n- __**applies**__: `UIView`\n- __**usage**__:\n\n  ```swift\n    style.shadow = NSShadow(offset: CGSize(width: 0, height: 0), radius: 4, color: UIColor.red)\n  ```   \n\n## TextAlign\n\n## TextOverflow\n\n## TintColor\n\n## Transform\n\n## Visible\n\n- __**since**__: 0.1\n- __**description**__: Sets whether or not the view is visible by changing `hidden` property.\n- __**applies**__: `UIView`\n- __**default**__: true\n- __**usage**__:\n\n ```swift\n   style.visible = false\n   ```\n\n## Width\n\n- __**since**__: 0.7\n- __**description**__: Sets a view width using AutoLayout.\n- __**applies**__: `UIView`\n- __**see**__: height\n"
  },
  {
    "path": "Gaikan/Gaikan.h",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for Gaikan.\nFOUNDATION_EXPORT double GaikanVersionNumber;\n\n//! Project version string for Gaikan.\nFOUNDATION_EXPORT const unsigned char GaikanVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Gaikan/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Gaikan/Helpers/AssociatedObject.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 25/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/**\n    Code for AssociationObject using Swift types\n    From https://wezzard.com/2015/10/09/associated-object-and-swift-struct\n**/\ninternal final class AssociatedObject<T> : NSObject, NSCopying {\n    typealias AssociatedType = T\n    let value: AssociatedType\n\n    required init(_ value: AssociatedType) {\n        self.value = value\n    }\n\n    func copy(with zone: NSZone?) -> Any {\n        return AssociatedObject(self.value)\n    }\n}\n\nextension AssociatedObject where T:NSCopying {\n    func copyWithZone(_ zone: NSZone?) -> AnyObject {\n        return AssociatedObject(value.copy(with: zone) as! AssociatedType)\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/CGPoint+Helpers.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 05/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nextension CGPoint {\n    public static func topLeft() -> CGPoint {\n        return CGPoint(x: 0, y: 0)\n    }\n\n    public static func topRight() -> CGPoint {\n        return CGPoint(x: 1, y: 1)\n    }\n\n    public static func bottomLeft() -> CGPoint {\n        return CGPoint(x: 0, y: 1)\n    }\n\n    public static func bottomRight() -> CGPoint {\n        return CGPoint(x: 1, y: 1)\n    }\n\n    public static func top() -> CGPoint {\n        return CGPoint(x: 0.5, y: 0)\n    }\n\n    public static func bottom() -> CGPoint {\n        return CGPoint(x: 0.5, y: 1)\n    }\n}"
  },
  {
    "path": "Gaikan/Helpers/Dictionary+Helpers.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 24/06/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nextension Dictionary where Key : Any, Value : OptionalProtocol, Value.WrappedType : AnyObject {\n    typealias Wrapped = Value.WrappedType\n\n    func trimmed() -> [Key:Wrapped] {\n        var dict = [Key:Wrapped]()\n\n        for (key, value) in self {\n            if let value = value.value {\n                dict[key] = value\n            }\n        }\n\n        return dict\n    }\n}\n\nextension Dictionary {\n    @discardableResult\n    mutating func gaikan_merge(_ dictionary: Dictionary<Key, Value>) -> Dictionary<Key, Value> {\n        for (key, value) in dictionary {\n            self.updateValue(value, forKey: key)\n        }\n\n        return self\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/NSAttributedString+Style.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 20/06/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nextension NSAttributedString {\n    public convenience init(string str: String, style: StyleRule) {\n        self.init(string: str, attributes: style.textAttributes)\n    }\n}\n\nextension NSMutableAttributedString {\n    public func setStyle(_ style: StyleRule, range: NSRange) {\n        self.setAttributes(style.textAttributes, range: range)\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/NSLayoutAttribute+Helpers.swift",
    "content": "//\n//  NSLayoutAttribute+Helpers.swift\n//  Gaikan\n//\n//  Created by pjechris on 01/09/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nextension NSLayoutAttribute {\n    func identifier() -> String {\n        switch(self) {\n        case .lastBaseline:\n            return \"baseline\"\n        case .bottom:\n            return \"bottom\"\n        case .bottomMargin:\n            return \"bottomMargin\"\n        case .centerX:\n            return \"centerX\"\n        case .centerXWithinMargins:\n            return \"centerXWithinMargins\"\n        case .centerY:\n            return \"centerY\"\n        case .centerYWithinMargins:\n            return \"centerYWithinMargins\"\n        case .firstBaseline:\n            return \"firstBaseline\"\n        case .height:\n            return \"height\"\n        case .leading:\n            return \"leading\"\n        case .leadingMargin:\n            return \"leadingMargin\"\n        case .left:\n            return \"left\"\n        case .leftMargin:\n            return \"leftMargin\"\n        case .notAnAttribute:\n            return \"notAnAttribute\"\n        case .right:\n            return \"right\"\n        case .rightMargin:\n            return \"rightMargin\"\n        case .top:\n            return \"top\"\n        case .topMargin:\n            return \"topMargin\"\n        case .trailing:\n            return \"trailing\"\n        case .trailingMargin:\n            return \"trailingMargin\"\n        case .width:\n            return \"width\"\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/NSLayoutRelation+Helpers.swift",
    "content": "//\n//  NSLayoutRelation+Helpers.swift\n//  Gaikan\n//\n//  Created by pjechris on 01/09/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nextension NSLayoutRelation {\n    func identifier() -> String {\n        switch (self) {\n        case .equal:\n            return \"accurate\"\n        case .greaterThanOrEqual:\n            return \"min\"\n        case .lessThanOrEqual:\n            return \"max\"\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/NSShadow+Helpers.swift",
    "content": "//\n//  NSShadow+Helpers.swift\n//  Gaikan\n//\n//  Created by pjechris on 07/02/17.\n//  Copyright © 2017 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nextension NSShadow {\n    public convenience init(offset: CGSize, radius: CGFloat, color: UIColor?) {\n        self.init()\n\n        self.shadowOffset = offset\n        self.shadowBlurRadius = radius\n        self.shadowColor = color\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/Optional+Helpers.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 24/06/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nprotocol OptionalProtocol {\n    associatedtype WrappedType\n\n    var value: WrappedType? { get }\n}\n\nextension Optional: OptionalProtocol {\n\n    var value: Wrapped? {\n        return self\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/UIColor+Helpers.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 05/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nextension UIColor : BackgroundValue {\n    public func draw(in ctx: CGContext) {\n        ctx.setFillColor(self.cgColor)\n        ctx.fill(CGRect(origin: CGPoint.zero, size: CGSize(width: ctx.width, height: ctx.height)))\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/UIImage+Helpers.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 15/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nextension UIImage : BackgroundValue {\n    public func draw(in ctx: CGContext) {\n        self.draw(in: CGRect(origin: CGPoint.zero, size: CGSize(width: ctx.width, height: ctx.height)))\n    }\n}\n"
  },
  {
    "path": "Gaikan/Helpers/UIView+Helpers.swift",
    "content": "//\n//  UIView+Helpers.swift\n//  Gaikan\n//\n//  Created by pjechris on 10/09/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nextension UIView {\n    struct Keys {\n        static var Dimension = \"DimensionAttr\"\n    }\n\n    var dimensions: [NSLayoutConstraint] {\n        get {\n            guard let constraints = objc_getAssociatedObject(self, &Keys.Dimension) as? [NSLayoutConstraint] else {\n                self.dimensions = []\n                return self.dimensions\n            }\n\n            return constraints\n        }\n        set { objc_setAssociatedObject(self, &Keys.Dimension, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }\n    }\n}"
  },
  {
    "path": "Gaikan/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</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>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Gaikan/InterfaceBuilder/UIView+InterfaceBuilder.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 03/05/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nvar ViewStyleNameAttribute = \"ViewStyleNameAttribute\"\nvar ViewThemeClassAttr = \"ViewThemeClassAttr\"\n\n/**\n *  Dynamically retrieves a \"defined styleClass\" from a storyboard/xib.\n */\nextension UIView {\n    /// theme class which contains desired styleClass instance.\n    /// You need to provide both `styleName` and `themeClassName` so that style can be dynamically found\n    @IBInspectable var themeClassName: String? {\n        get { return objc_getAssociatedObject(self, &ViewThemeClassAttr) as? String }\n        set {\n            guard let newValue = newValue else {\n                return\n            }\n\n            let moduleName = Bundle.main.infoDictionary![\"CFBundleExecutable\"] as! String\n            let className = newValue.contains(\".\") ? newValue : moduleName + \".\" + newValue\n\n            objc_setAssociatedObject(self, &ViewThemeClassAttr, className, .OBJC_ASSOCIATION_COPY)\n            self.attemptLoadingStyle()\n        }\n    }\n\n    /// styleClass attribute name into its theme class.\n    /// You need to provide both `styleName` and `themeClassName` so that style can be dynamically found\n    @IBInspectable var styleName: String? {\n        get { return objc_getAssociatedObject(self, &ViewStyleNameAttribute) as? String }\n        set {\n            objc_setAssociatedObject(self, &ViewStyleNameAttribute, newValue, .OBJC_ASSOCIATION_COPY)\n            self.attemptLoadingStyle()\n        }\n    }\n\n    fileprivate func attemptLoadingStyle() {\n        guard let styleName = self.styleName, let themeClassName = self.themeClassName else {\n            return\n        }\n\n        let themeClass = NSClassFromString(themeClassName) as! Theme.Type\n        let dynamicTheme = themeClass.init()\n        let dynamicMirror = Mirror(reflecting: dynamicTheme)\n\n        for (label, value) in dynamicMirror.children {\n            if label == styleName {\n                self.styleClass = value as? Style\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Property/Gradient.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 05/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic struct Gradient  {\n    public typealias GradientItem = (color: UIColor, position: Int)\n\n    let gradientValues: [(color: UIColor, position: Int)]\n    let to: CGPoint\n    let from: CGPoint\n\n    public init(from: CGPoint, to: CGPoint, _ gradients: (color: UIColor, position: Int)...) {\n        self.init(from: from, to: to, gradients)\n    }\n\n    public init(_ gradients: (color: UIColor, position: Int)...) {\n        self.init(from: CGPoint.top(), to: CGPoint.bottom(), gradients)\n    }\n\n    fileprivate init(from: CGPoint, to: CGPoint, _ gradients: [(color: UIColor, position: Int)]) {\n        self.from = from\n        self.to = to\n        self.gradientValues = gradients\n    }\n}\n\nextension Gradient : BackgroundValue {\n    public func draw(in ctx: CGContext) {\n        let layer = CAGradientLayer()\n\n        layer.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: ctx.width, height: ctx.height))\n\n        layer.endPoint = self.to\n        layer.startPoint = self.from\n        layer.colors = self.gradientValues.map { $0.color.cgColor }\n        layer.locations = self.gradientValues.map { NSNumber(value:($0.position/100)) }\n\n        layer.render(in: ctx)\n    }\n}\n"
  },
  {
    "path": "Gaikan/Property/Property.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/// Property that can be used to style a view\n/// Keep this file Alphabetic ordered\npublic enum Property {\n    case background\n    case border\n    case clip\n    case color\n    case cornerRadius\n    case font\n    case height\n    /// view layoutMargins\n    case margin\n    case maxHeight\n    case maxWidth\n    case minHeight\n    case minWidth\n    case opacity\n    case shadow\n    case textAlign\n    case textOverflow\n    case textShadow\n    case tintColor\n    case transform\n    case visible\n    case width\n}\n"
  },
  {
    "path": "Gaikan/Property/Value/Background.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 05/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/**\n Any class/struct conforming to BackgroundValue can be used to represent the `Background` property\n*/\npublic protocol BackgroundValue {\n    /// Renders the object into given context\n    func draw(in ctx: CGContext)\n}\n\n/**\n Allow to use one or more BackgroundValue objects at once as a unique background\n */\npublic struct Background : BackgroundValue {\n    internal var backgrounds: [BackgroundValue]\n\n    public init(_ backgrounds: BackgroundValue...) {\n        self.backgrounds = backgrounds\n    }\n\n    public func draw(in ctx: CGContext) {\n        for bg in self.backgrounds {\n            bg.draw(in: ctx)\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Property/Value/Border.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 05/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic typealias BorderStyle = (width: CGFloat, color: UIColor)\n\n/**\n Represents `Border` property\n */\n\npublic struct Border : Equatable {\n    var sides: [Side: BorderStyle]\n\n    public init(_ side: Side, style: BorderStyle) {\n        self.init(sides: [side], style: style)\n    }\n\n    public init(all style: BorderStyle) {\n        self.init(sides: [.top, .right, .bottom, .left], style: style)\n    }\n\n    public init(sides: [Side], style: BorderStyle) {\n        var allSides = [Side:BorderStyle]()\n\n        for side in sides {\n            allSides[side] = style\n        }\n\n        self.sides = allSides\n    }\n\n    public func stylize(_ side: Side, with style: BorderStyle) -> Border {\n        var newBorder = self\n\n        newBorder.sides[side] = style\n\n        return newBorder\n    }\n}\n\npublic func ==(lhs: Border, rhs: Border) -> Bool {\n    for (key, lvalue) in lhs.sides {\n        guard let rvalue = rhs.sides[key] else {\n            return false\n        }\n\n        guard lvalue.width == rvalue.width, lvalue.color == rvalue.color else {\n            return false\n        }\n    }\n\n    return true\n}\n"
  },
  {
    "path": "Gaikan/Property/Value/Constraint.swift",
    "content": "//\n//  Constraint.swift\n//  Gaikan\n//\n//  Created by pjechris on 29/08/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\n\npublic struct Constraint {\n    public let constant: Double\n    public var priority = UILayoutPriorityRequired\n\n    public init(constant: Double) {\n        self.constant = constant\n    }\n}\n\nextension Constraint : ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral {\n    public init(floatLiteral value: FloatLiteralType) {\n        self.init(constant: value)\n    }\n\n    public init(integerLiteral value: IntegerLiteralType) {\n        self.init(constant: Double(value))\n    }\n}\n\ninfix operator ~\n\npublic func ~ (lhs: inout Constraint, rhs: UILayoutPriority) -> Constraint {\n    lhs.priority = rhs\n\n    return lhs\n}\n"
  },
  {
    "path": "Gaikan/Property/Value/Corners.swift",
    "content": "//\n//  Corners.swift\n//  Gaikan\n//\n//  Created by Brandon on 27/01/2016.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\n/**\n Represent the `Corners` property\n */\npublic struct Corners {\n    public let radius: CGFloat\n    \n    public init(radius: CGFloat) {\n        self.radius = radius\n    }\n}"
  },
  {
    "path": "Gaikan/Property/Value/Side.swift",
    "content": "//\n//  Side.swift\n//  Gaikan\n//\n//  Created by pjechris on 04/12/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\npublic enum Side : String {\n    case top\n    case right\n    case bottom\n    case left\n\n    public static var all: Set<Side> {\n        return [.top, .right, .bottom, .left]\n    }\n}\n\nextension Side : Hashable {\n    public var hashValue: Int {\n        return self.rawValue.hashValue\n    }\n}\n\n//extension Side : Hashable {\n//    public var hashValue: Int {\n//        switch (self) {\n//        case .top(_):\n//            return \"top\".hashValue\n//        case .right(_):\n//            return \"right\".hashValue\n//        case .bottom(_):\n//            return \"bottom\".hashValue\n//        case .left(_):\n//            return \"left\".hashValue\n//        }\n//    }\n//}\n//\n//public func ==<T>(lhs: Side<T>, rhs: Side<T>) -> Bool {\n//    return lhs.hashValue == rhs.hashValue\n//}\n"
  },
  {
    "path": "Gaikan/Style/Stylable.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nvar ComputedStyleAttribute = \"ComputedStyleAttribute\"\n\n/**\n Applies a `Style` or a `StyleRule` on an object\n*/\npublic protocol Stylable : class {\n    /// `Style` class to apply. Calls `computeStyle` when changed\n    var styleClass: Style? { get set }\n    /// Style specific to the object. Has precedence over `styleClass`.\n    /// Works like `style` in HTML.\n    var styleInline: StyleRule? { get set }\n    /// Custom style state. If defined `computedStyle` will merge state style with \"default\" state style\n    var styleState: String? { get }\n\n    /// Re-applies computed style\n    func updateStyle()\n\n    static func keyPathsAffectingStyle() -> [String]\n}\n\nextension Stylable {\n\n    /// Result `StyleRule` from `styleClass` (including `styleState`) + `styleInline`.\n    /// When changed it calls `updateStyle` to apply it.\n    public internal(set) var computedStyle: StyleRule? {\n        get {\n            let value = objc_getAssociatedObject(self, &ComputedStyleAttribute) as? AssociatedObject<StyleRule>\n\n            return value != nil ? value!.value : nil\n        }\n        set {\n            objc_setAssociatedObject(self, &ComputedStyleAttribute, newValue.map { AssociatedObject($0) }, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            self.updateStyle()\n        }\n    }\n\n    /// Calculates style and store it into `computedStyle`\n    internal func computeStyle() {\n        guard let style = self.styleClass else {\n            self.computedStyle = self.styleInline\n\n            return\n        }\n\n        let states = StyleState.states(self)\n        var computedStyle = style.style\n\n        for state in states {\n            computedStyle = style.states[state].map { return $0.extends(computedStyle) } ?? computedStyle\n        }\n\n        if let styleInline = self.styleInline {\n            self.computedStyle = styleInline.extends(computedStyle)\n        }\n        else {\n            self.computedStyle = computedStyle\n        }\n    }\n}"
  },
  {
    "path": "Gaikan/Style/Style.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 11/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/**\n *  Defines a `StyleRule` on which you can apply supplemntary `StylePseudoState` states.\n */\npublic struct Style : ExpressibleByDictionaryLiteral {\n    internal fileprivate(set) var style: StyleRule\n    internal fileprivate(set) var states: [StyleState:StyleRule] = [:]\n\n    public init(dictionaryLiteral elements: (StyleRule.Key, StyleRule.Value)...) {\n        var attributes = Dictionary<StyleRule.Key, StyleRule.Value>()\n\n        for (attributeName, attributeValue) in elements {\n            attributes[attributeName] = attributeValue\n        }\n\n        self.init(style: StyleRule(attributes: attributes))\n    }\n\n    public init(_ styleBlock: (_ style: inout StyleRule) -> ()) {\n        self.init(style: StyleRule(styleBlock))\n    }\n\n    fileprivate init(style: StyleRule) {\n        self.style = style\n    }\n\n    public func state(_ state: StylePseudoState, styleRule styleBlock: (_ style: inout StyleRule) -> ()) -> Style {\n        return self.state(.pseudoState(state), styleRule: styleBlock)\n    }\n\n    internal func state(_ state: StyleState, styleRule styleBlock: (_ style: inout StyleRule) -> ()) -> Style {\n        var style = self\n\n        style.states[state] = StyleRule(styleBlock)\n\n        return style\n    }\n\n    public func state(_ state: String, styleRule styleBlock: (_ style: inout StyleRule) -> ()) -> Style {\n        return self.state(.custom(state), styleRule: styleBlock)\n    }\n\n    public func state(_ state: StylePseudoState, _ attributes: [StyleRule.Key:StyleRule.Value]) -> Style {\n        return self.state(.pseudoState(state), attributes: attributes)\n    }\n\n    public func state(_ state: String, _ attributes: [StyleRule.Key:StyleRule.Value]) -> Style {\n        return self.state(.custom(state), attributes: attributes)\n    }\n\n    internal func state(_ state: StyleState, attributes: [StyleRule.Key:StyleRule.Value]) -> Style {\n        var style = self\n\n        style.states[state] = StyleRule(attributes: attributes)\n\n        return style\n    }\n\n    internal subscript(state: StylePseudoState) -> StyleRule? {\n        get { return self.states[.pseudoState(state)] }\n    }\n\n    internal subscript(state: String) -> StyleRule? {\n        get { return self.states[.custom(state)] }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Style/StylePseudoState.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 14/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/**\n Used to define a special state of an element.\n As element can be in multiple states at the same time (like disabled and on), pseudo classes are defined as a UInt enum.\n The bigger the value, the higher priority it has\n**/\npublic enum StylePseudoState : UInt {\n    case highlighted\n    case disabled\n    case selected\n\n    case on\n}\n"
  },
  {
    "path": "Gaikan/Style/StyleRule+DirectAccess.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 17/06/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic extension StyleRule {\n    public var background: BackgroundValue? {\n        get { return self[.background].map { return $0 as! BackgroundValue } }\n        set { self.attributes[.background] = newValue }\n    }\n\n    public var border: Border? {\n        get { return self[.border].map { return $0 as! Border } }\n        set { self.attributes[.border] = newValue }\n    }\n\n    public var clip: Bool {\n        get { return self[.clip].map { return $0 as! Bool } ?? false }\n        set { self.attributes[.clip] = newValue }\n    }\n\n    public var corners: Corners? {\n        get { return self[.cornerRadius].map { return $0 as! Corners } }\n        set { self.attributes[.cornerRadius] = newValue }\n    }\n\n    public var color: UIColor? {\n        get { return self[.color].map { return $0 as! UIColor } }\n        set { self.attributes[.color] = newValue }\n    }\n\n    public var font: UIFont? {\n        get { return self[.font].map { return $0 as! UIFont } }\n        set { self.attributes[.font] = newValue }\n    }\n\n    public var height: Constraint? {\n        get { return self[.height].map { $0 as! Constraint } }\n        set { self.attributes[.height] = newValue }\n    }\n\n    public var margin: UIEdgeInsets? {\n        get { return self[.margin].map { return $0 as! UIEdgeInsets } }\n        set { self.attributes[.margin] = newValue }\n    }\n\n    public var maxHeight: Constraint? {\n        get { return self[.maxHeight].map { $0 as! Constraint } }\n        set { self.attributes[.maxHeight] = newValue }\n    }\n\n    public var maxWidth: Constraint? {\n        get { return self[.maxWidth].map { $0 as! Constraint } }\n        set { self.attributes[.maxWidth] = newValue }\n    }\n\n    public var minHeight: Constraint? {\n        get { return self[.minHeight].map { $0 as! Constraint } }\n        set { self.attributes[.minHeight] = newValue }\n    }\n\n    public var minWidth: Constraint? {\n        get { return self[.minWidth].map { $0 as! Constraint } }\n        set { self.attributes[.minWidth] = newValue }\n    }\n\n    /// value must be between 0 and 100\n    /// default is 100\n    public var opacity: Double {\n        get { return self[.opacity].map { return $0 as! Double } ?? 100 }\n        set { self.attributes[.opacity] = newValue }\n    }\n\n    public var shadow: NSShadow? {\n        get { return self[.shadow].map { return $0 as! NSShadow } }\n        set { self.attributes[.shadow] = newValue }\n    }\n\n    public var textAlign: NSTextAlignment? {\n        get { return self[.textAlign].map { return $0 as! NSTextAlignment } }\n        set { self.attributes[.textAlign] = newValue }\n    }\n\n    public var textOverflow: NSLineBreakMode? {\n        get { return self[.textOverflow].map { return $0 as! NSLineBreakMode } }\n        set { self.attributes[.textOverflow] = newValue }\n    }\n\n    public var tintColor: UIColor? {\n        get { return self[.tintColor].map { return $0 as! UIColor } }\n        set { self.attributes[.tintColor] = newValue }\n    }\n\n    public var transform: CATransform3D {\n        get { return self[.transform].map { return $0 as! CATransform3D } ?? CATransform3DIdentity }\n        set { self.attributes[.transform] = newValue }\n    }\n\n    public var visible: Bool? {\n        get { return self[.visible].map { return $0 as! Bool } }\n        set { self.attributes[.visible] = newValue }\n    }\n\n    public var width: Constraint? {\n        get { return self[.width].map { $0 as! Constraint } }\n        set { self.attributes[.width] = newValue }\n    }\n\n    public var textShadow: NSShadow? {\n        get { return self[.textShadow].map { return $0 as! NSShadow } }\n        set { self.attributes[.textShadow] = newValue }\n    }\n}\n"
  },
  {
    "path": "Gaikan/Style/StyleRule.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\n/**\n *  Defines design properties with their values.\n */\npublic struct StyleRule : ExpressibleByDictionaryLiteral {\n    public typealias Key = Property\n    public typealias Value = Any?\n\n    var attributes : Dictionary<Key, Value>\n\n    public init(attributes: [Key:Value]) {\n        self.attributes = attributes\n    }\n\n    public init(dictionaryLiteral elements: (Key, Value)...) {\n        var attributes = Dictionary<Key, Value>()\n\n        for (attributeName, attributeValue) in elements {\n            attributes[attributeName] = attributeValue\n        }\n\n        self.attributes = attributes\n    }\n\n    public init(_ styleBlock: (_ style: inout StyleRule) -> ()) {\n        self.init(attributes: [:])\n\n        styleBlock(&self)\n    }\n\n    public func extends(_ styles: StyleRule?...) -> StyleRule {\n        var composedAttributes: [Key:Value] = [:]\n\n        for style in styles {\n            if let styleAttributes = style?.attributes  {\n                composedAttributes.gaikan_merge(styleAttributes)\n            }\n        }\n\n        return StyleRule(attributes: composedAttributes.gaikan_merge(self.attributes))\n    }\n\n    subscript(keyname: Property) -> Value {\n        get { return self.attributes[keyname] != nil ? self.attributes[keyname]! : nil }\n    }\n}\n\nextension StyleRule {\n    public var textAttributes: [String:AnyObject] {\n        let attributes: [String:AnyObject?] = [\n            NSForegroundColorAttributeName: self.color,\n            NSFontAttributeName: self.font,\n            NSShadowAttributeName: self.textShadow\n        ]\n\n        return attributes.trimmed()\n    }\n}\n"
  },
  {
    "path": "Gaikan/Style/StyleState.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 10/12/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nenum StyleState {\n    case pseudoState(StylePseudoState)\n    case custom(String)\n}\n\nextension StyleState {\n    static func states<T:Stylable>(_ element: T) -> [StyleState] {\n        var states: [StyleState] = []\n\n        if let control = element as? UIControl {\n            if (control.isHighlighted) {\n                states.append(.pseudoState(.highlighted))\n            }\n\n            if (!control.isEnabled) {\n                states.append(.pseudoState(.disabled))\n            }\n\n            if (control.isSelected) {\n                states.append(.pseudoState(.selected))\n            }\n\n            if let switcher = control as? UISwitch {\n                if (switcher.isOn) {\n                    states.append(.pseudoState(.on))\n                }\n            }\n        }\n\n        if let customState = element.styleState {\n            states.append(.custom(customState))\n        }\n        \n        return states\n    }\n}\n\nextension StyleState : Hashable {\n    var hashValue: Int {\n        switch (self) {\n        case .pseudoState(let state):\n            return state.hashValue\n        case .custom(let state):\n            return state.hashValue\n        }\n    }\n}\n\nfunc ==(lhs: StyleState, rhs: StyleState) -> Bool {\n    switch (lhs, rhs) {\n    case (.pseudoState(let state1), .pseudoState(let state2)):\n        return state1 == state2\n    case (.custom(let state1), .custom(let state2)):\n        return state1 == state2\n    default:\n        return false\n    }\n}\n"
  },
  {
    "path": "Gaikan/Theme/Theme.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 14/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\nopen class Theme : AnyObject {\n    required public init() {\n\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Extension/UIControl.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 24/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic extension UIControl {\n    public override func updateStyle() {\n        super.updateStyle()\n\n        guard let computedStyle = self.computedStyle else {\n            return\n        }\n\n        ViewStyleRenderer.render(self, styleRule: computedStyle)\n    }\n\n    public override class func keyPathsAffectingStyle() -> [String] {\n        return [\"enabled\", \"selected\", \"highlighted\"]\n    }\n}"
  },
  {
    "path": "Gaikan/UIKit/Extension/UILabel.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 26/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic extension UILabel {\n    public override func updateStyle() {\n        super.updateStyle()\n\n        guard let computedStyle = self.computedStyle else {\n            return\n        }\n\n        ViewStyleRenderer.render(self, styleRule: computedStyle)\n    }\n}"
  },
  {
    "path": "Gaikan/UIKit/Extension/UINavigationBar.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 26/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic extension UINavigationBar {\n    \n    fileprivate struct AssociatedKeys {\n        static var VirtualView = \"gaikan_virtualView\"\n    }\n    \n    public override func updateStyle() {\n        super.updateStyle()\n\n        if let computedStyle = self.computedStyle {\n            ViewStyleRenderer.render(self, styleRule: computedStyle)\n        }\n\n        if let titleStyle = self.titleStyle.computedStyle {\n            ViewStyleRenderer.render(self, titleStyle: titleStyle)\n        }\n    }\n    \n    public var titleStyle: VirtualView<UINavigationBar> {\n        guard let title = objc_getAssociatedObject(self, &AssociatedKeys.VirtualView) as? VirtualView<UINavigationBar> else {\n            let title = VirtualView(targetView: self)\n            objc_setAssociatedObject(self, &AssociatedKeys.VirtualView, title as VirtualView<UINavigationBar>?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            return title\n        }\n        return title\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Extension/UISwitch.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 24/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\npublic extension UIButton {\n    public override func updateStyle() {\n        super.updateStyle()\n\n        guard let computedStyle = self.computedStyle else {\n            return\n        }\n\n        ViewStyleRenderer.render(self, styleRule: computedStyle)\n    }\n}"
  },
  {
    "path": "Gaikan/UIKit/Extension/UIView.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport KVOController\n\nvar ViewStyleStateAttribute = \"ViewStyleStateAttribute\"\nvar ViewStyleClassAttr = \"ViewStyleClassAttr\"\nvar ViewStyleInlineAttr = \"ViewStyleInlineAttr\"\n\nextension UIView : Stylable {\n    public var styleClass: Style? {\n        get {\n            let value = objc_getAssociatedObject(self, &ViewStyleClassAttr) as? AssociatedObject<Style?>\n\n            return value.map { $0.value } ?? nil\n        }\n        set {\n            if (newValue == nil) {\n                self.unregisterStyleKeyPaths()\n            }\n\n            objc_setAssociatedObject(self, &ViewStyleClassAttr, AssociatedObject(newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n\n            self.addStyleLayerIfNeeded()\n            self.computeStyle()\n\n            if (newValue != nil) {\n                self.registerStyleKeyPaths()\n            }\n        }\n    }\n\n    public var styleInline: StyleRule? {\n        get {\n            let value = objc_getAssociatedObject(self, &ViewStyleInlineAttr) as? AssociatedObject<StyleRule>\n\n            return value.map { $0.value }\n        }\n        set {\n            objc_setAssociatedObject(self, &ViewStyleInlineAttr, newValue.map { AssociatedObject($0) }, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n\n            self.addStyleLayerIfNeeded()\n            self.computeStyle()\n        }\n    }\n\n    public var styleState: String? {\n        get { return objc_getAssociatedObject(self, &ViewStyleStateAttribute) as? String }\n        set {\n            objc_setAssociatedObject(self, &ViewStyleStateAttribute, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            self.computeStyle()\n        }\n    }\n\n    public func updateStyle() {\n        guard let computedStyle = self.computedStyle else {\n            return\n        }\n\n        ViewStyleRenderer.render(self, styleRule: computedStyle)\n    }\n\n    public class func keyPathsAffectingStyle() -> [String] {\n        return []\n    }\n}\n\ninternal extension UIView {\n    func registerStyleKeyPaths() {\n        let keyPaths = type(of: self).keyPathsAffectingStyle()\n\n        if keyPaths.count > 0 {\n            self.kvoController.observe(self, keyPaths: keyPaths, options: .new) { [weak self] _ in\n                self?.computeStyle()\n            }\n        }\n    }\n\n    func unregisterStyleKeyPaths() {\n        type(of: self).keyPathsAffectingStyle().map { self.kvoController.unobserve(self, keyPath: $0) }\n    }\n}\n\nvar StyleKeyAttribute = \"StyleLayer\"\nextension UIView {\n\n    var styleLayer: StyleLayer! {\n        get { return objc_getAssociatedObject(self, &StyleKeyAttribute) as? StyleLayer }\n        set { objc_setAssociatedObject(self, &StyleKeyAttribute, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }\n    }\n\n    func addStyleLayerIfNeeded() {\n        if let _ = self.styleLayer {\n            return\n        }\n\n        let styleLayer = StyleLayer()\n\n        self.styleLayer = styleLayer\n        self.layer.insertSublayer(styleLayer, at: 0)\n\n        styleLayer.frame = self.layer.bounds\n        self.registerBounds()\n    }\n\n    func registerBounds() {\n        self.kvoController.observe(self.layer, keyPath: \"bounds\", options: .new) { [weak self] _ in\n            guard let weakSelf = self else {\n                return\n            }\n\n            weakSelf.styleLayer?.frame = weakSelf.layer.bounds\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Layer/BackgroundLayer.swift",
    "content": "//\n//  BackgroundLayer.swift\n//  Gaikan\n//\n//  Created by pjechris on 01/12/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nclass BackgroundLayer : CALayer {\n    var background: Background? {\n        didSet {\n            self.setNeedsDisplay()\n        }\n    }\n\n    override func draw(in ctx: CGContext) {\n        guard let background = self.background else {\n            return\n        }\n\n        UIGraphicsPushContext(ctx)\n\n        background.draw(in: ctx)\n\n        UIGraphicsPopContext()\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Layer/BorderLayer.swift",
    "content": "//\n//  BorderLayer.swift\n//  Gaikan\n//\n//  Created by pjechris on 30/11/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nclass BorderLayer : CALayer {\n    var border: Border? {\n        didSet { self.setNeedsDisplay() }\n    }\n\n    override func draw(in ctx: CGContext) {\n        guard let border = self.border else {\n            return\n        }\n        \n        guard border.sides.keys.count != Side.all.count else {\n            drawAllSides(for: border, in: ctx)\n            return\n        }\n        drawSingleSides(for: border, in: ctx)\n    }\n\n    @inline(__always) func drawAllSides(for border: Border, in ctx: CGContext) {\n        UIGraphicsPushContext(ctx)\n        let topBorder = border.sides[.top]! // Any border here would suffice\n        let path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius)\n        topBorder.color.setStroke()\n        path.lineWidth = CGFloat(topBorder.width)\n        path.addClip()\n        path.stroke()\n        UIGraphicsPopContext()\n    }\n    \n    private func drawSingleSides(for border: Border, in ctx: CGContext) {\n        let path = UIBezierPath()\n\n        UIGraphicsPushContext(ctx)\n\n        for (side, border) in border.sides {\n            switch(side) {\n            case .top:\n                self.draw(border: border,\n                          path: path,\n                          points: [ CGPoint(x: 0, y: 0), CGPoint(x: bounds.width, y: 0), CGPoint(x: bounds.width, y: border.width), CGPoint(x: 0, y: border.width) ])\n            case .right:\n                self.draw(border: border,\n                          path: path,\n                          points: [CGPoint(x: bounds.width, y: 0), CGPoint(x: bounds.width, y: bounds.height), CGPoint(x: bounds.width - border.width, y: bounds.height), CGPoint(x: bounds.width - border.width, y: 0)])\n            case .bottom:\n                self.draw(border: border,\n                          path: path,\n                          points: [CGPoint(x: bounds.width, y: bounds.height), CGPoint(x: 0, y: bounds.height), CGPoint(x: 0, y: bounds.height - border.width), CGPoint(x: bounds.width, y: bounds.height - border.width)])\n            case .left:\n                self.draw(border: border,\n                          path: path,\n                          points: [CGPoint(x: 0, y: bounds.height), CGPoint(x: 0, y: 0), CGPoint(x: Int(border.width), y: 0), CGPoint(x: border.width, y: bounds.height)])\n            }\n        }\n\n        UIGraphicsPopContext()\n    }\n\n    func draw(border: BorderStyle, path: UIBezierPath, points: [CGPoint]) {\n        guard let first = points.first else {\n            return\n        }\n\n        path.move(to: first)\n        for point in points {\n            path.addLine(to: point)\n        }\n        path.close()\n\n        border.color.setFill()\n        path.fill()\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Layer/Layer.swift",
    "content": "//\n//  Layer.swift\n//  Gaikan\n//\n//  Created by pjechris on 22/11/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nclass StyleLayer : CALayer {\n    let backgroundLayer = BackgroundLayer()\n    let borderLayer = BorderLayer()\n\n    var styleClass: StyleRule! {\n        didSet {\n            self.applyStyle()\n        }\n    }\n\n    override var frame: CGRect {\n        get { return super.frame }\n        set {\n            super.frame = newValue\n            self.applyStyle()\n        }\n    }\n\n    override init() {\n        super.init()\n        self.setupLayers()\n    }\n\n    override init(layer: Any) {\n        super.init(layer: layer)\n        self.setupLayers()\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        self.setupLayers()\n    }\n\n    private func setupLayers() {\n        self.contentsScale = UIScreen.main.scale\n        self.backgroundLayer.contentsScale = UIScreen.main.scale\n        self.borderLayer.contentsScale = UIScreen.main.scale\n        self.addSublayer(self.backgroundLayer)\n        self.addSublayer(self.borderLayer)\n    }\n\n    override func layoutSublayers() {\n        self.backgroundLayer.frame = self.frame\n        self.borderLayer.frame = self.frame\n    }\n\n    func applyStyle() {\n\n        guard let style = self.styleClass else {\n            return\n        }\n\n        self.backgroundLayer.background = style.background.map { Background($0) }\n        self.borderLayer.border = style.border\n    }\n    \n    override var cornerRadius: CGFloat {\n        didSet {\n            self.backgroundLayer.cornerRadius = cornerRadius\n            self.borderLayer.cornerRadius = cornerRadius\n        }\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Renderer/ConstraintRenderer.swift",
    "content": "//\n//  ConstraintRenderer.swift\n//  Gaikan\n//\n//  Created by pjechris on 30/08/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nclass ConstraintRenderer {\n    class func render(_ view: UIView, styleRule: StyleRule) {\n        self.addDimension(styleRule.height, to: view, attribute: .height, relation: .equal)\n        self.addDimension(styleRule.maxHeight, to: view, attribute: .height, relation: .lessThanOrEqual)\n        self.addDimension(styleRule.minHeight, to: view, attribute: .height, relation: .greaterThanOrEqual)\n\n        self.addDimension(styleRule.width, to: view, attribute: .width, relation: .equal)\n        self.addDimension(styleRule.maxWidth, to: view, attribute: .width, relation: .lessThanOrEqual)\n        self.addDimension(styleRule.minWidth, to: view, attribute: .width, relation: .greaterThanOrEqual)\n    }\n\n    fileprivate class func addDimension(_ constraint: Constraint?, to view: UIView, attribute: NSLayoutAttribute, relation: NSLayoutRelation) {\n        let identifier = \"gaikan-\\(relation.identifier())\\(attribute.identifier().capitalized))\"\n        let index = view.dimensions.index { $0.identifier == identifier }\n        var layoutConstraint: NSLayoutConstraint\n\n        // Remove layoutConstraint if constraint nil but already active (from a previously pass)\n        guard let constraint = constraint else {\n            if let index = index {\n                view.dimensions[index].isActive = false\n            }\n\n            return\n        }\n\n        if let index = index {\n            layoutConstraint = view.dimensions[index]\n        }\n        else {\n            layoutConstraint = NSLayoutConstraint(item: view,\n                                                  attribute: attribute,\n                                                  relatedBy: relation,\n                                                  toItem: nil,\n                                                  attribute: .notAnAttribute,\n                                                  multiplier: 1,\n                                                  constant: 0)\n            layoutConstraint.identifier = identifier\n\n            view.dimensions.append(layoutConstraint)\n        }\n\n        // Deactivate constraint if priority changing from/to required\n        if (layoutConstraint.priority != constraint.priority) {\n            if (constraint.priority == UILayoutPriorityRequired || layoutConstraint.priority == UILayoutPriorityRequired) {\n                layoutConstraint.isActive = false\n            }\n        }\n\n        layoutConstraint.constant = CGFloat(constraint.constant)\n        layoutConstraint.priority = constraint.priority\n        layoutConstraint.isActive = true\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/Renderer/ViewStyleRenderer.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 30/08/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\n\ninternal class ViewStyleRenderer {\n    final class func render(_ stylable: UIView, styleRule: StyleRule) {\n        let visible = styleRule.visible ?? true\n        let corners = styleRule.corners ?? Corners(radius: 0)\n        \n        stylable.layer.cornerRadius = corners.radius\n        stylable.clipsToBounds = styleRule.clip\n        stylable.layer.masksToBounds = styleRule.clip\n\n        stylable.layer.transform = styleRule.transform\n        stylable.tintColor = styleRule.tintColor\n        stylable.isHidden = !visible\n        stylable.alpha = CGFloat(styleRule.opacity / 100)\n        stylable.layoutMargins = styleRule.margin ?? stylable.layoutMargins\n\n        if let shadow = styleRule.shadow {\n            stylable.layer.shadowOpacity = 1\n            stylable.layer.shadowOffset = shadow.shadowOffset\n            stylable.layer.shadowRadius = shadow.shadowBlurRadius\n            stylable.layer.shadowColor = (shadow.shadowColor as? UIColor)?.cgColor\n        }\n        else {\n            stylable.layer.shadowOpacity = 0\n        }\n\n        stylable.styleLayer.styleClass = styleRule\n        stylable.styleLayer.cornerRadius = corners.radius\n\n        ConstraintRenderer.render(stylable, styleRule: styleRule)\n    }\n\n    final class func render(_ stylable: UILabel, styleRule: StyleRule) {\n        stylable.font = styleRule.font\n        stylable.textColor = styleRule.color\n        stylable.lineBreakMode = styleRule.textOverflow ?? .byTruncatingTail\n    }\n\n    final class func render(_ button: UIButton, styleRule: StyleRule) {\n        if let titleLabel = button.titleLabel {\n            self.render(titleLabel, styleRule: styleRule)\n        }\n\n        button.setTitleColor(styleRule.color, for: UIControlState())\n        button.contentEdgeInsets = styleRule.margin ?? button.contentEdgeInsets\n    }\n\n    final class func render(_ textField: UITextField, styleRule: StyleRule) {\n        textField.textAlignment = styleRule.textAlign ?? .natural\n    }\n    \n    final class func render(_ navigationBar: UINavigationBar, titleStyle: StyleRule) {\n        navigationBar.titleTextAttributes = titleStyle.textAttributes\n    }\n}\n"
  },
  {
    "path": "Gaikan/UIKit/VirtualView.swift",
    "content": "//\n//  VirtualView.swift\n//  Gaikan\n//\n//  Created by Simone Civetta on 17/03/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\n\nopen class VirtualView<TargetView: UIView> : NSObject, Stylable {\n    \n    fileprivate let targetView: TargetView\n    \n    init(targetView: TargetView) {\n        self.targetView = targetView\n    }\n    \n    open var styleClass: Style? {\n        didSet { self.computeStyle() }\n    }\n\n    open var styleInline: StyleRule? {\n        didSet { self.computeStyle() }\n    }\n    \n    open var styleState: String? {\n        didSet { self.computeStyle() }\n    }\n\n    open func updateStyle() {\n        self.targetView.updateStyle()\n    }\n\n    open static func keyPathsAffectingStyle() -> [String] {\n        return []\n    }\n}\n"
  },
  {
    "path": "Gaikan.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name                    = \"Gaikan\"\n  s.version                 = \"0.9.1\"\n  s.source                  = { :git => \"https://github.com/akane/Gaikan.git\",\n  \t\t     \t                    :tag => s.version.to_s }\n\n  s.summary                 = \"Declarative view styling in Swift.\"\n  s.description             = \"Powerful styling capabilities using a declarative DSL in Swift. Inspired by ReactJS and CSS modules.\"\n  s.homepage                = s.source[:git].to_s\n  s.license                 = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.author                  = 'pjechris', 'akane'\n\n  s.ios.deployment_target   = \"8.0\"\n  s.source_files            = \"Gaikan/**/*.{swift}\"\n  s.requires_arc            = true\n\n  s.dependency\t\t    'KVOController', '~> 1.x'\nend\n"
  },
  {
    "path": "Gaikan.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\t420190841C80B4BB00B70169 /* UINavigationBarSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420190831C80B4BB00B70169 /* UINavigationBarSpec.swift */; };\n\t\t420190861C80B60F00B70169 /* UINavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420190851C80B60F00B70169 /* UINavigationBar.swift */; };\n\t\t42087B221C9AE4B8000606A7 /* VirtualView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42087B211C9AE4B8000606A7 /* VirtualView.swift */; };\n\t\t490DA08D1D1853FD00A79778 /* Dictionary+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 490DA08C1D1853FD00A79778 /* Dictionary+Helpers.swift */; };\n\t\t4912E9821BEB905A00C0DA4A /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4912E9811BEB905A00C0DA4A /* Background.swift */; };\n\t\t4912E9861BEB9A9800C0DA4A /* Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4912E9851BEB9A9800C0DA4A /* Gradient.swift */; };\n\t\t4917A4C01D17EE1A008B5CB2 /* NSAttributedString+Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4917A4BF1D17EE1A008B5CB2 /* NSAttributedString+Style.swift */; };\n\t\t492C1B571BE0C9DF000515B9 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B501BE0C9DF000515B9 /* UIControl.swift */; };\n\t\t492C1B591BE0C9DF000515B9 /* UISwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B521BE0C9DF000515B9 /* UISwitch.swift */; };\n\t\t492C1B5A1BE0C9DF000515B9 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B531BE0C9DF000515B9 /* UIView.swift */; };\n\t\t492C1B5B1BE0C9DF000515B9 /* ViewStyleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B561BE0C9DF000515B9 /* ViewStyleRenderer.swift */; };\n\t\t492C1B601BE0CA59000515B9 /* UILabelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B5E1BE0CA59000515B9 /* UILabelSpec.swift */; };\n\t\t492C1B611BE0CA59000515B9 /* UIViewSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B5F1BE0CA59000515B9 /* UIViewSpec.swift */; };\n\t\t492C1B631BE0CAD0000515B9 /* UILabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C1B621BE0CAD0000515B9 /* UILabel.swift */; };\n\t\t4932871A1EFA7655009D1326 /* NSShadow+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493287191EFA7655009D1326 /* NSShadow+Helpers.swift */; };\n\t\t493BB1DC1DF094FC004906C4 /* BackgroundLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493BB1DB1DF094FC004906C4 /* BackgroundLayer.swift */; };\n\t\t493C1B921D7479E500861CEA /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493C1B911D7479E500861CEA /* Constraint.swift */; };\n\t\t495DE8FC1BA580D100DA97BF /* DictionarySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 495DE8FB1BA580D100DA97BF /* DictionarySpec.swift */; };\n\t\t496D38A11CD8EDCB00C8B4EC /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 496D389A1CD8EDCB00C8B4EC /* UIColor.swift */; };\n\t\t496D38A21CD8EDCB00C8B4EC /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 496D389B1CD8EDCB00C8B4EC /* UIFont.swift */; };\n\t\t496D38A61CD8EE2800C8B4EC /* SampleTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 496D38A51CD8EE2800C8B4EC /* SampleTheme.swift */; };\n\t\t497032FB1D75E6410014E0C2 /* ConstraintRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497032FA1D75E6410014E0C2 /* ConstraintRenderer.swift */; };\n\t\t4970A8171BD4459300BCB3BA /* Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4970A8161BD4459300BCB3BA /* Property.swift */; };\n\t\t4970A81A1BD445DB00BCB3BA /* Border.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4970A8191BD445DB00BCB3BA /* Border.swift */; };\n\t\t4970A81C1BD4484F00BCB3BA /* StyleSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4970A81B1BD4484F00BCB3BA /* StyleSpec.swift */; };\n\t\t497AD8981D19339A00FF5498 /* Optional+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497AD8971D19339A00FF5498 /* Optional+Helpers.swift */; };\n\t\t498E05391B98362100B4E26B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 498E05381B98362100B4E26B /* AppDelegate.swift */; };\n\t\t498E053B1B98362100B4E26B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 498E053A1B98362100B4E26B /* ViewController.swift */; };\n\t\t498E053E1B98362100B4E26B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 498E053C1B98362100B4E26B /* Main.storyboard */; };\n\t\t498E05401B98362100B4E26B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 498E053F1B98362100B4E26B /* Assets.xcassets */; };\n\t\t498E05431B98362100B4E26B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 498E05411B98362100B4E26B /* LaunchScreen.storyboard */; };\n\t\t499081B31DE4EF78000F8855 /* Layer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499081B21DE4EF78000F8855 /* Layer.swift */; };\n\t\t499943581D7497AB003C510E /* AssociatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499943531D7497AB003C510E /* AssociatedObject.swift */; };\n\t\t499943601D7497FA003C510E /* CGPoint+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4999435D1D7497FA003C510E /* CGPoint+Helpers.swift */; };\n\t\t499943611D7497FA003C510E /* UIColor+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4999435E1D7497FA003C510E /* UIColor+Helpers.swift */; };\n\t\t499943621D7497FA003C510E /* UIImage+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4999435F1D7497FA003C510E /* UIImage+Helpers.swift */; };\n\t\t49A4F5581C1A3C7600D2A392 /* StylePseudoState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49A4F5571C1A3C7600D2A392 /* StylePseudoState.swift */; };\n\t\t49B9A23B1D14589200E4DE52 /* StyleRule+DirectAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B9A23A1D14589200E4DE52 /* StyleRule+DirectAccess.swift */; };\n\t\t49BE40B51D78565B00FE0818 /* NSLayoutAttribute+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BE40B41D78565B00FE0818 /* NSLayoutAttribute+Helpers.swift */; };\n\t\t49BE40B71D78566400FE0818 /* NSLayoutRelation+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BE40B61D78566400FE0818 /* NSLayoutRelation+Helpers.swift */; };\n\t\t49C25A8C1D845A6900E3735C /* ConstraintRendererSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49C25A8B1D845A6900E3735C /* ConstraintRendererSpec.swift */; };\n\t\t49C306551CD8FD2900CABDF4 /* Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49C306541CD8FD2900CABDF4 /* Gradient.swift */; };\n\t\t49C306581CD902EC00CABDF4 /* UIView+InterfaceBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49C306571CD902EC00CABDF4 /* UIView+InterfaceBuilder.swift */; };\n\t\t49C8F7E91C1A33F400FF33DC /* StyleState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49C8F7E81C1A33F400FF33DC /* StyleState.swift */; };\n\t\t49CF3E291D0EF48200AF89E6 /* KVOController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49CF3E281D0EF48200AF89E6 /* KVOController.framework */; };\n\t\t49CF3E2D1D0EF81B00AF89E6 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49CF3E2B1D0EF81B00AF89E6 /* Nimble.framework */; };\n\t\t49CF3E2E1D0EF81B00AF89E6 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49CF3E2C1D0EF81B00AF89E6 /* Quick.framework */; };\n\t\t49CF3E2F1D0EF93900AF89E6 /* KVOController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49CF3E281D0EF48200AF89E6 /* KVOController.framework */; };\n\t\t49CF5F991BA4866B00216E6D /* StyleRuleSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49CF5F981BA4866B00216E6D /* StyleRuleSpec.swift */; };\n\t\t49D1BF831BDD4A8700348D3D /* CustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D1BF821BDD4A8700348D3D /* CustomView.swift */; };\n\t\t49D389A51D84272800D72B2E /* UIView+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D389A41D84272800D72B2E /* UIView+Helpers.swift */; };\n\t\t49DBD9021BCAAF110069B0C2 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49DBD9011BCAAF110069B0C2 /* Style.swift */; };\n\t\t49E99D491DEF3A77003BF8B4 /* BorderLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E99D481DEF3A77003BF8B4 /* BorderLayer.swift */; };\n\t\t49EC39681B92FC7D002938E1 /* Gaikan.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EC39671B92FC7D002938E1 /* Gaikan.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t49EC396F1B92FC7D002938E1 /* Gaikan.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49EC39641B92FC7D002938E1 /* Gaikan.framework */; };\n\t\t49EC39741B92FC7D002938E1 /* GaikanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EC39731B92FC7D002938E1 /* GaikanTests.swift */; };\n\t\t49EC398B1B93085E002938E1 /* StyleRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EC398A1B93085E002938E1 /* StyleRule.swift */; };\n\t\t49EC39931B9373B2002938E1 /* Stylable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EC39921B9373B2002938E1 /* Stylable.swift */; };\n\t\t49F78A671DF4245300866F72 /* Side.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F78A661DF4245300866F72 /* Side.swift */; };\n\t\t49FD8A651CD16652004F2979 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49FD8A631CD16652004F2979 /* Theme.swift */; };\n\t\tCAFCDA4F1C592BBC004513D3 /* Corners.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFCDA4E1C592BBC004513D3 /* Corners.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t498E05481B98362800B4E26B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49EC395B1B92FC7D002938E1 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49EC39631B92FC7D002938E1;\n\t\t\tremoteInfo = Gaikan;\n\t\t};\n\t\t49EC39701B92FC7D002938E1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49EC395B1B92FC7D002938E1 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49EC39631B92FC7D002938E1;\n\t\t\tremoteInfo = Gaikan;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t420190831C80B4BB00B70169 /* UINavigationBarSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UINavigationBarSpec.swift; sourceTree = \"<group>\"; };\n\t\t420190851C80B60F00B70169 /* UINavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UINavigationBar.swift; sourceTree = \"<group>\"; };\n\t\t42087B211C9AE4B8000606A7 /* VirtualView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VirtualView.swift; sourceTree = \"<group>\"; };\n\t\t490DA08C1D1853FD00A79778 /* Dictionary+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"Dictionary+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t4912E9811BEB905A00C0DA4A /* Background.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Background.swift; sourceTree = \"<group>\"; };\n\t\t4912E9851BEB9A9800C0DA4A /* Gradient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Gradient.swift; sourceTree = \"<group>\"; };\n\t\t4917A4BF1D17EE1A008B5CB2 /* NSAttributedString+Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSAttributedString+Style.swift\"; sourceTree = \"<group>\"; };\n\t\t492C1B501BE0C9DF000515B9 /* UIControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = \"<group>\"; };\n\t\t492C1B521BE0C9DF000515B9 /* UISwitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UISwitch.swift; sourceTree = \"<group>\"; };\n\t\t492C1B531BE0C9DF000515B9 /* UIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = \"<group>\"; };\n\t\t492C1B561BE0C9DF000515B9 /* ViewStyleRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewStyleRenderer.swift; sourceTree = \"<group>\"; };\n\t\t492C1B5E1BE0CA59000515B9 /* UILabelSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UILabelSpec.swift; sourceTree = \"<group>\"; };\n\t\t492C1B5F1BE0CA59000515B9 /* UIViewSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewSpec.swift; sourceTree = \"<group>\"; };\n\t\t492C1B621BE0CAD0000515B9 /* UILabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UILabel.swift; sourceTree = \"<group>\"; };\n\t\t493287191EFA7655009D1326 /* NSShadow+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSShadow+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t493BB1DB1DF094FC004906C4 /* BackgroundLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundLayer.swift; sourceTree = \"<group>\"; };\n\t\t493C1B911D7479E500861CEA /* Constraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constraint.swift; sourceTree = \"<group>\"; };\n\t\t495DE8FB1BA580D100DA97BF /* DictionarySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionarySpec.swift; sourceTree = \"<group>\"; };\n\t\t496D389A1CD8EDCB00C8B4EC /* UIColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = \"<group>\"; };\n\t\t496D389B1CD8EDCB00C8B4EC /* UIFont.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = \"<group>\"; };\n\t\t496D38A51CD8EE2800C8B4EC /* SampleTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleTheme.swift; sourceTree = \"<group>\"; };\n\t\t497032FA1D75E6410014E0C2 /* ConstraintRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConstraintRenderer.swift; sourceTree = \"<group>\"; };\n\t\t4970A8161BD4459300BCB3BA /* Property.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Property.swift; sourceTree = \"<group>\"; };\n\t\t4970A8191BD445DB00BCB3BA /* Border.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Border.swift; sourceTree = \"<group>\"; };\n\t\t4970A81B1BD4484F00BCB3BA /* StyleSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleSpec.swift; sourceTree = \"<group>\"; };\n\t\t497AD8971D19339A00FF5498 /* Optional+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"Optional+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t498E05361B98362100B4E26B /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t498E05381B98362100B4E26B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t498E053A1B98362100B4E26B /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t498E053D1B98362100B4E26B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t498E053F1B98362100B4E26B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t498E05421B98362100B4E26B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t498E05441B98362100B4E26B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t499081B21DE4EF78000F8855 /* Layer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Layer.swift; sourceTree = \"<group>\"; };\n\t\t499943531D7497AB003C510E /* AssociatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssociatedObject.swift; sourceTree = \"<group>\"; };\n\t\t4999435D1D7497FA003C510E /* CGPoint+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"CGPoint+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t4999435E1D7497FA003C510E /* UIColor+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIColor+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t4999435F1D7497FA003C510E /* UIImage+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIImage+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t49A4F5571C1A3C7600D2A392 /* StylePseudoState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylePseudoState.swift; sourceTree = \"<group>\"; };\n\t\t49B9A23A1D14589200E4DE52 /* StyleRule+DirectAccess.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"StyleRule+DirectAccess.swift\"; sourceTree = \"<group>\"; };\n\t\t49BE40B41D78565B00FE0818 /* NSLayoutAttribute+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSLayoutAttribute+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t49BE40B61D78566400FE0818 /* NSLayoutRelation+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSLayoutRelation+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t49C25A8B1D845A6900E3735C /* ConstraintRendererSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConstraintRendererSpec.swift; sourceTree = \"<group>\"; };\n\t\t49C306541CD8FD2900CABDF4 /* Gradient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Gradient.swift; sourceTree = \"<group>\"; };\n\t\t49C306571CD902EC00CABDF4 /* UIView+InterfaceBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+InterfaceBuilder.swift\"; sourceTree = \"<group>\"; };\n\t\t49C8F7E81C1A33F400FF33DC /* StyleState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleState.swift; sourceTree = \"<group>\"; };\n\t\t49CF3E281D0EF48200AF89E6 /* KVOController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KVOController.framework; path = Carthage/Build/iOS/KVOController.framework; sourceTree = \"<group>\"; };\n\t\t49CF3E2B1D0EF81B00AF89E6 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = \"<group>\"; };\n\t\t49CF3E2C1D0EF81B00AF89E6 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = \"<group>\"; };\n\t\t49CF5F981BA4866B00216E6D /* StyleRuleSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleRuleSpec.swift; sourceTree = \"<group>\"; };\n\t\t49D1BF821BDD4A8700348D3D /* CustomView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomView.swift; sourceTree = \"<group>\"; };\n\t\t49D389A41D84272800D72B2E /* UIView+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Helpers.swift\"; sourceTree = \"<group>\"; };\n\t\t49DBD9011BCAAF110069B0C2 /* Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Style.swift; sourceTree = \"<group>\"; };\n\t\t49E99D481DEF3A77003BF8B4 /* BorderLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BorderLayer.swift; sourceTree = \"<group>\"; };\n\t\t49EC39641B92FC7D002938E1 /* Gaikan.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Gaikan.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49EC39671B92FC7D002938E1 /* Gaikan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Gaikan.h; sourceTree = \"<group>\"; };\n\t\t49EC39691B92FC7D002938E1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49EC396E1B92FC7D002938E1 /* GaikanTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GaikanTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49EC39731B92FC7D002938E1 /* GaikanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GaikanTests.swift; sourceTree = \"<group>\"; };\n\t\t49EC39751B92FC7D002938E1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49EC398A1B93085E002938E1 /* StyleRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleRule.swift; sourceTree = \"<group>\"; };\n\t\t49EC39921B9373B2002938E1 /* Stylable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stylable.swift; sourceTree = \"<group>\"; };\n\t\t49F78A661DF4245300866F72 /* Side.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Side.swift; sourceTree = \"<group>\"; };\n\t\t49FD8A631CD16652004F2979 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = \"<group>\"; };\n\t\tCAFCDA4E1C592BBC004513D3 /* Corners.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Corners.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t498E05331B98362100B4E26B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49CF3E291D0EF48200AF89E6 /* KVOController.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC39601B92FC7D002938E1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC396B1B92FC7D002938E1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49CF3E2F1D0EF93900AF89E6 /* KVOController.framework in Frameworks */,\n\t\t\t\t49CF3E2D1D0EF81B00AF89E6 /* Nimble.framework in Frameworks */,\n\t\t\t\t49CF3E2E1D0EF81B00AF89E6 /* Quick.framework in Frameworks */,\n\t\t\t\t49EC396F1B92FC7D002938E1 /* Gaikan.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\t490AD3DA1BA1CD4A0078F2DB /* Style */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49CF5F981BA4866B00216E6D /* StyleRuleSpec.swift */,\n\t\t\t\t4970A81B1BD4484F00BCB3BA /* StyleSpec.swift */,\n\t\t\t);\n\t\t\tpath = Style;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4917A4BE1D17EE08008B5CB2 /* Helpers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t493287191EFA7655009D1326 /* NSShadow+Helpers.swift */,\n\t\t\t\t499943531D7497AB003C510E /* AssociatedObject.swift */,\n\t\t\t\t4999435D1D7497FA003C510E /* CGPoint+Helpers.swift */,\n\t\t\t\t490DA08C1D1853FD00A79778 /* Dictionary+Helpers.swift */,\n\t\t\t\t4917A4BF1D17EE1A008B5CB2 /* NSAttributedString+Style.swift */,\n\t\t\t\t49BE40B41D78565B00FE0818 /* NSLayoutAttribute+Helpers.swift */,\n\t\t\t\t49BE40B61D78566400FE0818 /* NSLayoutRelation+Helpers.swift */,\n\t\t\t\t497AD8971D19339A00FF5498 /* Optional+Helpers.swift */,\n\t\t\t\t4999435E1D7497FA003C510E /* UIColor+Helpers.swift */,\n\t\t\t\t4999435F1D7497FA003C510E /* UIImage+Helpers.swift */,\n\t\t\t\t49D389A41D84272800D72B2E /* UIView+Helpers.swift */,\n\t\t\t);\n\t\t\tpath = Helpers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t492C1B421BE0C81E000515B9 /* UIKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t499081B11DE4EF6F000F8855 /* Layer */,\n\t\t\t\t492C1B4F1BE0C9DF000515B9 /* Extension */,\n\t\t\t\t492C1B551BE0C9DF000515B9 /* Renderer */,\n\t\t\t\t42087B211C9AE4B8000606A7 /* VirtualView.swift */,\n\t\t\t);\n\t\t\tpath = UIKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t492C1B4F1BE0C9DF000515B9 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t492C1B501BE0C9DF000515B9 /* UIControl.swift */,\n\t\t\t\t492C1B621BE0CAD0000515B9 /* UILabel.swift */,\n\t\t\t\t420190851C80B60F00B70169 /* UINavigationBar.swift */,\n\t\t\t\t492C1B521BE0C9DF000515B9 /* UISwitch.swift */,\n\t\t\t\t492C1B531BE0C9DF000515B9 /* UIView.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t492C1B551BE0C9DF000515B9 /* Renderer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t492C1B561BE0C9DF000515B9 /* ViewStyleRenderer.swift */,\n\t\t\t\t497032FA1D75E6410014E0C2 /* ConstraintRenderer.swift */,\n\t\t\t);\n\t\t\tpath = Renderer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t492C1B5C1BE0CA59000515B9 /* UIKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t492C1B5D1BE0CA59000515B9 /* Extension */,\n\t\t\t\t49C25A8A1D845A4F00E3735C /* Renderer */,\n\t\t\t);\n\t\t\tpath = UIKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t492C1B5D1BE0CA59000515B9 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t492C1B5E1BE0CA59000515B9 /* UILabelSpec.swift */,\n\t\t\t\t420190831C80B4BB00B70169 /* UINavigationBarSpec.swift */,\n\t\t\t\t492C1B5F1BE0CA59000515B9 /* UIViewSpec.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t495DE8F91BA580C200DA97BF /* Swift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t495DE8FA1BA580C200DA97BF /* Extension */,\n\t\t\t);\n\t\t\tpath = Swift;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t495DE8FA1BA580C200DA97BF /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t495DE8FB1BA580D100DA97BF /* DictionarySpec.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t496D38991CD8EDCB00C8B4EC /* Theme */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t496D389A1CD8EDCB00C8B4EC /* UIColor.swift */,\n\t\t\t\t496D389B1CD8EDCB00C8B4EC /* UIFont.swift */,\n\t\t\t\t496D38A51CD8EE2800C8B4EC /* SampleTheme.swift */,\n\t\t\t\t49C306541CD8FD2900CABDF4 /* Gradient.swift */,\n\t\t\t);\n\t\t\tpath = Theme;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4970A8151BD4455900BCB3BA /* Property */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4912E9851BEB9A9800C0DA4A /* Gradient.swift */,\n\t\t\t\t4970A8161BD4459300BCB3BA /* Property.swift */,\n\t\t\t\t4970A8181BD445DB00BCB3BA /* Value */,\n\t\t\t);\n\t\t\tpath = Property;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4970A8181BD445DB00BCB3BA /* Value */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4970A8191BD445DB00BCB3BA /* Border.swift */,\n\t\t\t\t4912E9811BEB905A00C0DA4A /* Background.swift */,\n\t\t\t\tCAFCDA4E1C592BBC004513D3 /* Corners.swift */,\n\t\t\t\t493C1B911D7479E500861CEA /* Constraint.swift */,\n\t\t\t\t49F78A661DF4245300866F72 /* Side.swift */,\n\t\t\t);\n\t\t\tpath = Value;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t498E05371B98362100B4E26B /* Sample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t496D38991CD8EDCB00C8B4EC /* Theme */,\n\t\t\t\t498E05381B98362100B4E26B /* AppDelegate.swift */,\n\t\t\t\t498E053A1B98362100B4E26B /* ViewController.swift */,\n\t\t\t\t498E053C1B98362100B4E26B /* Main.storyboard */,\n\t\t\t\t498E053F1B98362100B4E26B /* Assets.xcassets */,\n\t\t\t\t498E05411B98362100B4E26B /* LaunchScreen.storyboard */,\n\t\t\t\t498E05441B98362100B4E26B /* Info.plist */,\n\t\t\t\t49D1BF821BDD4A8700348D3D /* CustomView.swift */,\n\t\t\t);\n\t\t\tpath = Sample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t499081B11DE4EF6F000F8855 /* Layer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t499081B21DE4EF78000F8855 /* Layer.swift */,\n\t\t\t\t49E99D481DEF3A77003BF8B4 /* BorderLayer.swift */,\n\t\t\t\t493BB1DB1DF094FC004906C4 /* BackgroundLayer.swift */,\n\t\t\t);\n\t\t\tpath = Layer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49C25A8A1D845A4F00E3735C /* Renderer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49C25A8B1D845A6900E3735C /* ConstraintRendererSpec.swift */,\n\t\t\t);\n\t\t\tpath = Renderer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49C306561CD902D800CABDF4 /* InterfaceBuilder */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49C306571CD902EC00CABDF4 /* UIView+InterfaceBuilder.swift */,\n\t\t\t);\n\t\t\tpath = InterfaceBuilder;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49EC395A1B92FC7D002938E1 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49CF3E2B1D0EF81B00AF89E6 /* Nimble.framework */,\n\t\t\t\t49CF3E2C1D0EF81B00AF89E6 /* Quick.framework */,\n\t\t\t\t49CF3E281D0EF48200AF89E6 /* KVOController.framework */,\n\t\t\t\t49EC39661B92FC7D002938E1 /* Gaikan */,\n\t\t\t\t49EC39721B92FC7D002938E1 /* GaikanTests */,\n\t\t\t\t498E05371B98362100B4E26B /* Sample */,\n\t\t\t\t49EC39651B92FC7D002938E1 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49EC39651B92FC7D002938E1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49EC39641B92FC7D002938E1 /* Gaikan.framework */,\n\t\t\t\t49EC396E1B92FC7D002938E1 /* GaikanTests.xctest */,\n\t\t\t\t498E05361B98362100B4E26B /* Sample.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49EC39661B92FC7D002938E1 /* Gaikan */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49EC39671B92FC7D002938E1 /* Gaikan.h */,\n\t\t\t\t49EC39691B92FC7D002938E1 /* Info.plist */,\n\t\t\t\t4917A4BE1D17EE08008B5CB2 /* Helpers */,\n\t\t\t\t49C306561CD902D800CABDF4 /* InterfaceBuilder */,\n\t\t\t\t4970A8151BD4455900BCB3BA /* Property */,\n\t\t\t\t49EC397E1B92FF2F002938E1 /* Style */,\n\t\t\t\t49FD8A611CD16652004F2979 /* Theme */,\n\t\t\t\t492C1B421BE0C81E000515B9 /* UIKit */,\n\t\t\t);\n\t\t\tpath = Gaikan;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49EC39721B92FC7D002938E1 /* GaikanTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49EC39731B92FC7D002938E1 /* GaikanTests.swift */,\n\t\t\t\t49EC39751B92FC7D002938E1 /* Info.plist */,\n\t\t\t\t490AD3DA1BA1CD4A0078F2DB /* Style */,\n\t\t\t\t495DE8F91BA580C200DA97BF /* Swift */,\n\t\t\t\t492C1B5C1BE0CA59000515B9 /* UIKit */,\n\t\t\t);\n\t\t\tpath = GaikanTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49EC397E1B92FF2F002938E1 /* Style */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49EC39921B9373B2002938E1 /* Stylable.swift */,\n\t\t\t\t49DBD9011BCAAF110069B0C2 /* Style.swift */,\n\t\t\t\t49A4F5571C1A3C7600D2A392 /* StylePseudoState.swift */,\n\t\t\t\t49EC398A1B93085E002938E1 /* StyleRule.swift */,\n\t\t\t\t49C8F7E81C1A33F400FF33DC /* StyleState.swift */,\n\t\t\t\t49B9A23A1D14589200E4DE52 /* StyleRule+DirectAccess.swift */,\n\t\t\t);\n\t\t\tpath = Style;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49FD8A611CD16652004F2979 /* Theme */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49FD8A631CD16652004F2979 /* Theme.swift */,\n\t\t\t);\n\t\t\tpath = Theme;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t49EC39611B92FC7D002938E1 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49EC39681B92FC7D002938E1 /* Gaikan.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\t498E05351B98362100B4E26B /* Sample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 498E05451B98362100B4E26B /* Build configuration list for PBXNativeTarget \"Sample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t498E05321B98362100B4E26B /* Sources */,\n\t\t\t\t498E05331B98362100B4E26B /* Frameworks */,\n\t\t\t\t498E05341B98362100B4E26B /* Resources */,\n\t\t\t\t49CF3E271D0EF41A00AF89E6 /* Carthage */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t498E05491B98362800B4E26B /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Sample;\n\t\t\tproductName = Sample;\n\t\t\tproductReference = 498E05361B98362100B4E26B /* Sample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t49EC39631B92FC7D002938E1 /* Gaikan */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49EC39781B92FC7D002938E1 /* Build configuration list for PBXNativeTarget \"Gaikan\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49EC395F1B92FC7D002938E1 /* Sources */,\n\t\t\t\t49EC39601B92FC7D002938E1 /* Frameworks */,\n\t\t\t\t49EC39611B92FC7D002938E1 /* Headers */,\n\t\t\t\t49EC39621B92FC7D002938E1 /* 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 = Gaikan;\n\t\t\tproductName = Gaikan;\n\t\t\tproductReference = 49EC39641B92FC7D002938E1 /* Gaikan.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t49EC396D1B92FC7D002938E1 /* GaikanTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49EC397B1B92FC7D002938E1 /* Build configuration list for PBXNativeTarget \"GaikanTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49EC396A1B92FC7D002938E1 /* Sources */,\n\t\t\t\t49EC396B1B92FC7D002938E1 /* Frameworks */,\n\t\t\t\t49EC396C1B92FC7D002938E1 /* Resources */,\n\t\t\t\t49CF3E2A1D0EF7E900AF89E6 /* Carthage */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t49EC39711B92FC7D002938E1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = GaikanTests;\n\t\t\tproductName = GaikanTests;\n\t\t\tproductReference = 49EC396E1B92FC7D002938E1 /* GaikanTests.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\t49EC395B1B92FC7D002938E1 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0710;\n\t\t\t\tLastUpgradeCheck = 0810;\n\t\t\t\tORGANIZATIONNAME = fr.akane;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t498E05351B98362100B4E26B = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t\t49EC39631B92FC7D002938E1 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t};\n\t\t\t\t\t49EC396D1B92FC7D002938E1 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 49EC395E1B92FC7D002938E1 /* Build configuration list for PBXProject \"Gaikan\" */;\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 = 49EC395A1B92FC7D002938E1;\n\t\t\tproductRefGroup = 49EC39651B92FC7D002938E1 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t49EC39631B92FC7D002938E1 /* Gaikan */,\n\t\t\t\t49EC396D1B92FC7D002938E1 /* GaikanTests */,\n\t\t\t\t498E05351B98362100B4E26B /* Sample */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t498E05341B98362100B4E26B /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t498E05431B98362100B4E26B /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t498E05401B98362100B4E26B /* Assets.xcassets in Resources */,\n\t\t\t\t498E053E1B98362100B4E26B /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC39621B92FC7D002938E1 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC396C1B92FC7D002938E1 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t49CF3E271D0EF41A00AF89E6 /* Carthage */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/KVOController.framework\",\n\t\t\t);\n\t\t\tname = Carthage;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/usr/local/bin/carthage copy-frameworks\";\n\t\t};\n\t\t49CF3E2A1D0EF7E900AF89E6 /* Carthage */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/Nimble.framework\",\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/Quick.framework\",\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/KVOController.framework\",\n\t\t\t);\n\t\t\tname = Carthage;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/usr/local/bin/carthage copy-frameworks\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t498E05321B98362100B4E26B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49D1BF831BDD4A8700348D3D /* CustomView.swift in Sources */,\n\t\t\t\t496D38A61CD8EE2800C8B4EC /* SampleTheme.swift in Sources */,\n\t\t\t\t496D38A21CD8EDCB00C8B4EC /* UIFont.swift in Sources */,\n\t\t\t\t49C306551CD8FD2900CABDF4 /* Gradient.swift in Sources */,\n\t\t\t\t498E053B1B98362100B4E26B /* ViewController.swift in Sources */,\n\t\t\t\t498E05391B98362100B4E26B /* AppDelegate.swift in Sources */,\n\t\t\t\t496D38A11CD8EDCB00C8B4EC /* UIColor.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC395F1B92FC7D002938E1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t499943601D7497FA003C510E /* CGPoint+Helpers.swift in Sources */,\n\t\t\t\t4970A81A1BD445DB00BCB3BA /* Border.swift in Sources */,\n\t\t\t\t4932871A1EFA7655009D1326 /* NSShadow+Helpers.swift in Sources */,\n\t\t\t\t49F78A671DF4245300866F72 /* Side.swift in Sources */,\n\t\t\t\t49EC398B1B93085E002938E1 /* StyleRule.swift in Sources */,\n\t\t\t\t49C306581CD902EC00CABDF4 /* UIView+InterfaceBuilder.swift in Sources */,\n\t\t\t\t49C8F7E91C1A33F400FF33DC /* StyleState.swift in Sources */,\n\t\t\t\t49EC39931B9373B2002938E1 /* Stylable.swift in Sources */,\n\t\t\t\t492C1B5B1BE0C9DF000515B9 /* ViewStyleRenderer.swift in Sources */,\n\t\t\t\t49BE40B51D78565B00FE0818 /* NSLayoutAttribute+Helpers.swift in Sources */,\n\t\t\t\t497032FB1D75E6410014E0C2 /* ConstraintRenderer.swift in Sources */,\n\t\t\t\t493C1B921D7479E500861CEA /* Constraint.swift in Sources */,\n\t\t\t\t490DA08D1D1853FD00A79778 /* Dictionary+Helpers.swift in Sources */,\n\t\t\t\t492C1B631BE0CAD0000515B9 /* UILabel.swift in Sources */,\n\t\t\t\t492C1B571BE0C9DF000515B9 /* UIControl.swift in Sources */,\n\t\t\t\t493BB1DC1DF094FC004906C4 /* BackgroundLayer.swift in Sources */,\n\t\t\t\t499081B31DE4EF78000F8855 /* Layer.swift in Sources */,\n\t\t\t\t49B9A23B1D14589200E4DE52 /* StyleRule+DirectAccess.swift in Sources */,\n\t\t\t\t49FD8A651CD16652004F2979 /* Theme.swift in Sources */,\n\t\t\t\t49A4F5581C1A3C7600D2A392 /* StylePseudoState.swift in Sources */,\n\t\t\t\t49E99D491DEF3A77003BF8B4 /* BorderLayer.swift in Sources */,\n\t\t\t\t4917A4C01D17EE1A008B5CB2 /* NSAttributedString+Style.swift in Sources */,\n\t\t\t\t499943581D7497AB003C510E /* AssociatedObject.swift in Sources */,\n\t\t\t\t4970A8171BD4459300BCB3BA /* Property.swift in Sources */,\n\t\t\t\t49BE40B71D78566400FE0818 /* NSLayoutRelation+Helpers.swift in Sources */,\n\t\t\t\t4912E9821BEB905A00C0DA4A /* Background.swift in Sources */,\n\t\t\t\t420190861C80B60F00B70169 /* UINavigationBar.swift in Sources */,\n\t\t\t\t492C1B5A1BE0C9DF000515B9 /* UIView.swift in Sources */,\n\t\t\t\t49DBD9021BCAAF110069B0C2 /* Style.swift in Sources */,\n\t\t\t\t492C1B591BE0C9DF000515B9 /* UISwitch.swift in Sources */,\n\t\t\t\t499943611D7497FA003C510E /* UIColor+Helpers.swift in Sources */,\n\t\t\t\t497AD8981D19339A00FF5498 /* Optional+Helpers.swift in Sources */,\n\t\t\t\t49D389A51D84272800D72B2E /* UIView+Helpers.swift in Sources */,\n\t\t\t\t42087B221C9AE4B8000606A7 /* VirtualView.swift in Sources */,\n\t\t\t\t499943621D7497FA003C510E /* UIImage+Helpers.swift in Sources */,\n\t\t\t\t4912E9861BEB9A9800C0DA4A /* Gradient.swift in Sources */,\n\t\t\t\tCAFCDA4F1C592BBC004513D3 /* Corners.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49EC396A1B92FC7D002938E1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49CF5F991BA4866B00216E6D /* StyleRuleSpec.swift in Sources */,\n\t\t\t\t492C1B601BE0CA59000515B9 /* UILabelSpec.swift in Sources */,\n\t\t\t\t495DE8FC1BA580D100DA97BF /* DictionarySpec.swift in Sources */,\n\t\t\t\t492C1B611BE0CA59000515B9 /* UIViewSpec.swift in Sources */,\n\t\t\t\t420190841C80B4BB00B70169 /* UINavigationBarSpec.swift in Sources */,\n\t\t\t\t4970A81C1BD4484F00BCB3BA /* StyleSpec.swift in Sources */,\n\t\t\t\t49C25A8C1D845A6900E3735C /* ConstraintRendererSpec.swift in Sources */,\n\t\t\t\t49EC39741B92FC7D002938E1 /* GaikanTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t498E05491B98362800B4E26B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 49EC39631B92FC7D002938E1 /* Gaikan */;\n\t\t\ttargetProxy = 498E05481B98362800B4E26B /* PBXContainerItemProxy */;\n\t\t};\n\t\t49EC39711B92FC7D002938E1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 49EC39631B92FC7D002938E1 /* Gaikan */;\n\t\t\ttargetProxy = 49EC39701B92FC7D002938E1 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t498E053C1B98362100B4E26B /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t498E053D1B98362100B4E26B /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t498E05411B98362100B4E26B /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t498E05421B98362100B4E26B /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t498E05461B98362100B4E26B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Sample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.Sample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 2.3;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t498E05471B98362100B4E26B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Sample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.Sample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 2.3;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49EC39761B92FC7D002938E1 /* 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\tCURRENT_PROJECT_VERSION = 1;\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\tFRAMEWORK_SEARCH_PATHS = \"$(PROJECT_DIR)/Carthage/Build/iOS\";\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\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\t49EC39771B92FC7D002938E1 /* 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 = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\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\tFRAMEWORK_SEARCH_PATHS = \"$(PROJECT_DIR)/Carthage/Build/iOS\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\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\t49EC39791B92FC7D002938E1 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\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 = Gaikan/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.Gaikan;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49EC397A1B92FC7D002938E1 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\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 = Gaikan/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.Gaikan;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49EC397C1B92FC7D002938E1 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GaikanTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.GaikanTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49EC397D1B92FC7D002938E1 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GaikanTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Akane.GaikanTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t498E05451B98362100B4E26B /* Build configuration list for PBXNativeTarget \"Sample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t498E05461B98362100B4E26B /* Debug */,\n\t\t\t\t498E05471B98362100B4E26B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49EC395E1B92FC7D002938E1 /* Build configuration list for PBXProject \"Gaikan\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49EC39761B92FC7D002938E1 /* Debug */,\n\t\t\t\t49EC39771B92FC7D002938E1 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49EC39781B92FC7D002938E1 /* Build configuration list for PBXNativeTarget \"Gaikan\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49EC39791B92FC7D002938E1 /* Debug */,\n\t\t\t\t49EC397A1B92FC7D002938E1 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49EC397B1B92FC7D002938E1 /* Build configuration list for PBXNativeTarget \"GaikanTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49EC397C1B92FC7D002938E1 /* Debug */,\n\t\t\t\t49EC397D1B92FC7D002938E1 /* 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 = 49EC395B1B92FC7D002938E1 /* Project object */;\n}\n"
  },
  {
    "path": "Gaikan.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Gaikan.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Gaikan.xcodeproj/xcshareddata/xcschemes/Gaikan.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 = \"49EC39631B92FC7D002938E1\"\n               BuildableName = \"Gaikan.framework\"\n               BlueprintName = \"Gaikan\"\n               ReferencedContainer = \"container:Gaikan.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      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49EC396D1B92FC7D002938E1\"\n               BuildableName = \"GaikanTests.xctest\"\n               BlueprintName = \"GaikanTests\"\n               ReferencedContainer = \"container:Gaikan.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49EC39631B92FC7D002938E1\"\n            BuildableName = \"Gaikan.framework\"\n            BlueprintName = \"Gaikan\"\n            ReferencedContainer = \"container:Gaikan.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      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49EC39631B92FC7D002938E1\"\n            BuildableName = \"Gaikan.framework\"\n            BlueprintName = \"Gaikan\"\n            ReferencedContainer = \"container:Gaikan.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49EC39631B92FC7D002938E1\"\n            BuildableName = \"Gaikan.framework\"\n            BlueprintName = \"Gaikan\"\n            ReferencedContainer = \"container:Gaikan.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Gaikan.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Gaikan.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "GaikanTests/GaikanTests.swift",
    "content": "//\n//  GaikanTests.swift\n//  GaikanTests\n//\n//  Created by JC on 30/08/15.\n//  Copyright © 2015 fr.akane. All rights reserved.\n//\n\nimport XCTest\n@testable import Gaikan\n\nclass GaikanTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n    \n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n}\n"
  },
  {
    "path": "GaikanTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "GaikanTests/Style/StyleRuleSpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 12/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\nimport Gaikan\n\nclass StyleRuleSpec: QuickSpec {\n    override func spec() {\n        var style: StyleRule!\n\n        describe(\"init\") {\n            context(\"when passing block\") {\n                beforeEach {\n                    style = StyleRule() { (style: inout StyleRule) -> () in\n                        style.color = UIColor.blue\n                    }\n                }\n\n                it(\"should initialize color\") {\n                    expect(style.color) == UIColor.blue\n                }\n            }\n        }\n\n        describe(\"extends\") {\n            beforeEach {\n                style = [ .color: UIColor.blue, .tintColor: nil ]\n            }\n\n            context(\"when extending properties\") {\n                it(\"it should take new value\") {\n                    let newStyle: StyleRule = [ .color: UIColor.black ]\n\n                    expect(newStyle.extends(style).color) == UIColor.black\n                }\n            }\n\n            context(\"when adding properties\") {\n                it(\"should be added to style\") {\n                    let font = UIFont.systemFont(ofSize:22)\n                    let newStyle: StyleRule = [ .font: font ]\n\n                    expect(newStyle.extends(style).font) == font\n                }\n            }\n\n            context(\"when nullyfing a property\") {\n                it(\"it should be nil\") {\n                    var newStyle: StyleRule = [ .color: nil ]\n\n                    newStyle.extends(style)\n                    expect(newStyle.color).to(beNil())\n                }\n            }\n\n            context(\"multiple styles\") {\n                context(\"with a nil style\") {\n                    it(\"should merge valid ones\") {\n                        var newStyle: StyleRule = [:]\n\n                        newStyle = newStyle.extends(nil, style)\n                        expect(newStyle.color) == UIColor.blue\n                    }\n\n                    it(\"should add all properties\") {\n                        var newStyle: StyleRule = [:]\n\n                        newStyle = newStyle.extends(style, [ .tintColor: UIColor.green ])\n\n                        expect(newStyle.color) == UIColor.blue\n                        expect(newStyle.tintColor) == UIColor.green\n                    }\n                }\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "GaikanTests/Style/StyleSpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 18/10/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\n@testable import Gaikan\n\nclass StyleSpec: QuickSpec {\n    override func spec() {\n        var style: Style!\n\n        beforeEach {\n            style = Style() { (style: inout StyleRule) in\n                style.color = UIColor.blue\n            }\n        }\n\n        describe(\"state\") {\n            context(\"when pseudo class does not exist yet\") {\n                it(\"should be nil\") {\n                    expect(style[.highlighted]).to(beNil())\n                }\n\n                it(\"should add it\") {\n                    style = style.state(.highlighted) { (style: inout StyleRule) -> () in\n                    }\n\n                    expect(style[.highlighted]).toNot(beNil())\n                }\n\n                it(\"should not be merged with .Normal\") {\n                    style = style.state(.highlighted) { (style: inout StyleRule) -> () in\n                    }\n\n                    expect(style[.highlighted]?.color).to(beNil())\n                }\n            }\n\n            context(\"when pseudo class exist\") {\n                beforeEach {\n                    style = style.state(.highlighted) { (style: inout StyleRule) -> () in\n                        style.color = .green\n                    }\n                }\n\n                it(\"should replace it\") {\n                    style = style.state(.highlighted) { (style: inout StyleRule) -> () in\n                    }\n\n                    expect(style[.highlighted]?.color).to(beNil())\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "GaikanTests/Swift/Extension/DictionarySpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 12/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\n@testable import Gaikan\n\nclass DictionarySpec: QuickSpec {\n    override func spec() {\n        describe(\"merge\") {\n            var dictionary1: [String:String?]!\n\n            context(\"when value is replaced\") {\n                context(\"with nil\") {\n                    beforeEach {\n                        let dictionary2: [String:String?] = [ \"hello\": nil ]\n\n                        dictionary1 = [ \"foo\": \"bar\", \"hello\": \"world\" ]\n                        dictionary1.gaikan_merge(dictionary2)\n                    }\n\n                    it(\"should exist\") {\n                        expect(dictionary1[\"hello\"]).toNot(beNil())\n                    }\n\n                    it(\"should CONTAIN nil\") {\n                        expect(dictionary1[\"hello\"]!).to(beNil())\n                    }\n                }\n            }\n\n            context(\"when value is added\") {\n                context(\"with nil\") {\n                    beforeEach {\n                        let dictionary2: [String:String?] = [ \"hello\": nil ]\n\n                        dictionary1 = [ \"foo\": \"bar\" ]\n                        dictionary1.gaikan_merge(dictionary2)\n                    }\n\n                    it(\"should exist\") {\n                        expect(dictionary1[\"hello\"]).toNot(beNil())\n                    }\n\n                    it(\"should CONTAIN nil\") {\n                        expect(dictionary1[\"hello\"]!).to(beNil())\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "GaikanTests/UIKit/Extension/UILabelSpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 11/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\nimport Gaikan\n\nclass UILabelSpec: QuickSpec {\n    override func spec() {\n        var label: UILabel!\n\n        beforeEach {\n            label = UILabel()\n        }\n\n        describe(\"styleInline\") {\n            var style: StyleRule!\n\n            context(\"when giving style\") {\n                it(\"should inherit view styles\") {\n                    style = [ .tintColor: UIColor.blue ]\n\n                    label.styleInline = style\n\n                    expect(label.tintColor) == UIColor.blue\n                }\n\n                it(\"should apply color\") {\n                    style = [ .color: UIColor.red ]\n\n                    label.styleInline = style\n\n                    expect(label.textColor) == UIColor.red\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "GaikanTests/UIKit/Extension/UINavigationBarSpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by Simone Civetta on 26/02/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\nimport Gaikan\n\nclass UINavigationBarSpec: QuickSpec {\n    override func spec() {\n        var navigationBar: UINavigationBar!\n\n        beforeEach {\n            navigationBar = UINavigationBar()\n        }\n\n        describe(\"styleInline\") {\n            var style: StyleRule!\n\n            context(\"when giving style\") {\n                it(\"should inherit view styles\") {\n                    style = [ .tintColor: UIColor.blue ]\n\n                    navigationBar.styleInline = style\n\n                    expect(navigationBar.tintColor) == UIColor.blue\n                }\n\n                it(\"should apply a title font\") {\n                    style = [ .font: UIFont.systemFont(ofSize: 42.0) ]\n\n                    navigationBar.titleStyle.styleInline = style\n\n                    expect(navigationBar.titleTextAttributes![NSFontAttributeName] as? UIFont) == UIFont.systemFont(ofSize: 42.0)\n                }\n\n                it(\"should apply a foreground color to the title\") {\n                    style = [ .color: UIColor.blue ]\n                    \n                    navigationBar.titleStyle.styleInline = style\n                    \n                    expect(navigationBar.titleTextAttributes![NSForegroundColorAttributeName] as? UIColor) == UIColor.blue\n                }\n                \n                it(\"should apply a shadow to the title\") {\n                    let shadow = NSShadow()\n                    shadow.shadowOffset = CGSize(width: 2, height: 3)\n                    \n                    style = [ .textShadow: shadow ]\n                    \n                    navigationBar.titleStyle.styleInline = style\n                    \n                    expect(navigationBar.titleTextAttributes![NSShadowAttributeName] as? NSShadow) == shadow\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "GaikanTests/UIKit/Extension/UIViewSpec.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 10/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Quick\nimport Nimble\n@testable import Gaikan\n\nclass UIViewSpec: QuickSpec {\n\n    override func spec() {\n        var view: UIView!\n\n        beforeEach {\n            view = UIView()\n        }\n\n        describe(\"styleInline\") {\n            var style: StyleRule!\n\n            context(\"when giving style\") {\n\n                it(\"should apply tintColor\") {\n                    style = [ .tintColor: UIColor.red ]\n\n                    view.styleInline = style\n\n                    expect(view.tintColor) == UIColor.red\n                }\n\n                it(\"should apply border\") {\n                    let border = Border(all: (width: 3, color: UIColor.black))\n\n                    style = [ .border: border]\n\n                    view.styleInline = style\n\n                    expect(view.styleLayer.borderLayer.border) == border\n                }\n\n                it(\"should apply visible\") {\n                    style = [ .visible: false ]\n\n                    view.styleInline = style\n                    \n                    expect(view.isHidden) == true\n                }\n            }\n        }\n\n        describe(\"styleState\") {\n            var style: Style!\n\n            beforeEach {\n                style = Style() { (styleRule:inout StyleRule) in\n                        styleRule.tintColor = UIColor.red\n                    }\n                    .state(\"newState\", [.tintColor: UIColor.blue])\n            }\n\n            context(\"when setting\") {\n                beforeEach {\n                    view.styleClass = style\n                    view.styleState = \"newState\"\n                }\n\n                it(\"should apply state tintColor\") {\n                    expect(view.tintColor) == UIColor.blue\n                }\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "GaikanTests/UIKit/Renderer/ConstraintRendererSpec.swift",
    "content": "//\n//  ConstraintRendererSpec.swift\n//  Gaikan\n//\n//  Created by pjechris on 10/09/16.\n//  Copyright © 2016 fr.akane. All rights reserved.\n//\n\nimport Foundation\nimport Nimble\nimport Quick\n@testable import Gaikan\n\nclass ConstraintRendererSpec : QuickSpec {\n    override func spec() {\n        var view: UIView!\n\n        beforeEach {\n            view = UIView()\n        }\n\n        describe(\"render\") {\n            var style: StyleRule!\n\n            context(\"style\") {\n                beforeEach {\n                    style = StyleRule()\n                    style.width = 42\n\n                    ConstraintRenderer.render(view, styleRule: style)\n                }\n\n                it(\"adds constraint\") {\n                    expect(view.constraints.count) == 1\n                }\n\n                context(\"changed\") {\n                    var newStyle = StyleRule()\n\n                    beforeEach {\n                        newStyle.width = 32\n\n                        ConstraintRenderer.render(view, styleRule: newStyle)\n                    }\n\n                    it(\"keeps constraint\") {\n                        expect(view.constraints.count) == 1\n                    }\n\n                    it(\"applies changed constraint\") {\n                        expect(view.constraints.first?.constant) == CGFloat(newStyle.width!.constant)\n                    }\n                }\n\n                context(\"removed\") {\n                    beforeEach {\n                        ConstraintRenderer.render(view, styleRule: StyleRule())\n                    }\n\n                    it(\"removes constraint\") {\n                        expect(view.constraints.count) == 0\n                    }\n                }\n            }\n\n\n\n            context(\"removed constraint\") {\n                beforeEach {\n                    style = StyleRule()\n\n                    style.width = 50\n\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 akane\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Podfile",
    "content": "platform :ios, '9.0'\n\ntarget 'Gaikan' do\n  use_frameworks!\n\n  pod 'KVOController'\n\n  target 'GaikanTests' do\n    inherit! :search_paths\n\n    pod 'Nimble'\n    pod 'Quick'\n  end\n\nend\n"
  },
  {
    "path": "README.md",
    "content": "<h1><img src=\"Doc/Screen/logo.png\" width=\"550\" alt=\"Gaikan\" /></h1>\n\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Gaikan.svg)](https://img.shields.io/cocoapods/v/Gaikan.svg)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Build Status](https://travis-ci.org/akane/Gaikan.svg?branch=travis)](https://travis-ci.org/akane/Gaikan)\n\nGaikan gives you powerful styling capabilities using a declarative DSL in Swift.\n_Inspired by_ <a href=\"https://speakerdeck.com/vjeux/react-css-in-js\">React: CSS in JS</a> and <a href=\"http://glenmaddern.com/articles/css-modules\">CSS modules</a>.\n\nTo style UIView(s) just give them a ```StyleRule``` object:\n\n```Swift\n\nlet myLabelStyle = StyleRule() { (inout style: StyleRule) -> () in\n  style.color = UIColor.redColor()\n  style.border = Border(width: 1, color: UIColor.greenColor())\n  style.font = UIFont(name: \"Courier\", size: 24)\n}\n\nself.label.styleInline = myLabelStyle\n\n```\n\nCheck out the sample to see how to well integrate Gaikan into a project.\n\n<img src=\"Doc/Screen/gaikan.png\" width=\"400\" />\n\n## Features\n\n* Apply a simple style using ```styleInline```....\n* ... or make theming using ```styleClass``` (see below for more information).\n* You can share styles using ```extends``` method to avoid repeating yourself.\n* You can style depending on your control state (enabled, highlighted, ...).\n* You can style `NSAttributedString`!\n\n## Properties\n\nCheck out our page on [properties](Doc/Properties.md) to find which one to use to style your views.\n\nStarting with 0.4, we also added `VirtualView`. This allow you to apply style effects on some non `UIView`\nattributes/objects:\n\n| NSObject          | Virtual view  | Description            | Available since\n| ------------------|---------------|------------------------|------------------\n| UINavigationBar   | titleStyle    | Sets title navigation bar style   | 0.4\n\n## Advanced usage\n\n### NSAttributedString\n\nJust call `NSAttributedString(string:\"Hello\", style: yourStyle)` to get a  styled `NSAttributedString`.\n\nAlternatively you can use `style.textAttributes` to transform `StyleRule` into any `NSAttributedString` compatible dictionary.\n\n### Theme\n\n```Theme``` packages together multiple ```Style``` definitions to make a whole set.\n\n```Swift\n\npublic class SampleTheme : Theme {\n  /// Non static is important if you want to reference them from InterfaceBuilder\n  lazy let logo = Style(...)\n  lazy let title = Style(...)\n}\n\nclass CustomView: UIView {\n  typealias ThemeType = RailTheme\n\n  @IBOutlet weak var title: UILabel!\n  @IBOutlet weak var footnote: UILabel!\n  @IBOutlet weak var logo: UIImageView!\n  @IBOutlet weak var button: UIButton!\n\n  override func awakeFromNib() {\n    self.title.styleClass = SampleTheme().logo\n    self.logo.styleClass = SampleTheme().title\n  }\n}\n\n```\n\nYou can also apply themes right from InterfaceBuilder:\n\n<img src=\"Doc/Screen/ib-styleclass.png\" width=\"400\" />\n\n### Extends\n\nYou can extend your styles to reuse common features:\n\n```Swift\nfunc primary() -> Style {\n  return [\n    .Color: UIColor.greenColor()\n  ]\n}\n\nfunc large() -> Style {\n  return [\n    .Font: UIFont.systemFontOfSize(18)\n  ]\n}\n\nfunc merged() -> Style {\n  return Style().extends(primary(), large())\n  // color: green, font: 18\n}\n\n```\n\n### States\n\nYou can define styles for states. They'll extend from the default state :\n\n```Swift\nfunc style() -> Style {\n  return Style() { (inout style: StyleRule) -> Void in\n    style.tintColor = UIColor.whiteColor()\n  }\n  .state(.Selected, attributes: [\n      .TintColor: UIColor.grayColor().colorWithAlphaComponent(0.6)\n  ]\n}\n```\n\nDon't hesitate to take a look at the sample to better understand how it works.\n\n## Contributing\n\nThis project was first developed by [Xebia IT Architects](http://xebia.fr) in Paris, France. We will continue working and investing on it.\n\nWe encourage the community to contribute to the project by opening tickets and/or pull requests. Here a some of the subjects we are interested in:\n\n- Add UIStackView attributes (distribution, spacing, ...).\n- Support for multiple layout engines (AutoLayout, LayoutKit, Flexbox, ...)\n- Allow to define 1+ borders and corner radius. Currently defining border and radius set the 4 of them (top, bottom, left, right).\n- Better support for IBDesignable (if possible).\n- Add debugging information (style name, inheritance, ...).\n- Better integration with NSAttributedString.\n- Support for traits.\n- Anything you have in mind!\n\n## License\n\nGaikan is released under the MIT License. Please see the LICENSE file for details.\n"
  },
  {
    "path": "Sample/AppDelegate.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 03/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n\n}\n\n"
  },
  {
    "path": "Sample/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\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": "Sample/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample/Assets.xcassets/background.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg.jpg\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample/Assets.xcassets/logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Sample/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"9059\" systemVersion=\"15B42\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9049\"/>\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=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <animations/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\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": "Sample/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"AJl-7z-nnU\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\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        <!--Navigation Controller-->\n        <scene sceneID=\"e1l-FZ-XFj\">\n            <objects>\n                <navigationController id=\"AJl-7z-nnU\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"7Ch-Lv-eYd\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"BYZ-38-t0r\" kind=\"relationship\" relationship=\"rootViewController\" id=\"hRn-Ka-Wgm\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"4bO-fc-QLu\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-419\" y=\"350\"/>\n        </scene>\n        <!--Welcome-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"Sample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\" customClass=\"CustomView\" customModule=\"Sample\" customModuleProvider=\"target\">\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\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" misplaced=\"YES\" text=\"Gaikan\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vyz-xj-UlD\">\n                                <rect key=\"frame\" x=\"275\" y=\"290.5\" width=\"50\" height=\"19\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"42\" id=\"cY9-bk-1QW\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" name=\"Optima-Regular\" family=\"Optima\" pointSize=\"16\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"styleName\" value=\"title\"/>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"themeClassName\" value=\"SampleTheme\"/>\n                                </userDefinedRuntimeAttributes>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"cY9-bk-1QW\"/>\n                                    </mask>\n                                </variation>\n                            </label>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" misplaced=\"YES\" text=\"Your new styling framework. For iOS.\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l5F-dS-U93\">\n                                <rect key=\"frame\" x=\"159.5\" y=\"309.5\" width=\"281.5\" height=\"20.5\"/>\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                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"styleName\" value=\"footnote\"/>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"themeClassName\" value=\"SampleTheme\"/>\n                                </userDefinedRuntimeAttributes>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" misplaced=\"YES\" image=\"logo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QjQ-fv-UZ9\">\n                                <rect key=\"frame\" x=\"223.5\" y=\"106\" width=\"153\" height=\"153\"/>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"styleName\" value=\"logo\"/>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"themeClassName\" value=\"SampleTheme\"/>\n                                </userDefinedRuntimeAttributes>\n                            </imageView>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" misplaced=\"YES\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Vy-ih-7cJ\">\n                                <rect key=\"frame\" x=\"270\" y=\"372\" width=\"60\" height=\"24\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"24\" id=\"0oR-vS-xYT\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"60\" id=\"ksB-7X-gAf\"/>\n                                </constraints>\n                                <state key=\"normal\" title=\"Got it!\"/>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"styleName\" value=\"getIt\"/>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"themeClassName\" value=\"SampleTheme\"/>\n                                </userDefinedRuntimeAttributes>\n                                <connections>\n                                    <action selector=\"gotIt\" destination=\"8bC-Xf-vdC\" eventType=\"touchUpInside\" id=\"3tv-K3-2WI\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"0.99997437000274658\" blue=\"0.99999129772186279\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"0Vy-ih-7cJ\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"ISz-g8-d0Q\"/>\n                            <constraint firstItem=\"QjQ-fv-UZ9\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"LWw-Wi-VaU\"/>\n                            <constraint firstItem=\"l5F-dS-U93\" firstAttribute=\"top\" secondItem=\"vyz-xj-UlD\" secondAttribute=\"bottom\" id=\"Yz2-I4-p3k\"/>\n                            <constraint firstItem=\"l5F-dS-U93\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"ihS-tm-wzR\"/>\n                            <constraint firstItem=\"vyz-xj-UlD\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"is3-Of-qAn\"/>\n                            <constraint firstItem=\"QjQ-fv-UZ9\" firstAttribute=\"top\" secondItem=\"y3c-jy-aDJ\" secondAttribute=\"bottom\" constant=\"42\" id=\"lpk-aG-RDK\"/>\n                            <constraint firstItem=\"0Vy-ih-7cJ\" firstAttribute=\"top\" secondItem=\"l5F-dS-U93\" secondAttribute=\"bottom\" constant=\"42\" id=\"q7P-PW-7sD\"/>\n                            <constraint firstItem=\"vyz-xj-UlD\" firstAttribute=\"centerY\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerY\" id=\"qcR-Nz-UU5\"/>\n                        </constraints>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"styleName\" value=\"home\"/>\n                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"themeClassName\" value=\"SampleTheme\"/>\n                        </userDefinedRuntimeAttributes>\n                        <connections>\n                            <outlet property=\"button\" destination=\"0Vy-ih-7cJ\" id=\"Hpf-II-fhO\"/>\n                            <outlet property=\"footnote\" destination=\"l5F-dS-U93\" id=\"rNQ-md-OhO\"/>\n                            <outlet property=\"logo\" destination=\"QjQ-fv-UZ9\" id=\"raz-7l-wub\"/>\n                            <outlet property=\"title\" destination=\"vyz-xj-UlD\" id=\"m3u-pg-cEf\"/>\n                        </connections>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Welcome\" id=\"gba-ZH-A6k\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"logo\" width=\"153\" height=\"153\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Sample/CustomView.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 16/11/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Gaikan\n\nclass CustomView : UIView {\n\n    @IBOutlet weak var title: UILabel!\n    @IBOutlet weak var footnote: UILabel!\n    @IBOutlet weak var logo: UIImageView!\n    @IBOutlet weak var button: UIButton!\n\n    @IBAction func gotIt() {\n        self.button.setTitle(\"Great!\", for: .normal)\n        self.button.styleClass = SampleTheme().gotIt\n    }\n}\n"
  },
  {
    "path": "Sample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample/Theme/Gradient.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 09/05/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Gaikan\n\nextension Gradient {\n    static func orangeGradient() -> Gradient {\n        return Gradient(\n            (color: UIColor(red: 251/255, green: 208/255, blue: 176/255, alpha: 0.5), position: 0),\n            (color: UIColor(red: 137/255, green: 106/255, blue: 111/255, alpha: 0.5), position: 100)\n        )\n    }\n}"
  },
  {
    "path": "Sample/Theme/SampleTheme.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 09/05/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport Gaikan\n\nclass SampleTheme : Theme {\n    var home =  Style() { (style: inout StyleRule) -> () in\n        style.background = Background(UIImage(named: \"background\")!, Gradient.orangeGradient())\n    }\n\n    var logo = Style() { (style: inout StyleRule) -> () in\n        style.tintColor = UIColor.logoColor()\n        style.width = 90\n        style.height = style.width\n    }\n\n    var title: Style = [\n        .color: UIColor.white,\n        .font: UIFont.titleFont()\n    ]\n\n    var footnote =  Style() { (style: inout StyleRule) -> () in\n        style.font = UIFont.footnoteFont()\n        style.color = UIColor.orangeRail()\n    }\n\n    var getIt: Style = [\n        .border: Border(all: (width: 1, color: UIColor.white)),\n        .color: UIColor.white\n    ]\n\n    var gotIt: Style = [\n        .color: UIColor.orange\n    ]\n}\n"
  },
  {
    "path": "Sample/Theme/UIColor.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 09/05/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport UIKit\n\nextension UIColor {\n    static func orangeRail() -> UIColor {\n        return UIColor(red: 251/255, green: 208/255, blue: 176/255, alpha: 1)\n    }\n\n    class func logoColor() -> UIColor {\n        return UIColor.white\n    }\n}\n"
  },
  {
    "path": "Sample/Theme/UIFont.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 09/05/16.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport Foundation\nimport UIKit\n\nextension UIFont {\n    class func bodyFont() -> UIFont? {\n        return UIFont(name: \"Avenir\", size: 12)\n    }\n\n    class func titleFont() -> UIFont? {\n        return UIFont(name: \"AvenirNext-Bold\", size: 38)\n    }\n\n    class func footnoteFont() -> UIFont? {\n        return UIFont(name: \"AvenirNext-Italic\", size: 18)\n    }\n}"
  },
  {
    "path": "Sample/ViewController.swift",
    "content": "//\n// This file is part of Gaikan\n//\n// Created by JC on 03/09/15.\n// For the full copyright and license information, please view the LICENSE\n// file that was distributed with this source code\n//\n\nimport UIKit\nimport Gaikan\n\nclass ViewController: UIViewController {\n    var customView: CustomView!\n\n    override func viewDidLoad() {\n        let titleStyle: StyleRule = [\n            .font: UIFont(name: \"AvenirNext-Italic\", size: 16),\n            .color: UIColor.purple\n        ]\n        \n        super.viewDidLoad()\n\n        self.customView = self.view as! CustomView\n\n        self.navigationController?.navigationBar.titleStyle.styleInline = titleStyle\n    }\n}\n\n"
  }
]