[
  {
    "path": ".gitignore",
    "content": "# OS X\n\n.DS_Store\n\n# 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"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 IFTTT Inc\nCopyright (c) 2015 David Román\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Popsicle/EasingFunction.swift",
    "content": "//\n//  EasingFunction.swift\n//  RazzleDazzle\n//\n//  Created by Laura Skelton on 6/15/15.\n//  Copyright (c) 2015 IFTTT. All rights reserved.\n//\n\n// Ported to Swift from Robert Böhnke's RBBAnimation, original available here:\n// <https://github.com/robb/RBBAnimation/blob/a29cafe2fa91e62573cc9967990b0ad2a6b17a76/RBBAnimation/RBBEasingFunction.m>\n\npublic typealias EasingFunction = (Progress) -> (Progress)\n\npublic let EasingFunctionLinear: EasingFunction = { t in\n\treturn t\n}\n\npublic let EasingFunctionEaseInQuad: EasingFunction = { t in\n\treturn t * t\n}\n\npublic let EasingFunctionEaseOutQuad: EasingFunction = { t in\n\treturn t * (2 - t)\n}\n\npublic let EasingFunctionEaseInOutQuad: EasingFunction = { t in\n\tif (t < 0.5) { return 2 * t * t }\n\treturn -1 + ((4 - (2 * t)) * t)\n}\n\npublic let EasingFunctionEaseInCubic: EasingFunction = { t in\n\treturn t * t * t\n}\n\npublic let EasingFunctionEaseOutCubic: EasingFunction = { t in\n\treturn pow(t - 1, 3) + 1\n}\n\npublic let EasingFunctionEaseInOutCubic: EasingFunction = { t in\n\tif (t < 0.5) { return 4 * pow(t, 3) }\n\treturn ((t - 1) * pow((2 * t) - 2, 2)) + 1\n}\n\npublic let EasingFunctionEaseInBounce: EasingFunction = { t in\n\treturn 1 - EasingFunctionEaseOutBounce(1 - t)\n}\n\npublic let EasingFunctionEaseOutBounce: EasingFunction = { t in\n\tif (t < (4.0 / 11.0)) {\n\t\treturn pow((11.0 / 4.0), 2) * pow(t, 2)\n\t}\n\n\tif (t < (8.0 / 11.0)) {\n\t\treturn (3.0 / 4.0) + (pow((11.0 / 4.0), 2) * pow(t - (6.0 / 11.0), 2))\n\t}\n\n\tif (t < (10.0 / 11.0)) {\n\t\treturn (15.0 / 16.0) + (pow((11.0 / 4.0), 2) * pow(t - (9.0 / 11.0), 2))\n\t}\n\n\treturn (63.0 / 64.0) + (pow((11.0 / 4.0), 2) * pow(t - (21.0 / 22.0), 2))\n}"
  },
  {
    "path": "Popsicle/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>2.0.1</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": "Popsicle/Interpolable.swift",
    "content": "//\n//  Interpolable.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 01/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\n/// A value from 0 to 1 defining the progress of a certain interpolation between two `Interpolable` values.\npublic typealias Progress = Double\n\n/// Defines a common protocol for all interpolable values.\n///\n/// Types conforming to this protocol are available to use as a `Interpolation` generic type.\npublic protocol Interpolable {\n\ttypealias ValueType\n\n\t/// Defines how an interpolation should be performed between two given values of the type conforming to this protocol.\n\tstatic func interpolate(from fromValue: ValueType, to toValue: ValueType, withProgress: Progress) -> ValueType\n\n\t/// Converts a value to a valid `Foundation` object, if necessary.\n\tstatic func objectify(value: ValueType) -> AnyObject\n}\n\nextension Bool: Interpolable {\n\tpublic static func interpolate(from fromValue: Bool, to toValue: Bool, withProgress progress: Progress) -> Bool {\n\t\treturn progress >= 0.5 ? toValue : fromValue\n\t}\n\n\tpublic static func objectify(value: Bool) -> AnyObject {\n\t\treturn NSNumber(bool: value)\n\t}\n}\n\nextension CGFloat: Interpolable {\n\tpublic static func interpolate(from fromValue: CGFloat, to toValue: CGFloat, withProgress progress: Progress) -> CGFloat {\n\t\treturn fromValue+(toValue-fromValue)*CGFloat(progress)\n\t}\n\n\tpublic static func objectify(value: CGFloat) -> AnyObject {\n\t\treturn NSNumber(double: Double(value))\n\t}\n}\n\nextension CGPoint: Interpolable {\n\tpublic static func interpolate(from fromValue: CGPoint, to toValue: CGPoint, withProgress progress: Progress) -> CGPoint {\n\t\tlet x = CGFloat.interpolate(from: fromValue.x, to: toValue.x, withProgress: progress)\n\t\tlet y = CGFloat.interpolate(from: fromValue.y, to: toValue.y, withProgress: progress)\n\n\t\treturn CGPointMake(x, y)\n\t}\n\n\tpublic static func objectify(value: CGPoint) -> AnyObject {\n\t\treturn NSValue(CGPoint: value)\n\t}\n}\n\nextension CGSize: Interpolable {\n\tpublic static func interpolate(from fromValue: CGSize, to toValue: CGSize, withProgress progress: Progress) -> CGSize {\n\t\tlet width = CGFloat.interpolate(from: fromValue.width, to: toValue.width, withProgress: progress)\n\t\tlet height = CGFloat.interpolate(from: fromValue.height, to: toValue.height, withProgress: progress)\n\n\t\treturn CGSizeMake(width, height)\n\t}\n\n\tpublic static func objectify(value: CGSize) -> AnyObject {\n\t\treturn NSValue(CGSize: value)\n\t}\n}\n\nextension CGRect: Interpolable {\n\tpublic static func interpolate(from fromValue: CGRect, to toValue: CGRect, withProgress progress: Progress) -> CGRect {\n\t\tlet origin = CGPoint.interpolate(from: fromValue.origin, to: toValue.origin, withProgress: progress)\n\t\tlet size = CGSize.interpolate(from: fromValue.size, to: toValue.size, withProgress: progress)\n\n\t\treturn CGRectMake(origin.x, origin.y, size.width, size.height)\n\t}\n\n\tpublic static func objectify(value: CGRect) -> AnyObject {\n\t\treturn NSValue(CGRect: value)\n\t}\n}\n\nextension CGAffineTransform: Interpolable {\n\tpublic static func interpolate(from fromValue: CGAffineTransform, to toValue: CGAffineTransform, withProgress progress: Progress) -> CGAffineTransform {\n\t\tlet tx1 = CGAffineTransformGetTranslationX(fromValue)\n\t\tlet tx2 = CGAffineTransformGetTranslationX(toValue)\n\t\tlet tx = CGFloat.interpolate(from: tx1, to: tx2, withProgress: progress)\n\n\t\tlet ty1 = CGAffineTransformGetTranslationY(fromValue)\n\t\tlet ty2 = CGAffineTransformGetTranslationY(toValue)\n\t\tlet ty = CGFloat.interpolate(from: ty1, to: ty2, withProgress: progress)\n\n\t\tlet sx1 = CGAffineTransformGetScaleX(fromValue)\n\t\tlet sx2 = CGAffineTransformGetScaleX(toValue)\n\t\tlet sx = CGFloat.interpolate(from: sx1, to: sx2, withProgress: progress)\n\n\t\tlet sy1 = CGAffineTransformGetScaleY(fromValue)\n\t\tlet sy2 = CGAffineTransformGetScaleY(toValue)\n\t\tlet sy = CGFloat.interpolate(from: sy1, to: sy2, withProgress: progress)\n\n\t\tlet deg1 = CGAffineTransformGetRotation(fromValue)\n\t\tlet deg2 = CGAffineTransformGetRotation(toValue)\n\t\tlet deg = CGFloat.interpolate(from: deg1, to: deg2, withProgress: progress)\n\n\t\treturn CGAffineTransformMake(tx, ty, sx, sy, deg)\n\t}\n\n\tpublic static func objectify(value: CGAffineTransform) -> AnyObject {\n\t\treturn NSValue(CGAffineTransform: value)\n\t}\n}\n\n/// `CGAffineTransformMake()`, The Right Way™\n///\n/// - parameter tx:  translation on x axis.\n/// - parameter ty:  translation on y axis.\n/// - parameter sx:  scale factor for width.\n/// - parameter sy:  scale factor for height.\n/// - parameter deg: degrees.\npublic func CGAffineTransformMake(tx: CGFloat, _ ty: CGFloat, _ sx: CGFloat, _ sy: CGFloat, _ deg: CGFloat) -> CGAffineTransform {\n\tlet translationTransform = CGAffineTransformMakeTranslation(tx, ty)\n\tlet scaleTransform = CGAffineTransformMakeScale(sx, sy)\n\tlet rotationTransform = CGAffineTransformMakeRotation(deg*CGFloat(M_PI_2)/180)\n\n\treturn CGAffineTransformConcat(CGAffineTransformConcat(translationTransform, scaleTransform), rotationTransform)\n}\n\nfunc CGAffineTransformGetTranslationX(t: CGAffineTransform) -> CGFloat { return t.tx }\nfunc CGAffineTransformGetTranslationY(t: CGAffineTransform) -> CGFloat { return t.ty }\nfunc CGAffineTransformGetScaleX(t: CGAffineTransform) -> CGFloat { return sqrt(t.a * t.a + t.c * t.c) }\nfunc CGAffineTransformGetScaleY(t: CGAffineTransform) -> CGFloat { return sqrt(t.b * t.b + t.d * t.d) }\nfunc CGAffineTransformGetRotation(t: CGAffineTransform) -> CGFloat { return (atan2(t.b, t.a)*180)/CGFloat(M_PI_2) }\n\nextension UIColor: Interpolable {\n\tpublic static func interpolate(from fromValue: UIColor, to toValue: UIColor, withProgress progress: Progress) -> UIColor {\n\t\tvar fromRed: CGFloat = 0\n\t\tvar fromGreen: CGFloat = 0\n\t\tvar fromBlue: CGFloat = 0\n\t\tvar fromAlpha: CGFloat = 0\n\n\t\tvar toRed: CGFloat = 0\n\t\tvar toGreen: CGFloat = 0\n\t\tvar toBlue: CGFloat = 0\n\t\tvar toAlpha: CGFloat = 0\n\n\t\tfromValue.getRed(&fromRed, green: &fromGreen, blue: &fromBlue, alpha: &fromAlpha)\n\t\ttoValue.getRed(&toRed, green: &toGreen, blue: &toBlue, alpha: &toAlpha)\n\n\t\tlet red = CGFloat.interpolate(from: fromRed, to: toRed, withProgress: progress)\n\t\tlet green = CGFloat.interpolate(from: fromGreen, to: toGreen, withProgress: progress)\n\t\tlet blue = CGFloat.interpolate(from: fromBlue, to: toBlue, withProgress: progress)\n\t\tlet alpha = CGFloat.interpolate(from: fromAlpha, to: toAlpha, withProgress: progress)\n\n\t\treturn UIColor(red: red, green: green, blue: blue, alpha: alpha)\n\t}\n\n\tpublic static func objectify(value: UIColor) -> AnyObject {\n\t\treturn value\n\t}\n}"
  },
  {
    "path": "Popsicle/Interpolation.swift",
    "content": "//\n//  Interpolation.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\nprotocol ObjectReferable {\n\tvar objectReference: NSObject { get }\n}\n\nprotocol Timeable {\n\tfunc setTime(time: Time)\n}\n\n/// `Interpolation` defines an interpolation which changes some `NSObject` value given by a key path.\npublic class Interpolation<T: Interpolable> : Equatable, ObjectReferable, Timeable {\n\tlet object: NSObject\n\tlet keyPath: String\n\n\tlet originalObject: NSObject\n\tvar objectReference: NSObject { return self.originalObject }\n\n\ttypealias Pole = (T.ValueType, EasingFunction)\n\tprivate var poles: [Time: Pole] = [:]\n\n\tpublic init<U: NSObject>(_ object: U, _ keyPath: KeyPath<U, T>) {\n\t\tself.originalObject = object\n\t\t(self.object, self.keyPath) = NSObject.filteredObjectAndKeyPath(withObject: object, andKeyPath: keyPath)\n\n\t\tif !self.object.respondsToSelector(NSSelectorFromString(self.keyPath)) {\n\t\t\tassertionFailure(\"Please make sure the key path \\\"\" + self.keyPath + \"\\\" you're referring to for an object of type <\" + NSStringFromClass(self.object.dynamicType) + \"> is invalid\")\n\t\t}\n\t}\n\n\t/// A convenience initializer with `keyPath` as a `String` parameter. You should try to avoid this method unless absolutely necessary, due to its unsafety.\n\tpublic convenience init(_ object: NSObject, _ keyPath: String) {\n\t\tself.init(object, KeyPath(keyPathable: keyPath))\n\t}\n\n\t/// Sets a specific easing function for the interpolation to be performed with for a given time.\n\t///\n\t/// - parameter easingFunction: the easing function to use.\n\t/// - parameter time:           the time where the easing function should be used.\n\tpublic func setEasingFunction(easingFunction: EasingFunction, forTime time: Time) {\n\t\tself.poles[time]?.1 = easingFunction\n\t}\n\n\tpublic subscript(time1: Time, rest: Time...) -> T.ValueType? {\n\t\tget {\n\t\t\tassert(poles.count >= 2, \"You must specify at least 2 poles for an interpolation to be performed\")\n\t\t\tif let existingPole = poles[time1] {\n\t\t\t\treturn existingPole.0\n\t\t\t} else if let timeInterval = poles.keys.sort().elementsAround(time1) {\n\n\t\t\t\tguard let fromTime = timeInterval.0 else {\n\t\t\t\t\treturn poles[timeInterval.1!]!.0\n\t\t\t\t}\n\n\t\t\t\tguard let toTime = timeInterval.1 else {\n\t\t\t\t\treturn poles[timeInterval.0!]!.0\n\t\t\t\t}\n\n\t\t\t\tlet easingFunction = poles[fromTime]!.1\n\t\t\t\tlet progress = easingFunction(self.progress(fromTime, toTime, time1))\n\t\t\t\treturn T.interpolate(from: poles[fromTime]!.0, to: poles[toTime]!.0, withProgress: progress)\n\t\t\t}\n\n\t\t\treturn nil\n\t\t}\n\n\t\tset {\n\t\t\tvar times = [time1]\n\t\t\ttimes.appendContentsOf(rest)\n\t\t\tfor time in times {\n\t\t\t\tpoles[time] = (newValue!, EasingFunctionLinear)\n\t\t\t}\n\t\t}\n\t}\n\n\tfunc progress(fromTime: Time, _ toTime: Time, _ currentTime: Time) -> Progress {\n\t\tlet p = (currentTime-fromTime)/(toTime-fromTime)\n\t\treturn min(1, max(0, p))\n\t}\n\n\tfunc setTime(time: Time) {\n\t\tself.object.setValue(T.objectify(self[time]!), forKeyPath: self.keyPath)\n\t}\n}\n\npublic func ==<T: Interpolable>(lhs: Interpolation<T>, rhs: Interpolation<T>) -> Bool {\n\treturn lhs.object == rhs.object && lhs.keyPath == rhs.keyPath\n}\n\nextension Array where Element: Comparable {\n\tfunc elementPairs() -> [(Element, Element)]? {\n\t\tif self.count >= 2 {\n\t\t\tvar elementPairs: [(Element, Element)] = []\n\n\t\t\tfor (i, e) in self.sort().enumerate() {\n\t\t\t\tif i+1 < self.count {\n\t\t\t\t\telementPairs.append((e, self[i+1]))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn elementPairs\n\t\t}\n\n\t\treturn nil\n\t}\n\n\tfunc elementsAround(element: Element) -> (Element?, Element?)? {\n\t\tif let pairs = self.elementPairs() {\n\n\t\t\tlet minElement = pairs.first!.0\n\t\t\tlet maxElement = pairs.last!.1\n\n\t\t\tif element < minElement {\n\t\t\t\treturn (nil, minElement)\n\t\t\t}\n\n\t\t\tif element > maxElement {\n\t\t\t\treturn (maxElement, nil)\n\t\t\t}\n\n\t\t\tfor (e1, e2) in pairs where (e1...e2).contains(element) {\n\t\t\t\treturn (e1, e2)\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n}"
  },
  {
    "path": "Popsicle/Interpolator.swift",
    "content": "//\n//  Interpolator.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\n/// Value type on which interpolation values rely on.\npublic typealias Time = Double\n\n/// `Interpolator` collects and coordinates a set of related interpolations through its `time` property.\npublic class Interpolator {\n\tvar interpolations = [Timeable]()\n\n\tpublic init() {}\n\n\tpublic func addInterpolation<T: Interpolable>(interpolation: Interpolation<T>) {\n\t\tself.interpolations.append(interpolation)\n\t}\n\n\tpublic var time: Time = 0 {\n\t\tdidSet {\n\t\t\tself.interpolations.forEach { $0.setTime(self.time) }\n\t\t}\n\t}\n\n\tpublic func removeInterpolation<T: Interpolable>(interpolation: Interpolation<T>) {\n\t\tfor (index, element) in self.interpolations.enumerate() {\n\t\t\tif let interpolation = element as? Interpolation<T> {\n\t\t\t\tif interpolation == interpolation {\n\t\t\t\t\tself.interpolations.removeAtIndex(index)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// Removes all interpolations containing the specified object.\n\tpublic func removeInterpolations(forObject object: NSObject) {\n\t\tfor (index, element) in self.interpolations.enumerate() {\n\t\t\tif let interpolation = element as? ObjectReferable {\n\t\t\t\tif interpolation.objectReference == object {\n\t\t\t\t\tself.interpolations.removeAtIndex(index)\n\t\t\t\t\tself.removeInterpolations(forObject: object) // Recursivity FTW\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic func removeAllInterpolations() {\n\t\tself.interpolations.removeAll()\n\t}\n}"
  },
  {
    "path": "Popsicle/KeyPath.swift",
    "content": "//\n//  KeyPath.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\n/// `KeyPathable` defines how a value is transformed to a valid `NSObject` key path.\npublic protocol KeyPathable {\n\tfunc stringify() -> String\n}\n\nextension String : KeyPathable {\n\tpublic func stringify() -> String {\n\t\treturn self\n\t}\n}\n\nextension NSLayoutAttribute: KeyPathable {\n\tpublic func stringify() -> String {\n\n\t\tvar type = \"UnknownAttribute\"\n\n\t\tswitch(self) {\n\t\tcase .Left:\n\t\t\ttype = \"Left\"\n\n\t\tcase .Right:\n\t\t\ttype = \"Right\"\n\n\t\tcase .Top:\n\t\t\ttype = \"Top\"\n\n\t\tcase .Bottom:\n\t\t\ttype = \"Bottom\"\n\n\t\tcase .Leading:\n\t\t\ttype = \"Leading\"\n\n\t\tcase .Trailing:\n\t\t\ttype = \"Trailing\"\n\n\t\tcase .Width:\n\t\t\ttype = \"Width\"\n\n\t\tcase .Height:\n\t\t\ttype = \"Height\"\n\n\t\tcase .CenterX:\n\t\t\ttype = \"CenterX\"\n\n\t\tcase .CenterY:\n\t\t\ttype = \"CenterY\"\n\n\t\tcase .LastBaseline:\n\t\t\ttype = \"Baseline\"\n\n\t\tcase .FirstBaseline:\n\t\t\ttype = \"FirstBaseline\"\n\n\t\tcase .LeftMargin:\n\t\t\ttype = \"LeftMargin\"\n\n\t\tcase .RightMargin:\n\t\t\ttype = \"RightMargin\"\n\n\t\tcase .TopMargin:\n\t\t\ttype = \"TopMargin\"\n\n\t\tcase .BottomMargin:\n\t\t\ttype = \"BottomMargin\"\n\n\t\tcase .LeadingMargin:\n\t\t\ttype = \"LeadingMargin\"\n\n\t\tcase .TrailingMargin:\n\t\t\ttype = \"TrailingMargin\"\n\n\t\tcase .CenterXWithinMargins:\n\t\t\ttype = \"CenterXWithinMargins\"\n\n\t\tcase .CenterYWithinMargins:\n\t\t\ttype = \"CenterYWithinMargins\"\n\n\t\tcase .NotAnAttribute:\n\t\t\ttype = \"NotAnAttribute\"\n\t\t}\n\n\t\treturn \"NSLayoutAttribute.\" + type\n\t}\n}\n\n/// `KeyPath` defines a `NSObject`'s key path, constrained to specific `NSObject` and `Interpolable` types for higher safety.\npublic struct KeyPath<T: NSObject, U: Interpolable> {\n\tlet keyPathable: KeyPathable\n\n\tpublic init(keyPathable: KeyPathable) {\n\t\tself.keyPathable = keyPathable\n\t}\n}\n\npublic let alpha                          = KeyPath<UIView, CGFloat>(keyPathable: \"alpha\")\npublic let backgroundColor                = KeyPath<UIView, UIColor>(keyPathable: \"backgroundColor\")\npublic let barTintColor                   = KeyPath<UIView, UIColor>(keyPathable: \"barTintColor\")\npublic let borderColor                    = KeyPath<CALayer, CGFloat>(keyPathable: \"borderColor\")\npublic let borderWidth                    = KeyPath<CALayer, CGFloat>(keyPathable: \"borderWidth\")\npublic let constant                       = KeyPath<NSLayoutConstraint, CGFloat>(keyPathable: \"constant\")\npublic let cornerRadius                   = KeyPath<CALayer, CGFloat>(keyPathable: \"cornerRadius\")\npublic let hidden                         = KeyPath<UIView, Bool>(keyPathable: \"hidden\")\npublic let textColor                      = KeyPath<UIView, UIColor>(keyPathable: \"textColor\")\npublic let tintColor                      = KeyPath<UIView, UIColor>(keyPathable: \"tintColor\")\npublic let transform                      = KeyPath<UIView, CGAffineTransform>(keyPathable: \"transform\")\n\npublic let baselineConstraint             = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.LastBaseline)\npublic let firstBaselineConstraint        = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.FirstBaseline)\n\npublic let topConstraint                  = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Top)\npublic let leftConstraint                 = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Left)\npublic let rightConstraint                = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Right)\npublic let bottomConstraint               = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Bottom)\npublic let leadingConstraint              = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Leading)\npublic let trailingConstraint             = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Trailing)\n\npublic let leftMarginConstraint           = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.LeftMargin)\npublic let rightMarginConstraint          = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.RightMargin)\npublic let topMarginConstraint            = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.TopMargin)\npublic let bottomMarginConstraint         = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.BottomMargin)\npublic let leadingMarginConstraint        = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.LeadingMargin)\npublic let trailingMarginConstraint       = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.TrailingMargin)\n\npublic let centerXConstraint              = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.CenterX)\npublic let centerYConstraint              = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.CenterY)\n\npublic let centerXWithinMarginsConstraint = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.CenterXWithinMargins)\npublic let centerYWithinMarginsConstraint = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.CenterYWithinMargins)\n\npublic let widthConstraint                = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Width)\npublic let heightConstraint               = KeyPath<UIView, CGFloat>(keyPathable: NSLayoutAttribute.Height)\n\nextension NSObject {\n\tstatic func filteredObjectAndKeyPath<T: NSObject, U: Interpolable>(withObject object: T, andKeyPath keyPath: KeyPath<T, U>) -> (NSObject, String) {\n\t\tif let view = object as? UIView, let superview = view.superview, let attribute = keyPath.keyPathable as? NSLayoutAttribute {\n            \n            let constrainedView = (attribute == .Width || attribute == .Height) ? view : superview\n            \n            for constraint in constrainedView.constraints where\n                !constraint.isKindOfClass(NSClassFromString(\"NSContentSizeLayoutConstraint\")!) &&\n                ((constraint.firstItem as? NSObject == view && constraint.firstAttribute == attribute) ||\n                    (constraint.secondItem as? NSObject == view && constraint.secondAttribute == attribute)) {\n                        return (constraint, constant.keyPathable.stringify())\n            }\n\t\t}\n\n\t\treturn (object, keyPath.keyPathable.stringify())\n\t}\n}\n"
  },
  {
    "path": "Popsicle/Popsicle.h",
    "content": "//\n//  Popsicle.h\n//  Popsicle\n//\n//  Created by David Román Aguirre on 01/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\n@import UIKit;\n\n//! Project version number for Popsicle.\nFOUNDATION_EXPORT double PopsicleVersionNumber;\n\n//! Project version string for Popsicle.\nFOUNDATION_EXPORT const unsigned char PopsicleVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Popsicle/PublicHeader.h>\n"
  },
  {
    "path": "Popsicle.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name                  = \"Popsicle\"\n  s.version               = \"2.0.1\"\n  s.summary               = \"Delightful, extensible Swift value interpolation framework\"\n  s.homepage              = \"https://github.com/DavdRoman/Popsicle\"\n  s.author                = { \"David Román\" => \"d@vidroman.me\" }\n  s.license               = { :type => 'MIT', :file => 'LICENSE' }\n  s.social_media_url      = 'https://twitter.com/DavdRoman'\n\n  s.platform              = :ios, '8.0'\n  s.ios.deployment_target = '8.0'\n\n  s.source                = { :git => \"https://github.com/DavdRoman/Popsicle.git\", :tag => s.version.to_s }\n  s.source_files          = 'Popsicle/*.{h,swift}'\n  s.frameworks            = 'UIKit'\n  s.requires_arc          = true\nend\n"
  },
  {
    "path": "Popsicle.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\tD53B324C1BE65FF800A1820B /* Interpolable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53B324B1BE65FF800A1820B /* Interpolable.swift */; };\n\t\tD53E5FD91BEA12340043DF84 /* EasingFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FD81BEA12340043DF84 /* EasingFunction.swift */; };\n\t\tD53E5FDB1BEA13600043DF84 /* Interpolation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FDA1BEA13600043DF84 /* Interpolation.swift */; };\n\t\tD53E5FDD1BEA13900043DF84 /* Interpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FDC1BEA13900043DF84 /* Interpolator.swift */; };\n\t\tD53E5FE51BEA145F0043DF84 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FE41BEA145F0043DF84 /* AppDelegate.swift */; };\n\t\tD53E5FE71BEA145F0043DF84 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FE61BEA145F0043DF84 /* ViewController.swift */; };\n\t\tD53E5FEC1BEA145F0043DF84 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D53E5FEB1BEA145F0043DF84 /* Assets.xcassets */; };\n\t\tD53E5FEF1BEA145F0043DF84 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D53E5FED1BEA145F0043DF84 /* LaunchScreen.storyboard */; };\n\t\tD53E5FF71BEA16D70043DF84 /* PageViews.xib in Resources */ = {isa = PBXBuildFile; fileRef = D53E5FF61BEA16D70043DF84 /* PageViews.xib */; };\n\t\tD53E60011BEA203B0043DF84 /* PageScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FFF1BEA199C0043DF84 /* PageScrollView.swift */; };\n\t\tD53E60021BEA227D0043DF84 /* DRPageScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = D53E5FFA1BEA18140043DF84 /* DRPageScrollView.m */; };\n\t\tD53E60051BEA67790043DF84 /* UIView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53E60041BEA67790043DF84 /* UIView+Utils.swift */; };\n\t\tD593A8DD1BEA72E500AFA257 /* Popsicle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5FBF53A1BE65BB500F3CB79 /* Popsicle.framework */; };\n\t\tD593A8DE1BEA72E500AFA257 /* Popsicle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D5FBF53A1BE65BB500F3CB79 /* Popsicle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tD5D6A94C1BEBB85A008E414E /* KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = D593A8E41BEA88B600AFA257 /* KeyPath.swift */; };\n\t\tD5FBF53E1BE65BB500F3CB79 /* Popsicle.h in Headers */ = {isa = PBXBuildFile; fileRef = D5FBF53D1BE65BB500F3CB79 /* Popsicle.h */; settings = {ATTRIBUTES = (Public, ); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tD593A8DF1BEA72E500AFA257 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D5FBF5311BE65BB500F3CB79 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D5FBF5391BE65BB500F3CB79;\n\t\t\tremoteInfo = Popsicle;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tD593A8E11BEA72E500AFA257 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tD593A8DE1BEA72E500AFA257 /* Popsicle.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\tD53B324B1BE65FF800A1820B /* Interpolable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interpolable.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FD81BEA12340043DF84 /* EasingFunction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EasingFunction.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FDA1BEA13600043DF84 /* Interpolation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interpolation.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FDC1BEA13900043DF84 /* Interpolator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interpolator.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FE21BEA145F0043DF84 /* PopsicleDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PopsicleDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD53E5FE41BEA145F0043DF84 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FE61BEA145F0043DF84 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\tD53E5FEB1BEA145F0043DF84 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tD53E5FEE1BEA145F0043DF84 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\tD53E5FF01BEA145F0043DF84 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD53E5FF61BEA16D70043DF84 /* PageViews.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PageViews.xib; sourceTree = \"<group>\"; };\n\t\tD53E5FF81BEA18130043DF84 /* PopsicleDemo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"PopsicleDemo-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\tD53E5FF91BEA18140043DF84 /* DRPageScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DRPageScrollView.h; sourceTree = \"<group>\"; };\n\t\tD53E5FFA1BEA18140043DF84 /* DRPageScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DRPageScrollView.m; sourceTree = \"<group>\"; };\n\t\tD53E5FFF1BEA199C0043DF84 /* PageScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageScrollView.swift; sourceTree = \"<group>\"; };\n\t\tD53E60041BEA67790043DF84 /* UIView+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Utils.swift\"; sourceTree = \"<group>\"; };\n\t\tD593A8E41BEA88B600AFA257 /* KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyPath.swift; sourceTree = \"<group>\"; };\n\t\tD5FBF53A1BE65BB500F3CB79 /* Popsicle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Popsicle.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD5FBF53D1BE65BB500F3CB79 /* Popsicle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Popsicle.h; sourceTree = \"<group>\"; };\n\t\tD5FBF53F1BE65BB500F3CB79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD53E5FDF1BEA145F0043DF84 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD593A8DD1BEA72E500AFA257 /* Popsicle.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD5FBF5361BE65BB500F3CB79 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tD516D8DF1D1A90910086E8E6 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD53E5FEB1BEA145F0043DF84 /* Assets.xcassets */,\n\t\t\t\tD53E5FED1BEA145F0043DF84 /* LaunchScreen.storyboard */,\n\t\t\t\tD53E5FF01BEA145F0043DF84 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD53E5FE31BEA145F0043DF84 /* PopsicleDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD53E5FE41BEA145F0043DF84 /* AppDelegate.swift */,\n\t\t\t\tD53E5FE61BEA145F0043DF84 /* ViewController.swift */,\n\t\t\t\tD5F2E3E11BEB720B00008043 /* Page Scroll View */,\n\t\t\t\tD516D8DF1D1A90910086E8E6 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = PopsicleDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5F2E3E11BEB720B00008043 /* Page Scroll View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD53E5FF81BEA18130043DF84 /* PopsicleDemo-Bridging-Header.h */,\n\t\t\t\tD53E5FF91BEA18140043DF84 /* DRPageScrollView.h */,\n\t\t\t\tD53E5FFA1BEA18140043DF84 /* DRPageScrollView.m */,\n\t\t\t\tD53E5FFF1BEA199C0043DF84 /* PageScrollView.swift */,\n\t\t\t\tD53E5FF61BEA16D70043DF84 /* PageViews.xib */,\n\t\t\t\tD53E60041BEA67790043DF84 /* UIView+Utils.swift */,\n\t\t\t);\n\t\t\tname = \"Page Scroll View\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5FBF5301BE65BB500F3CB79 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD53E5FE31BEA145F0043DF84 /* PopsicleDemo */,\n\t\t\t\tD5FBF53C1BE65BB500F3CB79 /* Popsicle */,\n\t\t\t\tD5FBF53B1BE65BB500F3CB79 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5FBF53B1BE65BB500F3CB79 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD5FBF53A1BE65BB500F3CB79 /* Popsicle.framework */,\n\t\t\t\tD53E5FE21BEA145F0043DF84 /* PopsicleDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5FBF53C1BE65BB500F3CB79 /* Popsicle */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD5FBF53D1BE65BB500F3CB79 /* Popsicle.h */,\n\t\t\t\tD53E5FDC1BEA13900043DF84 /* Interpolator.swift */,\n\t\t\t\tD53E5FDA1BEA13600043DF84 /* Interpolation.swift */,\n\t\t\t\tD53B324B1BE65FF800A1820B /* Interpolable.swift */,\n\t\t\t\tD53E5FD81BEA12340043DF84 /* EasingFunction.swift */,\n\t\t\t\tD593A8E41BEA88B600AFA257 /* KeyPath.swift */,\n\t\t\t\tD5FBF53F1BE65BB500F3CB79 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Popsicle;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tD5FBF5371BE65BB500F3CB79 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD5FBF53E1BE65BB500F3CB79 /* Popsicle.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\tD53E5FE11BEA145F0043DF84 /* PopsicleDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D53E5FF11BEA145F0043DF84 /* Build configuration list for PBXNativeTarget \"PopsicleDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD53E5FDE1BEA145F0043DF84 /* Sources */,\n\t\t\t\tD53E5FDF1BEA145F0043DF84 /* Frameworks */,\n\t\t\t\tD53E5FE01BEA145F0043DF84 /* Resources */,\n\t\t\t\tD593A8E11BEA72E500AFA257 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD593A8E01BEA72E500AFA257 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = PopsicleDemo;\n\t\t\tproductName = PopsicleDemo;\n\t\t\tproductReference = D53E5FE21BEA145F0043DF84 /* PopsicleDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tD5FBF5391BE65BB500F3CB79 /* Popsicle */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D5FBF54E1BE65BB600F3CB79 /* Build configuration list for PBXNativeTarget \"Popsicle\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD5FBF5351BE65BB500F3CB79 /* Sources */,\n\t\t\t\tD5FBF5361BE65BB500F3CB79 /* Frameworks */,\n\t\t\t\tD5FBF5371BE65BB500F3CB79 /* Headers */,\n\t\t\t\tD5FBF5381BE65BB500F3CB79 /* 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 = Popsicle;\n\t\t\tproductName = Popsicle;\n\t\t\tproductReference = D5FBF53A1BE65BB500F3CB79 /* Popsicle.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD5FBF5311BE65BB500F3CB79 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0710;\n\t\t\t\tLastUpgradeCheck = 0710;\n\t\t\t\tORGANIZATIONNAME = \"David Román Aguirre\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD53E5FE11BEA145F0043DF84 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t\tD5FBF5391BE65BB500F3CB79 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D5FBF5341BE65BB500F3CB79 /* Build configuration list for PBXProject \"Popsicle\" */;\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 = D5FBF5301BE65BB500F3CB79;\n\t\t\tproductRefGroup = D5FBF53B1BE65BB500F3CB79 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD53E5FE11BEA145F0043DF84 /* PopsicleDemo */,\n\t\t\t\tD5FBF5391BE65BB500F3CB79 /* Popsicle */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD53E5FE01BEA145F0043DF84 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD53E5FEF1BEA145F0043DF84 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\tD53E5FEC1BEA145F0043DF84 /* Assets.xcassets in Resources */,\n\t\t\t\tD53E5FF71BEA16D70043DF84 /* PageViews.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD5FBF5381BE65BB500F3CB79 /* 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 PBXSourcesBuildPhase section */\n\t\tD53E5FDE1BEA145F0043DF84 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD53E5FE71BEA145F0043DF84 /* ViewController.swift in Sources */,\n\t\t\t\tD53E5FE51BEA145F0043DF84 /* AppDelegate.swift in Sources */,\n\t\t\t\tD53E60051BEA67790043DF84 /* UIView+Utils.swift in Sources */,\n\t\t\t\tD53E60021BEA227D0043DF84 /* DRPageScrollView.m in Sources */,\n\t\t\t\tD53E60011BEA203B0043DF84 /* PageScrollView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD5FBF5351BE65BB500F3CB79 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD53E5FDD1BEA13900043DF84 /* Interpolator.swift in Sources */,\n\t\t\t\tD5D6A94C1BEBB85A008E414E /* KeyPath.swift in Sources */,\n\t\t\t\tD53E5FD91BEA12340043DF84 /* EasingFunction.swift in Sources */,\n\t\t\t\tD53B324C1BE65FF800A1820B /* Interpolable.swift in Sources */,\n\t\t\t\tD53E5FDB1BEA13600043DF84 /* Interpolation.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\tD593A8E01BEA72E500AFA257 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D5FBF5391BE65BB500F3CB79 /* Popsicle */;\n\t\t\ttargetProxy = D593A8DF1BEA72E500AFA257 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tD53E5FED1BEA145F0043DF84 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tD53E5FEE1BEA145F0043DF84 /* 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\tD53E5FF21BEA145F0043DF84 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tEMBEDDED_CONTENT_CONTAINS_SWIFT = YES;\n\t\t\t\tINFOPLIST_FILE = PopsicleDemo/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.davidroman.PopsicleDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"PopsicleDemo/PopsicleDemo-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 2.3;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD53E5FF31BEA145F0043DF84 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tEMBEDDED_CONTENT_CONTAINS_SWIFT = YES;\n\t\t\t\tINFOPLIST_FILE = PopsicleDemo/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.davidroman.PopsicleDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"PopsicleDemo/PopsicleDemo-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 2.3;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD5FBF54C1BE65BB600F3CB79 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\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\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\tD5FBF54D1BE65BB600F3CB79 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\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\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\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\tD5FBF54F1BE65BB600F3CB79 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\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 = Popsicle/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 = me.davidroman.Popsicle;\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 = 2.3;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD5FBF5501BE65BB600F3CB79 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\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 = Popsicle/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 = me.davidroman.Popsicle;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 2.3;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD53E5FF11BEA145F0043DF84 /* Build configuration list for PBXNativeTarget \"PopsicleDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD53E5FF21BEA145F0043DF84 /* Debug */,\n\t\t\t\tD53E5FF31BEA145F0043DF84 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD5FBF5341BE65BB500F3CB79 /* Build configuration list for PBXProject \"Popsicle\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD5FBF54C1BE65BB600F3CB79 /* Debug */,\n\t\t\t\tD5FBF54D1BE65BB600F3CB79 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD5FBF54E1BE65BB600F3CB79 /* Build configuration list for PBXNativeTarget \"Popsicle\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD5FBF54F1BE65BB600F3CB79 /* Debug */,\n\t\t\t\tD5FBF5501BE65BB600F3CB79 /* 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 = D5FBF5311BE65BB500F3CB79 /* Project object */;\n}\n"
  },
  {
    "path": "Popsicle.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Popsicle.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Popsicle.xcodeproj/xcshareddata/xcschemes/Popsicle.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0710\"\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 = \"D5FBF5391BE65BB500F3CB79\"\n               BuildableName = \"Popsicle.framework\"\n               BlueprintName = \"Popsicle\"\n               ReferencedContainer = \"container:Popsicle.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 = \"D5FBF5431BE65BB500F3CB79\"\n               BuildableName = \"PopsicleTests.xctest\"\n               BlueprintName = \"PopsicleTests\"\n               ReferencedContainer = \"container:Popsicle.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D5FBF5391BE65BB500F3CB79\"\n            BuildableName = \"Popsicle.framework\"\n            BlueprintName = \"Popsicle\"\n            ReferencedContainer = \"container:Popsicle.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 = \"D5FBF5391BE65BB500F3CB79\"\n            BuildableName = \"Popsicle.framework\"\n            BlueprintName = \"Popsicle\"\n            ReferencedContainer = \"container:Popsicle.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 = \"D5FBF5391BE65BB500F3CB79\"\n            BuildableName = \"Popsicle.framework\"\n            BlueprintName = \"Popsicle\"\n            ReferencedContainer = \"container:Popsicle.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": "PopsicleDemo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  PopsicleDemo\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\n\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n\tvar window: UIWindow?\n\n\tfunc application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n\n\t\tself.window = UIWindow(frame: UIScreen.mainScreen().bounds)\n\t\tself.window?.rootViewController = UINavigationController(rootViewController: ViewController())\n\t\tself.window?.makeKeyAndVisible()\n\n\t\treturn true\n\t}\n}\n\n"
  },
  {
    "path": "PopsicleDemo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-40@2x-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-29.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-29@2x-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-40.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-83.5@2x.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "PopsicleDemo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "PopsicleDemo/Assets.xcassets/logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "PopsicleDemo/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=\"9531\" systemVersion=\"15C50\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9529\"/>\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                        <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": "PopsicleDemo/DRPageScrollView.h",
    "content": "//\n//  DRPageScrollView.h\n//  DRPageScrollView\n//\n//  Created by David Román Aguirre on 3/4/15.\n//  Copyright (c) 2015 David Román Aguirre. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/// The type of block used to define what to display on each page view.\ntypedef void(^DRPageHandlerBlock)(UIView *pageView);\n\n@interface DRPageScrollView : UIScrollView\n\n/// Determines whether page views are reused or not in order to reduce memory consumption.\n@property (nonatomic, getter=isPageReuseEnabled) BOOL pageReuseEnabled;\n\n/// The current page index (starting from 0).\n@property (nonatomic, assign) NSInteger currentPage;\n\n/// The total number of pages in the scroll view.\n@property (nonatomic, readonly) NSInteger numberOfPages;\n\n/**\n * Sets up a new page for the scroll view.\n *\n * @param handler A block that defines what to display on the page.\n**/\n- (void)addPageWithHandler:(DRPageHandlerBlock)handler;\n\n@end\n"
  },
  {
    "path": "PopsicleDemo/DRPageScrollView.m",
    "content": "//\n//  DRPageScrollView.m\n//  DRPageScrollView\n//\n//  Created by David Román Aguirre on 3/4/15.\n//  Copyright (c) 2015 David Román Aguirre. All rights reserved.\n//\n\n#import \"DRPageScrollView.h\"\n\n@interface DRPageScrollView\t() {\n\tNSInteger previousPage;\n\tNSInteger instantaneousPreviousPage;\n}\n\n@property (nonatomic, strong) NSArray *pageViews;\n@property (nonatomic, strong) NSArray *pageHandlers;\n\n@end\n\n@implementation DRPageScrollView\n\n- (instancetype)init {\n\tif (self = [super init]) {\n\t\t[self commonInit];\n\t}\n\t\n\treturn self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n\tif (self = [super initWithFrame:frame]) {\n\t\t[self commonInit];\n\t}\n\n\treturn self;\n}\n\n- (void)commonInit {\n\tpreviousPage = -1;\n\tself.pagingEnabled = YES;\n\tself.showsHorizontalScrollIndicator = NO;\n\tself.showsVerticalScrollIndicator = NO;\n\n\tself.pageViews = [NSMutableArray new];\n\tself.pageHandlers = [NSArray new];\n}\n\n- (void)setPageReuseEnabled:(BOOL)pageReuseEnabled {\n\tif (self.numberOfPages > 0) return;\n\t_pageReuseEnabled = pageReuseEnabled;\n}\n\n- (NSInteger)currentPage {\n\tCGPoint presentationLayerContentOffset = [self.layer.presentationLayer bounds].origin;\n\treturn MAX(round(presentationLayerContentOffset.x/self.frame.size.width), 0);\n}\n\n- (void)setCurrentPage:(NSInteger)currentPage {\n\tself.contentOffset = CGPointMake(self.frame.size.width*currentPage, self.contentOffset.y);\n}\n\n- (NSInteger)numberOfPages {\n\treturn [self.pageHandlers count];\n}\n\n- (void)addPageWithHandler:(DRPageHandlerBlock)handler {\n\tself.pageHandlers = [self.pageHandlers arrayByAddingObject:handler];\n}\n\n#pragma mark Pages\n\n- (BOOL)isAnimating {\n\treturn [[self.layer animationKeys] count] != 0;\n}\n\n- (void)setContentOffset:(CGPoint)contentOffset {\n\t[super setContentOffset:contentOffset];\n\t\n\tif ([self isAnimating]) {\n\t\tCADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(didRefreshDisplay:)];\n\t\t[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];\n\t} else {\n\t\t[self didScrollToPosition:contentOffset];\n\t}\n}\n\n- (void)didRefreshDisplay:(CADisplayLink *)displayLink {\n\tif ([self isAnimating]) {\n\t\tCGPoint presentationLayerContentOffset = [self.layer.presentationLayer bounds].origin;\n\t\t[self didScrollToPosition:presentationLayerContentOffset];\n\t} else {\n\t\t[displayLink invalidate];\n\t}\n}\n\n- (void)didScrollToPosition:(CGPoint)position {\n\tif (self.numberOfPages == 0 || self.currentPage == previousPage) return;\n\t\n\tif (self.pageReuseEnabled) {\n\t\tfor (UIView *pageView in self.pageViews) {\n\t\t\tif (pageView.tag < self.currentPage - 1 || pageView.tag > self.currentPage + 1) {\n\t\t\t\t[self queuePageView:pageView];\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfor (NSInteger i = self.currentPage-1; i <= self.currentPage+1; i++) {\n\t\tif (i >= 0 && i < self.numberOfPages && ![self pageViewWithTag:i]) {\n\t\t\tUIView *pageView = [self dequeuePageView];\n\t\t\tpageView.tag = i;\n\t\t\t\n\t\t\tDRPageHandlerBlock handler = self.pageHandlers[i];\n\t\t\thandler(pageView);\n\t\t\t[self addSubview:pageView];\n\t\t\t\n\t\t\tNSInteger pageMultiplier = 2*i+1; // We need an odd multiplier. Any odd number can be expressed as 2n+1.\n\t\t\t\n\t\t\tNSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:pageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:pageMultiplier constant:0];\n\t\t\tNSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:pageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];\n\t\t\tNSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:pageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1 constant:0];\n\t\t\tNSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:pageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1 constant:0];\n\t\t\t\n\t\t\t[self addConstraints:@[centerXConstraint, centerYConstraint, widthConstraint, heightConstraint]]; // This may lead to vertical orientation support in the future ;)\n\t\t}\n\t}\n\t\n\tpreviousPage = self.currentPage;\n}\n\n- (void)queuePageView:(UIView *)pageView {\n\t[pageView removeFromSuperview];\n\t\n\tfor (UIView *sb in pageView.subviews) {\n\t\t[sb removeFromSuperview];\n\t}\n\t\n\tpageView.tag = -1;\n}\n\n- (UIView *)dequeuePageView {\n\tfor (UIView *pv in self.pageViews) {\n\t\tif (!pv.superview) {\n\t\t\treturn pv;\n\t\t}\n\t}\n\t\n\tUIView *pageView = [UIView new];\n\tpageView.tag = -1;\n\tpageView.translatesAutoresizingMaskIntoConstraints = NO;\n\tself.pageViews = [self.pageViews arrayByAddingObject:pageView];\n\t\n\treturn pageView;\n}\n\n- (UIView *)pageViewWithTag:(NSInteger)tag {\n\tfor (UIView *pageView in self.subviews) {\n\t\tif (pageView.tag == tag && pageView.class == [UIView class]) {\n\t\t\treturn pageView;\n\t\t}\n\t}\n\t\n\treturn nil;\n}\n\n#pragma mark Rotation/resize\n\n- (void)layoutSubviews {\n\tCGFloat neededContentSizeWidth = self.frame.size.width*self.numberOfPages;\n\t\n\tif (self.contentSize.width != neededContentSizeWidth) {\n\t\t[self refreshDimensions];\n\t\tself.currentPage = instantaneousPreviousPage;\n\t} else {\n\t\tinstantaneousPreviousPage = self.currentPage;\n\t}\n\t\n\t[super layoutSubviews];\n}\n\n- (void)refreshDimensions {\n\tself.contentSize = CGSizeMake(self.frame.size.width*self.numberOfPages, self.frame.size.height);\n\tself.contentInset = UIEdgeInsetsZero;\n}\n\n@end\n"
  },
  {
    "path": "PopsicleDemo/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>Popsicle</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>2.0.1</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>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "PopsicleDemo/PageScrollView.swift",
    "content": "//\n//  PageScrollView.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\nimport UIKit\n\nclass FirstPageView: UIView {\n\t@IBOutlet weak var label: UILabel?\n\t@IBOutlet weak var imageView: UIImageView?\n}\n\nclass SecondPageView: UIView {\n\t@IBOutlet weak var label: UILabel?\n}\n\nclass ThirdPageView: UIView {\n\t@IBOutlet weak var label1: UILabel?\n\t@IBOutlet weak var label2: UILabel?\n}\n\nclass FourthPageView: UIView {\n\t@IBOutlet weak var label: UILabel?\n}\n\nclass PageScrollView: DRPageScrollView {\n\tlet firstPageView: FirstPageView\n\tlet secondPageView: SecondPageView\n\tlet thirdPageView: ThirdPageView\n\tlet fourthPageView: FourthPageView\n\n\toverride init(frame: CGRect) {\n\t\tlet views = UIView.viewsByClassInNibNamed(\"PageViews\")\n\t\tself.firstPageView = views[\"PopsicleDemo.FirstPageView\"] as! FirstPageView\n\t\tself.secondPageView = views[\"PopsicleDemo.SecondPageView\"] as! SecondPageView\n\t\tself.thirdPageView = views[\"PopsicleDemo.ThirdPageView\"] as! ThirdPageView\n\t\tself.fourthPageView = views[\"PopsicleDemo.FourthPageView\"] as! FourthPageView\n\t\tsuper.init(frame: frame)\n\t}\n\n\trequired init?(coder aDecoder: NSCoder) {\n\t\tfatalError(\"init(coder:) has not been implemented\")\n\t}\n\n\toverride func didMoveToSuperview() {\n\t\tif self.superview != nil {\n\t\t\tfor pv in [firstPageView, secondPageView, thirdPageView, fourthPageView] {\n\t\t\t\tself.addPageWithHandler { pageView in\n\t\t\t\t\tpageView.addSubview(pv)\n\t\t\t\t\tpv.pinToSuperviewEdges()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "PopsicleDemo/PageViews.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"9531\" systemVersion=\"15C50\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9529\"/>\n        <capability name=\"Alignment constraints with different attributes\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\" customClass=\"FirstPageView\" customModule=\"PopsicleDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Welcome to this demo of Popsicle\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ecS-oi-gEe\">\n                    <rect key=\"frame\" x=\"171\" y=\"549.5\" width=\"259.5\" height=\"20.5\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"logo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6y5-6A-Jqb\">\n                    <rect key=\"frame\" x=\"172\" y=\"172\" width=\"256\" height=\"256\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" constant=\"256\" id=\"HP8-Kb-mIE\"/>\n                        <constraint firstAttribute=\"height\" constant=\"256\" id=\"xDP-1k-OEj\"/>\n                    </constraints>\n                </imageView>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"ecS-oi-gEe\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"30\" id=\"4JZ-tg-q2N\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"ecS-oi-gEe\" secondAttribute=\"centerX\" id=\"LIr-Vw-5cn\"/>\n                <constraint firstAttribute=\"centerY\" secondItem=\"6y5-6A-Jqb\" secondAttribute=\"centerY\" id=\"ku4-Hi-Zyi\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"6y5-6A-Jqb\" secondAttribute=\"centerX\" id=\"sF6-vM-KOf\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"ecS-oi-gEe\" secondAttribute=\"bottom\" constant=\"30\" id=\"xkO-DG-nPj\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"imageView\" destination=\"6y5-6A-Jqb\" id=\"tzf-O6-3ix\"/>\n                <outlet property=\"label\" destination=\"ecS-oi-gEe\" id=\"pTx-fd-ibf\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"393\" y=\"403\"/>\n        </view>\n        <view contentMode=\"scaleToFill\" id=\"I3K-66-IeR\" customClass=\"SecondPageView\" customModule=\"PopsicleDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iib-Tg-Cyj\">\n                    <rect key=\"frame\" x=\"44\" y=\"179.5\" width=\"512\" height=\"81.5\"/>\n                    <string key=\"text\">That was smooth!\n\nAs you can see, Popsicle provides a great way to create transitions through value interpolations.</string>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <constraints>\n                <constraint firstAttribute=\"centerX\" secondItem=\"iib-Tg-Cyj\" secondAttribute=\"centerX\" id=\"HG8-QR-See\"/>\n                <constraint firstItem=\"iib-Tg-Cyj\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"I3K-66-IeR\" secondAttribute=\"leading\" constant=\"30\" id=\"JPf-6l-Scg\"/>\n                <constraint firstAttribute=\"centerY\" secondItem=\"iib-Tg-Cyj\" secondAttribute=\"centerY\" constant=\"80\" id=\"Udi-CK-c1O\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"label\" destination=\"iib-Tg-Cyj\" id=\"7Vt-NB-TYi\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"1135\" y=\"403\"/>\n        </view>\n        <view contentMode=\"scaleToFill\" id=\"lSl-j6-h40\" customClass=\"ThirdPageView\" customModule=\"PopsicleDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ijd-gD-Pdk\">\n                    <rect key=\"frame\" x=\"36\" y=\"239\" width=\"528.5\" height=\"61\"/>\n                    <string key=\"text\">Interpolations are not bound to UIKit values, although Popsicle offers built-in support for widely used types such CGFloat, CGAffineTransform and UIColor.</string>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                    <userDefinedRuntimeAttributes>\n                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"textColor\">\n                            <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        </userDefinedRuntimeAttribute>\n                    </userDefinedRuntimeAttributes>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yOi-JI-a0I\">\n                    <rect key=\"frame\" x=\"30\" y=\"350\" width=\"540.5\" height=\"41\"/>\n                    <string key=\"text\">In addition to that, Popsicle takes advantage of Swift's best features such as generics and subscripts, making it really sweet to use.</string>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                    <userDefinedRuntimeAttributes>\n                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"textColor\">\n                            <color key=\"value\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        </userDefinedRuntimeAttribute>\n                    </userDefinedRuntimeAttributes>\n                </label>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"yOi-JI-a0I\" firstAttribute=\"top\" secondItem=\"lSl-j6-h40\" secondAttribute=\"centerY\" constant=\"50\" id=\"5xz-In-fDV\"/>\n                <constraint firstItem=\"yOi-JI-a0I\" firstAttribute=\"centerX\" secondItem=\"lSl-j6-h40\" secondAttribute=\"centerX\" id=\"6Nq-hu-RdY\"/>\n                <constraint firstItem=\"yOi-JI-a0I\" firstAttribute=\"leading\" secondItem=\"lSl-j6-h40\" secondAttribute=\"leading\" constant=\"30\" id=\"R0Q-Q4-0CB\"/>\n                <constraint firstAttribute=\"centerY\" secondItem=\"ijd-gD-Pdk\" secondAttribute=\"bottom\" id=\"nOG-cc-EOM\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"ijd-gD-Pdk\" secondAttribute=\"centerX\" id=\"vJw-lL-OL9\"/>\n                <constraint firstItem=\"ijd-gD-Pdk\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"lSl-j6-h40\" secondAttribute=\"leading\" constant=\"30\" id=\"yZM-gD-9ft\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"label1\" destination=\"ijd-gD-Pdk\" id=\"3Ld-kl-1zB\"/>\n                <outlet property=\"label2\" destination=\"yOi-JI-a0I\" id=\"dOF-QM-xoB\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"1890\" y=\"403\"/>\n        </view>\n        <view contentMode=\"scaleToFill\" id=\"pIp-qb-tLI\" customClass=\"FourthPageView\" customModule=\"PopsicleDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"For requests, comments or concerns, just open a GitHub issue or ping me @DavdRoman.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4nl-Ho-8yk\">\n                    <rect key=\"frame\" x=\"31\" y=\"280\" width=\"538.5\" height=\"41\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <constraints>\n                <constraint firstAttribute=\"centerX\" secondItem=\"4nl-Ho-8yk\" secondAttribute=\"centerX\" id=\"I9N-AY-ig8\"/>\n                <constraint firstAttribute=\"centerY\" secondItem=\"4nl-Ho-8yk\" secondAttribute=\"centerY\" id=\"T0O-jF-phJ\"/>\n                <constraint firstItem=\"4nl-Ho-8yk\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"pIp-qb-tLI\" secondAttribute=\"leading\" constant=\"30\" id=\"idu-Sz-fiy\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"label\" destination=\"4nl-Ho-8yk\" id=\"h0M-xJ-h3S\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"2614\" y=\"403\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"logo\" width=\"512\" height=\"512\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "PopsicleDemo/PopsicleDemo-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import \"DRPageScrollView.h\""
  },
  {
    "path": "PopsicleDemo/UIView+Utils.swift",
    "content": "//\n//  UIView+Utils.swift\n//  Popsicle\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\nextension UIView {\n\tstatic func viewsByClassInNibNamed(name: String) -> [String: UIView] {\n\t\tvar viewsByClass = [String: UIView]()\n\n\t\tlet nibViews = NSBundle.mainBundle().loadNibNamed(name, owner: self, options: nil)\n\n\t\tfor view in nibViews {\n\t\t\tif let v = view as? UIView {\n\t\t\t\tviewsByClass[NSStringFromClass(v.dynamicType)] = v\n\t\t\t}\n\t\t}\n\n\t\treturn viewsByClass\n\t}\n\n\tfunc pinToSuperviewEdges() {\n\t\tself.translatesAutoresizingMaskIntoConstraints = false\n\n\t\tfor attribute in [.Top, .Left, .Bottom, .Right] as [NSLayoutAttribute] {\n\t\t\tlet constraint = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: .Equal, toItem: self.superview, attribute: attribute, multiplier: 1, constant: 0)\n\n\t\t\tself.superview?.addConstraint(constraint)\n\t\t}\n\t}\n}"
  },
  {
    "path": "PopsicleDemo/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  PopsicleDemo\n//\n//  Created by David Román Aguirre on 04/11/15.\n//  Copyright © 2015 David Román Aguirre. All rights reserved.\n//\n\nimport UIKit\nimport Popsicle\n\nclass ViewController: UIViewController, UIScrollViewDelegate {\n\n\tlet pageScrollView: PageScrollView\n\tlet interpolator: Interpolator\n\n\tinit() {\n\t\tself.pageScrollView = PageScrollView(frame: CGRectZero)\n\t\tself.interpolator = Interpolator()\n\t\tsuper.init(nibName: nil, bundle: nil)\n\t}\n\n\trequired init?(coder aDecoder: NSCoder) {\n\t    fatalError(\"init(coder:) has not been implemented\")\n\t}\n\n\toverride func viewDidLoad() {\n\t\tsuper.viewDidLoad()\n\n\t\tself.title = \"Popsicle\"\n\t\tself.view.backgroundColor = UIColor.whiteColor()\n\n\t\tself.pageScrollView.delegate = self\n\t\tself.view.addSubview(self.pageScrollView)\n\t\tself.pageScrollView.pinToSuperviewEdges()\n\t}\n\n\toverride func viewDidLayoutSubviews() {\n\t\tsuper.viewDidLayoutSubviews()\n\n\t\tself.interpolator.removeAllInterpolations()\n\n\t\tlet backgroundColorInterpolation = Interpolation(self.view, backgroundColor)\n\t\tbackgroundColorInterpolation[1, 3] = UIColor.whiteColor()\n\t\tbackgroundColorInterpolation[1.7, 2] = UIColor(red: 254/255, green: 134/255, blue: 44/255, alpha: 1)\n\t\tself.interpolator.addInterpolation(backgroundColorInterpolation)\n\n\t\tlet barTintColorInterpolation = Interpolation(self.navigationController!.navigationBar, barTintColor)\n\t\tbarTintColorInterpolation[1, 3] = UIColor.whiteColor()\n\t\tbarTintColorInterpolation[1.7, 2] = UIColor(red: 244255, green: 219/255, blue: 165/255, alpha: 1)\n\t\tself.interpolator.addInterpolation(barTintColorInterpolation)\n\n\t\tif let imageView = self.pageScrollView.firstPageView.imageView {\n\t\t\tlet xInterpolation = Interpolation(imageView, centerXConstraint)\n\t\t\txInterpolation[0] = 0\n\t\t\txInterpolation.setEasingFunction(EasingFunctionEaseInQuad, forTime: 0)\n\t\t\txInterpolation[1] = -self.pageScrollView.frame.width\n\t\t\txInterpolation[2] = -self.pageScrollView.frame.width*2\n\t\t\txInterpolation[3] = -self.pageScrollView.frame.width*3\n\t\t\tself.interpolator.addInterpolation(xInterpolation)\n\n\t\t\tlet yInterpolation = Interpolation(imageView, centerYConstraint)\n\t\t\tyInterpolation[0] = 0\n\t\t\tyInterpolation[1, 2] = -self.pageScrollView.frame.height/2+80\n\t\t\tyInterpolation[3] = 0\n\t\t\tself.interpolator.addInterpolation(yInterpolation)\n\n\t\t\tlet alphaInterpolation = Interpolation(imageView, alpha)\n\t\t\talphaInterpolation[1] = 1\n\t\t\talphaInterpolation[2] = 0\n\t\t\talphaInterpolation[3] = 0.25\n\t\t\tself.interpolator.addInterpolation(alphaInterpolation)\n\n\t\t\tlet transformInterpolation = Interpolation(imageView, transform)\n\t\t\ttransformInterpolation[0, 1, 2] = CGAffineTransformIdentity\n\t\t\ttransformInterpolation[0.25] = CGAffineTransformMake(0, 0, 1.1, 1.1, 0)\n\t\t\ttransformInterpolation[3] = CGAffineTransformMake(0, 0, 1.4, 1.4, 60)\n\t\t\tself.interpolator.addInterpolation(transformInterpolation)\n\t\t}\n\n\t\tif let label1 = self.pageScrollView.firstPageView.label {\n\t\t\tlet alphaInterpolation = Interpolation(label1, alpha)\n\t\t\talphaInterpolation[0] = 1\n\t\t\talphaInterpolation[0.4] = 0\n\t\t\tself.interpolator.addInterpolation(alphaInterpolation)\n\t\t}\n\n\t\tif let label2 = self.pageScrollView.secondPageView.label {\n\t\t\tlet scaleInterpolation = Interpolation(label2, transform)\n\t\t\tscaleInterpolation[0] = CGAffineTransformMake(0, 0, 0.6, 0.6, 0)\n\t\t\tscaleInterpolation[1] = CGAffineTransformMake(0, 0, 1, 1, 0)\n\t\t\tself.interpolator.addInterpolation(scaleInterpolation)\n\n\t\t\tlet alphaInterpolation = Interpolation(label2, alpha)\n\t\t\talphaInterpolation[1] = 1\n\t\t\talphaInterpolation[1.7] = 0\n\t\t\tself.interpolator.addInterpolation(alphaInterpolation)\n\t\t}\n\n\t\tif let label3 = self.pageScrollView.thirdPageView.label1, let label4 = self.pageScrollView.thirdPageView.label2 {\n\t\t\tlet translateInterpolation1 = Interpolation(label3, transform)\n\t\t\ttranslateInterpolation1[1] = CGAffineTransformMake(100, 0, 1, 1, 0)\n\t\t\ttranslateInterpolation1[2] = CGAffineTransformIdentity\n\t\t\ttranslateInterpolation1[3] = CGAffineTransformMake(-100, 0, 1, 1, 0)\n\t\t\tself.interpolator.addInterpolation(translateInterpolation1)\n\n\t\t\tlet translateInterpolation2 = Interpolation(label4, transform)\n\t\t\ttranslateInterpolation2[1] = CGAffineTransformMake(300, 0, 1, 1, 0)\n\t\t\ttranslateInterpolation2[2] = CGAffineTransformIdentity\n\t\t\ttranslateInterpolation2[3] = CGAffineTransformMake(-300, 0, 1, 1, 0)\n\t\t\tself.interpolator.addInterpolation(translateInterpolation2)\n\t\t}\n\t}\n\n\tfunc scrollViewDidScroll(scrollView: UIScrollView) {\n\t\tself.interpolator.time = Double(scrollView.contentOffset.x/scrollView.frame.size.width)\n\t}\n}"
  },
  {
    "path": "README.md",
    "content": "> **THIS PROJECT IS NO LONGER MAINTAINED.**\n\n---\n\n<p align=\"center\">\n\t<img src=\"Assets/header.png\" alt=\"Popsicle header\" width=\"520px\" />\n</p>\n\n<p align=\"center\">\n\t<a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg\" alt=\"Carthage compatible\" /></a>\n\t<a href=\"https://cocoapods.org/pods/Popsicle\"><img src=\"https://img.shields.io/cocoapods/v/Popsicle.svg\" alt=\"CocoaPods compatible\" /></a>\n</p>\n\n<p align=\"center\">\n\t<img src=\"Assets/1.gif\" alt=\"GIF 1\" width=\"320px\" />\n</p>\n\nPopsicle is a Swift framework for creating and managing interpolations of different value types with built-in UIKit support.\n\n## Installation\n\n#### Carthage\n\n```\ngithub \"DavdRoman/Popsicle\"\n```\n\n#### CocoaPods\n\n```ruby\npod 'Popsicle'\n```\n\n#### Manual\n\nDrag and copy all files in the [__Popsicle__](Popsicle) folder into your project.\n\n## At a glance\n\n#### Interpolating UIView (or any other NSObject) values\n\nFirst, you need an `Interpolator` instance:\n\n```swift\nlet interpolator = Interpolator()\n```\n\nNext, you need to add some `Interpolation<T>` instances to your interpolator. In the example below, we are going to interpolate the alpha value of a UIView for times between 0 and 150:\n\n```swift\nlet interpolation = Interpolation(yourView, alpha)\ninterpolation[0] = 0\ninterpolation[150] = 1\nself.interpolator.addInterpolation(interpolation)\n```\n\nNote `alpha` is a built-in `KeyPath<T, U>` constant. Popsicle offers a nice set of [__UIKit-related KeyPaths__](Popsicle/KeyPath.swift) ready to be used. You may also use a completely custom key path.\n\nYou can also modify the easing function used at a given time:\n\n```swift\ninterpolation.setEasingFunction(EasingFunctionEaseOutQuad, forTime: 0)\n```\n\nThere's a bunch of [__built-in easing functions__](Popsicle/EasingFunction.swift) to choose from.\n\nFinally, just make your `interpolator` vary its `time` depending on whatever you want. For example, the content offset of a `UITableView`:\n\n```swift\nfunc scrollViewDidScroll(scrollView: UIScrollView) {\n\tinterpolator.time = Double(scrollView.contentOffset.y)\n}\n```\n\n#### Interpolating custom values\n\nYou can declare a value type as interpolable by making it conform to the `Interpolable` protocol.\n\nAs an example, check out how `CGPoint` conforms to `Interpolable`:\n\n```swift\nextension CGSize: Interpolable {\n\tpublic static func interpolate(from fromValue: CGSize, to toValue: CGSize, withProgress progress: Progress) -> CGSize {\n\t\tlet width = CGFloat.interpolate(from: fromValue.width, to: toValue.width, withProgress: progress)\n\t\tlet height = CGFloat.interpolate(from: fromValue.height, to: toValue.height, withProgress: progress)\n\n\t\treturn CGSizeMake(width, height)\n\t}\n\n\tpublic static func objectify(value: CGSize) -> AnyObject {\n\t\treturn NSValue(CGSize: value)\n\t}\n}\n```\n\n## License\n\nPopsicle is available under the MIT license.\n"
  }
]