[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xcuserstate\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n.build/\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# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output"
  },
  {
    "path": ".swift-version",
    "content": "4.2\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules: # rule identifiers to exclude from running\n  - missing_docs\n  - shorthand_operator\n  - vertical_parameter_alignment\n  - opening_brace\n  - variable_name\n\nopt_in_rules: # some rules are only opt-in\n  - empty_count\n# Find all the available rules by running:\n# swiftlint rules\n\nincluded: # paths to include during linting. `--path` is ignored if present.\n- Sources\n\nexcluded: # paths to ignore during linting. Takes precedence over `included`.\n  - Carthage\n  - Pods\n\n# configurable rules can be customized from this configuration file\n# binary rules can set their severity level\nforce_cast: warning # implicitly\nforce_try:\n  severity: warning # explicitly\n\n# rules that have both warning and error levels, can set just the warning level\n# implicitly\nline_length: 130\n\n# they can set both implicitly with an array\ntype_body_length:\n  - 100 # warning\n  - 150 # error\n\n# or they can set both explicitly\nfile_length:\n  warning: 200\n  error: 500\n\n# naming rules can set warnings/errors for min_length and max_length\n# additionally they can set excluded names\ntype_name:\n  min_length: 3 # only warning\n  max_length: # warning and error\n    warning: 40\n    error: 50\n  excluded: # excluded via string\n    - T\n    - t\n\nvariable_name:\n  min_length: # only min_length\n    error: 3 # only error\n  excluded: # excluded via string array\n    - id\n    - vc\n    - to\n    - a\n    - b\n    - t\n    - x\n    - y\n    - z\n    - w\n    - p\n    - xy\n    - dx\n    - dy\n    - dt\n    - dv\n    - gr\n    - ax\n    - ay\n    - bx\n    - by\n    - cx\n    - cy\n"
  },
  {
    "path": "Examples/CardViewController.swift",
    "content": "import UIKit\nimport YetAnotherAnimationLibrary\n\nclass CardViewController: UIViewController {\n\n    let gr = UIPanGestureRecognizer()\n    var card: UIView!\n    var backCard: UIView?\n\n    func generateCard() -> UIView {\n        let frame = view.bounds.inset(by: UIEdgeInsets(top:120, left: 50, bottom: 120, right: 50))\n        let card = UIView(frame: frame)\n\n        card.layer.cornerRadius = 7\n        card.backgroundColor = .white\n        view.insertSubview(card, at: 0)\n\n        card.yaal.center.value => { [weak view] newCenter in\n            if let view = view {\n                return (newCenter.x - view.center.x) / view.bounds.width\n            }\n            return nil\n        } => card.yaal.rotation\n\n        card.yaal.scale.value => { $0 * $0 } => card.yaal.alpha\n\n        return card\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        view.backgroundColor = UIColor(red: 1.0, green: 0.5, blue: 0.5, alpha: 1.0)\n        gr.addTarget(self, action: #selector(pan(gr:)))\n        view.addGestureRecognizer(gr)\n\n        card = generateCard()\n    }\n\n    @objc func pan(gr: UIPanGestureRecognizer) {\n        let translation = gr.translation(in: view)\n        switch gr.state {\n        case .began:\n            backCard = generateCard()\n            backCard!.yaal.scale.setTo(0.7)\n            fallthrough\n        case .changed:\n            card.yaal.center.setTo(CGPoint(x:translation.x + view.center.x, y:translation.y / 10 + view.center.y))\n            backCard!.yaal.scale.setTo(abs(translation.x)/view.bounds.width * 0.3 + 0.7)\n        default:\n            if let backCard = backCard, abs(translation.x) > view.bounds.width / 4 {\n                let finalX = translation.x < 0 ? -view.bounds.width : view.bounds.width*2\n                card.yaal.center.animateTo(CGPoint(x:finalX, y:view.center.y)) { [card] _ in\n                    card?.removeFromSuperview()\n                }\n                card = backCard\n                card.yaal.scale.animateTo(1)\n            } else {\n                backCard?.yaal.scale.animateTo(0) { [backCard] _ in\n                    backCard?.removeFromSuperview()\n                }\n                card.yaal.center.animateTo(view.center)\n            }\n            backCard = nil\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/GestureViewController.swift",
    "content": "import UIKit\nimport YetAnotherAnimationLibrary\n\nextension CGPoint {\n    var magnitude: CGFloat {\n        return hypot(x, y)\n    }\n}\nfunc + (l: CGPoint, r: CGPoint) -> CGPoint {\n    return CGPoint(x: l.x + r.x, y: l.y + r.y)\n}\n\nextension CGFloat {\n    func clamp(_ a: CGFloat, b: CGFloat) -> CGFloat {\n        return CGFloat.minimum(CGFloat.maximum(self, a), b)\n    }\n}\n\nclass GestureViewController: UIViewController {\n\n    let red = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        red.center = view.center\n        red.layer.cornerRadius = 7\n        red.backgroundColor = UIColor(red: 1.0, green: 0.5, blue: 0.5, alpha: 1.0)\n        view.addSubview(red)\n\n        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap(gr:))))\n        red.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(pan(gr:))))\n\n        red.layer.yaal.perspective.setTo(-1/500)\n\n        let limit = CGFloat.pi / 3\n        red.yaal.center.velocity => { 1 - $0.magnitude / 3000 } => red.yaal.alpha\n\n        // 2d rotation\n        red.yaal.center.velocity => { ($0.x / 1000).clamp(-limit, b: limit) } => red.yaal.rotation\n\n        // 3d rotation\n        red.yaal.center.velocity => { ($0.x / 1000).clamp(-limit, b: limit) } => red.yaal.rotationY\n        red.yaal.center.velocity => { (-$0.y / 1000).clamp(-limit, b: limit) } => red.yaal.rotationX\n    }\n\n    @objc func tap(gr: UITapGestureRecognizer) {\n        red.yaal.center.animateTo(gr.location(in: view))\n    }\n\n    var beginPosition: CGPoint?\n    @objc func pan(gr: UIPanGestureRecognizer) {\n        switch gr.state {\n        case .began:\n            beginPosition = red.center\n            fallthrough\n        case .changed:\n            red.yaal.center.setTo(gr.translation(in: view) + beginPosition!)\n        default:\n            red.yaal.center.decay(initialVelocity:gr.velocity(in: nil), damping: 5)\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Supporting Files/AppDelegate.swift",
    "content": "import UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        UINavigationBar.appearance().tintColor = UIColor(red: 1.0, green: 0.4, blue: 0.4, alpha: 1.0)\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 invalidate graphics rendering callbacks. 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 active 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"
  },
  {
    "path": "Examples/Supporting Files/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      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Supporting Files/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=\"11134\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11106\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\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": "Examples/Supporting Files/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12118\" systemVersion=\"16E195\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"eRR-Yv-awx\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12086\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Gesture View Controller-->\n        <scene sceneID=\"M4R-HP-Io6\">\n            <objects>\n                <viewController id=\"Fuk-vV-GjF\" customClass=\"GestureViewController\" customModule=\"Examples\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"zRw-Sr-HLa\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"7cH-X8-E1S\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"3gy-Y4-r92\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"rMc-hn-epb\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"532\" y=\"802\"/>\n        </scene>\n        <!--Card View Controller-->\n        <scene sceneID=\"3Lh-hA-ln5\">\n            <objects>\n                <viewController id=\"zyh-Nj-WI8\" customClass=\"CardViewController\" customModule=\"Examples\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"tOY-q4-NM6\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"Kd8-AD-gr8\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"uQQ-mZ-ClA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"c3p-Cf-ZBv\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1484\" y=\"802\"/>\n        </scene>\n        <!--Examples-->\n        <scene sceneID=\"0Ie-ep-Rf9\">\n            <objects>\n                <tableViewController clearsSelectionOnViewWillAppear=\"NO\" id=\"VLW-qP-Mo3\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"twj-uH-8ia\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <sections>\n                            <tableViewSection id=\"oXo-vb-xSx\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" textLabel=\"myB-TW-QPO\" style=\"IBUITableViewCellStyleDefault\" id=\"TZP-jO-pyc\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"TZP-jO-pyc\" id=\"zIk-Du-Pdd\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Gesture Example\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"myB-TW-QPO\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"0.0\" width=\"345\" height=\"43.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                        <connections>\n                                            <segue destination=\"Fuk-vV-GjF\" kind=\"show\" id=\"D7a-9K-7Vi\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" textLabel=\"d2R-y2-jP2\" style=\"IBUITableViewCellStyleDefault\" id=\"gIT-om-tGu\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"gIT-om-tGu\" id=\"ukP-7a-1f8\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Card Example\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"d2R-y2-jP2\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"0.0\" width=\"345\" height=\"43.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                        <connections>\n                                            <segue destination=\"zyh-Nj-WI8\" kind=\"show\" id=\"WdC-cs-ATY\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"VLW-qP-Mo3\" id=\"PD6-83-66E\"/>\n                            <outlet property=\"delegate\" destination=\"VLW-qP-Mo3\" id=\"21v-Pi-YMW\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Examples\" id=\"ayx-yo-A5n\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"1DN-yR-ftO\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1485\" y=\"146\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"q98-BS-1mT\">\n            <objects>\n                <navigationController id=\"g5C-5u-A0A\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"2Od-PT-Jgg\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"VLW-qP-Mo3\" kind=\"relationship\" relationship=\"rootViewController\" id=\"MLr-ea-fU2\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"qa4-dt-6QZ\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"532\" y=\"146\"/>\n        </scene>\n        <!--Split View Controller-->\n        <scene sceneID=\"nAO-jU-WQd\">\n            <objects>\n                <splitViewController id=\"eRR-Yv-awx\" sceneMemberID=\"viewController\">\n                    <connections>\n                        <segue destination=\"g5C-5u-A0A\" kind=\"relationship\" relationship=\"masterViewController\" id=\"ZXP-iI-O4g\"/>\n                        <segue destination=\"Fuk-vV-GjF\" kind=\"relationship\" relationship=\"detailViewController\" id=\"s7R-Az-ZZT\"/>\n                    </connections>\n                </splitViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Sqe-VP-9vP\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-418\" y=\"474\"/>\n        </scene>\n    </scenes>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"D7a-9K-7Vi\"/>\n    </inferredMetricsTieBreakers>\n</document>\n"
  },
  {
    "path": "Examples/Supporting Files/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>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\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": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Luke Zhao <me@lkzhao.com>\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": "Package.swift",
    "content": "// swift-tools-version:5.2\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"YetAnotherAnimationLibrary\",\n    platforms: [.iOS(.v9)],\n    products: [\n        // Products define the executables and libraries produced by a package, and make them visible to other packages.\n        .library(\n            name: \"YetAnotherAnimationLibrary\",\n            targets: [\"YetAnotherAnimationLibrary\"]),\n    ],\n    dependencies: [\n        // Dependencies declare other packages that this package depends on.\n    ],\n    targets: [\n        // Targets are the basic building blocks of a package. A target can define a module or a test suite.\n        // Targets can depend on other targets in this package, and on products in packages which this package depends on.\n        .target(\n            name: \"YetAnotherAnimationLibrary\",\n            dependencies: []),\n    ]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# Yet Another Animation Library\n\nDesigned for gesture-driven animations. Fast, simple, & extensible!\n\nIt is written in pure swift 3.1 with protocol oriented design and extensive use of generics.\n\nConsider this as a swift optimized version of facebook's pop. It plays nicer with swift and faster too.\n\n**Fast**:\n  * Uses SIMD types and instructions for calculation\n  * Better compiler optimization through swift generics\n\n**Simple**:\n  * Supports Curve(Basic), Spring, & Decay animations out of the box\n  * Easy API for animating common animatable properties. (checkout the [Extensions](https://github.com/lkzhao/YetAnotherAnimationLibrary/tree/master/Sources/Extensions) folder for list of included properties)\n  * Type safety guaranteed when assigning animation values\n  * Observable, including value, velocity, and target value\n  * Builtin chaining operator to easily react to changes in value\n  * Provide velocity interpolation with gestures\n\n**Extensible**:\n  * Supports custom property\n  * Supports custom animatable type\n  * Supports custom animation\n\n## Installation\n\n```ruby\npod \"YetAnotherAnimationLibrary\"\n```\n\n## Usage\n\n### Animation\n\n```swift\n// Spring animation\nview.yaal.center.animateTo(CGPoint(x:50, y:100))\nview.yaal.alpha.animateTo(0.5, stiffness: 300, damping: 20)\n\n// Curve(Basic) animation\nview.yaal.frame.animateTo(CGRect(x:0, y:0, width:50, height:50), duration:0.5, curve: .linear)\n\n// Decay Animation\nview.yaal.center.decay(initialVelocity:CGPoint(x:100, y:0))\n```\n\n### Observe Changes\n\n```swift\n// observe value changes\nview.yaal.center.value.changes.addListener { oldVelocity, newVelocity in\n  print(oldVelocity, newVelocity)\n}\n// observe velocity changes\nview.yaal.center.velocity.changes.addListener { oldVelocity, newVelocity in\n  print(oldVelocity, newVelocity)\n}\n```\n\n### Chaining Reactions\n```swift\n// when scale changes, also change its alpha\n// for example if view's scale animates from 1 to 0.5. its alpha will animate to 0.5 as well\nview.yaal.scale.value => view.yaal.alpha\n// equvalent to the following\n// view.yaal.scale.value.changes.addListener { _, newScale in\n//   view.yaal.alpha.animateTo(newScale)\n// }\n\n// optionally you can provide a mapping function in between.\n// For example, the following code makes the view more transparent the faster it is moving\nview.yaal.center.velocity => { 1 - $0.magnitude / 1000 } => view.yaal.alpha\n// equvalent to the following\n// view.yaal.center.velocity.changes.addListener { _, newVelocity in\n//   view.yaal.alpha.animateTo(1 - newVelocity.magnitude / 1000)\n// }\n```\n\n### Set Value (Notify listeners)\n```swift\n// this sets the value directly (not animate to). Change listeners are called.\n// Velocity listeners will receive a series of smoothed velocity values.\nview.yaal.center.setTo(gestureRecognizer.location(in:nil))\n```\n\n## Advance Usages\n\n### React to changes\nAnimate is very efficient at observing animated value and react accordingly. Some awesome effects can be achieved through observed values.\n\nFor example, here is a simple 2d rotation animation thats made possible through observing the center value's velocity.\n```swift\n   override func viewDidLoad() {\n     // ...\n     view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap(gr:))))\n     squareView.yaal.center.velocity => { $0.x / 1000 } => squareView.yaal.rotation\n   }\n   func tap(gr: UITapGestureRecognizer) {\n       squareView.yaal.center.animateTo(gr.location(in: view))\n   }\n```\n<img src=\"https://cloud.githubusercontent.com/assets/3359850/24976406/51c0e0ae-1f97-11e7-8e7d-7684a625195f.gif\" width=\"300\"/>\n\n----------------------\n\nAnimate also provide smooth velocity interpolation when calling `setTo(_:)`. This is especially useful when dealing with user gesture.\n\nFor example. the following does a 3d rotate animation when dragged\n```swift\noverride func viewDidLoad() {\n    // ...\n    squareView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(pan(gr:))))\n    squareView.yaal.perspective.setTo(-1.0 / 500.0)\n    squareView.yaal.center.velocity => { $0.x / 1000 } => squareView.yaal.rotationY\n    squareView.yaal.center.velocity => { -$0.y / 1000 } => squareView.yaal.rotationX\n}\n\nfunc pan(gr: UIPanGestureRecognizer) {\n    squareView.yaal.center.setTo(gr.location(in: view))\n}\n```\n<img src=\"https://cloud.githubusercontent.com/assets/3359850/24976408/52d1afe6-1f97-11e7-84ee-356b92076333.gif\" width=\"300\"/>\n\n### Custom property\n\nTo animate custom property, just create an animation object by calling `SpringAnimation(getter:setter:)`. Use the animation object to animate and set the values. There are 4 types of animations provided by Animate:\n\n* SpringAnimation\n* CurveAnimation\n* DecayAnimation\n* MixAnimation (does all three types of animation)\n\n```swift\nclass Foo {\n    var volumn: Float = 0.0\n    lazy var volumnAnimation: SpringAnimation<Float>\n        = SpringAnimation(getter: { [weak self] in self?.volumn },\n                          setter: { [weak self] in self?.volumn = $0 })\n}\n\nvolumnAnimation.animateTo(0.5)\n```\n\nIf your class inherits from NSObject, then it is even easier by using the built in animation store.\n\n### via extension & `yaal.animationFor`\n```swift\nextension Foo {\n    public var volumnAnimation: MixAnimation<CGRect> {\n        return yaal.animationFor(key: \"volumn\",\n                                 getter: { [weak self] in self?.volumn },\n                                 setter: { [weak self] in self?.volumn = $0 })\n    }\n}\n```\n\n### via `yaal.register` & `yaal.animationFor`\n```swift\n// or register ahead of time\nyaal.register(key: \"volumn\", \n              getter: { [weak self] in self?.volumn },\n              setter: { [weak self] in self?.volumn = $0 })\n\n// and retrieve the animation object through the same key.\nyaal.animationFor(key: \"volumn\")!.animateTo(0.5)\n\n// NOTE: that this method have limited type safety. You can basically pass any animatable type into `animateTo()`\n// There is nothing to stop you from doing the following. but they will crash at run time\nyaal.animationFor(key: \"volumn\")!.animateTo(CGSize.zero)\nyaal.animationFor(key: \"volumn\")!.animateTo(CGRect.zero)\n```\n\n### Custom Animatable Type\n\nCustom animatable types are also supported. Just make the type conform to `VectorConvertable`.\n\n```swift\n// the following makes IndexPath animatable\nextension IndexPath: VectorConvertible {\n    public typealias Vector = Vector2\n    public init(vector: Vector) {\n        self.init(item: Int(vector.x), section: Int(vector.y))\n    }\n    public var vector: Vector {\n        return [Double(item), Double(section)]\n    }\n}\n// Can now be used like this\nlet indexAnimation = SpringAnimation(getter: { self.indexPath },\n                                     setter: { self.indexPath = $0 })\nindexAnimation.animateTo(IndexPath(item:0, section:0))\n\n// Note that everything is type safe. incorrect type won't be allowed to compile\n```\n\n### Custom Animation\n\nJust subclass `Animation` and override `update(dt:TimeInterval)` method.\nIf your animation need getter & setter support, subclass `ValueAnimation` instead.\nCheckout the builtin animations for example.\n\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animatables/Animatable.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol Animatable: AnyObject {\n    func update(dt: TimeInterval)\n    func start(_ completionHandler: ((Bool) -> Void)?)\n    func finish()\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animatables/CurveAnimatable.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol CurveAnimatable: SolverAnimatable {\n    var defaultCurve: Curve { get set }\n\n    var target: AnimationProperty<Value> { get }\n}\n\nextension CurveAnimatable {\n    public func setDefaultCurve(_ curve: Curve) {\n        defaultCurve = curve\n    }\n\n    public func animateTo(_ targetValue: Value,\n                          duration: TimeInterval,\n                          curve: Curve? = nil,\n                          completionHandler: ((Bool) -> Void)? = nil) {\n        target.value = targetValue\n        solver = CurveSolver(duration: duration,\n                             curve: curve ?? defaultCurve,\n                             current: value, target: target, velocity: velocity)\n        start(completionHandler)\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animatables/DecayAnimatable.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol DecayAnimatable: SolverAnimatable {\n    var defaultThreshold: Double { get set }\n    var defaultDamping: Double { get set }\n}\n\nextension DecayAnimatable {\n    public func setDefaultDamping(_ damping: Double) {\n        defaultDamping = damping\n    }\n    public func setDefaultThreshold(_ threshold: Double) {\n        defaultThreshold = threshold\n    }\n\n    public func decay(initialVelocity: Value? = nil,\n                      damping: Double? = nil,\n                      threshold: Double? = nil,\n                      completionHandler: ((Bool) -> Void)? = nil) {\n        if let initialVelocity = initialVelocity {\n            velocity.value = initialVelocity\n        }\n        var solver = DecaySolver<Value>(damping: damping ?? defaultDamping,\n                                        threshold: threshold ?? defaultThreshold)\n        solver.current = value\n        solver.velocity = velocity\n        self.solver = solver\n        start(completionHandler)\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animatables/SolverAnimatable.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol SolverAnimatable: Animatable {\n    associatedtype Value: VectorConvertible\n\n    var solver: Solver? { get set }\n\n    var value: AnimationProperty<Value> { get }\n    var velocity: AnimationProperty<Value> { get }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animatables/SpringAnimatable.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol SpringAnimatable: DecayAnimatable {\n    var defaultStiffness: Double { get set }\n\n    var target: AnimationProperty<Value> { get }\n}\n\n// convenience\nextension SpringAnimatable {\n    public func setDefaultStiffness(_ stiffness: Double) {\n        defaultStiffness = stiffness\n    }\n\n    public func animateTo(_ targetValue: Value,\n                          initialVelocity: Value? = nil,\n                          stiffness: Double? = nil,\n                          damping: Double? = nil,\n                          threshold: Double? = nil,\n                          completionHandler: ((Bool) -> Void)? = nil) {\n        target.value = targetValue\n        if let initialVelocity = initialVelocity {\n            velocity.value = initialVelocity\n        }\n        var solver = SpringSolver<Value>(stiffness: stiffness ?? defaultStiffness,\n                                         damping: damping ?? defaultDamping,\n                                         threshold: threshold ?? defaultThreshold)\n        solver.current = value\n        solver.velocity = velocity\n        solver.target = target\n        self.solver = solver\n        start(completionHandler)\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/AnimationProperty/AnimationProperty.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic class AnimationProperty<Value: VectorConvertible> {\n    private var _changes: Announcer<Value>?\n    public var changes: Announcer<Value> {\n        if _changes == nil {\n            _changes = Announcer<Value>()\n        }\n        return _changes!\n    }\n\n    public var vector: Value.Vector = Value.Vector() {\n        didSet {\n            if let announcer = _changes {\n                announcer.notify(old: oldValue, new: vector)\n            }\n        }\n    }\n\n    public var value: Value {\n        get { return Value.from(vector: vector) }\n        set { vector = newValue.vector }\n    }\n\n    public init() {}\n    public init(value: Value) {\n        self.value = value\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/AnimationProperty/Announcer.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic class Announcer<Value: VectorConvertible> {\n    public typealias Vector = Value.Vector\n\n    public var listeners = [String: (Value, Value) -> Void]()\n    public var vectorListeners = [String: (Vector, Vector) -> Void]()\n\n    public var hasListener: Bool {\n        return !listeners.isEmpty\n    }\n\n    public var hasVectorListener: Bool {\n        return !vectorListeners.isEmpty\n    }\n\n    public func addListener(_ listener:@escaping (_ old: Value, _ new: Value) -> Void) {\n        listeners[UUID().uuidString] = listener\n    }\n    public func addListenerWith(identifier: String,\n                                listener:@escaping (_ old: Value, _ new: Value) -> Void) {\n        listeners[identifier] = listener\n    }\n    public func removeListenerWith(identifier: String) {\n        listeners[identifier] = nil\n    }\n    public func removeAllListeners() {\n        listeners.removeAll()\n    }\n\n    public func addVectorListener(_ listener:@escaping (_ old: Vector, _ new: Vector) -> Void) {\n        vectorListeners[UUID().uuidString] = listener\n    }\n    public func addVectorListenerWith(identifier: String,\n                                      listener:@escaping (_ old: Vector, _ new: Vector) -> Void) {\n        vectorListeners[identifier] = listener\n    }\n    public func removeVectorListenerWith(identifier: String) {\n        vectorListeners[identifier] = nil\n    }\n    public func removeAllVectorListeners() {\n        vectorListeners.removeAll()\n    }\n\n    public func notify(old: Vector, new: Vector) {\n        for listener in vectorListeners.values {\n            listener(old, new)\n        }\n        if !listeners.isEmpty {\n            let old = Value.from(vector: old)\n            let new = Value.from(vector: new)\n            for listener in listeners.values {\n                listener(old, new)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/Animation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\n/// Base animation class\n/// Provides start/finish/cancel/stop functions to an animation\n/// \nopen class Animation: NSObject, Animatable {\n    public private(set) var isRunning: Bool = false\n    public private(set) var completionHandler: ((Bool) -> Void)?\n\n    public func start(_ completionHandler: ((Bool) -> Void)? = nil) {\n        if let oldCompletion = self.completionHandler {\n            oldCompletion(false)\n            self.completionHandler = completionHandler\n        }\n        self.completionHandler = completionHandler\n        if isRunning { return }\n        isRunning = true\n        willStart()\n        Animator.shared.add(animation: self)\n    }\n\n    public func finish() {\n        if !isRunning { return }\n        isRunning = false\n        Animator.shared.remove(animation: self)\n        didEnd(finished: true)\n    }\n\n    public func cancel() {\n        if !isRunning { return }\n        isRunning = false\n        Animator.shared.remove(animation: self)\n        didEnd(finished: false)\n    }\n\n    public func stop() {\n        cancel()\n    }\n\n    // override point for subclass\n    open func willUpdate() { }\n    open func update(dt: TimeInterval) { }\n    open func didUpdate() { }\n    open func willStart() { }\n    open func didEnd(finished: Bool) {\n        completionHandler?(finished)\n        completionHandler = nil\n    }\n\n    // called by animator\n    internal final func displayTick(dt: TimeInterval) {\n        willUpdate()\n        update(dt: dt)\n        didUpdate()\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/CurveAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic class CurveAnimation<Value: VectorConvertible>: SolvableAnimation<Value>, CurveAnimatable {\n    public var defaultCurve: Curve = .linear\n\n    public let target = AnimationProperty<Value>()\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/DecayAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic class DecayAnimation<Value: VectorConvertible>: SolvableAnimation<Value>, DecayAnimatable {\n    public var defaultThreshold: Double = 0.001\n    public var defaultDamping: Double = 20\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/MixAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\nopen class MixAnimation<Value: VectorConvertible>:\n    SolvableAnimation<Value>, SpringAnimatable, CurveAnimatable, DecayAnimatable {\n    public var defaultThreshold: Double = 0.001\n    public var defaultStiffness: Double = 150\n    public var defaultDamping: Double = 20\n    public var defaultCurve: Curve = .linear\n\n    public let target = AnimationProperty<Value>()\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/SolvableAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\nopen class SolvableAnimation<Value: VectorConvertible>: ValueAnimation<Value>, SolverAnimatable {\n    public var solver: Solver?\n    public let velocity = AnimationProperty<Value>()\n\n    open override func update(dt: TimeInterval) {\n        if solver?.solve(dt: dt) != false {\n            finish()\n        }\n    }\n\n    open override func didEnd(finished: Bool) {\n        super.didEnd(finished: finished)\n        velocity.vector = Value.Vector()\n        solver = nil\n    }\n\n    open override func setTo(_ value: Value) {\n        updateWithCurrentState()\n        if solver as? VelocitySmoother<Value> == nil {\n            solver = VelocitySmoother<Value>(value: self.value, velocity: velocity)\n        }\n        super.setTo(value)\n        start()\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/SpringAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic class SpringAnimation<Value: VectorConvertible>: DecayAnimation<Value>, SpringAnimatable {\n    public var defaultStiffness: Double = 150\n\n    public let target = AnimationProperty<Value>()\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animations/ValueAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\nopen class ValueAnimation<Value: VectorConvertible>: Animation {\n    typealias Vector = Value.Vector\n\n    // getter returns optional because we dont want strong references inside the getter block\n    public var getter: () -> Value?\n    public var setter: (Value) -> Void\n\n    public let value: AnimationProperty<Value>\n\n    open override func willStart() {\n        super.willStart()\n        updateWithCurrentState()\n    }\n\n    open override func didUpdate() {\n        super.didUpdate()\n        setter(value.value)\n    }\n\n    public init(getter:@escaping () -> Value?, setter:@escaping (Value) -> Void) {\n        self.value = AnimationProperty<Value>()\n        self.getter = getter\n        self.setter = setter\n    }\n\n    public init(value: AnimationProperty<Value>) {\n        self.value = value\n        self.getter = { return nil }\n        self.setter = { newValue in }\n    }\n\n    public convenience override init() {\n        self.init(value: AnimationProperty<Value>())\n    }\n\n    public func setTo(_ value: Value) {\n        self.value.value = value\n        setter(value)\n    }\n\n    public func updateWithCurrentState() {\n        if let currentValue = getter() {\n            value.value = currentValue\n        }\n    }\n\n    public func from(_ value: Value) -> Self {\n        self.value.value = value\n        setter(value)\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animator/Animator.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\ninternal class Animator: DisplayLink {\n    static let shared = Animator()\n\n    private var animations = Set<Animation>()\n\n    override func update(dt: TimeInterval) {\n        for animation in animations {\n            animation.displayTick(dt: dt)\n        }\n    }\n\n    func has(animation: Animation) -> Bool {\n        return animations.contains(animation)\n    }\n\n    func add(animation: Animation) {\n        animations.insert(animation)\n        start()\n    }\n\n    func remove(animation: Animation) {\n        animations.remove(animation)\n        if animations.isEmpty {\n            stop()\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Animator/DisplayLink.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nprivate let minDeltaTime = 1.0 / 30.0\n\n/// The `update(dt:)` function will be called on every screen refresh if started\ninternal class DisplayLink: NSObject {\n    private var displayLink: CADisplayLink?\n    private var lastUpdateTime: TimeInterval = 0\n    internal var isRunning: Bool {\n        return displayLink != nil\n    }\n\n    @objc internal func _update() {\n        guard let _ = displayLink else { return }\n        let currentTime = CACurrentMediaTime()\n        defer { lastUpdateTime = currentTime }\n        var dt = currentTime - lastUpdateTime\n        while dt > minDeltaTime {\n            update(dt: minDeltaTime)\n            dt -= minDeltaTime\n        }\n        update(dt: dt)\n    }\n\n    open func update(dt: TimeInterval) {}\n\n    internal func start() {\n        guard !isRunning else { return }\n        lastUpdateTime = CACurrentMediaTime()\n        displayLink = CADisplayLink(target: self, selector: #selector(_update))\n        if #available(iOS 15.0, *) {\n            displayLink?.preferredFrameRateRange = CAFrameRateRange(minimum:80, maximum:120, preferred:120)\n        }\n        displayLink!.add(to: .main, forMode: .common)\n    }\n\n    internal func stop() {\n        guard let displayLink = displayLink else { return }\n        displayLink.isPaused = true\n        displayLink.remove(from: .main, forMode: .common)\n        self.displayLink = nil\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Extensions/CALayer+YAAL.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nextension Yaal where Base: CALayer {\n    public var position: MixAnimation<CGPoint> {\n        return animationFor(key: \"position\",\n                            getter: { [weak base] in base?.position },\n                            setter: { [weak base] in base?.position = $0 })\n    }\n    public var opacity: MixAnimation<Float> {\n        return animationFor(key: \"opacity\",\n                            getter: { [weak base] in base?.opacity },\n                            setter: { [weak base] in base?.opacity = $0 })\n    }\n    public var bounds: MixAnimation<CGRect> {\n        return animationFor(key: \"bounds\",\n                            getter: { [weak base] in base?.bounds },\n                            setter: { [weak base] in base?.bounds = $0 })\n    }\n    public var frame: MixAnimation<CGRect> {\n        return animationFor(key: \"frame\",\n                            getter: { [weak base] in base?.frame },\n                            setter: { [weak base] in base?.frame = $0 })\n    }\n    public var backgroundColor: MixAnimation<CGColor> {\n        return animationFor(key: \"backgroundColor\",\n                            getter: { [weak base] in base?.backgroundColor },\n                            setter: { [weak base] in base?.backgroundColor = $0 })\n    }\n\n    public var cornerRadius: MixAnimation<CGFloat> {\n        return animationFor(key: \"cornerRadius\",\n                            getter: { [weak base] in base?.cornerRadius },\n                            setter: { [weak base] in base?.cornerRadius = $0 })\n    }\n\n    public var zPosition: MixAnimation<CGFloat> {\n        return animationFor(key: \"zPosition\",\n                            getter: { [weak base] in base?.zPosition },\n                            setter: { [weak base] in base?.zPosition = $0 })\n    }\n\n    public var borderWidth: MixAnimation<CGFloat> {\n        return animationFor(key: \"borderWidth\",\n                            getter: { [weak base] in base?.borderWidth },\n                            setter: { [weak base] in base?.borderWidth = $0 })\n    }\n    public var borderColor: MixAnimation<CGColor> {\n        return animationFor(key: \"borderColor\",\n                            getter: { [weak base] in base?.borderColor },\n                            setter: { [weak base] in base?.borderColor = $0 })\n    }\n\n    public var shadowRadius: MixAnimation<CGFloat> {\n        return animationFor(key: \"shadowRadius\",\n                            getter: { [weak base] in base?.shadowRadius },\n                            setter: { [weak base] in base?.shadowRadius = $0 })\n    }\n    public var shadowColor: MixAnimation<CGColor> {\n        return animationFor(key: \"shadowColor\",\n                            getter: { [weak base] in base?.shadowColor },\n                            setter: { [weak base] in base?.shadowColor = $0 })\n    }\n    public var shadowOffset: MixAnimation<CGSize> {\n        return animationFor(key: \"shadowOffset\",\n                            getter: { [weak base] in base?.shadowOffset },\n                            setter: { [weak base] in base?.shadowOffset = $0 })\n    }\n    public var shadowOpacity: MixAnimation<Float> {\n        return animationFor(key: \"shadowOpacity\",\n                            getter: { [weak base] in base?.shadowOpacity },\n                            setter: { [weak base] in base?.shadowOpacity = $0 })\n    }\n\n    public var perspective: MixAnimation<CGFloat> {\n        return animationFor(key: \"perspective\",\n                            getter: { [weak base] in base?.transform.m34 },\n                            setter: { [weak base] in base?.transform.m34 = $0 })\n    }\n\n    public var translation: MixAnimation<CGPoint> {\n        return animationForKeyPath(\"transform.translation\")\n    }\n    public var translationX: MixAnimation<CGFloat> {\n        return animationForKeyPath(\"transform.translation.x\")\n    }\n    public var translationY: MixAnimation<CGFloat> {\n        return animationForKeyPath(\"transform.translation.y\")\n    }\n    public var translationZ: MixAnimation<CGFloat> {\n        return animationForKeyPath(\"transform.translation.z\")\n    }\n\n    public var scale: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.scale\") }\n    public var scaleX: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.scale.x\") }\n    public var scaleY: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.scale.y\") }\n\n    public var rotation: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.rotation\") }\n    public var rotationX: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.rotation.x\") }\n    public var rotationY: MixAnimation<CGFloat> { return animationForKeyPath(\"transform.rotation.y\") }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Extensions/NSObject+YAAL.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\nextension NSObject {\n    internal class YaalState {\n        internal init() {}\n        internal var animations: [String: Any] = [:]\n    }\n\n    internal var yaalState: YaalState {\n        struct AssociatedKeys {\n            internal static var yaalState = \"yaalState\"\n        }\n        if let state = objc_getAssociatedObject(self, &AssociatedKeys.yaalState) as? YaalState {\n            return state\n        } else {\n            let state = YaalState()\n            objc_setAssociatedObject(self, &AssociatedKeys.yaalState, state, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            return state\n        }\n    }\n}\n\nextension Yaal where Base: NSObject {\n    public func animationFor<Value>(key: String,\n                             getter: @escaping () -> Value?,\n                             setter: @escaping (Value) -> Void) -> MixAnimation<Value> {\n        if let anim = base.yaalState.animations[key] as? MixAnimation<Value> {\n            return anim\n        } else {\n            let anim = MixAnimation(getter: getter, setter: setter)\n            base.yaalState.animations[key] = anim\n            return anim\n        }\n    }\n\n    @discardableResult public func register<Value>(key: String,\n                                            getter: @escaping () -> Value?,\n                                            setter: @escaping (Value) -> Void) -> MixAnimation<Value> {\n        return animationFor(key: key, getter: getter, setter: setter)\n    }\n\n    public func animationFor<Value>(key: String) -> MixAnimation<Value>? {\n        return base.yaalState.animations[key] as? MixAnimation<Value>\n    }\n\n    public func animationForKeyPath<Value>(_ keyPath: String) -> MixAnimation<Value> {\n        return animationFor(key: keyPath,\n                            getter: { [weak base] in base?.value(forKeyPath: keyPath) as? Value },\n                            setter: { [weak base] in base?.setValue($0, forKeyPath: keyPath) })\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Extensions/UILabel+YAAL.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nextension Yaal where Base: UILabel {\n    public var textColor: MixAnimation<UIColor> {\n        return animationFor(key: \"textColor\",\n                            getter: { [weak base] in base?.textColor },\n                            setter: { [weak base] in base?.textColor = $0 })\n    }\n    public var shadowColor: MixAnimation<UIColor> {\n        return animationFor(key: \"shadowColor\",\n                            getter: { [weak base] in base?.shadowColor },\n                            setter: { [weak base] in base?.shadowColor = $0 })\n    }\n    public var shadowOffset: MixAnimation<CGSize> {\n        return animationFor(key: \"shadowOffset\",\n                            getter: { [weak base] in base?.shadowOffset },\n                            setter: { [weak base] in base?.shadowOffset = $0 })\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Extensions/UIScrollView+YAAL.swift",
    "content": "//\n//  UIScrollView+YAAL.swift\n//  YetAnotherAnimationLibrary\n//\n//  Created by Luke on 4/13/17.\n//  Copyright © 2017 Luke Zhao. All rights reserved.\n//\n\nimport UIKit\n\nextension Yaal where Base: UIScrollView {\n    public var contentOffset: MixAnimation<CGPoint> {\n        return animationFor(key: \"contentOffset\",\n                            getter: { [weak base] in base?.contentOffset },\n                            setter: { [weak base] in base?.contentOffset = $0 })\n    }\n    public var contentSize: MixAnimation<CGSize> {\n        return animationFor(key: \"contentSize\",\n                            getter: { [weak base] in base?.contentSize },\n                            setter: { [weak base] in base?.contentSize = $0 })\n    }\n    public var zoomScale: MixAnimation<CGFloat> {\n        return animationFor(key: \"zoomScale\",\n                            getter: { [weak base] in base?.zoomScale },\n                            setter: { [weak base] in base?.zoomScale = $0 })\n    }\n    public var contentInset: MixAnimation<UIEdgeInsets> {\n        return animationFor(key: \"contentInset\",\n                            getter: { [weak base] in base?.contentInset },\n                            setter: { [weak base] in base?.contentInset = $0 })\n    }\n    public var scrollIndicatorInsets: MixAnimation<UIEdgeInsets> {\n        return animationFor(key: \"scrollIndicatorInsets\",\n                            getter: { [weak base] in base?.scrollIndicatorInsets },\n                            setter: { [weak base] in base?.scrollIndicatorInsets = $0 })\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Extensions/UIView+YAAL.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nextension Yaal where Base: UIView {\n    public var center: MixAnimation<CGPoint> {\n        return animationFor(key: \"center\",\n                            getter: { [weak base] in base?.center },\n                            setter: { [weak base] in base?.center = $0 })\n    }\n    public var alpha: MixAnimation<CGFloat> {\n        return animationFor(key: \"alpha\",\n                            getter: { [weak base] in base?.alpha },\n                            setter: { [weak base] in base?.alpha = $0 })\n    }\n    public var bounds: MixAnimation<CGRect> {\n        return animationFor(key: \"bounds\",\n                            getter: { [weak base] in base?.bounds },\n                            setter: { [weak base] in base?.bounds = $0 })\n    }\n    public var frame: MixAnimation<CGRect> {\n        return animationFor(key: \"frame\",\n                            getter: { [weak base] in base?.frame },\n                            setter: { [weak base] in base?.frame = $0 })\n    }\n    public var backgroundColor: MixAnimation<UIColor> {\n        return animationFor(key: \"backgroundColor\",\n                            getter: { [weak base] in base?.backgroundColor },\n                            setter: { [weak base] in base?.backgroundColor = $0 })\n    }\n    public var tintColor: MixAnimation<UIColor> {\n        return animationFor(key: \"tintColor\",\n                            getter: { [weak base] in base?.tintColor },\n                            setter: { [weak base] in base?.tintColor = $0 })\n    }\n\n    public var translation: MixAnimation<CGPoint> { return base.layer.yaal.translation }\n    public var translationX: MixAnimation<CGFloat> { return base.layer.yaal.translationX }\n    public var translationY: MixAnimation<CGFloat> { return base.layer.yaal.translationY }\n    public var translationZ: MixAnimation<CGFloat> { return base.layer.yaal.translationZ }\n\n    public var scale: MixAnimation<CGFloat> { return base.layer.yaal.scale }\n    public var scaleX: MixAnimation<CGFloat> { return base.layer.yaal.scaleX }\n    public var scaleY: MixAnimation<CGFloat> { return base.layer.yaal.scaleY }\n\n    public var rotation: MixAnimation<CGFloat> { return base.layer.yaal.rotation }\n    public var rotationX: MixAnimation<CGFloat> { return base.layer.yaal.rotationX }\n    public var rotationY: MixAnimation<CGFloat> { return base.layer.yaal.rotationY }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/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.4.0</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": "Sources/YetAnotherAnimationLibrary/Solvers/Curve.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\nprivate let epsilon: Double = 1.0 / 1000\n\n// Following code is rewritten based on UnitBezier.h in WebKit\n// https://github.com/WebKit/webkit/blob/master/Source/WebCore/platform/graphics/UnitBezier.h\n/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\npublic class Curve {\n    public static let linear = Curve(p1x: 0, p1y: 0, p2x: 1, p2y: 1)\n    public static let easeIn = Curve(p1x: 0.42, p1y: 0, p2x: 0, p2y: 1)\n    public static let easeOut = Curve(p1x: 0, p1y: 0, p2x: 0.58, p2y: 1)\n    public static let easeInOut = Curve(p1x: 0.42, p1y: 0, p2x: 0.58, p2y: 1)\n\n    public init(p1x: Double, p1y: Double, p2x: Double, p2y: Double) {\n        cx = 3 * p1x\n        bx = 3 * (p2x - p1x) - cx\n        ax = 1 - cx - bx\n        cy = 3 * p1y\n        by = 3 * (p2y - p1y) - cy\n        ay = 1.0 - cy - by\n    }\n    func sampleCurveX(_ t: Double) -> Double {\n        return ((ax * t + bx) * t + cx) * t\n    }\n    func sampleCurveY(_ t: Double) -> Double {\n        return ((ay * t + by) * t + cy) * t\n    }\n    func sampleCurveDerivativeX(_ t: Double) -> Double {\n        return (3.0 * ax * t + 2.0 * bx) * t + cx\n    }\n    func solveCurveX(_ x: Double) -> Double {\n        var t0, t1, t2, x2, d2: Double\n\n        // Firstly try a few iterations of Newton's method -- normally very fast\n        t2 = x\n        for _ in 0..<8 {\n            x2 = sampleCurveX(t2) - x\n            if fabs(x2) < epsilon {\n                return t2\n            }\n            d2 = sampleCurveDerivativeX(t2)\n            if fabs(x2) < 1e-6 {\n                break\n            }\n            t2 = t2 - x2 / d2\n        }\n\n        // Fall back to the bisection method for reliability\n        t0 = 0\n        t1 = 1\n        t2 = x\n\n        if t2 < t0 {\n            return t0\n        }\n        if t2 > t1 {\n            return t1\n        }\n\n        while t0 < t1 {\n            x2 = sampleCurveX(t2)\n            if fabs(x2 - x) < epsilon {\n                return t2\n            }\n            if x > x2 {\n                t0 = t2\n            } else {\n                t1 = t2\n            }\n            t2 = (t1 - t0) * 0.5 + t0\n        }\n\n        // Failure\n        return t2\n    }\n\n    public func solve(_ x: Double) -> Double {\n        return sampleCurveY(solveCurveX(x))\n    }\n\n    private var ax, ay, bx, by, cx, cy: Double\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/CurveSolver.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic struct CurveSolver<Value: VectorConvertible>: Solver {\n    public let current: AnimationProperty<Value>\n    public let target: AnimationProperty<Value>\n    public let velocity: AnimationProperty<Value>\n    public let curve: Curve\n    public let duration: TimeInterval\n    public var start: Value.Vector\n\n    public var time: TimeInterval = 0\n\n    init(duration: TimeInterval, curve: Curve,\n         current: AnimationProperty<Value>,\n         target: AnimationProperty<Value>,\n         velocity: AnimationProperty<Value>) {\n        self.current = current\n        self.target = target\n        self.velocity = velocity\n        self.duration = duration\n        self.curve = curve\n        self.start = current.vector\n    }\n\n    public mutating func solve(dt: TimeInterval) -> Bool {\n        time += dt\n        if time > duration {\n            current.vector = target.vector\n            velocity.vector = .zero\n            return true\n        }\n        let t = curve.solve(time / duration)\n        let oldCurrent = current.vector\n        current.vector = (target.vector - start) * t + start\n        velocity.vector = (current.vector - oldCurrent) / dt\n        return false\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/DecaySolver.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic struct DecaySolver<Value: VectorConvertible>: RK4Solver {\n    public typealias Vector = Value.Vector\n\n    public let damping: Double\n    public let threshold: Double\n    public var current: AnimationProperty<Value>!\n    public var velocity: AnimationProperty<Value>!\n\n    public init(damping: Double,\n                threshold: Double) {\n        self.damping = damping\n        self.threshold = threshold\n    }\n\n    public func acceleration(current: Vector, velocity: Vector) -> Vector {\n        return -damping * velocity\n    }\n\n    public func updateWith(newCurrent: Vector, newVelocity: Vector) -> Bool {\n        if newVelocity.distance(between: .zero) < threshold {\n            current.vector = newCurrent\n            velocity.vector = .zero\n            return true\n        } else {\n            current.vector = newCurrent\n            velocity.vector = newVelocity\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/RK4Solver.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol RK4Solver: Solver {\n    associatedtype Value: VectorConvertible\n    typealias Vector = Value.Vector\n\n    mutating func solve(dt: TimeInterval) -> Bool\n\n    var current: AnimationProperty<Value>! { get }\n    var velocity: AnimationProperty<Value>! { get }\n    func acceleration(current: Vector, velocity: Vector) -> Vector\n    func updateWith(newCurrent: Vector, newVelocity: Vector) -> Bool\n}\n\nextension RK4Solver {\n    // http://gafferongames.com/game-physics/integration-basics/\n    public func solve(dt: TimeInterval) -> Bool {\n        var dx = Vector.zero\n        var dv = Vector.zero\n        evalutate(dt: 0, dx: &dx, dv: &dv)\n        var dxdt = dx\n        var dvdt = dv\n        evalutate(dt: 0.5 * dt, dx: &dx, dv: &dv)\n        dxdt = dxdt + 2 * dx\n        dvdt = dvdt + 2 * dv\n        evalutate(dt: 0.5 * dt, dx: &dx, dv: &dv)\n        dxdt = dxdt + 2 * dx\n        dvdt = dvdt + 2 * dv\n        evalutate(dt: dt, dx: &dx, dv: &dv)\n        dxdt = dxdt + dx\n        dvdt = dvdt + dv\n\n        let newCurrent = current.vector + dxdt * (dt / 6.0)\n        let newVelocity = velocity.vector + dvdt * (dt / 6.0)\n        return updateWith(newCurrent: newCurrent, newVelocity: newVelocity)\n    }\n\n    func evalutate(dt: TimeInterval, dx: inout Vector, dv: inout Vector) {\n        let x = current.vector + dx * dt\n        let v = velocity.vector + dv * dt\n        let a = acceleration(current: x, velocity: v)\n        dx = v\n        dv = a\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/Solver.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic protocol Solver {\n    mutating func solve(dt: TimeInterval) -> Bool\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/SpringSolver.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic struct SpringSolver<Value: VectorConvertible>: RK4Solver {\n    public typealias Vector = Value.Vector\n    public let stiffness: Double\n    public let damping: Double\n    public let threshold: Double\n    public var current: AnimationProperty<Value>!\n    public var velocity: AnimationProperty<Value>!\n    public var target: AnimationProperty<Value>!\n\n    public init(stiffness: Double,\n                damping: Double,\n                threshold: Double) {\n        self.stiffness = stiffness\n        self.damping = damping\n        self.threshold = threshold\n    }\n\n    public func acceleration(current: Vector, velocity: Vector) -> Vector {\n        return stiffness * (target.vector - current) - damping * velocity\n    }\n\n    public func updateWith(newCurrent: Vector, newVelocity: Vector) -> Bool {\n        if newCurrent.distance(between: target.vector) < threshold,\n            newVelocity.distance(between: .zero) < threshold {\n            current.vector = target.vector\n            velocity.vector = .zero\n            return true\n        } else {\n            current.vector = newCurrent\n            velocity.vector = newVelocity\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Solvers/VelocitySmoother.swift",
    "content": "//\n//  VelocitySmoother.swift\n//  Animate\n//\n//  Created by Luke Zhao on 2017-04-08.\n//  Copyright © 2017 Luke Zhao. All rights reserved.\n//\n\nimport Foundation\n\nprivate let euler = M_E\npublic struct VelocitySmoother<Value: VectorConvertible>: Solver {\n    public let value: AnimationProperty<Value>\n    public let velocity: AnimationProperty<Value>\n    public let lastValue: AnimationProperty<Value>\n\n    public init(value: AnimationProperty<Value>,\n                velocity: AnimationProperty<Value>) {\n        self.value = value\n        self.velocity = velocity\n        lastValue = AnimationProperty<Value>(value: value.value)\n    }\n\n    public mutating func solve(dt: TimeInterval) -> Bool {\n        let alpha = 1 - pow(euler, -dt / 0.05)\n        let currentVelocity = (value.vector - lastValue.vector) / dt\n        let smoothed = velocity.vector + alpha * (currentVelocity - velocity.vector)\n\n        lastValue.vector = value.vector\n        velocity.vector = smoothed\n\n        if velocity.vector.distance(between: .zero) < alpha {\n            velocity.vector = .zero\n            return true\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Types & Operators/ChainOperator.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\npublic struct PipeBuilder<InputValue: VectorConvertible, OutputValue: VectorConvertible> {\n    var root: AnimationProperty<InputValue>\n    var converter: (InputValue) -> OutputValue?\n}\n\nprecedencegroup AnimationPipePrecedence {\n    associativity: left\n    lowerThan: AdditionPrecedence\n}\ninfix operator => : AnimationPipePrecedence\n\npublic func =><Value>(lhs: AnimationProperty<Value>, rhs: MixAnimation<Value>) {\n    lhs.changes.addListener { [weak rhs] _, newValue in\n        rhs?.setTo(newValue)\n    }\n}\n\npublic func =><InputValue, OutputValue>\n    (lhs: PipeBuilder<InputValue, OutputValue>, rhs: MixAnimation<OutputValue>) {\n    lhs.root.changes.addListener { [weak rhs, converter=lhs.converter] _, newValue in\n        if let newValue = converter(newValue) {\n            rhs?.setTo(newValue)\n        }\n    }\n}\n\npublic func =><InputValue, OutputValue>\n    (lhs: AnimationProperty<InputValue>, rhs:@escaping (InputValue) -> OutputValue?) -> PipeBuilder<InputValue, OutputValue> {\n    return PipeBuilder(root: lhs, converter: rhs)\n}\n\npublic func =><InputValue, PipeValue, OutputValue>\n    (lhs: PipeBuilder<InputValue, PipeValue>, rhs:@escaping (PipeValue) -> OutputValue?) -> PipeBuilder<InputValue, OutputValue> {\n    return PipeBuilder(root: lhs.root) { [converter=lhs.converter] newValue in\n        if let newValue = converter(newValue) {\n            return rhs(newValue)\n        }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Types & Operators/Vector.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport simd\n\npublic typealias Vector1 = Double\npublic typealias Vector2 = SIMD2<Double>\npublic typealias Vector3 = SIMD3<Double>\npublic typealias Vector4 = SIMD4<Double>\n\npublic protocol VectorType: ExpressibleByArrayLiteral {\n    init()\n\n    static var zero: Self { get }\n    // for looping all values one by one, not used internally\n    static var rawValueCount: Int { get }\n    subscript(index: Int) -> Double { get set }\n\n    // arithmetic\n    static func + (lhs: Self, rhs: Self) -> Self\n    static func - (lhs: Self, rhs: Self) -> Self\n    static func * (lhs: Double, rhs: Self) -> Self\n    func distance(between: Self) -> Double\n}\n\n// implements VectorConvertible, so that all VectorType conform to VectorConvertible\nextension VectorType {\n    public typealias Vector = Self\n    public static func from(vector: Self) -> Self {\n        return vector\n    }\n    public var vector: Self {\n        return self\n    }\n  static func * (lhs: Self, rhs: Double) -> Self {\n    rhs * lhs\n  }\n  static func / (lhs: Self, rhs: Double) -> Self {\n    lhs * (1 / rhs)\n  }\n  public func distance(between: Self) -> Double {\n    var result = 0.0\n    for i in 0..<Self.rawValueCount {\n      result += abs(self[i] - between[i])\n    }\n    return result\n  }\n}\n\nextension Double: VectorType, VectorConvertible {\n    public static var zero = 0.0\n    public static var rawValueCount: Int { return 1 }\n    public subscript(x: Int) -> Double {\n        get { return self }\n        set { self = newValue }\n    }\n    public init(arrayLiteral elements: Double...) {\n        self = elements[0]\n    }\n    public func distance(between: Double) -> Double {\n        return abs(self - between)\n    }\n}\n\nextension SIMD16: VectorType, VectorConvertible where Scalar == Double {\n  public static var zero: SIMD16<Scalar> = SIMD16<Scalar>()\n  public static var rawValueCount: Int { 16 }\n\n  public static func * (lhs: Double, rhs: SIMD16<Scalar>) -> SIMD16<Scalar> {\n    [lhs * rhs[0], lhs * rhs[1], lhs * rhs[2], lhs * rhs[3],\n     lhs * rhs[4], lhs * rhs[5], lhs * rhs[6], lhs * rhs[7],\n     lhs * rhs[8], lhs * rhs[9], lhs * rhs[10], lhs * rhs[11],\n     lhs * rhs[12], lhs * rhs[13], lhs * rhs[14], lhs * rhs[15]]\n  }\n}\n\nextension SIMD2: VectorType, VectorConvertible where Scalar == Double {\n    public static var zero = SIMD2<Double>()\n    public static var rawValueCount: Int { 2 }\n    public func distance(between: SIMD2<Double>) -> Double {\n        simd.distance(self, between)\n    }\n}\n\nextension SIMD3: VectorType, VectorConvertible where Scalar == Double {\n    public static var zero = SIMD3<Double>()\n    public static var rawValueCount: Int { 3 }\n    public func distance(between: SIMD3<Double>) -> Double {\n        simd.distance(self, between)\n    }\n}\n\nextension SIMD4: VectorType, VectorConvertible where Scalar == Double {\n    public static var zero = SIMD4<Double>()\n    public static var rawValueCount: Int { 4 }\n    public func distance(between: SIMD4<Double>) -> Double {\n        simd.distance(self, between)\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/Types & Operators/VectorConvertible.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\npublic protocol VectorConvertible {\n    associatedtype Vector: VectorType\n    static func from(vector: Vector) -> Self\n    var vector: Vector { get }\n}\n\nextension Float: VectorConvertible {\n    public typealias Vector = Vector1\n    public static func from(vector: Vector1) -> Float {\n        return Float(vector)\n    }\n    public var vector: Vector1 {\n        return Vector1(self)\n    }\n}\n\nextension CGFloat: VectorConvertible {\n    public typealias Vector = Vector1\n    public static func from(vector: Vector1) -> CGFloat {\n        return CGFloat(vector)\n    }\n    public var vector: Vector1 {\n        return Vector1(self)\n    }\n}\n\nextension CGPoint: VectorConvertible {\n    public typealias Vector = Vector2\n    public static func from(vector: Vector2) -> CGPoint {\n        return CGPoint(x: vector.x, y: vector.y)\n    }\n    public var vector: Vector2 {\n        return [Double(x), Double(y)]\n    }\n}\n\nextension CGSize: VectorConvertible {\n    public typealias Vector = Vector2\n    public static func from(vector: Vector2) -> CGSize {\n        return CGSize(width: vector.x, height: vector.y)\n    }\n    public var vector: Vector2 {\n        return [Double(width), Double(height)]\n    }\n}\n\nextension CGRect: VectorConvertible {\n    public typealias Vector = Vector4\n    public static func from(vector: Vector4) -> CGRect {\n        return CGRect(x: vector.x, y: vector.y, width: vector.z, height: vector.w)\n    }\n    public var vector: Vector4 {\n        return [Double(origin.x), Double(origin.y), Double(width), Double(height)]\n    }\n}\n\nextension UIEdgeInsets: VectorConvertible {\n    public typealias Vector = Vector4\n    public static func from(vector: Vector4) -> UIEdgeInsets {\n        return UIEdgeInsets(top: CGFloat(vector.x), left: CGFloat(vector.y),\n                            bottom: CGFloat(vector.z), right: CGFloat(vector.w))\n    }\n    public var vector: Vector4 {\n        return [Double(top), Double(left), Double(bottom), Double(right)]\n    }\n}\n\nextension CGColor: VectorConvertible {\n    private static let rgbColorSpace = CGColorSpaceCreateDeviceRGB()\n    public typealias Vector = Vector4\n    public static func from(vector: Vector4) -> Self {\n        let components = [CGFloat(vector.x), CGFloat(vector.y), CGFloat(vector.z), CGFloat(vector.w)]\n        let color = self.init(colorSpace: CGColor.rgbColorSpace, components: components)!\n        return color\n    }\n\n    public var vector: Vector4 {\n        var rtn = Vector4()\n        if let components = components {\n            if 4 == numberOfComponents {\n                // RGB colorspace\n                rtn[0] = Double(components[0])\n                rtn[1] = Double(components[1])\n                rtn[2] = Double(components[2])\n                rtn[3] = Double(components[3])\n            } else if 2 == numberOfComponents {\n                // Grey colorspace\n                rtn[0] = Double(components[0])\n                rtn[1] = Double(components[0])\n                rtn[2] = Double(components[0])\n                rtn[3] = Double(components[1])\n            } else {\n                // Use CI to convert\n                let ciColor = CIColor(cgColor: self)\n                rtn[0] = Double(ciColor.red)\n                rtn[1] = Double(ciColor.green)\n                rtn[2] = Double(ciColor.blue)\n                rtn[3] = Double(ciColor.alpha)\n            }\n        }\n        return rtn\n    }\n}\n\nextension UIColor: VectorConvertible {\n    public typealias Vector = Vector4\n    public static func from(vector: Vector4) -> Self {\n        return self.init(cgColor: CGColor.from(vector: vector))\n    }\n    public var vector: Vector4 {\n        return cgColor.vector\n    }\n}\n"
  },
  {
    "path": "Sources/YetAnotherAnimationLibrary/YaalCompatible.swift",
    "content": "//\n//  YaalCompatible.swift\n//  YetAnotherAnimationLibrary\n//\n//  Created by Anton Siliuk on 21.04.17.\n//  Copyright © 2017 Luke Zhao. All rights reserved.\n//\n\nimport Foundation\n\npublic struct Yaal<Base> {\n    /// Base object to extend.\n    public let base: Base\n\n    /// Creates extensions with base object.\n    ///\n    /// - parameter base: Base object.\n    public init(_ base: Base) {\n        self.base = base\n    }\n}\n\n/// A type that has yaal extensions.\npublic protocol YaalCompatible {\n    /// Extended type\n    associatedtype CompatibleType\n\n    /// Yaal extensions.\n    static var yaal: Yaal<CompatibleType>.Type { get set }\n\n    /// Yaal extensions.\n    var yaal: Yaal<CompatibleType> { get set }\n}\n\nextension YaalCompatible {\n    /// Yaal extensions.\n    public static var yaal: Yaal<Self>.Type {\n        get {\n            return Yaal<Self>.self\n        }\n        set {\n            // this enables using Yaal to \"mutate\" base type\n        }\n    }\n\n    /// Yaal extensions.\n    public var yaal: Yaal<Self> {\n        get {\n            return Yaal(self)\n        }\n        set {\n            // this enables using Yaal to \"mutate\" base object\n        }\n    }\n}\n\nextension NSObject: YaalCompatible {}\n"
  },
  {
    "path": "YetAnotherAnimationLibrary.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name             = \"YetAnotherAnimationLibrary\"\n  s.version          = \"1.5.0\"\n  s.summary          = \"Designed for gesture-driven animations. Simple, fast and extensible.\"\n\n  s.description      = <<-DESC\n                        Designed for gesture-driven animations. Simple, fast and extensible.\n\n                        It is written in pure swift with protocol oriented design and extensive use of generics.\n                       DESC\n\n  s.homepage         = \"https://github.com/lkzhao/YetAnotherAnimationLibrary\"\n  s.license          = 'MIT'\n  s.author           = { \"Luke\" => \"lzhaoyilun@gmail.com\" }\n  s.source           = { :git => \"https://github.com/lkzhao/YetAnotherAnimationLibrary.git\", :tag => s.version.to_s }\n  \n  s.ios.deployment_target  = '8.0'\n  s.tvos.deployment_target  = '9.0'\n\n  s.ios.frameworks         = 'UIKit', 'Foundation'\n\n  s.requires_arc = true\n\n  s.swift_versions = ['5.0']\n  s.source_files = 'Sources/**/*.swift'\nend\n"
  },
  {
    "path": "YetAnotherAnimationLibrary.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\t8CCFCB181EAA011B008345FC /* YaalCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CCFCB171EAA011B008345FC /* YaalCompatible.swift */; };\n\t\tB11C9F5D1E903671004916D1 /* CardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11C9F5C1E903671004916D1 /* CardViewController.swift */; };\n\t\tB16E80F01E99584B00E95C31 /* SolverAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80EF1E99584B00E95C31 /* SolverAnimatable.swift */; };\n\t\tB16E80F41E995A2C00E95C31 /* CurveSolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80F31E995A2C00E95C31 /* CurveSolver.swift */; };\n\t\tB16E80F61E995A3300E95C31 /* DecaySolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80F51E995A3300E95C31 /* DecaySolver.swift */; };\n\t\tB16E80F81E995A3900E95C31 /* SpringSolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80F71E995A3900E95C31 /* SpringSolver.swift */; };\n\t\tB16E80FA1E995A4500E95C31 /* RK4Solver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80F91E995A4500E95C31 /* RK4Solver.swift */; };\n\t\tB16E80FD1E995ABF00E95C31 /* SpringAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80FC1E995ABE00E95C31 /* SpringAnimation.swift */; };\n\t\tB16E80FF1E995AC500E95C31 /* CurveAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E80FE1E995AC500E95C31 /* CurveAnimation.swift */; };\n\t\tB16E81011E995AD700E95C31 /* DecayAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E81001E995AD700E95C31 /* DecayAnimation.swift */; };\n\t\tB16E81031E9962C300E95C31 /* SolvableAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16E81021E9962C300E95C31 /* SolvableAnimation.swift */; };\n\t\tB17BB1BA1E9BEDB000D287BA /* Animatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17BB1B91E9BEDB000D287BA /* Animatable.swift */; };\n\t\tB17BB1BC1E9BEDD400D287BA /* CurveAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17BB1BB1E9BEDD400D287BA /* CurveAnimatable.swift */; };\n\t\tB17BB1BE1E9BEDE000D287BA /* DecayAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17BB1BD1E9BEDE000D287BA /* DecayAnimatable.swift */; };\n\t\tB17BB1C01E9BEDEF00D287BA /* SpringAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17BB1BF1E9BEDEF00D287BA /* SpringAnimatable.swift */; };\n\t\tB17F18F31E8EE34800D2FA3D /* Solver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17F18F21E8EE34800D2FA3D /* Solver.swift */; };\n\t\tB197CE1E1E8B660F004495AE /* YetAnotherAnimationLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B197CE171E8B660F004495AE /* YetAnotherAnimationLibrary.framework */; };\n\t\tB197CE1F1E8B660F004495AE /* YetAnotherAnimationLibrary.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B197CE171E8B660F004495AE /* YetAnotherAnimationLibrary.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tB197CE251E8B6615004495AE /* ValueAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE101E8B146F004495AE /* ValueAnimation.swift */; };\n\t\tB197CE261E8B6615004495AE /* Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE0B1E8B0F94004495AE /* Animation.swift */; };\n\t\tB197CE271E8B6615004495AE /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE091E8B0F6E004495AE /* Animator.swift */; };\n\t\tB197CE281E8B6615004495AE /* DisplayLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C2ED181E8AE6E1005F0081 /* DisplayLink.swift */; };\n\t\tB197CE291E8B6615004495AE /* VectorConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE0E1E8B0FF3004495AE /* VectorConvertible.swift */; };\n\t\tB197CE2A1E8B6615004495AE /* Vector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1DC14D01E8B08BD00933896 /* Vector.swift */; };\n\t\tB197CE2F1E8C50E9004495AE /* UIView+YAAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE2E1E8C50E9004495AE /* UIView+YAAL.swift */; };\n\t\tB197CE351E8D7E95004495AE /* Announcer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE341E8D7E95004495AE /* Announcer.swift */; };\n\t\tB197CE371E8D91CB004495AE /* AnimationProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197CE361E8D91CB004495AE /* AnimationProperty.swift */; };\n\t\tB1A54F721EA0002E00A96112 /* NSObject+YAAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A54F711EA0002E00A96112 /* NSObject+YAAL.swift */; };\n\t\tB1A54F741EA0004400A96112 /* CALayer+YAAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A54F731EA0004400A96112 /* CALayer+YAAL.swift */; };\n\t\tB1A54F761EA0007200A96112 /* UILabel+YAAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A54F751EA0007200A96112 /* UILabel+YAAL.swift */; };\n\t\tB1A54F791EA00E6200A96112 /* UIScrollView+YAAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A54F781EA00E6200A96112 /* UIScrollView+YAAL.swift */; };\n\t\tB1D0B4801E89C479000B0E24 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D0B47F1E89C479000B0E24 /* AppDelegate.swift */; };\n\t\tB1D0B4821E89C479000B0E24 /* GestureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D0B4811E89C479000B0E24 /* GestureViewController.swift */; };\n\t\tB1D0B4851E89C479000B0E24 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B1D0B4831E89C479000B0E24 /* Main.storyboard */; };\n\t\tB1D0B4871E89C479000B0E24 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B1D0B4861E89C479000B0E24 /* Assets.xcassets */; };\n\t\tB1D0B48A1E89C479000B0E24 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B1D0B4881E89C479000B0E24 /* LaunchScreen.storyboard */; };\n\t\tB1F346211E99923C002E15D7 /* ChainOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1F346201E99923C002E15D7 /* ChainOperator.swift */; };\n\t\tB1F346231E99927E002E15D7 /* VelocitySmoother.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1F346221E99927E002E15D7 /* VelocitySmoother.swift */; };\n\t\tB1FE700B1E8DEC1B00CF9840 /* Curve.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FE700A1E8DEC1B00CF9840 /* Curve.swift */; };\n\t\tB1FE700D1E8DF33700CF9840 /* MixAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FE700C1E8DF33700CF9840 /* MixAnimation.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tB197CE1C1E8B660F004495AE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = B1D0B4741E89C479000B0E24 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B197CE161E8B660F004495AE;\n\t\t\tremoteInfo = Animate;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tB197CE231E8B660F004495AE /* 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\tB197CE1F1E8B660F004495AE /* YetAnotherAnimationLibrary.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\t8CCFCB171EAA011B008345FC /* YaalCompatible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YaalCompatible.swift; sourceTree = \"<group>\"; };\n\t\tB11C9F5C1E903671004916D1 /* CardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardViewController.swift; sourceTree = \"<group>\"; };\n\t\tB16E80EF1E99584B00E95C31 /* SolverAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolverAnimatable.swift; sourceTree = \"<group>\"; };\n\t\tB16E80F31E995A2C00E95C31 /* CurveSolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurveSolver.swift; sourceTree = \"<group>\"; };\n\t\tB16E80F51E995A3300E95C31 /* DecaySolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecaySolver.swift; sourceTree = \"<group>\"; };\n\t\tB16E80F71E995A3900E95C31 /* SpringSolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringSolver.swift; sourceTree = \"<group>\"; };\n\t\tB16E80F91E995A4500E95C31 /* RK4Solver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RK4Solver.swift; sourceTree = \"<group>\"; };\n\t\tB16E80FC1E995ABE00E95C31 /* SpringAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringAnimation.swift; sourceTree = \"<group>\"; };\n\t\tB16E80FE1E995AC500E95C31 /* CurveAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurveAnimation.swift; sourceTree = \"<group>\"; };\n\t\tB16E81001E995AD700E95C31 /* DecayAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecayAnimation.swift; sourceTree = \"<group>\"; };\n\t\tB16E81021E9962C300E95C31 /* SolvableAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolvableAnimation.swift; sourceTree = \"<group>\"; };\n\t\tB17BB1B91E9BEDB000D287BA /* Animatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animatable.swift; sourceTree = \"<group>\"; };\n\t\tB17BB1BB1E9BEDD400D287BA /* CurveAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurveAnimatable.swift; sourceTree = \"<group>\"; };\n\t\tB17BB1BD1E9BEDE000D287BA /* DecayAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecayAnimatable.swift; sourceTree = \"<group>\"; };\n\t\tB17BB1BF1E9BEDEF00D287BA /* SpringAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringAnimatable.swift; sourceTree = \"<group>\"; };\n\t\tB17F18F21E8EE34800D2FA3D /* Solver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Solver.swift; sourceTree = \"<group>\"; };\n\t\tB197CE091E8B0F6E004495AE /* Animator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animator.swift; sourceTree = \"<group>\"; };\n\t\tB197CE0B1E8B0F94004495AE /* Animation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animation.swift; sourceTree = \"<group>\"; };\n\t\tB197CE0E1E8B0FF3004495AE /* VectorConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VectorConvertible.swift; sourceTree = \"<group>\"; };\n\t\tB197CE101E8B146F004495AE /* ValueAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueAnimation.swift; sourceTree = \"<group>\"; };\n\t\tB197CE171E8B660F004495AE /* YetAnotherAnimationLibrary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YetAnotherAnimationLibrary.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB197CE1A1E8B660F004495AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB197CE2E1E8C50E9004495AE /* UIView+YAAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+YAAL.swift\"; sourceTree = \"<group>\"; };\n\t\tB197CE341E8D7E95004495AE /* Announcer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Announcer.swift; sourceTree = \"<group>\"; };\n\t\tB197CE361E8D91CB004495AE /* AnimationProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimationProperty.swift; sourceTree = \"<group>\"; };\n\t\tB1A54F711EA0002E00A96112 /* NSObject+YAAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSObject+YAAL.swift\"; sourceTree = \"<group>\"; };\n\t\tB1A54F731EA0004400A96112 /* CALayer+YAAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"CALayer+YAAL.swift\"; sourceTree = \"<group>\"; };\n\t\tB1A54F751EA0007200A96112 /* UILabel+YAAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UILabel+YAAL.swift\"; sourceTree = \"<group>\"; };\n\t\tB1A54F781EA00E6200A96112 /* UIScrollView+YAAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIScrollView+YAAL.swift\"; sourceTree = \"<group>\"; };\n\t\tB1C2ED181E8AE6E1005F0081 /* DisplayLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayLink.swift; sourceTree = \"<group>\"; };\n\t\tB1D0B47C1E89C479000B0E24 /* Examples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Examples.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB1D0B47F1E89C479000B0E24 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tB1D0B4811E89C479000B0E24 /* GestureViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GestureViewController.swift; sourceTree = \"<group>\"; };\n\t\tB1D0B4841E89C479000B0E24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\tB1D0B4861E89C479000B0E24 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tB1D0B4891E89C479000B0E24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\tB1D0B48B1E89C479000B0E24 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB1DC14D01E8B08BD00933896 /* Vector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Vector.swift; sourceTree = \"<group>\"; };\n\t\tB1F346201E99923C002E15D7 /* ChainOperator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChainOperator.swift; sourceTree = \"<group>\"; };\n\t\tB1F346221E99927E002E15D7 /* VelocitySmoother.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VelocitySmoother.swift; sourceTree = \"<group>\"; };\n\t\tB1FE700A1E8DEC1B00CF9840 /* Curve.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Curve.swift; sourceTree = \"<group>\"; };\n\t\tB1FE700C1E8DF33700CF9840 /* MixAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MixAnimation.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tB197CE131E8B660F004495AE /* 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\tB1D0B4791E89C479000B0E24 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB197CE1E1E8B660F004495AE /* YetAnotherAnimationLibrary.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\tB16E80F11E99585B00E95C31 /* Animator */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB197CE091E8B0F6E004495AE /* Animator.swift */,\n\t\t\t\tB1C2ED181E8AE6E1005F0081 /* DisplayLink.swift */,\n\t\t\t);\n\t\t\tpath = Animator;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB16E80F21E99586D00E95C31 /* Animations */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB197CE0B1E8B0F94004495AE /* Animation.swift */,\n\t\t\t\tB16E80FE1E995AC500E95C31 /* CurveAnimation.swift */,\n\t\t\t\tB16E81001E995AD700E95C31 /* DecayAnimation.swift */,\n\t\t\t\tB1FE700C1E8DF33700CF9840 /* MixAnimation.swift */,\n\t\t\t\tB16E81021E9962C300E95C31 /* SolvableAnimation.swift */,\n\t\t\t\tB16E80FC1E995ABE00E95C31 /* SpringAnimation.swift */,\n\t\t\t\tB197CE101E8B146F004495AE /* ValueAnimation.swift */,\n\t\t\t);\n\t\t\tpath = Animations;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB16E80FB1E995A7300E95C31 /* Solvers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1FE700A1E8DEC1B00CF9840 /* Curve.swift */,\n\t\t\t\tB16E80F31E995A2C00E95C31 /* CurveSolver.swift */,\n\t\t\t\tB16E80F51E995A3300E95C31 /* DecaySolver.swift */,\n\t\t\t\tB16E80F91E995A4500E95C31 /* RK4Solver.swift */,\n\t\t\t\tB17F18F21E8EE34800D2FA3D /* Solver.swift */,\n\t\t\t\tB16E80F71E995A3900E95C31 /* SpringSolver.swift */,\n\t\t\t\tB1F346221E99927E002E15D7 /* VelocitySmoother.swift */,\n\t\t\t);\n\t\t\tpath = Solvers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB17BB1C11E9BEE2400D287BA /* Animatables */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB17BB1B91E9BEDB000D287BA /* Animatable.swift */,\n\t\t\t\tB17BB1BB1E9BEDD400D287BA /* CurveAnimatable.swift */,\n\t\t\t\tB17BB1BD1E9BEDE000D287BA /* DecayAnimatable.swift */,\n\t\t\t\tB16E80EF1E99584B00E95C31 /* SolverAnimatable.swift */,\n\t\t\t\tB17BB1BF1E9BEDEF00D287BA /* SpringAnimatable.swift */,\n\t\t\t);\n\t\t\tpath = Animatables;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB17BB1C21E9BEE4F00D287BA /* AnimationProperty */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB197CE361E8D91CB004495AE /* AnimationProperty.swift */,\n\t\t\t\tB197CE341E8D7E95004495AE /* Announcer.swift */,\n\t\t\t);\n\t\t\tpath = AnimationProperty;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB17BB1C31E9BEE6B00D287BA /* Types & Operators */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1F346201E99923C002E15D7 /* ChainOperator.swift */,\n\t\t\t\tB1DC14D01E8B08BD00933896 /* Vector.swift */,\n\t\t\t\tB197CE0E1E8B0FF3004495AE /* VectorConvertible.swift */,\n\t\t\t);\n\t\t\tpath = \"Types & Operators\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB197CE0D1E8B0FB1004495AE /* Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8CCFCB171EAA011B008345FC /* YaalCompatible.swift */,\n\t\t\t\tB17BB1C11E9BEE2400D287BA /* Animatables */,\n\t\t\t\tB17BB1C21E9BEE4F00D287BA /* AnimationProperty */,\n\t\t\t\tB16E80F21E99586D00E95C31 /* Animations */,\n\t\t\t\tB16E80F11E99585B00E95C31 /* Animator */,\n\t\t\t\tB1A54F771EA0009800A96112 /* Extensions */,\n\t\t\t\tB16E80FB1E995A7300E95C31 /* Solvers */,\n\t\t\t\tB17BB1C31E9BEE6B00D287BA /* Types & Operators */,\n\t\t\t\tB197CE1A1E8B660F004495AE /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Sources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1A54F771EA0009800A96112 /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1A54F711EA0002E00A96112 /* NSObject+YAAL.swift */,\n\t\t\t\tB1A54F731EA0004400A96112 /* CALayer+YAAL.swift */,\n\t\t\t\tB1A54F751EA0007200A96112 /* UILabel+YAAL.swift */,\n\t\t\t\tB1A54F781EA00E6200A96112 /* UIScrollView+YAAL.swift */,\n\t\t\t\tB197CE2E1E8C50E9004495AE /* UIView+YAAL.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1D0B4731E89C479000B0E24 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D0B47E1E89C479000B0E24 /* Examples */,\n\t\t\t\tB1D0B47D1E89C479000B0E24 /* Products */,\n\t\t\t\tB197CE0D1E8B0FB1004495AE /* Sources */,\n\t\t\t);\n\t\t\tindentWidth = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 4;\n\t\t};\n\t\tB1D0B47D1E89C479000B0E24 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D0B47C1E89C479000B0E24 /* Examples.app */,\n\t\t\t\tB197CE171E8B660F004495AE /* YetAnotherAnimationLibrary.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1D0B47E1E89C479000B0E24 /* Examples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1F346241E999371002E15D7 /* Supporting Files */,\n\t\t\t\tB11C9F5C1E903671004916D1 /* CardViewController.swift */,\n\t\t\t\tB1D0B4811E89C479000B0E24 /* GestureViewController.swift */,\n\t\t\t);\n\t\t\tpath = Examples;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1F346241E999371002E15D7 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D0B47F1E89C479000B0E24 /* AppDelegate.swift */,\n\t\t\t\tB1D0B4861E89C479000B0E24 /* Assets.xcassets */,\n\t\t\t\tB1D0B48B1E89C479000B0E24 /* Info.plist */,\n\t\t\t\tB1D0B4881E89C479000B0E24 /* LaunchScreen.storyboard */,\n\t\t\t\tB1D0B4831E89C479000B0E24 /* Main.storyboard */,\n\t\t\t);\n\t\t\tpath = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tB197CE141E8B660F004495AE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\tB197CE161E8B660F004495AE /* YetAnotherAnimationLibrary */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B197CE201E8B660F004495AE /* Build configuration list for PBXNativeTarget \"YetAnotherAnimationLibrary\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB17BB1C41E9BEEDC00D287BA /* Swiftlint */,\n\t\t\t\tB197CE121E8B660F004495AE /* Sources */,\n\t\t\t\tB197CE131E8B660F004495AE /* Frameworks */,\n\t\t\t\tB197CE141E8B660F004495AE /* Headers */,\n\t\t\t\tB197CE151E8B660F004495AE /* 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 = YetAnotherAnimationLibrary;\n\t\t\tproductName = Animate;\n\t\t\tproductReference = B197CE171E8B660F004495AE /* YetAnotherAnimationLibrary.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tB1D0B47B1E89C479000B0E24 /* Examples */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B1D0B48E1E89C479000B0E24 /* Build configuration list for PBXNativeTarget \"Examples\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB1D0B4781E89C479000B0E24 /* Sources */,\n\t\t\t\tB1D0B4791E89C479000B0E24 /* Frameworks */,\n\t\t\t\tB1D0B47A1E89C479000B0E24 /* Resources */,\n\t\t\t\tB197CE231E8B660F004495AE /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tB197CE1D1E8B660F004495AE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Examples;\n\t\t\tproductName = SpringAnimator;\n\t\t\tproductReference = B1D0B47C1E89C479000B0E24 /* Examples.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tB1D0B4741E89C479000B0E24 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = \"Luke Zhao\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tB197CE161E8B660F004495AE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tDevelopmentTeam = 4VSEW78TKT;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\tB1D0B47B1E89C479000B0E24 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tDevelopmentTeam = 4VSEW78TKT;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = B1D0B4771E89C479000B0E24 /* Build configuration list for PBXProject \"YetAnotherAnimationLibrary\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\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 = B1D0B4731E89C479000B0E24;\n\t\t\tproductRefGroup = B1D0B47D1E89C479000B0E24 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB1D0B47B1E89C479000B0E24 /* Examples */,\n\t\t\t\tB197CE161E8B660F004495AE /* YetAnotherAnimationLibrary */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tB197CE151E8B660F004495AE /* 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\tB1D0B47A1E89C479000B0E24 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB1D0B48A1E89C479000B0E24 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\tB1D0B4871E89C479000B0E24 /* Assets.xcassets in Resources */,\n\t\t\t\tB1D0B4851E89C479000B0E24 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tB17BB1C41E9BEEDC00D287BA /* Swiftlint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 12;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = Swiftlint;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"if which swiftlint >/dev/null; then\\nswiftlint\\nelse\\necho \\\"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\\\"\\nfi\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tB197CE121E8B660F004495AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB1F346231E99927E002E15D7 /* VelocitySmoother.swift in Sources */,\n\t\t\t\tB17BB1BA1E9BEDB000D287BA /* Animatable.swift in Sources */,\n\t\t\t\tB1FE700B1E8DEC1B00CF9840 /* Curve.swift in Sources */,\n\t\t\t\tB16E80F61E995A3300E95C31 /* DecaySolver.swift in Sources */,\n\t\t\t\tB197CE291E8B6615004495AE /* VectorConvertible.swift in Sources */,\n\t\t\t\tB16E80F41E995A2C00E95C31 /* CurveSolver.swift in Sources */,\n\t\t\t\tB197CE371E8D91CB004495AE /* AnimationProperty.swift in Sources */,\n\t\t\t\tB197CE281E8B6615004495AE /* DisplayLink.swift in Sources */,\n\t\t\t\tB197CE2F1E8C50E9004495AE /* UIView+YAAL.swift in Sources */,\n\t\t\t\tB16E81031E9962C300E95C31 /* SolvableAnimation.swift in Sources */,\n\t\t\t\tB1A54F791EA00E6200A96112 /* UIScrollView+YAAL.swift in Sources */,\n\t\t\t\tB17BB1BC1E9BEDD400D287BA /* CurveAnimatable.swift in Sources */,\n\t\t\t\tB197CE271E8B6615004495AE /* Animator.swift in Sources */,\n\t\t\t\tB1FE700D1E8DF33700CF9840 /* MixAnimation.swift in Sources */,\n\t\t\t\t8CCFCB181EAA011B008345FC /* YaalCompatible.swift in Sources */,\n\t\t\t\tB197CE2A1E8B6615004495AE /* Vector.swift in Sources */,\n\t\t\t\tB17F18F31E8EE34800D2FA3D /* Solver.swift in Sources */,\n\t\t\t\tB16E80F81E995A3900E95C31 /* SpringSolver.swift in Sources */,\n\t\t\t\tB1A54F741EA0004400A96112 /* CALayer+YAAL.swift in Sources */,\n\t\t\t\tB1A54F761EA0007200A96112 /* UILabel+YAAL.swift in Sources */,\n\t\t\t\tB197CE251E8B6615004495AE /* ValueAnimation.swift in Sources */,\n\t\t\t\tB16E81011E995AD700E95C31 /* DecayAnimation.swift in Sources */,\n\t\t\t\tB197CE261E8B6615004495AE /* Animation.swift in Sources */,\n\t\t\t\tB16E80F01E99584B00E95C31 /* SolverAnimatable.swift in Sources */,\n\t\t\t\tB1A54F721EA0002E00A96112 /* NSObject+YAAL.swift in Sources */,\n\t\t\t\tB16E80FF1E995AC500E95C31 /* CurveAnimation.swift in Sources */,\n\t\t\t\tB16E80FD1E995ABF00E95C31 /* SpringAnimation.swift in Sources */,\n\t\t\t\tB1F346211E99923C002E15D7 /* ChainOperator.swift in Sources */,\n\t\t\t\tB197CE351E8D7E95004495AE /* Announcer.swift in Sources */,\n\t\t\t\tB17BB1BE1E9BEDE000D287BA /* DecayAnimatable.swift in Sources */,\n\t\t\t\tB17BB1C01E9BEDEF00D287BA /* SpringAnimatable.swift in Sources */,\n\t\t\t\tB16E80FA1E995A4500E95C31 /* RK4Solver.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1D0B4781E89C479000B0E24 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB1D0B4821E89C479000B0E24 /* GestureViewController.swift in Sources */,\n\t\t\t\tB11C9F5D1E903671004916D1 /* CardViewController.swift in Sources */,\n\t\t\t\tB1D0B4801E89C479000B0E24 /* AppDelegate.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\tB197CE1D1E8B660F004495AE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = B197CE161E8B660F004495AE /* YetAnotherAnimationLibrary */;\n\t\t\ttargetProxy = B197CE1C1E8B660F004495AE /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tB1D0B4831E89C479000B0E24 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D0B4841E89C479000B0E24 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tpath = .;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1D0B4881E89C479000B0E24 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D0B4891E89C479000B0E24 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tpath = .;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tB197CE211E8B660F004495AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 4VSEW78TKT;\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 = \"$(SRCROOT)/Sources/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.lkzhao.YetAnotherAnimationLibrary;\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 = 5.0;\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\tB197CE221E8B660F004495AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 4VSEW78TKT;\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 = \"$(SRCROOT)/Sources/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.lkzhao.YetAnotherAnimationLibrary;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\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\tB1D0B48C1E89C479000B0E24 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\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_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\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_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB1D0B48D1E89C479000B0E24 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\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_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tB1D0B48F1E89C479000B0E24 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 4VSEW78TKT;\n\t\t\t\tINFOPLIST_FILE = \"Examples/Supporting Files/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.lkzhao.YetAnotherAnimationLibraryExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_INSTALL_OBJC_HEADER = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB1D0B4901E89C479000B0E24 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 4VSEW78TKT;\n\t\t\t\tINFOPLIST_FILE = \"Examples/Supporting Files/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.lkzhao.YetAnotherAnimationLibraryExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_INSTALL_OBJC_HEADER = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tB197CE201E8B660F004495AE /* Build configuration list for PBXNativeTarget \"YetAnotherAnimationLibrary\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB197CE211E8B660F004495AE /* Debug */,\n\t\t\t\tB197CE221E8B660F004495AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB1D0B4771E89C479000B0E24 /* Build configuration list for PBXProject \"YetAnotherAnimationLibrary\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB1D0B48C1E89C479000B0E24 /* Debug */,\n\t\t\t\tB1D0B48D1E89C479000B0E24 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB1D0B48E1E89C479000B0E24 /* Build configuration list for PBXNativeTarget \"Examples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB1D0B48F1E89C479000B0E24 /* Debug */,\n\t\t\t\tB1D0B4901E89C479000B0E24 /* 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 = B1D0B4741E89C479000B0E24 /* Project object */;\n}\n"
  },
  {
    "path": "YetAnotherAnimationLibrary.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/lkzhao/Snapchat/Dev/Animate/YetAnotherAnimationLibrary.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "YetAnotherAnimationLibrary.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "YetAnotherAnimationLibrary.xcodeproj/xcshareddata/xcschemes/YetAnotherAnimationLibrary.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\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 = \"B197CE161E8B660F004495AE\"\n               BuildableName = \"YetAnotherAnimationLibrary.framework\"\n               BlueprintName = \"YetAnotherAnimationLibrary\"\n               ReferencedContainer = \"container:YetAnotherAnimationLibrary.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      </Testables>\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 = \"B197CE161E8B660F004495AE\"\n            BuildableName = \"YetAnotherAnimationLibrary.framework\"\n            BlueprintName = \"YetAnotherAnimationLibrary\"\n            ReferencedContainer = \"container:YetAnotherAnimationLibrary.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 = \"B197CE161E8B660F004495AE\"\n            BuildableName = \"YetAnotherAnimationLibrary.framework\"\n            BlueprintName = \"YetAnotherAnimationLibrary\"\n            ReferencedContainer = \"container:YetAnotherAnimationLibrary.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"
  }
]