[
  {
    "path": ".github/workflows/ios.yml",
    "content": "name: iOS starter workflow\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  build:\n    name: Build and Test default scheme using any available iPhone simulator\n    runs-on: macos-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Set Default Scheme\n        run: |\n          scheme_list=$(xcodebuild -list -json | tr -d \"\\n\")\n          default=$(echo $scheme_list | ruby -e \"require 'json'; puts JSON.parse(STDIN.gets)['project']['schemes'][0]\")\n          echo $default | cat >default\n          echo Using default scheme: $default\n      - name: Build\n        env:\n          scheme: ${{ 'default' }}\n          platform: ${{ 'iOS Simulator' }}\n        run: |\n          # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)\n          device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\\(]+' | head -1 | awk '{$1=$1;print}' | sed -e \"s/ Simulator$//\"`\n          if [ $scheme = default ]; then scheme=$(cat default); fi\n          if [ \"`ls -A | grep -i \\\\.xcworkspace\\$`\" ]; then filetype_parameter=\"workspace\" && file_to_build=\"`ls -A | grep -i \\\\.xcworkspace\\$`\"; else filetype_parameter=\"project\" && file_to_build=\"`ls -A | grep -i \\\\.xcodeproj\\$`\"; fi\n          file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`\n          xcodebuild build-for-testing -scheme \"$scheme\" -\"$filetype_parameter\" \"$file_to_build\" -destination \"platform=$platform,name=$device\" -skipPackagePluginValidation -skipMacroValidation\n      - name: Test\n        env:\n          scheme: ${{ 'default' }}\n          platform: ${{ 'iOS Simulator' }}\n        run: |\n          # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)\n          device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\\(]+' | head -1 | awk '{$1=$1;print}' | sed -e \"s/ Simulator$//\"`\n          if [ $scheme = default ]; then scheme=$(cat default); fi\n          if [ \"`ls -A | grep -i \\\\.xcworkspace\\$`\" ]; then filetype_parameter=\"workspace\" && file_to_build=\"`ls -A | grep -i \\\\.xcworkspace\\$`\"; else filetype_parameter=\"project\" && file_to_build=\"`ls -A | grep -i \\\\.xcodeproj\\$`\"; fi\n          file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`\n          xcodebuild test-without-building -scheme \"$scheme\" -\"$filetype_parameter\" \"$file_to_build\" -destination \"platform=$platform,name=$device\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)\n*.xcscmblueprint\n*.xccheckout\n\n## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)\nbuild/\nDerivedData/\n*.moved-aside\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\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# Package.pins\n# Package.resolved\n# *.xcodeproj\n#\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n.swiftpm\n\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# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\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# Accio dependency management\nDependencies/\n.accio/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n"
  },
  {
    "path": ".jazzy.yaml",
    "content": "readme: README.md\nauthor: Vinh Nguyen\nauthor_url: https://github.com/ninjaprox\ngithub_url: https://github.com/ninjaprox/NVActivityIndicatorView\n\ntheme: fullwidth\ndisable_search: true\nhide_documentation_coverage: true\nclean: true\n\nmodule: NVActivityIndicatorView\nmodule_version: 5.2.0\nbuild_tool_arguments:\n- -scheme\n- NVActivityIndicatorView-Package\n- -project\n- NVActivityIndicatorView.xcodeproj\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules:\n- line_length\n\ntype_name:\n  max_length: 60\nidentifier_name:\n  excluded:\n  - x\n  - y\n  - i\n  - j\nfunction_body_length:\n  warning: 50\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change log\n\n## [5.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.2.0)\n\n-   Add privacy manifest (#349)\n\n## [5.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.1)\n\n-   Fix #319 (amendment)\n\n## [5.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.0)\n\n-   Fix #319\n\n## [5.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.1)\n\n-   Fix #314\n\n## [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0)\n\n-   Deprecate `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`\n-   By default, `NVActivityIndicatorView` pod doesn't include `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`, use `NVActivityIndicatorView/Extended` instead\n-   The same applies for `NVActivityIndicatorView` and `NVActivityIndicatorViewExtended` when using Swift Package Manager\n-   Drop support for Swift <4.2\n\n## [4.8.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.8.0)\n\n-   Add Swift Package Manager support (#290)\n\n## [4.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.7.0)\n\n-   Default nil fadeInAnimation and fadeOutAnimation (#264)\n-   Swift 5 migration (#274)\n\n## [4.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.1)\n\n-   Fix #261\n\n## [4.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.0)\n\n-   New NVActivityIndicatorAnimationBallDoubleBounce animation (#258)\n-   Unify product name (#260)\n\n## [4.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.1)\n\n-   Fix #251\n\n## [4.5.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.0)\n\n-   Add tvOS target (#248)\n\n## [4.4.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.1)\n\n-   Don’t start/stop animating if unnecessary (#239)\n-   Specify Swift version in Podspec (#245)\n\n## [4.4.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.0)\n\n-   Fix #211\n-   Swift 4.2 migration\n\n## [4.3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.3.0)\n\n-   Handle starting while waiting to stop (#218)\n-   UI blocker fade in/out animation (#219)\n\n## [4.2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.1)\n\n-   Fix #213\n\n## [4.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.0)\n\n-   Refactor `NVActivityIndicatorPresenter` with state pattern\n-   Expose `isAnimating` from `NVActivityIndicatorPresenter` and `NVActivityIndicatorViewable` (#204)\n-   Fix tests\n\n## [4.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.1)\n\n-   Fix #186, #189\n\n## [4.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.0)\n\n-   Introduce message spacing\n-   New circle stroke spin animation\n\n## [4.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.1)\n\n-   Fix view in auto layout\n-   Fix #173, #180\n\n## [4.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.0)\n\n-   Update to Swift 4\n\n## [3.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.7.0)\n\n-   Support app extension\n\n## [3.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.1)\n\n-   Fix #138\n\n## [3.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.0)\n\n-   Fix #128\n\n## [3.5.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.2)\n\n-   Fix #132\n\n## [3.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.1)\n\n-   Fix #123\n\n## [v3.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.5)\n\n-   Fix #121\n-   Fix setting message\n\n## [v3.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.4)\n\n-   Fix constraint conflict in UI blocker\n\n## [v3.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.3)\n\n-   Able to change text color in UI blocker\n-   Fix UI blocker layer on orientation change\n\n## [v3.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.2)\n\n-   Able to change UI blocker background color\n-   Able to change message in UI blocker during displaying\n\n## [v3.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.1)\n\n-   Optimize compile time\n-   Update setting to Swift 3.0.1\n-   Add default message\n-   Custom message font\n-   Auto message width\n\n## [v3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.0)\n\n-   Support Xcode 8 and Swift 3\n\n## [v2.12](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.12)\n\n-   Fix infinite loop caused by `stopAnimation()` (#67)\n\n## [v2.11](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.11)\n\n-   Fix when used with MBProgressHUD\n-   Abilitiy to display UI blocker anywher\n-   Time threshold to display UI blocker\n-   Minimum display time of UI blocker\n-   Deprecate some APIs\n-   Add tests\n\n## [v2.10](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.10)\n\n-   Fix UI blocker not showing full screen\n-   Support tvOS\n\n## [v2.9](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.9)\n\n-   Ability to change size of animation in UI blocker\n\n## [v2.8](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.8)\n\n-   New Orbit animation\n-   New Audio equalizer animation\n\n## [v2.7](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.7)\n\n-   Display as UI blocker for UIViewController\n-   Be able to change defaults\n\n## [v2.6](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.6)\n\n-   Fix BallSpinFadeLoader animation\n-   Fix LineSpinFadeLoader animation\n-   Fix BallRotateChase animation\n-   Change default animation to BallSpinFadeLoader\n\n## [v2.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.5)\n\n-   Fix padding issues\n\n## [v2.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.4)\n\n-   Fix autolayout compability when using in Storyboard\n-   Support for IBInpectable\n\n## [v2.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.3)\n\n-   Fix bug when orientation changes once stopped animation\n-   Update document\n\n## [v2.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.2)\n\n-   Public properties of animation\n-   Public hidesWhenStopped and animating\n-   New animation:\n    -   Ball rotate chase\n\n## [v2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.1)\n\n-   Support Carthage\n\n## [v2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.0)\n\n-   Update to Swift 2.0\n\n## [v1.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.3)\n\n-   More convenient constructor\n-   Hide when stopped option\n\n## [v1.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.2)\n\n-   Fix issue when using as framework\n-   Set default animation type to pacman\n-   Add documentation\n\n## [v1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.1)\n\n-   Change project structure to work well with CocoaPods\n-   Small fix in `podspec`\n\n## [v1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.0)\n\n-   Initial release\n-   Full implementations of 28 loaders from loaders.css\n"
  },
  {
    "path": "Example/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    // MARK: UISceneSession Lifecycle\n\n    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {\n        // Called when a new scene session is being created.\n        // Use this method to select a configuration to create the new scene with.\n        return UISceneConfiguration(name: \"Default Configuration\", sessionRole: connectingSceneSession.role)\n    }\n\n    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {\n        // Called when the user discards a scene session.\n        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.\n        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.\n    }\n\n}\n"
  },
  {
    "path": "Example/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\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      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/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=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\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                    <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\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/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=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\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\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>5.2.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>48</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>\n\t\t\t\t\t<key>UISceneStoryboardFile</key>\n\t\t\t\t\t<string>Main</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\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": "Example/SceneDelegate.swift",
    "content": "//\n//  SceneDelegate.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport UIKit\n\nclass SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n    var window: UIWindow?\n\n    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.\n        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.\n        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).\n        guard (scene as? UIWindowScene) != nil else { return }\n    }\n\n    func sceneDidDisconnect(_ scene: UIScene) {\n        // Called as the scene is being released by the system.\n        // This occurs shortly after the scene enters the background, or when its session is discarded.\n        // Release any resources associated with this scene that can be re-created the next time the scene connects.\n        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).\n    }\n\n    func sceneDidBecomeActive(_ scene: UIScene) {\n        // Called when the scene has moved from an inactive state to an active state.\n        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.\n    }\n\n    func sceneWillResignActive(_ scene: UIScene) {\n        // Called when the scene will move from an active state to an inactive state.\n        // This may occur due to temporary interruptions (ex. an incoming phone call).\n    }\n\n    func sceneWillEnterForeground(_ scene: UIScene) {\n        // Called as the scene transitions from the background to the foreground.\n        // Use this method to undo the changes made on entering the background.\n    }\n\n    func sceneDidEnterBackground(_ scene: UIScene) {\n        // Called as the scene transitions from the foreground to the background.\n        // Use this method to save data, release shared resources, and store enough scene-specific state information\n        // to restore the scene back to its current state.\n    }\n\n}\n"
  },
  {
    "path": "Example/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport UIKit\nimport NVActivityIndicatorView\nimport NVActivityIndicatorViewExtended\n\nclass ViewController: UIViewController, NVActivityIndicatorViewable {\n\n    private let presentingIndicatorTypes = {\n        return NVActivityIndicatorType.allCases.filter { $0 != .blank }\n    }()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        self.view.backgroundColor = UIColor(red: CGFloat(237 / 255.0), green: CGFloat(85 / 255.0), blue: CGFloat(101 / 255.0), alpha: 1)\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        let safeArea = view.safeAreaLayoutGuide.layoutFrame\n\n        var cols = 4\n        var rows = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))\n        if safeArea.width > safeArea.height {\n            //Landscape\n            cols = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))\n            rows = 4\n        }\n        let cellWidth = Int(safeArea.width / CGFloat(cols))\n        let cellHeight = Int(safeArea.height / CGFloat(rows))\n\n        self.view.subviews.forEach {\n            $0.removeFromSuperview()\n        }\n\n        for (index, indicatorType) in presentingIndicatorTypes.enumerated() {\n            let x = index % cols * cellWidth + Int(safeArea.origin.x)\n            let y = index / cols * cellHeight + Int(safeArea.origin.y)\n            let frame = CGRect(x: x, y: y, width: cellWidth, height: cellHeight)\n            let activityIndicatorView = NVActivityIndicatorView(frame: frame,\n                                                                type: indicatorType)\n            let animationTypeLabel = UILabel(frame: frame)\n\n            animationTypeLabel.text = String(index)\n            animationTypeLabel.sizeToFit()\n            animationTypeLabel.allowsDefaultTighteningForTruncation = true\n            animationTypeLabel.textColor = UIColor.white\n            animationTypeLabel.frame.origin.x += 5\n            animationTypeLabel.frame.origin.y += CGFloat(cellHeight) - animationTypeLabel.frame.size.height\n\n            activityIndicatorView.padding = 20\n            if indicatorType == NVActivityIndicatorType.orbit {\n                activityIndicatorView.padding = 0\n            }\n            self.view.addSubview(activityIndicatorView)\n            self.view.addSubview(animationTypeLabel)\n            activityIndicatorView.startAnimating()\n\n            let button = UIButton(frame: frame)\n            button.tag = index\n            button.addTarget(self,\n                             action: #selector(buttonTapped(_:)),\n                             for: .touchUpInside)\n            self.view.addSubview(button)\n        }\n    }\n\n    @objc func buttonTapped(_ sender: UIButton) {\n        let size = CGSize(width: 30, height: 30)\n        let selectedIndicatorIndex = sender.tag\n        let indicatorType = presentingIndicatorTypes[selectedIndicatorIndex]\n\n        startAnimating(size, message: \"Loading...\", type: indicatorType, fadeInAnimation: nil)\n\n        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) {\n            NVActivityIndicatorPresenter.sharedInstance.setMessage(\"Authenticating...\")\n        }\n\n        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {\n            self.stopAnimating(nil)\n        }\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Vinh Nguyen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NVActivityIndicatorView.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name              = 'NVActivityIndicatorView'\n  s.version           = '5.2.0'\n  s.summary           = 'A collection of awesome loading animations'\n  s.homepage          = 'https://github.com/ninjaprox/NVActivityIndicatorView'\n  s.screenshot        = 'https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif'\n  s.license           = { type: 'MIT', file: 'LICENSE' }\n  s.author            = { 'Vinh Nguyen' => 'ninjaprox@gmail.com' }\n  s.social_media_url  = 'http://twitter.com/ninjaprox'\n  s.documentation_url = 'https://nvactivityindicatorview.vinhis.me'\n\n  s.ios.deployment_target  = '9.0'\n  s.tvos.deployment_target = '9.0'\n  s.swift_version          = '5.0'\n\n  s.source = { git: 'https://github.com/ninjaprox/NVActivityIndicatorView.git',\n               tag: s.version }\n\n  s.subspec 'Base' do |ss|\n    ss.source_files = 'Sources/Base/**/*.swift'\n  end\n  s.subspec 'Extended' do |ss|\n    ss.dependency 'NVActivityIndicatorView/Base'\n    ss.source_files = 'Sources/Extended/**/*.swift'\n  end\n  s.default_subspec = 'Base'\n\n  s.frameworks = 'UIKit', 'QuartzCore'\nend\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_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>5.2.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>48</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_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>5.2.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>48</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836DF248CEFC200583430 /* AppDelegate.swift */; };\n\t\t1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E1248CEFC200583430 /* SceneDelegate.swift */; };\n\t\t1F1836E4248CEFC200583430 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E3248CEFC200583430 /* ViewController.swift */; };\n\t\t1F1836E7248CEFC200583430 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E5248CEFC200583430 /* Main.storyboard */; };\n\t\t1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E8248CEFC300583430 /* Assets.xcassets */; };\n\t\t1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */; };\n\t\t1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product\" /* NVActivityIndicatorViewExtended.framework */; };\n\t\t1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product\" /* NVActivityIndicatorViewExtended.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183706248CF29F00583430 /* ActivityDataTests.swift */; };\n\t\t1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */; };\n\t\t1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */; };\n\t\t1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */; };\n\t\tOBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* NVActivityIndicatorPresenter.swift */; };\n\t\tOBJ_103 /* NVActivityIndicatorViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* NVActivityIndicatorViewable.swift */; };\n\t\tOBJ_105 /* NVActivityIndicatorView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = \"NVActivityIndicatorView::NVActivityIndicatorView::Product\" /* NVActivityIndicatorView.framework */; };\n\t\tOBJ_112 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };\n\t\tOBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */; };\n\t\tOBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */; };\n\t\tOBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */; };\n\t\tOBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */; };\n\t\tOBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */; };\n\t\tOBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */; };\n\t\tOBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */; };\n\t\tOBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */; };\n\t\tOBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */; };\n\t\tOBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */; };\n\t\tOBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */; };\n\t\tOBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */; };\n\t\tOBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */; };\n\t\tOBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */; };\n\t\tOBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */; };\n\t\tOBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */; };\n\t\tOBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */; };\n\t\tOBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */; };\n\t\tOBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */; };\n\t\tOBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */; };\n\t\tOBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */; };\n\t\tOBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */; };\n\t\tOBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */; };\n\t\tOBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */; };\n\t\tOBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */; };\n\t\tOBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */; };\n\t\tOBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */; };\n\t\tOBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */; };\n\t\tOBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */; };\n\t\tOBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */; };\n\t\tOBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */; };\n\t\tOBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */; };\n\t\tOBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */; };\n\t\tOBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */; };\n\t\tOBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */; };\n\t\tOBJ_94 /* NVActivityIndicatorShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* NVActivityIndicatorShape.swift */; };\n\t\tOBJ_95 /* NVActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* NVActivityIndicatorView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1F1836A8248CEC7400583430 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = OBJ_1 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = \"NVActivityIndicatorView::NVActivityIndicatorView\";\n\t\t\tremoteInfo = NVActivityIndicatorView;\n\t\t};\n\t\t1F1836F4248CF08B00583430 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = OBJ_1 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended\";\n\t\t\tremoteInfo = NVActivityIndicatorViewExtended;\n\t\t};\n\t\t1F183700248CF25600583430 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = OBJ_1 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1F1836DC248CEFC200583430;\n\t\t\tremoteInfo = Example;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t1F1836F6248CF08B00583430 /* 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\t1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.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\t1F1836DD248CEFC200583430 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1F1836DF248CEFC200583430 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t1F1836E1248CEFC200583430 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\t1F1836E3248CEFC200583430 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t1F1836E6248CEFC200583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t1F1836E8248CEFC300583430 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t1F1836EB248CEFC300583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t1F1836ED248CEFC300583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1F1836FB248CF25600583430 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1F1836FF248CF25600583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1F183705248CF29E00583430 /* Tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Tests-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t1F183706248CF29F00583430 /* ActivityDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityDataTests.swift; sourceTree = \"<group>\"; };\n\t\t1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenterTests.swift; sourceTree = \"<group>\"; };\n\t\t1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewTests.swift; sourceTree = \"<group>\"; };\n\t\t1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorTypeTests.swift; sourceTree = \"<group>\"; };\n\t\t1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = \"<group>\"; };\n\t\t\"NVActivityIndicatorView::NVActivityIndicatorView::Product\" /* NVActivityIndicatorView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorView.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t\"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product\" /* NVActivityIndicatorViewExtended.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorViewExtended.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tOBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationAudioEqualizer.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallBeat.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotate.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotateMultiple.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotatePulse.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallDoubleBounce.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridBeat.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridPulse.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulse.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseRise.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseSync.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotate.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotateChase.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScale.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleMultiple.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRipple.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRippleMultiple.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallSpinFadeLoader.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallTrianglePath.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZag.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZagDeflect.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_31 /* NVActivityIndicatorAnimationBlank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBlank.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCircleStrokeSpin.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCubeTransition.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScale.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScaleParty.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOut.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOutRapid.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineSpinFadeLoader.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationOrbit.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_40 /* NVActivityIndicatorAnimationPacman.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationPacman.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSemiCircleSpin.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSquareSpin.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationTriangleSkewSpin.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationDelegate.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_45 /* NVActivityIndicatorShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorShape.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_46 /* NVActivityIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorView.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_48 /* NVActivityIndicatorPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenter.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_49 /* NVActivityIndicatorViewable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewable.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1F1836DA248CEFC200583430 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1F1836F8248CF25600583430 /* 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\tOBJ_104 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t\tOBJ_105 /* NVActivityIndicatorView.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tOBJ_96 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1F1836DE248CEFC200583430 /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1F1836DF248CEFC200583430 /* AppDelegate.swift */,\n\t\t\t\t1F1836E1248CEFC200583430 /* SceneDelegate.swift */,\n\t\t\t\t1F1836E3248CEFC200583430 /* ViewController.swift */,\n\t\t\t\t1F1836E5248CEFC200583430 /* Main.storyboard */,\n\t\t\t\t1F1836E8248CEFC300583430 /* Assets.xcassets */,\n\t\t\t\t1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */,\n\t\t\t\t1F1836ED248CEFC300583430 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1F1836F1248CF08B00583430 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1F1836FC248CF25600583430 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */,\n\t\t\t\t1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */,\n\t\t\t\t1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */,\n\t\t\t\t1F183706248CF29F00583430 /* ActivityDataTests.swift */,\n\t\t\t\t1F1836FF248CF25600583430 /* Info.plist */,\n\t\t\t\t1F183705248CF29E00583430 /* Tests-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tOBJ_47 /* NVActivityIndicatorViewExtended */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_48 /* NVActivityIndicatorPresenter.swift */,\n\t\t\t\tOBJ_49 /* NVActivityIndicatorViewable.swift */,\n\t\t\t);\n\t\t\tname = NVActivityIndicatorViewExtended;\n\t\t\tpath = Sources/Extended;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tOBJ_5 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */,\n\t\t\t\tOBJ_6 /* Package.swift */,\n\t\t\t\tOBJ_7 /* Sources */,\n\t\t\t\t1F1836DE248CEFC200583430 /* Example */,\n\t\t\t\t1F1836FC248CF25600583430 /* Tests */,\n\t\t\t\tOBJ_51 /* Products */,\n\t\t\t\t1F1836F1248CF08B00583430 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tOBJ_51 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t\"NVActivityIndicatorView::NVActivityIndicatorView::Product\" /* NVActivityIndicatorView.framework */,\n\t\t\t\t\"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product\" /* NVActivityIndicatorViewExtended.framework */,\n\t\t\t\t1F1836DD248CEFC200583430 /* Example.app */,\n\t\t\t\t1F1836FB248CF25600583430 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tOBJ_7 /* Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_8 /* NVActivityIndicatorView */,\n\t\t\t\tOBJ_47 /* NVActivityIndicatorViewExtended */,\n\t\t\t);\n\t\t\tname = Sources;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tOBJ_8 /* NVActivityIndicatorView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_9 /* Animations */,\n\t\t\t\tOBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */,\n\t\t\t\tOBJ_45 /* NVActivityIndicatorShape.swift */,\n\t\t\t\tOBJ_46 /* NVActivityIndicatorView.swift */,\n\t\t\t);\n\t\t\tname = NVActivityIndicatorView;\n\t\t\tpath = Sources/Base;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tOBJ_9 /* Animations */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */,\n\t\t\t\tOBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */,\n\t\t\t\tOBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */,\n\t\t\t\tOBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */,\n\t\t\t\tOBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */,\n\t\t\t\tOBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */,\n\t\t\t\tOBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */,\n\t\t\t\tOBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */,\n\t\t\t\tOBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */,\n\t\t\t\tOBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */,\n\t\t\t\tOBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */,\n\t\t\t\tOBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */,\n\t\t\t\tOBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */,\n\t\t\t\tOBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */,\n\t\t\t\tOBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */,\n\t\t\t\tOBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */,\n\t\t\t\tOBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */,\n\t\t\t\tOBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */,\n\t\t\t\tOBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */,\n\t\t\t\tOBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */,\n\t\t\t\tOBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */,\n\t\t\t\tOBJ_31 /* NVActivityIndicatorAnimationBlank.swift */,\n\t\t\t\tOBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */,\n\t\t\t\tOBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */,\n\t\t\t\tOBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */,\n\t\t\t\tOBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */,\n\t\t\t\tOBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */,\n\t\t\t\tOBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */,\n\t\t\t\tOBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */,\n\t\t\t\tOBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */,\n\t\t\t\tOBJ_40 /* NVActivityIndicatorAnimationPacman.swift */,\n\t\t\t\tOBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */,\n\t\t\t\tOBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */,\n\t\t\t\tOBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */,\n\t\t\t);\n\t\t\tpath = Animations;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1F1836DC248CEFC200583430 /* Example */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget \"Example\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1F1836D9248CEFC200583430 /* Sources */,\n\t\t\t\t1F1836DA248CEFC200583430 /* Frameworks */,\n\t\t\t\t1F1836DB248CEFC200583430 /* Resources */,\n\t\t\t\t1F1836F6248CF08B00583430 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1F1836F5248CF08B00583430 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Example;\n\t\t\tproductName = Example;\n\t\t\tproductReference = 1F1836DD248CEFC200583430 /* Example.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t1F1836FA248CF25600583430 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1F1836F7248CF25600583430 /* Sources */,\n\t\t\t\t1F1836F8248CF25600583430 /* Frameworks */,\n\t\t\t\t1F1836F9248CF25600583430 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1F183701248CF25600583430 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 1F1836FB248CF25600583430 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t\"NVActivityIndicatorView::NVActivityIndicatorView\" /* NVActivityIndicatorView */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = OBJ_55 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorView\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tOBJ_58 /* Sources */,\n\t\t\t\tOBJ_96 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1F0742D12F6A40C600304500 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = NVActivityIndicatorView;\n\t\t\tproductName = NVActivityIndicatorView;\n\t\t\tproductReference = \"NVActivityIndicatorView::NVActivityIndicatorView::Product\" /* NVActivityIndicatorView.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t\"NVActivityIndicatorView::NVActivityIndicatorViewExtended\" /* NVActivityIndicatorViewExtended */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = OBJ_98 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorViewExtended\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tOBJ_101 /* Sources */,\n\t\t\t\tOBJ_104 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1F0742D32F6A40CF00304500 /* PBXTargetDependency */,\n\t\t\t\tOBJ_106 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = NVActivityIndicatorViewExtended;\n\t\t\tproductName = NVActivityIndicatorViewExtended;\n\t\t\tproductReference = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product\" /* NVActivityIndicatorViewExtended.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t\"NVActivityIndicatorView::SwiftPMPackageDescription\" /* NVActivityIndicatorViewPackageDescription */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = OBJ_108 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorViewPackageDescription\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tOBJ_111 /* Sources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = NVActivityIndicatorViewPackageDescription;\n\t\t\tproductName = NVActivityIndicatorViewPackageDescription;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tOBJ_1 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftMigration = 9999;\n\t\t\t\tLastSwiftUpdateCheck = 1130;\n\t\t\t\tLastUpgradeCheck = 2630;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1F1836DC248CEFC200583430 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t1F1836FA248CF25600583430 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1130;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 1F1836DC248CEFC200583430;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = OBJ_2 /* Build configuration list for PBXProject \"NVActivityIndicatorView\" */;\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 = OBJ_5;\n\t\t\tpackageReferences = (\n\t\t\t\t1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference \"SwiftLintPlugins\" */,\n\t\t\t);\n\t\t\tproductRefGroup = OBJ_51 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t\"NVActivityIndicatorView::NVActivityIndicatorView\" /* NVActivityIndicatorView */,\n\t\t\t\t\"NVActivityIndicatorView::NVActivityIndicatorViewExtended\" /* NVActivityIndicatorViewExtended */,\n\t\t\t\t\"NVActivityIndicatorView::SwiftPMPackageDescription\" /* NVActivityIndicatorViewPackageDescription */,\n\t\t\t\t1F1836DC248CEFC200583430 /* Example */,\n\t\t\t\t1F1836FA248CF25600583430 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1F1836DB248CEFC200583430 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */,\n\t\t\t\t1F1836E7248CEFC200583430 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1F1836F9248CF25600583430 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1F1836D9248CEFC200583430 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1F1836E4248CEFC200583430 /* ViewController.swift in Sources */,\n\t\t\t\t1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */,\n\t\t\t\t1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1F1836F7248CF25600583430 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */,\n\t\t\t\t1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */,\n\t\t\t\t1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */,\n\t\t\t\t1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tOBJ_101 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t\tOBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */,\n\t\t\t\tOBJ_103 /* NVActivityIndicatorViewable.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tOBJ_111 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t\tOBJ_112 /* Package.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tOBJ_58 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t\tOBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */,\n\t\t\t\tOBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */,\n\t\t\t\tOBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */,\n\t\t\t\tOBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */,\n\t\t\t\tOBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */,\n\t\t\t\tOBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */,\n\t\t\t\tOBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */,\n\t\t\t\tOBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */,\n\t\t\t\tOBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */,\n\t\t\t\tOBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */,\n\t\t\t\tOBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */,\n\t\t\t\tOBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */,\n\t\t\t\tOBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */,\n\t\t\t\tOBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */,\n\t\t\t\tOBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */,\n\t\t\t\tOBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */,\n\t\t\t\tOBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */,\n\t\t\t\tOBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */,\n\t\t\t\tOBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */,\n\t\t\t\tOBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */,\n\t\t\t\tOBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */,\n\t\t\t\tOBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */,\n\t\t\t\tOBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */,\n\t\t\t\tOBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */,\n\t\t\t\tOBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */,\n\t\t\t\tOBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */,\n\t\t\t\tOBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */,\n\t\t\t\tOBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */,\n\t\t\t\tOBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */,\n\t\t\t\tOBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */,\n\t\t\t\tOBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */,\n\t\t\t\tOBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */,\n\t\t\t\tOBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */,\n\t\t\t\tOBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */,\n\t\t\t\tOBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */,\n\t\t\t\tOBJ_94 /* NVActivityIndicatorShape.swift in Sources */,\n\t\t\t\tOBJ_95 /* NVActivityIndicatorView.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\t1F0742D12F6A40C600304500 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tproductRef = 1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */;\n\t\t};\n\t\t1F0742D32F6A40CF00304500 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tproductRef = 1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */;\n\t\t};\n\t\t1F1836F5248CF08B00583430 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended\" /* NVActivityIndicatorViewExtended */;\n\t\t\ttargetProxy = 1F1836F4248CF08B00583430 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1F183701248CF25600583430 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1F1836DC248CEFC200583430 /* Example */;\n\t\t\ttargetProxy = 1F183700248CF25600583430 /* PBXContainerItemProxy */;\n\t\t};\n\t\tOBJ_106 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = \"NVActivityIndicatorView::NVActivityIndicatorView\" /* NVActivityIndicatorView */;\n\t\t\ttargetProxy = 1F1836A8248CEC7400583430 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t1F1836E5248CEFC200583430 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1F1836E6248CEFC200583430 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1F1836EB248CEFC300583430 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1F1836EE248CEFC300583430 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_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\tINFOPLIST_FILE = Example/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1F1836EF248CEFC300583430 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_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\tINFOPLIST_FILE = Example/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\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\t1F183703248CF25600583430 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_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\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/Tests-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Example.app/Example\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1F183704248CF25600583430 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_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\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/Tests-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Example.app/Example\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_100 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 48;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.1.0;\n\t\t\t\tOTHER_CFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;\n\t\t\t\tPRODUCT_MODULE_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTARGET_NAME = NVActivityIndicatorViewExtended;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_109 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tLD = /usr/bin/true;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tOBJ_110 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tLD = /usr/bin/true;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_NS_ASSERTIONS = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\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\"$(inherited)\",\n\t\t\t\t\t\"SWIFT_PACKAGE=1\",\n\t\t\t\t\t\"DEBUG=1\",\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;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\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 = 12.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited) -DXcode\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) SWIFT_PACKAGE DEBUG\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tOBJ_4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = s;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"SWIFT_PACKAGE=1\",\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;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\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 = 12.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited) -DXcode\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) SWIFT_PACKAGE\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_56 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 48;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.1.0;\n\t\t\t\tOTHER_CFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;\n\t\t\t\tPRODUCT_MODULE_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTARGET_NAME = NVActivityIndicatorView;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tOBJ_57 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 48;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.1.0;\n\t\t\t\tOTHER_CFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;\n\t\t\t\tPRODUCT_MODULE_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTARGET_NAME = NVActivityIndicatorView;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_99 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 48;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PLATFORM_DIR)/Developer/Library/Frameworks\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.1.0;\n\t\t\t\tOTHER_CFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;\n\t\t\t\tPRODUCT_MODULE_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTARGET_NAME = NVActivityIndicatorViewExtended;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget \"Example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1F1836EE248CEFC300583430 /* Debug */,\n\t\t\t\t1F1836EF248CEFC300583430 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1F183703248CF25600583430 /* Debug */,\n\t\t\t\t1F183704248CF25600583430 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tOBJ_108 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorViewPackageDescription\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_109 /* Debug */,\n\t\t\t\tOBJ_110 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tOBJ_2 /* Build configuration list for PBXProject \"NVActivityIndicatorView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_3 /* Debug */,\n\t\t\t\tOBJ_4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tOBJ_55 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_56 /* Debug */,\n\t\t\t\tOBJ_57 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tOBJ_98 /* Build configuration list for PBXNativeTarget \"NVActivityIndicatorViewExtended\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_99 /* Debug */,\n\t\t\t\tOBJ_100 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference \"SwiftLintPlugins\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/SimplyDanny/SwiftLintPlugins\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 0.63.2;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference \"SwiftLintPlugins\" */;\n\t\t\tproductName = \"plugin:SwiftLintBuildToolPlugin\";\n\t\t};\n\t\t1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference \"SwiftLintPlugins\" */;\n\t\t\tproductName = \"plugin:SwiftLintBuildToolPlugin\";\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = OBJ_1 /* Project object */;\n}\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>"
  },
  {
    "path": "NVActivityIndicatorView.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": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n    <false/>\n</dict>\n</plist>"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"originHash\" : \"1fa961aa1dc717cea452f3389668f0f99a254f07e4eb11d190768a53798f744f\",\n  \"pins\" : [\n    {\n      \"identity\" : \"swiftlintplugins\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/SimplyDanny/SwiftLintPlugins\",\n      \"state\" : {\n        \"revision\" : \"8a4640d14777685ba8f14e832373160498fbab92\",\n        \"version\" : \"0.63.2\"\n      }\n    }\n  ],\n  \"version\" : 3\n}\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\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 = \"1F1836DC248CEFC200583430\"\n               BuildableName = \"Example.app\"\n               BlueprintName = \"Example\"\n               ReferencedContainer = \"container:NVActivityIndicatorView.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1F1836FA248CF25600583430\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:NVActivityIndicatorView.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\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      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1F1836DC248CEFC200583430\"\n            BuildableName = \"Example.app\"\n            BlueprintName = \"Example\"\n            ReferencedContainer = \"container:NVActivityIndicatorView.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1F1836DC248CEFC200583430\"\n            BuildableName = \"Example.app\"\n            BlueprintName = \"Example\"\n            ReferencedContainer = \"container:NVActivityIndicatorView.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView-Package.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\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 = \"NVActivityIndicatorView::NVActivityIndicatorView\"\n               BuildableName = \"NVActivityIndicatorView.framework\"\n               BlueprintName = \"NVActivityIndicatorView\"\n               ReferencedContainer = \"container:NVActivityIndicatorView.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"NVActivityIndicatorView::NVActivityIndicatorViewExtended\"\n               BuildableName = \"NVActivityIndicatorViewExtended.framework\"\n               BlueprintName = \"NVActivityIndicatorViewExtended\"\n               ReferencedContainer = \"container:NVActivityIndicatorView.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   </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   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.0\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: \"NVActivityIndicatorView\",\n    platforms: [\n        .iOS(.v9),\n        .tvOS(.v9)\n    ],\n    products: [\n        .library(name: \"NVActivityIndicatorView\", targets: [\"NVActivityIndicatorView\"]),\n        .library(name: \"NVActivityIndicatorViewExtended\", targets: [\"NVActivityIndicatorViewExtended\"])\n    ],\n    targets: [\n        .target(name: \"NVActivityIndicatorView\", path: \"Sources/Base\"),\n        .target(name: \"NVActivityIndicatorViewExtended\",\n                dependencies: [\"NVActivityIndicatorView\"],\n                path: \"Sources/Extended\")\n    ]\n)\n"
  },
  {
    "path": "PrivacyInfo.xcprivacy",
    "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>NSPrivacyTracking</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "README.md",
    "content": "# NVActivityIndicatorView\n\n[![Build Status](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml/badge.svg?event=push)](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml)\n[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg)](https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n⚠️ Check out [LoaderUI](https://github.com/ninjaprox/LoaderUI) (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. 🎉\n\n## Introduction\n\n`NVActivityIndicatorView` is a collection of awesome loading animations.\n\n![Demo](https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif)\n\n## Animation types\n\n| Type                   | Type                        | Type                   | Type                       |\n| ---------------------- | --------------------------- | ---------------------- | -------------------------- |\n| 1. ballPulse           | 2. ballGridPulse            | 3. ballClipRotate      | 4. squareSpin              |\n| 5. ballClipRotatePulse | 6. ballClipRotateMultiple   | 7. ballPulseRise       | 8. ballRotate              |\n| 9. cubeTransition      | 10. ballZigZag              | 11. ballZigZagDeflect  | 12. ballTrianglePath       |\n| 13. ballScale          | 14. lineScale               | 15. lineScaleParty     | 16. ballScaleMultiple      |\n| 17. ballPulseSync      | 18. ballBeat                | 19. lineScalePulseOut  | 20. lineScalePulseOutRapid |\n| 21. ballScaleRipple    | 22. ballScaleRippleMultiple | 23. ballSpinFadeLoader | 24. lineSpinFadeLoader     |\n| 25. triangleSkewSpin   | 26. pacman                  | 27. ballGridBeat       | 28. semiCircleSpin         |\n| 29. ballRotateChase    | 30. orbit                   | 31. audioEqualizer     | 32. circleStrokeSpin       |\n\n## Installation\n\n### Cocoapods\n\n[Cocoapods](https://cocoapods.org/#install) is a dependency manager for Swift and Objective-C Cocoa projects. To use NVActivityIndicatorView with CocoaPods, add it in your `Podfile`.\n\n```ruby\npod 'NVActivityIndicatorView'\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage#installing-carthage) is intended to be the simplest way to add frameworks to your Cocoa application. To use NVActivityIndicatorView with Carthage, add it in your `Cartfile`.\n\n```ruby\ngithub \"ninjaprox/NVActivityIndicatorView\"\n```\n\n### Swift Package Manager\n\nThe [Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. To use NVActivityIndicatorView with Swift Package Manger, add it to `dependencies` in your `Package.swift`\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/ninjaprox/NVActivityIndicatorView.git\")\n]\n```\n\n## Migration\n\nVersion [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0) comes with breaking changes. Please refer to the release note for details.\n\n## Usage\n\nFirstly, import `NVActivityIndicatorView`.\n\n```swift\nimport NVActivityIndicatorView\n```\n\n### Initialization\n\nThen, there are two ways you can create `NVActivityIndicatorView`:\n\n-   By storyboard, changing class of any `UIView` to `NVActivityIndicatorView`.\n\n_**Note:** Set `Module` to `NVActivityIndicatorView`._\n\n-   By code, using initializer. All parameters other than `frame` are optional and [`NVActivityIndicatorView.DEFAULT_*`](https://nvactivityindicatorview.vinhis.me/Classes/NVActivityIndicatorView.html) are used as default values.\n\n```swift\nNVActivityIndicatorView(frame: frame, type: type, color: color, padding: padding)\n```\n\n### Control\n\nStart animating.\n\n```swift\nactivityIndicatorView.startAnimating()\n```\n\nStop animating.\n\n```swift\nactivityIndicatorView.stopAnimating()\n```\n\nDetermine if it is animating.\n\n```swift\nanimating = activityIndicatorView.isAnimating\n```\n\n### Change properties\n\nIn storyboard, you can change all properties in Attributes inspector tab of Utilities panel.\n\n_**Note:** Use one of values (case-insensitive) in [Animation types](#animation-types) for `Type Name`._\n\nAll properties are public so you can change them after initializing.\n\n_**Note:** All changes must be made before calling `startAnimating()`._\n\n## Documentation\n\nhttps://nvactivityindicatorview.vinhis.me/\n\n## Acknowledgment\n\nThanks [Connor Atherton](https://github.com/ConnorAtherton) for inspired [Loaders.css](https://github.com/ConnorAtherton/loaders.css) and [Danil Gontovnik](https://github.com/gontovnik) for [DGActivityIndicatorView](https://github.com/gontovnik/DGActivityIndicatorView).\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Vinh Nguyen [@ninjaprox](http://twitter.com/ninjaprox)\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift",
    "content": "//\n//  NVActivityIndicatorAnimationAudioEqualizer.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSize = size.width / 9\n        let x = (layer.bounds.size.width - lineSize * 7) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: [CFTimeInterval] = [4.3, 2.5, 1.7, 3.1]\n        let values = [0, 0.7, 0.4, 0.05, 0.95, 0.3, 0.9, 0.4, 0.15, 0.18, 0.75, 0.01]\n\n        // Draw lines\n        for i in 0 ..< 4 {\n            let animation = CAKeyframeAnimation()\n\n            animation.keyPath = \"path\"\n            animation.isAdditive = true\n            animation.values = []\n\n            for j in 0 ..< values.count {\n                let heightFactor = values[j]\n                let height = size.height * CGFloat(heightFactor)\n                let point = CGPoint(x: 0, y: size.height - height)\n                let path = UIBezierPath(rect: CGRect(origin: point, size: CGSize(width: lineSize, height: height)))\n\n                animation.values?.append(path.cgPath)\n            }\n            animation.duration = duration[i]\n            animation.repeatCount = HUGE\n            animation.isRemovedOnCompletion = false\n\n            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)\n            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i),\n                               y: y,\n                               width: lineSize,\n                               height: size.height)\n\n            line.frame = frame\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallBeat.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallBeat: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize = (size.width - circleSpacing * 2) / 3\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - circleSize) / 2\n        let duration: CFTimeInterval = 0.7\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0.35, 0, 0.35]\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.values = [1, 0.75, 1]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.keyTimes = [0, 0.5, 1]\n        opacityAnimation.values = [1, 0.2, 1]\n        opacityAnimation.duration = duration\n\n        // Aniamtion\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                               y: y,\n                               width: circleSize,\n                               height: circleSize)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.frame = frame\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift",
    "content": "//\n//  NVActivityIndicatorBallClipRotate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallClipRotate: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 0.75\n\n        //    Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.values = [1, 0.6, 1]\n\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        rotateAnimation.keyTimes = scaleAnimation.keyTimes\n        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, rotateAnimation]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.ringThirdFour.layerWith(size: CGSize(width: size.width, height: size.height), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                           y: (layer.bounds.size.height - size.height) / 2,\n                           width: size.width,\n                           height: size.height)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallClipRotateMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let bigCircleSize: CGFloat = size.width\n        let smallCircleSize: CGFloat = size.width / 2\n        let longDuration: CFTimeInterval = 1\n        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n\n        circleOf(shape: .ringTwoHalfHorizontal,\n                 duration: longDuration,\n                 timingFunction: timingFunction,\n                 layer: layer,\n                 size: bigCircleSize,\n                 color: color, reverse: false)\n        circleOf(shape: .ringTwoHalfVertical,\n                 duration: longDuration,\n                 timingFunction: timingFunction,\n                 layer: layer,\n                 size: smallCircleSize,\n                 color: color, reverse: true)\n    }\n\n    func createAnimationIn(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, reverse: Bool) -> CAAnimation {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [1, 0.6, 1]\n        scaleAnimation.duration = duration\n\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        rotateAnimation.keyTimes = scaleAnimation.keyTimes\n        rotateAnimation.timingFunctions = [timingFunction, timingFunction]\n        if !reverse {\n            rotateAnimation.values = [0, Double.pi, 2 * Double.pi]\n        } else {\n            rotateAnimation.values = [0, -Double.pi, -2 * Double.pi]\n        }\n        rotateAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, rotateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        return animation\n    }\n\n    // swiftlint:disable:next function_parameter_count\n    func circleOf(shape: NVActivityIndicatorShape, duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGFloat, color: UIColor, reverse: Bool) {\n        let circle = shape.layerWith(size: CGSize(width: size, height: size), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size) / 2,\n                           y: (layer.bounds.size.height - size) / 2,\n                           width: size,\n                           height: size)\n        let animation = createAnimationIn(duration: duration, timingFunction: timingFunction, reverse: reverse)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallClipRotatePulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 1\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)\n\n        smallCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)\n        bigCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)\n    }\n\n    func smallCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        animation.keyTimes = [0, 0.3, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.3, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circleSize = size.width / 2\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2,\n                           y: (layer.bounds.size.height - circleSize) / 2,\n                           width: circleSize,\n                           height: circleSize)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n\n    func bigCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [1, 0.6, 1]\n        scaleAnimation.duration = duration\n\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        rotateAnimation.keyTimes = scaleAnimation.keyTimes\n        rotateAnimation.timingFunctions = [timingFunction, timingFunction]\n        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]\n        rotateAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, rotateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.ringTwoHalfVertical.layerWith(size: size, color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                           y: (layer.bounds.size.height - size.height) / 2,\n                           width: size.width,\n                           height: size.height)\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallsBounce.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallDoubleBounce: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        for index in (0...1) {\n            bouncingBall(in: layer, size: size, color: color, startingAt: CACurrentMediaTime() + Double(index))\n        }\n    }\n\n    fileprivate func bouncingBall(in layer: CALayer, size: CGSize, color: UIColor, startingAt: CFTimeInterval) {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n        scaleAnimation.duration = 2\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.values = [-1, 0, -1]\n\n        scaleAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n        scaleAnimation.repeatCount = HUGE\n        scaleAnimation.isRemovedOnCompletion = false\n\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                           y: (layer.bounds.size.height - size.height) / 2,\n                           width: size.width,\n                           height: size.height)\n\n        scaleAnimation.beginTime = startingAt\n        circle.frame = frame\n        circle.opacity = 0.6\n        circle.add(scaleAnimation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallGridBeat.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallGridBeat: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize = (size.width - circleSpacing * 2) / 3\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let durations = [0.96, 0.93, 1.19, 1.13, 1.34, 0.94, 1.2, 0.82, 1.19]\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0.36, 0.4, 0.68, 0.41, 0.71, -0.15, -0.12, 0.01, 0.32]\n        let timingFunction = CAMediaTimingFunction(name: .default)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.7, 1]\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            for j in 0 ..< 3 {\n                let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n                let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),\n                                   y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                                   width: circleSize,\n                                   height: circleSize)\n\n                animation.duration = durations[3 * i + j]\n                animation.beginTime = beginTime + beginTimes[3 * i + j]\n                circle.frame = frame\n                circle.add(animation, forKey: \"animation\")\n                layer.addSublayer(circle)\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallGridPulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallGridPulse: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize = (size.width - circleSpacing * 2) / 3\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let durations: [CFTimeInterval] = [0.72, 1.02, 1.28, 1.42, 1.45, 1.18, 0.87, 1.45, 1.06]\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [ -0.06, 0.25, -0.17, 0.48, 0.31, 0.03, 0.46, 0.78, 0.45]\n        let timingFunction = CAMediaTimingFunction(name: .default)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [1, 0.5, 1]\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.keyTimes = [0, 0.5, 1]\n        opacityAnimation.timingFunctions = [timingFunction, timingFunction]\n        opacityAnimation.values = [1, 0.7, 1]\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            for j in 0 ..< 3 {\n                let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n                let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),\n                                   y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                                   width: circleSize,\n                                   height: circleSize)\n\n                animation.duration = durations[3 * i + j]\n                animation.beginTime = beginTime + beginTimes[3 * i + j]\n                circle.frame = frame\n                circle.add(animation, forKey: \"animation\")\n                layer.addSublayer(circle)\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallPulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallPulse: NVActivityIndicatorAnimationDelegate {\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize: CGFloat = (size.width - 2 * circleSpacing) / 3\n        let x: CGFloat = (layer.bounds.size.width - size.width) / 2\n        let y: CGFloat = (layer.bounds.size.height - circleSize) / 2\n        let duration: CFTimeInterval = 0.75\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0.12, 0.24, 0.36]\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.2, 0.68, 0.18, 1.08)\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        // Animation\n        animation.keyTimes = [0, 0.3, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.3, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                               y: y,\n                               width: circleSize,\n                               height: circleSize)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.frame = frame\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallPulseRise.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallPulseRise: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize = (size.width - 4 * circleSpacing) / 5\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - circleSize) / 2\n        let deltaY = size.height / 2\n        let duration: CFTimeInterval = 1\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.15, 0.46, 0.9, 0.6)\n        let oddAnimation = self.oddAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)\n        let evenAnimation = self.evenAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)\n\n        // Draw circles\n        for i in 0 ..< 5 {\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                               y: y,\n                               width: circleSize,\n                               height: circleSize)\n\n            circle.frame = frame\n            if i % 2 == 0 {\n                circle.add(evenAnimation, forKey: \"animation\")\n            } else {\n                circle.add(oddAnimation, forKey: \"animation\")\n            }\n            layer.addSublayer(circle)\n        }\n    }\n\n    func oddAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [0.4, 1.1, 0.75]\n        scaleAnimation.duration = duration\n\n        // Translate animation\n        let translateAnimation = CAKeyframeAnimation(keyPath: \"transform.translation.y\")\n\n        translateAnimation.keyTimes = [0, 0.25, 0.75, 1]\n        translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]\n        translateAnimation.values = [0, deltaY, -deltaY, 0]\n        translateAnimation.duration = duration\n\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, translateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        return animation\n    }\n\n    func evenAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [1.1, 0.4, 1]\n        scaleAnimation.duration = duration\n\n        // Translate animation\n        let translateAnimation = CAKeyframeAnimation(keyPath: \"transform.translation.y\")\n\n        translateAnimation.keyTimes = [0, 0.25, 0.75, 1]\n        translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]\n        translateAnimation.values = [0, -deltaY, deltaY, 0]\n        translateAnimation.duration = duration\n\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, translateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        return animation\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallPulseSync.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallPulseSync: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = 2\n        let circleSize = (size.width - circleSpacing * 2) / 3\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - circleSize) / 2\n        let deltaY = (size.height / 2 - circleSize / 2) / 2\n        let duration: CFTimeInterval = 0.6\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0.07, 0.14, 0.21]\n        let timingFunciton = CAMediaTimingFunction(name: .easeInEaseOut)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.translation.y\")\n\n        animation.keyTimes = [0, 0.33, 0.66, 1]\n        animation.timingFunctions = [timingFunciton, timingFunciton, timingFunciton]\n        animation.values = [0, deltaY, -deltaY, 0]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),\n                               y: y,\n                               width: circleSize,\n                               height: circleSize)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.frame = frame\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallRotate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallRotate: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize: CGFloat = size.width / 5\n        let duration: CFTimeInterval = 1\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.7, -0.13, 0.22, 0.86)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction]\n        scaleAnimation.values = [1, 0.6, 1]\n        scaleAnimation.duration = duration\n\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        rotateAnimation.keyTimes = [0, 0.5, 1]\n        rotateAnimation.timingFunctions = [timingFunction, timingFunction]\n        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]\n        rotateAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, rotateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        let leftCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n        let rightCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n        let centerCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n\n        leftCircle.opacity = 0.8\n        leftCircle.frame = CGRect(x: 0, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)\n        rightCircle.opacity = 0.8\n        rightCircle.frame = CGRect(x: size.width - circleSize, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)\n        centerCircle.frame = CGRect(x: (size.width - circleSize) / 2, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)\n\n        let circle = CALayer()\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2, y: (layer.bounds.size.height - size.height) / 2, width: size.width, height: size.height)\n\n        circle.frame = frame\n        circle.addSublayer(leftCircle)\n        circle.addSublayer(rightCircle)\n        circle.addSublayer(centerCircle)\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallRotateChase.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize = size.width / 5\n\n        // Draw circles\n        for i in 0 ..< 5 {\n            let factor = Float(i) * 1 / 5\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n            let animation = rotateAnimation(factor, x: layer.bounds.size.width / 2, y: layer.bounds.size.height / 2, size: CGSize(width: size.width - circleSize, height: size.height - circleSize))\n\n            circle.frame = CGRect(x: 0, y: 0, width: circleSize, height: circleSize)\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n\n    func rotateAnimation(_ rate: Float, x: CGFloat, y: CGFloat, size: CGSize) -> CAAnimationGroup {\n        let duration: CFTimeInterval = 1.5\n        let fromScale = 1 - rate\n        let toScale = 0.2 + rate\n        let timeFunc = CAMediaTimingFunction(controlPoints: 0.5, 0.15 + rate, 0.25, 1)\n\n        // Scale animation\n        let scaleAnimation = CABasicAnimation(keyPath: \"transform.scale\")\n        scaleAnimation.duration = duration\n        scaleAnimation.repeatCount = HUGE\n        scaleAnimation.fromValue = fromScale\n        scaleAnimation.toValue = toScale\n\n        // Position animation\n        let positionAnimation = CAKeyframeAnimation(keyPath: \"position\")\n        positionAnimation.duration = duration\n        positionAnimation.repeatCount = HUGE\n        positionAnimation.path = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: CGFloat(3 * Double.pi * 0.5), endAngle: CGFloat(3 * Double.pi * 0.5 + 2 * Double.pi), clockwise: true).cgPath\n\n        // Aniamtion\n        let animation = CAAnimationGroup()\n        animation.animations = [scaleAnimation, positionAnimation]\n        animation.timingFunction = timeFunc\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        return animation\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallScale.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallScale: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 1\n\n        // Scale animation\n        let scaleAnimation = CABasicAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.duration = duration\n        scaleAnimation.fromValue = 0\n        scaleAnimation.toValue = 1\n\n        // Opacity animation\n        let opacityAnimation = CABasicAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.duration = duration\n        opacityAnimation.fromValue = 1\n        opacityAnimation.toValue = 0\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)\n\n        circle.frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                              y: (layer.bounds.size.height - size.height) / 2,\n                              width: size.width,\n                              height: size.height)\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallScaleMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 1\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0, 0.2, 0.4]\n\n        // Scale animation\n        let scaleAnimation = CABasicAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.duration = duration\n        scaleAnimation.fromValue = 0\n        scaleAnimation.toValue = 1\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.duration = duration\n        opacityAnimation.keyTimes = [0, 0.05, 1]\n        opacityAnimation.values = [0, 1, 0]\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw balls\n        for i in 0 ..< 3 {\n            let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)\n            let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                               y: (layer.bounds.size.height - size.height) / 2,\n                               width: size.width,\n                               height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.frame = frame\n            circle.opacity = 0\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallScaleRipple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallScaleRipple: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 1\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.7]\n        scaleAnimation.timingFunction = timingFunction\n        scaleAnimation.values = [0.1, 1]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.keyTimes = [0, 0.7, 1]\n        opacityAnimation.timingFunctions = [timingFunction, timingFunction]\n        opacityAnimation.values = [1, 0.7, 0]\n        opacityAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                           y: (layer.bounds.size.height - size.height) / 2,\n                           width: size.width,\n                           height: size.height)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallScaleRippleMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallScaleRippleMultiple: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 1.25\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0, 0.2, 0.4]\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.7]\n        scaleAnimation.timingFunction = timingFunction\n        scaleAnimation.values = [0, 1]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.keyTimes = [0, 0.7, 1]\n        opacityAnimation.timingFunctions = [timingFunction, timingFunction]\n        opacityAnimation.values = [1, 0.7, 0]\n        opacityAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 3 {\n            let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)\n            let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                               y: (layer.bounds.size.height - size.height) / 2,\n                               width: size.width,\n                               height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.frame = frame\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallSpinFadeLoader.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSpacing: CGFloat = -2\n        let circleSize = (size.width - 4 * circleSpacing) / 5\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 1\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84]\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.5, 1]\n        scaleAnimation.values = [1, 0.4, 1]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimaton = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        opacityAnimaton.keyTimes = [0, 0.5, 1]\n        opacityAnimaton.values = [1, 0.3, 1]\n        opacityAnimaton.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimaton]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        for i in 0 ..< 8 {\n            let circle = circleAt(angle: CGFloat(Double.pi / 4) * CGFloat(i),\n                                  size: circleSize,\n                                  origin: CGPoint(x: x, y: y),\n                                  containerSize: size,\n                                  color: color)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            circle.add(animation, forKey: \"animation\")\n            layer.addSublayer(circle)\n        }\n    }\n\n    func circleAt(angle: CGFloat, size: CGFloat, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer {\n        let radius = containerSize.width / 2 - size / 2\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: size, height: size), color: color)\n        let frame = CGRect(\n            x: origin.x + radius * (cos(angle) + 1),\n            y: origin.y + radius * (sin(angle) + 1),\n            width: size,\n            height: size)\n\n        circle.frame = frame\n\n        return circle\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallTrianglePath.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallTrianglePath: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize = size.width / 5\n        let deltaX = size.width / 2 - circleSize / 2\n        let deltaY = size.height / 2 - circleSize / 2\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 2\n        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform\")\n\n        animation.keyTimes = [0, 0.33, 0.66, 1]\n        animation.timingFunctions = [timingFunction, timingFunction, timingFunction]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Top-center circle\n        let topCenterCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n\n        changeAnimation(animation, values: [\"{0,0}\", \"{hx,fy}\", \"{-hx,fy}\", \"{0,0}\"], deltaX: deltaX, deltaY: deltaY)\n        topCenterCircle.frame = CGRect(x: x + size.width / 2 - circleSize / 2, y: y, width: circleSize, height: circleSize)\n        topCenterCircle.add(animation, forKey: \"animation\")\n        layer.addSublayer(topCenterCircle)\n\n        // Bottom-left circle\n        let bottomLeftCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n\n        changeAnimation(animation, values: [\"{0,0}\", \"{hx,-fy}\", \"{fx,0}\", \"{0,0}\"], deltaX: deltaX, deltaY: deltaY)\n        bottomLeftCircle.frame = CGRect(x: x, y: y + size.height - circleSize, width: circleSize, height: circleSize)\n        bottomLeftCircle.add(animation, forKey: \"animation\")\n        layer.addSublayer(bottomLeftCircle)\n\n        // Bottom-right circle\n        let bottomRightCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n\n        changeAnimation(animation, values: [\"{0,0}\", \"{-fx,0}\", \"{-hx,-fy}\", \"{0,0}\"], deltaX: deltaX, deltaY: deltaY)\n        bottomRightCircle.frame = CGRect(x: x + size.width - circleSize, y: y + size.height - circleSize, width: circleSize, height: circleSize)\n        bottomRightCircle.add(animation, forKey: \"animation\")\n        layer.addSublayer(bottomRightCircle)\n    }\n\n    func changeAnimation(_ animation: CAKeyframeAnimation, values rawValues: [String], deltaX: CGFloat, deltaY: CGFloat) {\n        let values = NSMutableArray(capacity: 5)\n\n        for rawValue in rawValues {\n            let point = NSCoder.cgPoint(for: translateString(rawValue, deltaX: deltaX, deltaY: deltaY))\n\n            values.add(NSValue(caTransform3D: CATransform3DMakeTranslation(point.x, point.y, 0)))\n        }\n        animation.values = values as [AnyObject]\n    }\n\n    func translateString(_ valueString: String, deltaX: CGFloat, deltaY: CGFloat) -> String {\n        let valueMutableString = NSMutableString(string: valueString)\n        let fullDeltaX = 2 * deltaX\n        let fullDeltaY = 2 * deltaY\n        var range = NSRange(location: 0, length: valueMutableString.length)\n\n        valueMutableString.replaceOccurrences(of: \"hx\", with: \"\\(deltaX)\", options: NSString.CompareOptions.caseInsensitive, range: range)\n        range.length = valueMutableString.length\n        valueMutableString.replaceOccurrences(of: \"fx\", with: \"\\(fullDeltaX)\", options: NSString.CompareOptions.caseInsensitive, range: range)\n        range.length = valueMutableString.length\n        valueMutableString.replaceOccurrences(of: \"hy\", with: \"\\(deltaY)\", options: NSString.CompareOptions.caseInsensitive, range: range)\n        range.length = valueMutableString.length\n        valueMutableString.replaceOccurrences(of: \"fy\", with: \"\\(fullDeltaY)\", options: NSString.CompareOptions.caseInsensitive, range: range)\n\n        return valueMutableString as String\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallZigZag.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\nimport QuartzCore\n\nclass NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize: CGFloat = size.width / 5\n        let duration: CFTimeInterval = 0.7\n        let deltaX = size.width / 2 - circleSize / 2\n        let deltaY = size.height / 2 - circleSize / 2\n        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)\n\n        // Circle 1 animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform\")\n\n        animation.keyTimes = [0, 0.33, 0.66, 1]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))\n        ]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle 1\n        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)\n\n        // Circle 2 animation\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))\n        ]\n\n        // Draw circle 2\n        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)\n    }\n\n    func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBallZigZagDeflect.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize: CGFloat = size.width / 5\n        let duration: CFTimeInterval = 0.75\n        let deltaX = size.width / 2 - circleSize / 2\n        let deltaY = size.height / 2 - circleSize / 2\n        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)\n\n        // Circle 1 animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform\")\n\n        animation.keyTimes = [0, 0.33, 0.66, 1]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))\n        ]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.autoreverses = true\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle 1\n        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)\n\n        // Circle 2 animation\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),\n            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))\n        ]\n\n        // Draw circle 2\n        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)\n    }\n\n    func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBlank.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationBlank: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in _: CALayer, size _: CGSize, color _: UIColor) {\n        // Do nothing\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift",
    "content": "//\n//  NVActivityIndicatorAnimationCircleStrokeSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let beginTime: Double = 0.5\n        let strokeStartDuration: Double = 1.2\n        let strokeEndDuration: Double = 0.7\n\n        let rotationAnimation = CABasicAnimation(keyPath: \"transform.rotation\")\n        rotationAnimation.byValue = Float.pi * 2\n        rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear)\n\n        let strokeEndAnimation = CABasicAnimation(keyPath: \"strokeEnd\")\n        strokeEndAnimation.duration = strokeEndDuration\n        strokeEndAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)\n        strokeEndAnimation.fromValue = 0\n        strokeEndAnimation.toValue = 1\n\n        let strokeStartAnimation = CABasicAnimation(keyPath: \"strokeStart\")\n        strokeStartAnimation.duration = strokeStartDuration\n        strokeStartAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)\n        strokeStartAnimation.fromValue = 0\n        strokeStartAnimation.toValue = 1\n        strokeStartAnimation.beginTime = beginTime\n\n        let groupAnimation = CAAnimationGroup()\n        groupAnimation.animations = [rotationAnimation, strokeEndAnimation, strokeStartAnimation]\n        groupAnimation.duration = strokeStartDuration + beginTime\n        groupAnimation.repeatCount = .infinity\n        groupAnimation.isRemovedOnCompletion = false\n        groupAnimation.fillMode = .forwards\n\n        let circle = NVActivityIndicatorShape.stroke.layerWith(size: size, color: color)\n        let frame = CGRect(\n            x: (layer.bounds.width - size.width) / 2,\n            y: (layer.bounds.height - size.height) / 2,\n            width: size.width,\n            height: size.height\n        )\n\n        circle.frame = frame\n        circle.add(groupAnimation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift",
    "content": "//\n//  NVActivityIndicatorAnimationCubeTransition.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationCubeTransition: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let squareSize = size.width / 5\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let deltaX = size.width - squareSize\n        let deltaY = size.height - squareSize\n        let duration: CFTimeInterval = 1.6\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0, -0.8]\n        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.25, 0.5, 0.75, 1]\n        scaleAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]\n        scaleAnimation.values = [1, 0.5, 1, 0.5, 1]\n        scaleAnimation.duration = duration\n\n        // Translate animation\n        let translateAnimation = CAKeyframeAnimation(keyPath: \"transform.translation\")\n\n        translateAnimation.keyTimes = scaleAnimation.keyTimes\n        translateAnimation.timingFunctions = scaleAnimation.timingFunctions\n        translateAnimation.values = [\n            NSValue(cgSize: CGSize(width: 0, height: 0)),\n            NSValue(cgSize: CGSize(width: deltaX, height: 0)),\n            NSValue(cgSize: CGSize(width: deltaX, height: deltaY)),\n            NSValue(cgSize: CGSize(width: 0, height: deltaY)),\n            NSValue(cgSize: CGSize(width: 0, height: 0))\n        ]\n        translateAnimation.duration = duration\n\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        rotateAnimation.keyTimes = scaleAnimation.keyTimes\n        rotateAnimation.timingFunctions = scaleAnimation.timingFunctions\n        rotateAnimation.values = [0, -Double.pi / 2, -Double.pi, -1.5 * Double.pi, -2 * Double.pi]\n        rotateAnimation.duration = duration\n\n        // Animation\u0012\u0012\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, translateAnimation, rotateAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw squares\n        for i in 0 ..< 2 {\n            let square = NVActivityIndicatorShape.rectangle.layerWith(size: CGSize(width: squareSize, height: squareSize), color: color)\n            let frame = CGRect(x: x, y: y, width: squareSize, height: squareSize)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            square.frame = frame\n            square.add(animation, forKey: \"animation\")\n            layer.addSublayer(square)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift",
    "content": "//\n//  NVActivityIndicatorAnimationBarScale.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationLineScale: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSize = size.width / 9\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 1\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0.1, 0.2, 0.3, 0.4, 0.5]\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.2, 0.68, 0.18, 1.08)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale.y\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.4, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw lines\n        for i in 0 ..< 5 {\n            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)\n            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i), y: y, width: lineSize, height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            line.frame = frame\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift",
    "content": "//\n//  NVActivityIndicatorAnimationLineScaleParty.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationLineScaleParty: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSize = size.width / 7\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let durations: [CFTimeInterval] = [1.26, 0.43, 1.01, 0.73]\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0.77, 0.29, 0.28, 0.74]\n        let timingFunction = CAMediaTimingFunction(name: .default)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.5, 1]\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        for i in 0 ..< 4 {\n            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)\n            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i), y: y, width: lineSize, height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            animation.duration = durations[i]\n            line.frame = frame\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift",
    "content": "//\n//  NVActivityIndicatorAnimationLineScalePulseOut.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationLineScalePulseOut: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSize = size.width / 9\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 1\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0.4, 0.2, 0, 0.2, 0.4]\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.85, 0.25, 0.37, 0.85)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale.y\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.4, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw lines\n        for i in 0 ..< 5 {\n            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)\n            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i),\n                               y: y,\n                               width: lineSize,\n                               height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            line.frame = frame\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift",
    "content": "//\n//  NVActivityIndicatorAnimationLineScalePulseOutRapid.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationLineScalePulseOutRapid: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSize = size.width / 9\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 0.9\n        let beginTime = CACurrentMediaTime()\n        let beginTimes = [0.5, 0.25, 0, 0.25, 0.5]\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.11, 0.49, 0.38, 0.78)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.scale.y\")\n\n        animation.keyTimes = [0, 0.8, 0.9]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.beginTime = beginTime\n        animation.values = [1, 0.3, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw lines\n        for i in 0 ..< 5 {\n            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)\n            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i),\n                               y: y,\n                               width: lineSize,\n                               height: size.height)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            line.frame = frame\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift",
    "content": "//\n//  NVActivityIndicatorAnimationLineSpinFadeLoader.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationLineSpinFadeLoader: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let lineSpacing: CGFloat = 2\n        let lineSize = CGSize(width: (size.width - 4 * lineSpacing) / 5, height: (size.height - 2 * lineSpacing) / 3)\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 1.2\n        let beginTime = CACurrentMediaTime()\n        let beginTimes: [CFTimeInterval] = [0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84, 0.96]\n        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"opacity\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.timingFunctions = [timingFunction, timingFunction]\n        animation.values = [1, 0.3, 1]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw lines\n        for i in 0 ..< 8 {\n            let line = lineAt(angle: CGFloat(Double.pi / 4 * Double(i)),\n                              size: lineSize,\n                              origin: CGPoint(x: x, y: y),\n                              containerSize: size,\n                              color: color)\n\n            animation.beginTime = beginTime + beginTimes[i]\n            line.add(animation, forKey: \"animation\")\n            layer.addSublayer(line)\n        }\n    }\n\n    func lineAt(angle: CGFloat, size: CGSize, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer {\n        let radius = containerSize.width / 2 - max(size.width, size.height) / 2\n        let lineContainerSize = CGSize(width: max(size.width, size.height), height: max(size.width, size.height))\n        let lineContainer = CALayer()\n        let lineContainerFrame = CGRect(\n            x: origin.x + radius * (cos(angle) + 1),\n            y: origin.y + radius * (sin(angle) + 1),\n            width: lineContainerSize.width,\n            height: lineContainerSize.height)\n        let line = NVActivityIndicatorShape.line.layerWith(size: size, color: color)\n        let lineFrame = CGRect(\n            x: (lineContainerSize.width - size.width) / 2,\n            y: (lineContainerSize.height - size.height) / 2,\n            width: size.width,\n            height: size.height)\n\n        lineContainer.frame = lineContainerFrame\n        line.frame = lineFrame\n        lineContainer.addSublayer(line)\n        lineContainer.sublayerTransform = CATransform3DMakeRotation(CGFloat(Double.pi / 2) + angle, 0, 0, 1)\n\n        return lineContainer\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift",
    "content": "//\n//  NVActivityIndicatorAnimationOrbit.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate {\n    let duration: CFTimeInterval = 1.9\n    let satelliteCoreRatio: CGFloat = 0.25\n    let distanceRatio: CGFloat = 1.5 // distance / core size\n\n    var coreSize: CGFloat = 0\n    var satelliteSize: CGFloat = 0\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        coreSize = size.width / (1 + satelliteCoreRatio + distanceRatio)\n        satelliteSize = coreSize * satelliteCoreRatio\n\n        ring1InLayer(layer, size: size, color: color)\n        ring2InLayer(layer, size: size, color: color)\n        coreInLayer(layer, size: size, color: color)\n        satelliteInLayer(layer, size: size, color: color)\n    }\n\n    func ring1InLayer(_ layer: CALayer, size _: CGSize, color: UIColor) {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.45, 0.45, 1]\n        scaleAnimation.timingFunction = CAMediaTimingFunction(name: .linear)\n        scaleAnimation.values = [0, 0, 1.3, 2]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1)\n\n        opacityAnimation.keyTimes = [0, 0.45, 1]\n        scaleAnimation.timingFunctions = [CAMediaTimingFunction(name: .linear), timingFunction]\n        opacityAnimation.values = [0.8, 0.8, 0]\n        opacityAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2,\n                           y: (layer.bounds.size.height - coreSize) / 2,\n                           width: coreSize,\n                           height: coreSize)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n\n    func ring2InLayer(_ layer: CALayer, size _: CGSize, color: UIColor) {\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.55, 0.55, 1]\n        scaleAnimation.timingFunction = CAMediaTimingFunction(name: .linear)\n        scaleAnimation.values = [0, 0, 1.3, 2.1]\n        scaleAnimation.duration = duration\n\n        // Opacity animation\n        let opacityAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1)\n\n        opacityAnimation.keyTimes = [0, 0.55, 0.65, 1]\n        scaleAnimation.timingFunctions = [CAMediaTimingFunction(name: .linear), timingFunction]\n        opacityAnimation.values = [0.7, 0.7, 0, 0]\n        opacityAnimation.duration = duration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [scaleAnimation, opacityAnimation]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2,\n                           y: (layer.bounds.size.height - coreSize) / 2,\n                           width: coreSize,\n                           height: coreSize)\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n\n    func coreInLayer(_ layer: CALayer, size _: CGSize, color: UIColor) {\n        let inTimingFunction = CAMediaTimingFunction(controlPoints: 0.7, 0, 1, 0.5)\n        let outTimingFunction = CAMediaTimingFunction(controlPoints: 0, 0.7, 0.5, 1)\n        let standByTimingFunction = CAMediaTimingFunction(name: .linear)\n\n        // Scale animation\n        let scaleAnimation = CAKeyframeAnimation(keyPath: \"transform.scale\")\n\n        scaleAnimation.keyTimes = [0, 0.45, 0.55, 1]\n        scaleAnimation.timingFunctions = [inTimingFunction, standByTimingFunction, outTimingFunction]\n        scaleAnimation.values = [1, 1.3, 1.3, 1]\n        scaleAnimation.duration = duration\n        scaleAnimation.repeatCount = HUGE\n        scaleAnimation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2,\n                           y: (layer.bounds.size.height - coreSize) / 2,\n                           width: coreSize,\n                           height: coreSize)\n\n        circle.frame = frame\n        circle.add(scaleAnimation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n\n    func satelliteInLayer(_ layer: CALayer, size: CGSize, color: UIColor) {\n        // Rotate animation\n        let rotateAnimation = CAKeyframeAnimation(keyPath: \"position\")\n\n        rotateAnimation.path = UIBezierPath(arcCenter: CGPoint(x: layer.bounds.midX, y: layer.bounds.midY),\n                                            radius: (size.width - satelliteSize) / 2,\n                                            startAngle: CGFloat(Double.pi * 1.5),\n                                            endAngle: CGFloat(Double.pi * 1.5 + 4 * Double.pi),\n                                            clockwise: true).cgPath\n        rotateAnimation.duration = duration * 2\n        rotateAnimation.repeatCount = HUGE\n        rotateAnimation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: satelliteSize, height: satelliteSize), color: color)\n        let frame = CGRect(x: 0, y: 0, width: satelliteSize, height: satelliteSize)\n\n        circle.frame = frame\n        circle.add(rotateAnimation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift",
    "content": "//\n//  NVActivityIndicatorAnimationPacman.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationPacman: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        circleInLayer(layer, size: size, color: color)\n        pacmanInLayer(layer, size: size, color: color)\n    }\n\n    func pacmanInLayer(_ layer: CALayer, size: CGSize, color: UIColor) {\n        let pacmanSize = 2 * size.width / 3\n        let pacmanDuration: CFTimeInterval = 0.5\n        let timingFunction = CAMediaTimingFunction(name: .default)\n\n        // Stroke start animation\n        let strokeStartAnimation = CAKeyframeAnimation(keyPath: \"strokeStart\")\n\n        strokeStartAnimation.keyTimes = [0, 0.5, 1]\n        strokeStartAnimation.timingFunctions = [timingFunction, timingFunction]\n        strokeStartAnimation.values = [0.125, 0, 0.125]\n        strokeStartAnimation.duration = pacmanDuration\n\n        // Stroke end animation\n        let strokeEndAnimation = CAKeyframeAnimation(keyPath: \"strokeEnd\")\n\n        strokeEndAnimation.keyTimes = [0, 0.5, 1]\n        strokeEndAnimation.timingFunctions = [timingFunction, timingFunction]\n        strokeEndAnimation.values = [0.875, 1, 0.875]\n        strokeEndAnimation.duration = pacmanDuration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [strokeStartAnimation, strokeEndAnimation]\n        animation.duration = pacmanDuration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw pacman\n        let pacman = NVActivityIndicatorShape.pacman.layerWith(size: CGSize(width: pacmanSize, height: pacmanSize), color: color)\n        let frame = CGRect(\n            x: (layer.bounds.size.width - size.width) / 2,\n            y: (layer.bounds.size.height - pacmanSize) / 2,\n            width: pacmanSize,\n            height: pacmanSize\n        )\n\n        pacman.frame = frame\n        pacman.add(animation, forKey: \"animation\")\n        layer.addSublayer(pacman)\n    }\n\n    func circleInLayer(_ layer: CALayer, size: CGSize, color: UIColor) {\n        let circleSize = size.width / 5\n        let circleDuration: CFTimeInterval = 1\n\n        // Translate animation\n        let translateAnimation = CABasicAnimation(keyPath: \"transform.translation.x\")\n\n        translateAnimation.fromValue = 0\n        translateAnimation.toValue = -size.width / 2\n        translateAnimation.duration = circleDuration\n\n        // Opacity animation\n        let opacityAnimation = CABasicAnimation(keyPath: \"opacity\")\n\n        opacityAnimation.fromValue = 1\n        opacityAnimation.toValue = 0.7\n        opacityAnimation.duration = circleDuration\n\n        // Animation\n        let animation = CAAnimationGroup()\n\n        animation.animations = [translateAnimation, opacityAnimation]\n        animation.timingFunction = CAMediaTimingFunction(name: .linear)\n        animation.duration = circleDuration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circles\n        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)\n        let frame = CGRect(\n            x: (layer.bounds.size.width - size.width) / 2 + size.width - circleSize,\n            y: (layer.bounds.size.height - circleSize) / 2,\n            width: circleSize,\n            height: circleSize\n        )\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift",
    "content": "//\n//  NVActivityIndicatorAnimationSemiCircleSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationSemiCircleSpin: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 0.6\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform.rotation.z\")\n\n        animation.keyTimes = [0, 0.5, 1]\n        animation.values = [0, Double.pi, 2 * Double.pi]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw circle\n        let circle = NVActivityIndicatorShape.circleSemi.layerWith(size: size, color: color)\n        let frame = CGRect(\n            x: (layer.bounds.width - size.width) / 2,\n            y: (layer.bounds.height - size.height) / 2,\n            width: size.width,\n            height: size.height\n        )\n\n        circle.frame = frame\n        circle.add(animation, forKey: \"animation\")\n        layer.addSublayer(circle)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift",
    "content": "//\n//  NVActivityIndicatorAnimationSquareSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationSquareSpin: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let duration: CFTimeInterval = 3\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform\")\n\n        animation.keyTimes = [0, 0.25, 0.5, 0.75, 1]\n        animation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: 0))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: CGFloat(Double.pi)), createRotateYTransform(angle: 0))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: CGFloat(Double.pi)), createRotateYTransform(angle: CGFloat(Double.pi)))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: CGFloat(Double.pi)))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: 0)))\n        ]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw square\n        let square = NVActivityIndicatorShape.rectangle.layerWith(size: size, color: color)\n        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,\n                           y: (layer.bounds.size.height - size.height) / 2,\n                           width: size.width,\n                           height: size.height)\n\n        square.frame = frame\n        square.add(animation, forKey: \"animation\")\n        layer.addSublayer(square)\n    }\n\n    func createRotateXTransform(angle: CGFloat) -> CATransform3D {\n        var transform = CATransform3DMakeRotation(angle, 1, 0, 0)\n\n        transform.m34 = CGFloat(-1) / 100\n\n        return transform\n    }\n\n    func createRotateYTransform(angle: CGFloat) -> CATransform3D {\n        var transform = CATransform3DMakeRotation(angle, 0, 1, 0)\n\n        transform.m34 = CGFloat(-1) / 100\n\n        return transform\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift",
    "content": "//\n//  NVActivityIndicatorAnimationTriangleSkewSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nclass NVActivityIndicatorAnimationTriangleSkewSpin: NVActivityIndicatorAnimationDelegate {\n\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {\n        let x = (layer.bounds.size.width - size.width) / 2\n        let y = (layer.bounds.size.height - size.height) / 2\n        let duration: CFTimeInterval = 3\n        let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)\n\n        // Animation\n        let animation = CAKeyframeAnimation(keyPath: \"transform\")\n\n        animation.keyTimes = [0, 0.25, 0.5, 0.75, 1]\n        animation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]\n        animation.values = [\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: 0))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: CGFloat(Double.pi)), createRotateYTransform(angle: 0))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: CGFloat(Double.pi)), createRotateYTransform(angle: CGFloat(Double.pi)))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: CGFloat(Double.pi)))),\n            NSValue(caTransform3D: CATransform3DConcat(createRotateXTransform(angle: 0), createRotateYTransform(angle: 0)))\n        ]\n        animation.duration = duration\n        animation.repeatCount = HUGE\n        animation.isRemovedOnCompletion = false\n\n        // Draw triangle\n        let triangle = NVActivityIndicatorShape.triangle.layerWith(size: size, color: color)\n\n        triangle.frame = CGRect(x: x, y: y, width: size.width, height: size.height)\n        triangle.add(animation, forKey: \"animation\")\n        layer.addSublayer(triangle)\n    }\n\n    func createRotateXTransform(angle: CGFloat) -> CATransform3D {\n        var transform = CATransform3DMakeRotation(angle, 1, 0, 0)\n\n        transform.m34 = CGFloat(-1) / 100\n\n        return transform\n    }\n\n    func createRotateYTransform(angle: CGFloat) -> CATransform3D {\n        var transform = CATransform3DMakeRotation(angle, 0, 1, 0)\n\n        transform.m34 = CGFloat(-1) / 100\n\n        return transform\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/NVActivityIndicatorAnimationDelegate.swift",
    "content": "//\n//  NVActivityIndicatorDelegate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\n// swiftlint:disable:next class_delegate_protocol\nprotocol NVActivityIndicatorAnimationDelegate {\n    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor)\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/NVActivityIndicatorShape.swift",
    "content": "//\n//  NVActivityIndicatorShape.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\nenum NVActivityIndicatorShape {\n    case circle\n    case circleSemi\n    case ring\n    case ringTwoHalfVertical\n    case ringTwoHalfHorizontal\n    case ringThirdFour\n    case rectangle\n    case triangle\n    case line\n    case pacman\n    case stroke\n\n    // swiftlint:disable:next cyclomatic_complexity function_body_length\n    func layerWith(size: CGSize, color: UIColor) -> CALayer {\n        let layer: CAShapeLayer = CAShapeLayer()\n        var path: UIBezierPath = UIBezierPath()\n        let lineWidth: CGFloat = 2\n\n        switch self {\n        case .circle:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: 0,\n                        endAngle: CGFloat(2 * Double.pi),\n                        clockwise: false)\n            layer.fillColor = color.cgColor\n        case .circleSemi:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(-Double.pi / 6),\n                        endAngle: CGFloat(-5 * Double.pi / 6),\n                        clockwise: false)\n            path.close()\n            layer.fillColor = color.cgColor\n        case .ring:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: 0,\n                        endAngle: CGFloat(2 * Double.pi),\n                        clockwise: false)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = lineWidth\n        case .ringTwoHalfVertical:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(-3 * Double.pi / 4),\n                        endAngle: CGFloat(-Double.pi / 4),\n                        clockwise: true)\n            path.move(\n                to: CGPoint(x: size.width / 2 - size.width / 2 * cos(CGFloat(Double.pi / 4)),\n                            y: size.height / 2 + size.height / 2 * sin(CGFloat(Double.pi / 4)))\n            )\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(-5 * Double.pi / 4),\n                        endAngle: CGFloat(-7 * Double.pi / 4),\n                        clockwise: false)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = lineWidth\n        case .ringTwoHalfHorizontal:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(3 * Double.pi / 4),\n                        endAngle: CGFloat(5 * Double.pi / 4),\n                        clockwise: true)\n            path.move(\n                to: CGPoint(x: size.width / 2 + size.width / 2 * cos(CGFloat(Double.pi / 4)),\n                            y: size.height / 2 - size.height / 2 * sin(CGFloat(Double.pi / 4)))\n            )\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(-Double.pi / 4),\n                        endAngle: CGFloat(Double.pi / 4),\n                        clockwise: true)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = lineWidth\n        case .ringThirdFour:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: CGFloat(-3 * Double.pi / 4),\n                        endAngle: CGFloat(-Double.pi / 4),\n                        clockwise: false)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = 2\n        case .rectangle:\n            path.move(to: CGPoint(x: 0, y: 0))\n            path.addLine(to: CGPoint(x: size.width, y: 0))\n            path.addLine(to: CGPoint(x: size.width, y: size.height))\n            path.addLine(to: CGPoint(x: 0, y: size.height))\n            layer.fillColor = color.cgColor\n        case .triangle:\n            let offsetY = size.height / 4\n\n            path.move(to: CGPoint(x: 0, y: size.height - offsetY))\n            path.addLine(to: CGPoint(x: size.width / 2, y: size.height / 2 - offsetY))\n            path.addLine(to: CGPoint(x: size.width, y: size.height - offsetY))\n            path.close()\n            layer.fillColor = color.cgColor\n        case .line:\n            path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: size.width, height: size.height),\n                                cornerRadius: size.width / 2)\n            layer.fillColor = color.cgColor\n        case .pacman:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 4,\n                        startAngle: 0,\n                        endAngle: CGFloat(2 * Double.pi),\n                        clockwise: true)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = size.width / 2\n        case .stroke:\n            path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2),\n                        radius: size.width / 2,\n                        startAngle: -(.pi / 2),\n                        endAngle: .pi + .pi / 2,\n                        clockwise: true)\n            layer.fillColor = nil\n            layer.strokeColor = color.cgColor\n            layer.lineWidth = 2\n        }\n\n        layer.backgroundColor = nil\n        layer.path = path.cgPath\n        layer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)\n\n        return layer\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Base/NVActivityIndicatorView.swift",
    "content": "//\n//  NVActivityIndicatorView.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\n\n/**\n Enum of animation types used for activity indicator view.\n\n - Blank:                   Blank animation.\n - BallPulse:               BallPulse animation.\n - BallGridPulse:           BallGridPulse animation.\n - BallClipRotate:          BallClipRotate animation.\n - SquareSpin:              SquareSpin animation.\n - BallClipRotatePulse:     BallClipRotatePulse animation.\n - BallClipRotateMultiple:  BallClipRotateMultiple animation.\n - BallPulseRise:           BallPulseRise animation.\n - BallRotate:              BallRotate animation.\n - CubeTransition:          CubeTransition animation.\n - BallZigZag:              BallZigZag animation.\n - BallZigZagDeflect:       BallZigZagDeflect animation.\n - BallTrianglePath:        BallTrianglePath animation.\n - BallScale:               BallScale animation.\n - LineScale:               LineScale animation.\n - LineScaleParty:          LineScaleParty animation.\n - BallScaleMultiple:       BallScaleMultiple animation.\n - BallPulseSync:           BallPulseSync animation.\n - BallBeat:                BallBeat animation.\n - BallDoubleBounce:        BallDoubleBounce animation.\n - LineScalePulseOut:       LineScalePulseOut animation.\n - LineScalePulseOutRapid:  LineScalePulseOutRapid animation.\n - BallScaleRipple:         BallScaleRipple animation.\n - BallScaleRippleMultiple: BallScaleRippleMultiple animation.\n - BallSpinFadeLoader:      BallSpinFadeLoader animation.\n - LineSpinFadeLoader:      LineSpinFadeLoader animation.\n - TriangleSkewSpin:        TriangleSkewSpin animation.\n - Pacman:                  Pacman animation.\n - BallGridBeat:            BallGridBeat animation.\n - SemiCircleSpin:          SemiCircleSpin animation.\n - BallRotateChase:         BallRotateChase animation.\n - Orbit:                   Orbit animation.\n - AudioEqualizer:          AudioEqualizer animation.\n - CircleStrokeSpin:        CircleStrokeSpin animation.\n */\npublic enum NVActivityIndicatorType: CaseIterable {\n    /**\n     Blank.\n\n     - returns: Instance of NVActivityIndicatorAnimationBlank.\n     */\n    case blank\n    /**\n     BallPulse.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallPulse.\n     */\n    case ballPulse\n    /**\n     BallGridPulse.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallGridPulse.\n     */\n    case ballGridPulse\n    /**\n     BallClipRotate.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallClipRotate.\n     */\n    case ballClipRotate\n    /**\n     SquareSpin.\n\n     - returns: Instance of NVActivityIndicatorAnimationSquareSpin.\n     */\n    case squareSpin\n    /**\n     BallClipRotatePulse.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallClipRotatePulse.\n     */\n    case ballClipRotatePulse\n    /**\n     BallClipRotateMultiple.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallClipRotateMultiple.\n     */\n    case ballClipRotateMultiple\n    /**\n     BallPulseRise.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallPulseRise.\n     */\n    case ballPulseRise\n    /**\n     BallRotate.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallRotate.\n     */\n    case ballRotate\n    /**\n     CubeTransition.\n\n     - returns: Instance of NVActivityIndicatorAnimationCubeTransition.\n     */\n    case cubeTransition\n    /**\n     BallZigZag.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallZigZag.\n     */\n    case ballZigZag\n    /**\n     BallZigZagDeflect\n\n     - returns: Instance of NVActivityIndicatorAnimationBallZigZagDeflect\n     */\n    case ballZigZagDeflect\n    /**\n     BallTrianglePath.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallTrianglePath.\n     */\n    case ballTrianglePath\n    /**\n     BallScale.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallScale.\n     */\n    case ballScale\n    /**\n     LineScale.\n\n     - returns: Instance of NVActivityIndicatorAnimationLineScale.\n     */\n    case lineScale\n    /**\n     LineScaleParty.\n\n     - returns: Instance of NVActivityIndicatorAnimationLineScaleParty.\n     */\n    case lineScaleParty\n    /**\n     BallScaleMultiple.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallScaleMultiple.\n     */\n    case ballScaleMultiple\n    /**\n     BallPulseSync.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallPulseSync.\n     */\n    case ballPulseSync\n    /**\n     BallBeat.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallBeat.\n     */\n    case ballBeat\n    /**\n     BallDoubleBounce.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallDoubleBounce.\n     */\n    case ballDoubleBounce\n    /**\n     LineScalePulseOut.\n\n     - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOut.\n     */\n    case lineScalePulseOut\n    /**\n     LineScalePulseOutRapid.\n\n     - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOutRapid.\n     */\n    case lineScalePulseOutRapid\n    /**\n     BallScaleRipple.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallScaleRipple.\n     */\n    case ballScaleRipple\n    /**\n     BallScaleRippleMultiple.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallScaleRippleMultiple.\n     */\n    case ballScaleRippleMultiple\n    /**\n     BallSpinFadeLoader.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallSpinFadeLoader.\n     */\n    case ballSpinFadeLoader\n    /**\n     LineSpinFadeLoader.\n\n     - returns: Instance of NVActivityIndicatorAnimationLineSpinFadeLoader.\n     */\n    case lineSpinFadeLoader\n    /**\n     TriangleSkewSpin.\n\n     - returns: Instance of NVActivityIndicatorAnimationTriangleSkewSpin.\n     */\n    case triangleSkewSpin\n    /**\n     Pacman.\n\n     - returns: Instance of NVActivityIndicatorAnimationPacman.\n     */\n    case pacman\n    /**\n     BallGridBeat.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallGridBeat.\n     */\n    case ballGridBeat\n    /**\n     SemiCircleSpin.\n\n     - returns: Instance of NVActivityIndicatorAnimationSemiCircleSpin.\n     */\n    case semiCircleSpin\n    /**\n     BallRotateChase.\n\n     - returns: Instance of NVActivityIndicatorAnimationBallRotateChase.\n     */\n    case ballRotateChase\n    /**\n     Orbit.\n\n     - returns: Instance of NVActivityIndicatorAnimationOrbit.\n     */\n    case orbit\n    /**\n     AudioEqualizer.\n\n     - returns: Instance of NVActivityIndicatorAnimationAudioEqualizer.\n     */\n    case audioEqualizer\n    /**\n     Stroke.\n     \n     - returns: Instance of NVActivityIndicatorAnimationCircleStrokeSpin.\n     */\n    case circleStrokeSpin\n\n    // swiftlint:disable:next cyclomatic_complexity function_body_length\n    func animation() -> NVActivityIndicatorAnimationDelegate {\n        switch self {\n        case .blank:\n            return NVActivityIndicatorAnimationBlank()\n        case .ballPulse:\n            return NVActivityIndicatorAnimationBallPulse()\n        case .ballGridPulse:\n            return NVActivityIndicatorAnimationBallGridPulse()\n        case .ballClipRotate:\n            return NVActivityIndicatorAnimationBallClipRotate()\n        case .squareSpin:\n            return NVActivityIndicatorAnimationSquareSpin()\n        case .ballClipRotatePulse:\n            return NVActivityIndicatorAnimationBallClipRotatePulse()\n        case .ballClipRotateMultiple:\n            return NVActivityIndicatorAnimationBallClipRotateMultiple()\n        case .ballPulseRise:\n            return NVActivityIndicatorAnimationBallPulseRise()\n        case .ballRotate:\n            return NVActivityIndicatorAnimationBallRotate()\n        case .cubeTransition:\n            return NVActivityIndicatorAnimationCubeTransition()\n        case .ballZigZag:\n            return NVActivityIndicatorAnimationBallZigZag()\n        case .ballZigZagDeflect:\n            return NVActivityIndicatorAnimationBallZigZagDeflect()\n        case .ballTrianglePath:\n            return NVActivityIndicatorAnimationBallTrianglePath()\n        case .ballScale:\n            return NVActivityIndicatorAnimationBallScale()\n        case .lineScale:\n            return NVActivityIndicatorAnimationLineScale()\n        case .lineScaleParty:\n            return NVActivityIndicatorAnimationLineScaleParty()\n        case .ballScaleMultiple:\n            return NVActivityIndicatorAnimationBallScaleMultiple()\n        case .ballPulseSync:\n            return NVActivityIndicatorAnimationBallPulseSync()\n        case .ballBeat:\n            return NVActivityIndicatorAnimationBallBeat()\n        case .ballDoubleBounce:\n            return NVActivityIndicatorAnimationBallDoubleBounce()\n        case .lineScalePulseOut:\n            return NVActivityIndicatorAnimationLineScalePulseOut()\n        case .lineScalePulseOutRapid:\n            return NVActivityIndicatorAnimationLineScalePulseOutRapid()\n        case .ballScaleRipple:\n            return NVActivityIndicatorAnimationBallScaleRipple()\n        case .ballScaleRippleMultiple:\n            return NVActivityIndicatorAnimationBallScaleRippleMultiple()\n        case .ballSpinFadeLoader:\n            return NVActivityIndicatorAnimationBallSpinFadeLoader()\n        case .lineSpinFadeLoader:\n            return NVActivityIndicatorAnimationLineSpinFadeLoader()\n        case .triangleSkewSpin:\n            return NVActivityIndicatorAnimationTriangleSkewSpin()\n        case .pacman:\n            return NVActivityIndicatorAnimationPacman()\n        case .ballGridBeat:\n            return NVActivityIndicatorAnimationBallGridBeat()\n        case .semiCircleSpin:\n            return NVActivityIndicatorAnimationSemiCircleSpin()\n        case .ballRotateChase:\n            return NVActivityIndicatorAnimationBallRotateChase()\n        case .orbit:\n            return NVActivityIndicatorAnimationOrbit()\n        case .audioEqualizer:\n            return NVActivityIndicatorAnimationAudioEqualizer()\n        case .circleStrokeSpin:\n            return NVActivityIndicatorAnimationCircleStrokeSpin()\n        }\n    }\n}\n\n/// Function that performs fade in/out animation.\npublic typealias FadeInAnimation = (UIView) -> Void\n\n/// Function that performs fade out animation.\n///\n/// - Note: Must call the second parameter on the animation completion.\npublic typealias FadeOutAnimation = (UIView, @escaping () -> Void) -> Void\n\n// swiftlint:disable file_length\n/// Activity indicator view with nice animations\npublic final class NVActivityIndicatorView: UIView {\n    // swiftlint:disable identifier_name\n    /// Default type. Default value is .BallSpinFadeLoader.\n    public static var DEFAULT_TYPE: NVActivityIndicatorType = .ballSpinFadeLoader\n\n    /// Default color of activity indicator. Default value is UIColor.white.\n    public static var DEFAULT_COLOR = UIColor.white\n\n    /// Default color of text. Default value is UIColor.white.\n    public static var DEFAULT_TEXT_COLOR = UIColor.white\n\n    /// Default padding. Default value is 0.\n    public static var DEFAULT_PADDING: CGFloat = 0\n\n    /// Default size of activity indicator view in UI blocker. Default value is 60x60.\n    public static var DEFAULT_BLOCKER_SIZE = CGSize(width: 60, height: 60)\n\n    /// Default display time threshold to actually display UI blocker. Default value is 0 ms.\n    ///\n    /// - note:\n    /// Default time that has to be elapsed (between calls of `startAnimating()` and `stopAnimating()`) in order to actually display UI blocker. It should be set thinking about what the minimum duration of an activity is to be worth showing it to the user. If the activity ends before this time threshold, then it will not be displayed at all.\n    public static var DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD = 0\n\n    /// Default minimum display time of UI blocker. Default value is 0 ms.\n    ///\n    /// - note:\n    /// Default minimum display time of UI blocker. Its main purpose is to avoid flashes showing and hiding it so fast. For instance, setting it to 200ms will force UI blocker to be shown for at least this time (regardless of calling `stopAnimating()` ealier).\n    public static var DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME = 0\n\n    /// Default message displayed in UI blocker. Default value is nil.\n    public static var DEFAULT_BLOCKER_MESSAGE: String?\n\n    /// Default message spacing to activity indicator view in UI blocker. Default value is 8.\n    public static var DEFAULT_BLOCKER_MESSAGE_SPACING = CGFloat(8.0)\n\n    /// Default font of message displayed in UI blocker. Default value is bold system font, size 20.\n    public static var DEFAULT_BLOCKER_MESSAGE_FONT = UIFont.boldSystemFont(ofSize: 20)\n\n    /// Default background color of UI blocker. Default value is UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)\n    public static var DEFAULT_BLOCKER_BACKGROUND_COLOR = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)\n\n    /// Default fade in animation.\n    public static var DEFAULT_FADE_IN_ANIMATION: FadeInAnimation = { view in\n        view.alpha = 0\n        UIView.animate(withDuration: 0.25) {\n            view.alpha = 1\n        }\n    }\n\n    /// Default fade out animation.\n    public static var DEFAULT_FADE_OUT_ANIMATION: FadeOutAnimation = { (view, complete) in\n        UIView.animate(withDuration: 0.25,\n                       animations: {\n                        view.alpha = 0\n        },\n                       completion: { completed in\n                        if completed {\n                            complete()\n                        }\n        })\n    }\n    // swiftlint:enable identifier_name\n\n    /// Animation type.\n    public var type: NVActivityIndicatorType = NVActivityIndicatorView.DEFAULT_TYPE\n\n    @available(*, unavailable, message: \"This property is reserved for Interface Builder. Use 'type' instead.\")\n    @IBInspectable var typeName: String {\n        get {\n            return getTypeName()\n        }\n        set {\n            _setTypeName(newValue)\n        }\n    }\n\n    /// Color of activity indicator view.\n    @IBInspectable public var color: UIColor = NVActivityIndicatorView.DEFAULT_COLOR\n\n    /// Padding of activity indicator view.\n    @IBInspectable public var padding: CGFloat = NVActivityIndicatorView.DEFAULT_PADDING\n\n    /// Current status of animation, read-only.\n    @available(*, deprecated)\n    public var animating: Bool { return isAnimating }\n\n    /// Current status of animation, read-only.\n    private(set) public var isAnimating: Bool = false\n\n    /**\n     Returns an object initialized from data in a given unarchiver.\n     self, initialized using the data in decoder.\n\n     - parameter decoder: an unarchiver object.\n\n     - returns: self, initialized using the data in decoder.\n     */\n    public required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        backgroundColor = UIColor.clear\n        isHidden = true\n    }\n\n    /**\n     Create a activity indicator view.\n\n     Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params.\n\n     - parameter frame:   view's frame.\n     - parameter type:    animation type.\n     - parameter color:   color of activity indicator view.\n     - parameter padding: padding of activity indicator view.\n\n     - returns: The activity indicator view.\n     */\n    public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) {\n        self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE\n        self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR\n        self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING\n        super.init(frame: frame)\n        isHidden = true\n    }\n\n    // Fix issue #62\n    // Intrinsic content size is used in autolayout\n    // that causes mislayout when using with MBProgressHUD.\n    /**\n     Returns the natural size for the receiving view, considering only properties of the view itself.\n\n     A size indicating the natural size for the receiving view based on its intrinsic properties.\n\n     - returns: A size indicating the natural size for the receiving view based on its intrinsic properties.\n     */\n    public override var intrinsicContentSize: CGSize {\n        return CGSize(width: bounds.width, height: bounds.height)\n    }\n\n    public override var bounds: CGRect {\n        didSet {\n            // setup the animation again for the new bounds\n            if oldValue != bounds && isAnimating {\n                setUpAnimation()\n            }\n        }\n    }\n\n    /**\n     Start animating.\n     */\n    public final func startAnimating() {\n        guard !isAnimating else {\n            return\n        }\n        isHidden = false\n        isAnimating = true\n        layer.speed = 1\n        setUpAnimation()\n    }\n\n    /**\n     Stop animating.\n     */\n    public final func stopAnimating() {\n        guard isAnimating else {\n            return\n        }\n        isHidden = true\n        isAnimating = false\n        layer.sublayers?.removeAll()\n    }\n\n    // MARK: Internal\n\n    // swiftlint:disable:next identifier_name\n    func _setTypeName(_ typeName: String) {\n        for item in NVActivityIndicatorType.allCases where String(describing: item).caseInsensitiveCompare(typeName) == .orderedSame {\n            type = item\n            break\n        }\n    }\n\n    func getTypeName() -> String {\n        return String(describing: type)\n    }\n\n    // MARK: Privates\n\n    private final func setUpAnimation() {\n        let animation: NVActivityIndicatorAnimationDelegate = type.animation()\n        var animationRect = frame.inset(by: UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding))\n        let minEdge = min(animationRect.width, animationRect.height)\n\n        layer.sublayers = nil\n        animationRect.size = CGSize(width: minEdge, height: minEdge)\n        animation.setUpAnimation(in: layer, size: animationRect.size, color: color)\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Extended/NVActivityIndicatorPresenter.swift",
    "content": "//\n//  NVActivityIndicatorPresenter.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\nimport NVActivityIndicatorView\n\n/// Class packages information used to display UI blocker.\n@available(*, deprecated, message: \"\")\npublic final class ActivityData {\n    /// Size of activity indicator view.\n    let size: CGSize\n\n    /// Message displayed under activity indicator view.\n    let message: String?\n\n    /// Font of message displayed under activity indicator view.\n    let messageFont: UIFont\n\n    /// Message spacing to activity indicator view.\n    let messageSpacing: CGFloat\n\n    /// Animation type.\n    let type: NVActivityIndicatorType\n\n    /// Color of activity indicator view.\n    let color: UIColor\n\n    /// Color of text.\n    let textColor: UIColor\n\n    /// Padding of activity indicator view.\n    let padding: CGFloat\n\n    /// Display time threshold to actually display UI blocker.\n    let displayTimeThreshold: Int\n\n    /// Minimum display time of UI blocker.\n    let minimumDisplayTime: Int\n\n    /// Background color of the UI blocker\n    let backgroundColor: UIColor\n\n    /**\n     Create information package used to display UI blocker.\n\n     Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params.\n\n     - parameter size:                 size of activity indicator view.\n     - parameter message:              message displayed under activity indicator view.\n     - parameter messageFont:          font of message displayed under activity indicator view.\n     - parameter messageSpacing:       message spacing to activity indicator view.\n     - parameter type:                 animation type.\n     - parameter color:                color of activity indicator view.\n     - parameter padding:              padding of activity indicator view.\n     - parameter displayTimeThreshold: display time threshold to actually display UI blocker.\n     - parameter minimumDisplayTime:   minimum display time of UI blocker.\n     - parameter textColor:            color of the text below the activity indicator view. Will match color parameter if not set, otherwise DEFAULT_TEXT_COLOR if color is not set.\n\n     - returns: The information package used to display UI blocker.\n     */\n    public init(size: CGSize? = nil,\n                message: String? = nil,\n                messageFont: UIFont? = nil,\n                messageSpacing: CGFloat? = nil,\n                type: NVActivityIndicatorType? = nil,\n                color: UIColor? = nil,\n                padding: CGFloat? = nil,\n                displayTimeThreshold: Int? = nil,\n                minimumDisplayTime: Int? = nil,\n                backgroundColor: UIColor? = nil,\n                textColor: UIColor? = nil) {\n        self.size = size ?? NVActivityIndicatorView.DEFAULT_BLOCKER_SIZE\n        self.message = message ?? NVActivityIndicatorView.DEFAULT_BLOCKER_MESSAGE\n        self.messageFont = messageFont ?? NVActivityIndicatorView.DEFAULT_BLOCKER_MESSAGE_FONT\n        self.messageSpacing = messageSpacing ?? NVActivityIndicatorView.DEFAULT_BLOCKER_MESSAGE_SPACING\n        self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE\n        self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR\n        self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING\n        self.displayTimeThreshold = displayTimeThreshold ?? NVActivityIndicatorView.DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD\n        self.minimumDisplayTime = minimumDisplayTime ?? NVActivityIndicatorView.DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME\n        self.backgroundColor = backgroundColor ?? NVActivityIndicatorView.DEFAULT_BLOCKER_BACKGROUND_COLOR\n        self.textColor = textColor ?? color ?? NVActivityIndicatorView.DEFAULT_TEXT_COLOR\n    }\n}\n\nprivate protocol NVActivityIndicatorPresenterState {\n    func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?)\n    func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?)\n}\n\nprivate struct NVActivityIndicatorPresenterStateWaitingToStart: NVActivityIndicatorPresenterState {\n    func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?) {\n        guard let activityData = presenter.data else { return }\n\n        presenter.show(with: activityData, fadeInAnimation)\n        presenter.state = .animating\n        presenter.waitingToStartGroup.leave()\n    }\n\n    func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?) {\n        presenter.state = .stopped\n        presenter.waitingToStartGroup.leave()\n    }\n}\n\nprivate struct NVActivityIndicatorPresenterStateAnimating: NVActivityIndicatorPresenterState {\n    func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?) {\n        // Do nothing\n    }\n\n    func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?) {\n        guard let activityData = presenter.data else { return }\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(activityData.minimumDisplayTime)) {\n            guard presenter.state == .waitingToStop else { return }\n\n            presenter.stopAnimating(fadeOutAnimation)\n        }\n        presenter.state = .waitingToStop\n    }\n}\n\nprivate struct NVActivityIndicatorPresenterStateWaitingToStop: NVActivityIndicatorPresenterState {\n    func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?) {\n        presenter.stopAnimating(nil)\n\n        guard let activityData = presenter.data else { return }\n        presenter.startAnimating(activityData, fadeInAnimation)\n    }\n\n    func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?) {\n        presenter.hide(fadeOutAnimation)\n        presenter.state = .stopped\n    }\n}\n\nprivate struct NVActivityIndicatorPresenterStateStopped: NVActivityIndicatorPresenterState {\n    func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?) {\n        guard let activityData = presenter.data else { return }\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(activityData.displayTimeThreshold)) {\n            guard presenter.state == .waitingToStart else { return }\n\n            presenter.startAnimating(activityData, fadeInAnimation)\n        }\n        presenter.state = .waitingToStart\n        presenter.waitingToStartGroup.enter()\n    }\n\n    func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?) {\n        // Do nothing\n    }\n}\n\n/// Presenter that displays NVActivityIndicatorView as UI blocker.\n@available(*, deprecated, message: \"\")\npublic final class NVActivityIndicatorPresenter {\n    fileprivate enum State: NVActivityIndicatorPresenterState {\n        case waitingToStart\n        case animating\n        case waitingToStop\n        case stopped\n\n        var performer: NVActivityIndicatorPresenterState {\n            switch self {\n            case .waitingToStart: return NVActivityIndicatorPresenterStateWaitingToStart()\n            case .animating: return NVActivityIndicatorPresenterStateAnimating()\n            case .waitingToStop: return NVActivityIndicatorPresenterStateWaitingToStop()\n            case .stopped: return NVActivityIndicatorPresenterStateStopped()\n            }\n        }\n\n        func startAnimating(presenter: NVActivityIndicatorPresenter, _ fadeInAnimation: FadeInAnimation?) {\n            performer.startAnimating(presenter: presenter, fadeInAnimation)\n        }\n\n        func stopAnimating(presenter: NVActivityIndicatorPresenter, _ fadeOutAnimation: FadeOutAnimation?) {\n            performer.stopAnimating(presenter: presenter, fadeOutAnimation)\n        }\n    }\n\n    private let restorationIdentifier = \"NVActivityIndicatorViewContainer\"\n    private let messageLabel: UILabel = {\n        let label = UILabel()\n\n        label.textAlignment = .center\n        label.numberOfLines = 0\n        label.translatesAutoresizingMaskIntoConstraints = false\n\n        return label\n    }()\n\n    fileprivate var state: State = .stopped\n    fileprivate var data: ActivityData? // Shared activity data across states\n\n    /// The group to synchronize the message so that the one set by `setMessage` is always displayed after the initial message passed to `startAnimating(_:)`.\n    fileprivate let waitingToStartGroup = DispatchGroup()\n\n    /// Shared instance of `NVActivityIndicatorPresenter`.\n    public static let sharedInstance = NVActivityIndicatorPresenter()\n\n    /// Current status of animation, read-only.\n    public var isAnimating: Bool { return state == .animating || state == .waitingToStop }\n\n    private init() {}\n\n    // MARK: - Public interface\n\n    /**\n     Display UI blocker.\n\n     - parameter data: Information package used to display UI blocker.\n     - parameter fadeInAnimation: Fade in animation.\n     */\n    public final func startAnimating(_ data: ActivityData, _ fadeInAnimation: FadeInAnimation? = nil) {\n        self.data = data\n        state.startAnimating(presenter: self, fadeInAnimation)\n    }\n\n    /**\n     Remove UI blocker.\n\n     - parameter fadeOutAnimation: Fade out animation.\n     */\n    public final func stopAnimating(_ fadeOutAnimation: FadeOutAnimation? = nil) {\n        state.stopAnimating(presenter: self, fadeOutAnimation)\n    }\n\n    /// Set message displayed under activity indicator view.\n    ///\n    /// - Parameter message: message displayed under activity indicator view.\n    public final func setMessage(_ message: String?) {\n        waitingToStartGroup.notify(queue: DispatchQueue.main) {\n            self.messageLabel.text = message\n        }\n    }\n\n    // MARK: - Helpers\n\n    fileprivate func show(with activityData: ActivityData, _ fadeInAnimation: FadeInAnimation?) {\n        let containerView = UIView(frame: UIScreen.main.bounds)\n\n        containerView.backgroundColor = activityData.backgroundColor\n        containerView.restorationIdentifier = restorationIdentifier\n        containerView.translatesAutoresizingMaskIntoConstraints = false\n        fadeInAnimation?(containerView)\n\n        let activityIndicatorView = NVActivityIndicatorView(\n            frame: CGRect(x: 0, y: 0, width: activityData.size.width, height: activityData.size.height),\n            type: activityData.type,\n            color: activityData.color,\n            padding: activityData.padding)\n\n        activityIndicatorView.startAnimating()\n        activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false\n        containerView.addSubview(activityIndicatorView)\n\n        // Add constraints for `activityIndicatorView`.\n        ({\n            let xConstraint = NSLayoutConstraint(item: containerView, attribute: .centerX, relatedBy: .equal, toItem: activityIndicatorView, attribute: .centerX, multiplier: 1, constant: 0)\n            let yConstraint = NSLayoutConstraint(item: containerView, attribute: .centerY, relatedBy: .equal, toItem: activityIndicatorView, attribute: .centerY, multiplier: 1, constant: 0)\n\n            containerView.addConstraints([xConstraint, yConstraint])\n            }())\n\n        messageLabel.font = activityData.messageFont\n        messageLabel.textColor = activityData.textColor\n        messageLabel.text = activityData.message\n        containerView.addSubview(messageLabel)\n\n        // Add constraints for `messageLabel`.\n        ({\n            let leadingConstraint = NSLayoutConstraint(item: containerView, attribute: .leading, relatedBy: .equal, toItem: messageLabel, attribute: .leading, multiplier: 1, constant: -8)\n            let trailingConstraint = NSLayoutConstraint(item: containerView, attribute: .trailing, relatedBy: .equal, toItem: messageLabel, attribute: .trailing, multiplier: 1, constant: 8)\n\n            containerView.addConstraints([leadingConstraint, trailingConstraint])\n            }())\n        ({\n            let spacingConstraint = NSLayoutConstraint(item: messageLabel, attribute: .top, relatedBy: .equal, toItem: activityIndicatorView, attribute: .bottom, multiplier: 1, constant: activityData.messageSpacing)\n\n            containerView.addConstraint(spacingConstraint)\n            }())\n\n        guard let keyWindow = UIApplication.shared.keyWindow else { return }\n\n        keyWindow.addSubview(containerView)\n\n        // Add constraints for `containerView`.\n        ({\n            let leadingConstraint = NSLayoutConstraint(item: keyWindow, attribute: .leading, relatedBy: .equal, toItem: containerView, attribute: .leading, multiplier: 1, constant: 0)\n            let trailingConstraint = NSLayoutConstraint(item: keyWindow, attribute: .trailing, relatedBy: .equal, toItem: containerView, attribute: .trailing, multiplier: 1, constant: 0)\n            let topConstraint = NSLayoutConstraint(item: keyWindow, attribute: .top, relatedBy: .equal, toItem: containerView, attribute: .top, multiplier: 1, constant: 0)\n            let bottomConstraint = NSLayoutConstraint(item: keyWindow, attribute: .bottom, relatedBy: .equal, toItem: containerView, attribute: .bottom, multiplier: 1, constant: 0)\n\n            keyWindow.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])\n            }())\n    }\n\n    fileprivate func hide(_ fadeOutAnimation: FadeOutAnimation?) {\n        for window in UIApplication.shared.windows {\n            for item in window.subviews\n                where item.restorationIdentifier == restorationIdentifier {\n                    if let fadeOutAnimation = fadeOutAnimation {\n                        fadeOutAnimation(item) {\n                            item.removeFromSuperview()\n                        }\n                    } else {\n                        item.removeFromSuperview()\n                    }\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/Extended/NVActivityIndicatorViewable.swift",
    "content": "//\n//  NVActivityIndicatorViewable.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\n#if canImport(UIKit)\nimport UIKit\nimport NVActivityIndicatorView\n\n/**\n *  UIViewController conforms this protocol to be able to display NVActivityIndicatorView as UI blocker.\n *\n *  This extends abilities of UIViewController to display and remove UI blocker.\n */\n@available(*, deprecated, message: \"\")\npublic protocol NVActivityIndicatorViewable {}\n\n@available(*, deprecated, message: \"\")\npublic extension NVActivityIndicatorViewable where Self: UIViewController {\n\n    /// Current status of animation, read-only.\n    var isAnimating: Bool { return NVActivityIndicatorPresenter.sharedInstance.isAnimating }\n\n    /**\n     Display UI blocker.\n\n     Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params.\n\n     - parameter size:                 size of activity indicator view.\n     - parameter message:              message displayed under activity indicator view.\n     - parameter messageFont:          font of message displayed under activity indicator view.\n     - parameter type:                 animation type.\n     - parameter color:                color of activity indicator view.\n     - parameter padding:              padding of activity indicator view.\n     - parameter displayTimeThreshold: display time threshold to actually display UI blocker.\n     - parameter minimumDisplayTime:   minimum display time of UI blocker.\n     - parameter fadeInAnimation:      fade in animation.\n     */\n    func startAnimating(\n        _ size: CGSize? = nil,\n        message: String? = nil,\n        messageFont: UIFont? = nil,\n        type: NVActivityIndicatorType? = nil,\n        color: UIColor? = nil,\n        padding: CGFloat? = nil,\n        displayTimeThreshold: Int? = nil,\n        minimumDisplayTime: Int? = nil,\n        backgroundColor: UIColor? = nil,\n        textColor: UIColor? = nil,\n        fadeInAnimation: FadeInAnimation? = NVActivityIndicatorView.DEFAULT_FADE_IN_ANIMATION) {\n        let activityData = ActivityData(size: size,\n                                        message: message,\n                                        messageFont: messageFont,\n                                        type: type,\n                                        color: color,\n                                        padding: padding,\n                                        displayTimeThreshold: displayTimeThreshold,\n                                        minimumDisplayTime: minimumDisplayTime,\n                                        backgroundColor: backgroundColor,\n                                        textColor: textColor)\n\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, fadeInAnimation)\n    }\n\n    /**\n     Remove UI blocker.\n\n     - parameter fadeOutAnimation: fade out animation.\n     */\n    func stopAnimating(_ fadeOutAnimation: FadeOutAnimation? = NVActivityIndicatorView.DEFAULT_FADE_OUT_ANIMATION) {\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(fadeOutAnimation)\n    }\n}\n#endif\n"
  },
  {
    "path": "Tests/ActivityDataTests.swift",
    "content": "//\n//  ActivityDataTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport XCTest\n@testable import NVActivityIndicatorView\n@testable import NVActivityIndicatorViewExtended\n\nclass ActivityDataTests: XCTestCase {\n\n    func testInitWithoutParams() {\n        let activityData = ActivityData()\n\n        XCTAssertEqual(activityData.size, NVActivityIndicatorView.DEFAULT_BLOCKER_SIZE)\n        XCTAssertNil(activityData.message)\n        XCTAssertEqual(activityData.type, NVActivityIndicatorView.DEFAULT_TYPE)\n        XCTAssertEqual(activityData.color, NVActivityIndicatorView.DEFAULT_COLOR)\n        XCTAssertEqual(activityData.padding, NVActivityIndicatorView.DEFAULT_PADDING)\n        XCTAssertEqual(activityData.displayTimeThreshold, NVActivityIndicatorView.DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD)\n        XCTAssertEqual(activityData.minimumDisplayTime, NVActivityIndicatorView.DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME)\n        XCTAssertEqual(activityData.backgroundColor, NVActivityIndicatorView.DEFAULT_BLOCKER_BACKGROUND_COLOR)\n    }\n\n    func testInitWithParams() {\n\n        let size = CGSize(width: 100, height: 100)\n        let message = \"Loading...\"\n        let type = NVActivityIndicatorType.ballBeat\n        let color = UIColor.red\n        let padding: CGFloat = 10\n        let displayTimeThreshold = 100\n        let minimumDisplayTime = 150\n        let backgroundColor = UIColor.red\n        let textColor = UIColor.purple\n        let activityData = ActivityData(size: size,\n                                        message: message,\n                                        type: type,\n                                        color: color,\n                                        padding: padding,\n                                        displayTimeThreshold: displayTimeThreshold,\n                                        minimumDisplayTime: minimumDisplayTime,\n                                        backgroundColor: backgroundColor,\n                                        textColor: textColor)\n\n        XCTAssertEqual(activityData.size, size)\n        XCTAssertEqual(activityData.message, message)\n        XCTAssertEqual(activityData.type, type)\n        XCTAssertEqual(activityData.color, color)\n        XCTAssertEqual(activityData.padding, padding)\n        XCTAssertEqual(activityData.displayTimeThreshold, displayTimeThreshold)\n        XCTAssertEqual(activityData.minimumDisplayTime, minimumDisplayTime)\n        XCTAssertEqual(activityData.backgroundColor, backgroundColor)\n        XCTAssertEqual(activityData.textColor, textColor)\n    }\n\n    func testTextColorInitWithColor() {\n\n        let color = UIColor.red\n        let activityData = ActivityData(color: color)\n\n        XCTAssertEqual(activityData.color, color)\n        XCTAssertEqual(activityData.textColor, color) // textColor matches color\n    }\n\n    func testNoColorOrTextColorInit() {\n\n        let activityData = ActivityData()\n\n        XCTAssertEqual(activityData.textColor, NVActivityIndicatorView.DEFAULT_TEXT_COLOR)\n    }\n}\n"
  },
  {
    "path": "Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>5.2.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>48</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/NVActivityIndicatorPresenterTests.swift",
    "content": "//\n//  NVActivityIndicatorPresenterTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport XCTest\n@testable import NVActivityIndicatorView\n@testable import NVActivityIndicatorViewExtended\n\nclass NVActivityIndicatorPresenterTests: XCTestCase {\n    let approximateZero: Int = 20\n\n    func testZeroDisplayTimeThreshold() {\n        let activityData = createActivityData(displayTimeThreshold: 0,\n                                              minimumDisplayTime: 0)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(approximateZero) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n        }\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(approximateZero) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n    }\n\n    func testNonZeroDisplayTimeThreshold() {\n        let activityData = createActivityData(displayTimeThreshold: 100,\n                                              minimumDisplayTime: 0)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(50) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(approximateZero) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(100) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n        }\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(approximateZero) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n    }\n\n    func testZeroMinimumDisplayTime() {\n        let activityData = createActivityData(displayTimeThreshold: 0,\n                                              minimumDisplayTime: 0)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(approximateZero) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n        }\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(approximateZero) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n    }\n\n    func testNonZeroMinimumDisplayTime() {\n        let activityData = createActivityData(displayTimeThreshold: 0,\n                                              minimumDisplayTime: 100)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(approximateZero) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n        }\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(50) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n        }\n        doAfter(50) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n    }\n\n    func testStartStop() {\n        let activityData = createActivityData(displayTimeThreshold: 0,\n                                              minimumDisplayTime: 0)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(approximateZero) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n    }\n\n    func testStartStopStart() {\n        let activityData = createActivityData(displayTimeThreshold: 0,\n                                              minimumDisplayTime: 0)\n\n        XCTAssertFalse(checkActivityViewAppeared())\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n\n        doAfter(approximateZero) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n            NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n            NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        }\n\n        doAfter(approximateZero * 2) {\n            XCTAssertTrue(self.checkActivityViewAppeared())\n            NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        }\n\n        doAfter(approximateZero * 3) {\n            XCTAssertFalse(self.checkActivityViewAppeared())\n        }\n\n    }\n\n    func testIsAnimating() {\n        let activityData = createActivityData(displayTimeThreshold: 100,\n                                              minimumDisplayTime: 100)\n\n        // .stopped\n        XCTAssertFalse(NVActivityIndicatorPresenter.sharedInstance.isAnimating)\n\n        // .waitingToStart\n        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData, nil)\n        doAfter(50) {\n            XCTAssertFalse(NVActivityIndicatorPresenter.sharedInstance.isAnimating)\n        }\n\n        // .animating\n        doAfter(50) {\n            XCTAssertTrue(NVActivityIndicatorPresenter.sharedInstance.isAnimating)\n        }\n\n        // .waitingToStop\n        NVActivityIndicatorPresenter.sharedInstance.stopAnimating(nil)\n        doAfter(50) {\n            XCTAssertTrue(NVActivityIndicatorPresenter.sharedInstance.isAnimating)\n        }\n\n        // .stopped\n        doAfter(50) {\n            XCTAssertFalse(NVActivityIndicatorPresenter.sharedInstance.isAnimating)\n        }\n    }\n\n    // MARK: Helpers\n\n    func createActivityData(displayTimeThreshold: Int,\n                            minimumDisplayTime: Int) -> ActivityData {\n        return ActivityData(size: CGSize.zero,\n                            message: \"\",\n                            type: nil,\n                            color: nil,\n                            padding: 0,\n                            displayTimeThreshold: displayTimeThreshold,\n                            minimumDisplayTime: minimumDisplayTime,\n                            textColor: nil)\n    }\n\n    func checkActivityViewAppeared() -> Bool {\n        for item in UIApplication.shared.keyWindow!.subviews\n            where item.restorationIdentifier == \"NVActivityIndicatorViewContainer\" {\n                return true\n        }\n\n        return false\n    }\n\n    func doAfter(_ after: Int, thing: @escaping () -> Void) {\n        let expectation = self.expectation(description: \"\")\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(after)) {\n            thing()\n            expectation.fulfill()\n        }\n        waitForExpectations(timeout: Double(after) * 1.5 / 1000) { error in\n            print(error ?? \"Timeout\")\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/NVActivityIndicatorTypeTests.swift",
    "content": "//\n//  NVActivityIndicatorTypeTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport XCTest\n@testable import NVActivityIndicatorView\n@testable import NVActivityIndicatorViewExtended\n\nclass NVActivityIndicatorTypeTests: XCTestCase {\n\n    func testAnimation() {\n        let enumClass: [NVActivityIndicatorType: NVActivityIndicatorAnimationDelegate.Type] = [\n            .blank: NVActivityIndicatorAnimationBlank.self,\n            .ballPulse: NVActivityIndicatorAnimationBallPulse.self,\n            .ballGridPulse: NVActivityIndicatorAnimationBallGridPulse.self,\n            .ballClipRotate: NVActivityIndicatorAnimationBallClipRotate.self,\n            .squareSpin: NVActivityIndicatorAnimationSquareSpin.self,\n            .ballClipRotatePulse: NVActivityIndicatorAnimationBallClipRotatePulse.self,\n            .ballClipRotateMultiple: NVActivityIndicatorAnimationBallClipRotateMultiple.self,\n            .ballPulseRise: NVActivityIndicatorAnimationBallPulseRise.self,\n            .ballRotate: NVActivityIndicatorAnimationBallRotate.self,\n            .cubeTransition: NVActivityIndicatorAnimationCubeTransition.self,\n            .ballZigZag: NVActivityIndicatorAnimationBallZigZag.self,\n            .ballZigZagDeflect: NVActivityIndicatorAnimationBallZigZagDeflect.self,\n            .ballTrianglePath: NVActivityIndicatorAnimationBallTrianglePath.self,\n            .ballScale: NVActivityIndicatorAnimationBallScale.self,\n            .lineScale: NVActivityIndicatorAnimationLineScale.self,\n            .lineScaleParty: NVActivityIndicatorAnimationLineScaleParty.self,\n            .ballScaleMultiple: NVActivityIndicatorAnimationBallScaleMultiple.self,\n            .ballPulseSync: NVActivityIndicatorAnimationBallPulseSync.self,\n            .ballBeat: NVActivityIndicatorAnimationBallBeat.self,\n            .lineScalePulseOut: NVActivityIndicatorAnimationLineScalePulseOut.self,\n            .lineScalePulseOutRapid: NVActivityIndicatorAnimationLineScalePulseOutRapid.self,\n            .ballScaleRipple: NVActivityIndicatorAnimationBallScaleRipple.self,\n            .ballScaleRippleMultiple: NVActivityIndicatorAnimationBallScaleRippleMultiple.self,\n            .ballSpinFadeLoader: NVActivityIndicatorAnimationBallSpinFadeLoader.self,\n            .lineSpinFadeLoader: NVActivityIndicatorAnimationLineSpinFadeLoader.self,\n            .triangleSkewSpin: NVActivityIndicatorAnimationTriangleSkewSpin.self,\n            .pacman: NVActivityIndicatorAnimationPacman.self,\n            .ballGridBeat: NVActivityIndicatorAnimationBallGridBeat.self,\n            .semiCircleSpin: NVActivityIndicatorAnimationSemiCircleSpin.self,\n            .ballRotateChase: NVActivityIndicatorAnimationBallRotateChase.self,\n            .orbit: NVActivityIndicatorAnimationOrbit.self,\n            .audioEqualizer: NVActivityIndicatorAnimationAudioEqualizer.self,\n            .circleStrokeSpin: NVActivityIndicatorAnimationCircleStrokeSpin.self\n        ]\n\n        enumClass.forEach { enumm, clazz in\n            let enummClassString = String(describing: enumm.animation())\n            let clazzString = String(describing: clazz)\n\n            XCTAssertTrue(enummClassString.hasSuffix(clazzString))\n        }\n    }\n\n    func testAllCases() {\n        XCTAssertEqual(NVActivityIndicatorType.allCases.last, NVActivityIndicatorType.circleStrokeSpin)\n    }\n}\n"
  },
  {
    "path": "Tests/NVActivityIndicatorViewTests.swift",
    "content": "//\n//  NVActivityIndicatorViewTests.swift\n//  NVActivityIndicatorViewTests\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh Nguyen\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 all\n// 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 THE\n// SOFTWARE.\n//\n\nimport XCTest\n@testable import NVActivityIndicatorView\n@testable import NVActivityIndicatorViewExtended\n\nclass NVActivityIndicatorViewTests: XCTestCase {\n    var activityIndicatorView: NVActivityIndicatorView!\n\n    override func setUp() {\n        super.setUp()\n\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect.zero)\n    }\n\n    override func tearDown() {\n        activityIndicatorView = nil\n\n        super.tearDown()\n    }\n\n    func testDefaultValues() {\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_TYPE, NVActivityIndicatorType.ballSpinFadeLoader)\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_COLOR, UIColor.white)\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_PADDING, 0)\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_BLOCKER_SIZE, CGSize(width: 60, height: 60))\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME, 0)\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD, 0)\n        XCTAssertEqual(NVActivityIndicatorView.DEFAULT_BLOCKER_BACKGROUND_COLOR, UIColor(red: 0, green: 0, blue: 0, alpha: 0.5))\n    }\n\n    func testSetTypeName() {\n        activityIndicatorView._setTypeName(\"unknown\")\n        XCTAssertEqual(activityIndicatorView.type, NVActivityIndicatorView.DEFAULT_TYPE)\n        activityIndicatorView._setTypeName(\"Orbit\")\n        XCTAssertEqual(activityIndicatorView.type, NVActivityIndicatorType.orbit)\n        activityIndicatorView._setTypeName(\"orbit\")\n        XCTAssertEqual(activityIndicatorView.type, NVActivityIndicatorType.orbit)\n        activityIndicatorView._setTypeName(\"orbiT\")\n        XCTAssertEqual(activityIndicatorView.type, NVActivityIndicatorType.orbit)\n    }\n\n    func testGetTypeName() {\n        activityIndicatorView.type = .audioEqualizer\n        XCTAssertEqual(activityIndicatorView.getTypeName(), String(describing: NVActivityIndicatorType.audioEqualizer))\n    }\n\n    func testInitWithParams() {\n        let type: NVActivityIndicatorType = .audioEqualizer\n        let color = UIColor.red\n        let padding: CGFloat = 10\n\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect.zero, type: type)\n        XCTAssertEqual(activityIndicatorView.type, type)\n\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect.zero, color: color)\n        XCTAssertEqual(activityIndicatorView.color, color)\n\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect.zero, padding: padding)\n        XCTAssertEqual(activityIndicatorView.padding, padding)\n\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect.zero, type: type, color: color, padding: padding)\n        XCTAssertEqual(activityIndicatorView.type, type)\n        XCTAssertEqual(activityIndicatorView.color, color)\n        XCTAssertEqual(activityIndicatorView.padding, padding)\n    }\n\n    func testInitWithFrame() {\n        activityIndicatorView = NVActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))\n        XCTAssertEqual(activityIndicatorView.type, NVActivityIndicatorView.DEFAULT_TYPE)\n        XCTAssertEqual(activityIndicatorView.color, NVActivityIndicatorView.DEFAULT_COLOR)\n        XCTAssertEqual(activityIndicatorView.padding, NVActivityIndicatorView.DEFAULT_PADDING)\n    }\n\n    func testStartAnimating() {\n        XCTAssertFalse(activityIndicatorView.isAnimating)\n        XCTAssertTrue(activityIndicatorView.isHidden)\n        activityIndicatorView.startAnimating()\n        XCTAssertEqual(activityIndicatorView.layer.speed, 1)\n        XCTAssertTrue(activityIndicatorView.isAnimating)\n        XCTAssertFalse(activityIndicatorView.isHidden)\n    }\n\n    func testStopAnimating() {\n        activityIndicatorView.startAnimating()\n        activityIndicatorView.stopAnimating()\n        XCTAssertFalse(activityIndicatorView.isAnimating)\n        XCTAssertTrue(activityIndicatorView.isHidden)\n        XCTAssertTrue(activityIndicatorView.layer.sublayers == nil)\n    }\n}\n"
  },
  {
    "path": "Tests/Tests-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
  },
  {
    "path": "docs/CNAME",
    "content": "nvactivityindicatorview.vinhis.me"
  },
  {
    "path": "docs/Classes/NVActivityIndicatorView.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Class/NVActivityIndicatorView\" class=\"dashAnchor\"></a>\n\n    <a title=\"NVActivityIndicatorView Class Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"../index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"../img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"../index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      <a class=\"breadcrumb\" href=\"../Classes.html\">Classes</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      NVActivityIndicatorView Class Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>NVActivityIndicatorView</h1>\n            <p>Activity indicator view with nice animations</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_TYPE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_TYPE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default type. Default value is .BallSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default color of activity indicator. Default value is UIColor.white.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_TEXT_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_TEXT_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default color of text. Default value is UIColor.white.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_PADDING\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_PADDING</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default padding. Default value is 0.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_SIZE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_SIZE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default size of activity indicator view in UI blocker. Default value is 60x60.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default display time threshold to actually display UI blocker. Default value is 0 ms.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Default time that has to be elapsed (between calls of <code>startAnimating()</code> and <code>stopAnimating()</code>) in order to actually display UI blocker. It should be set thinking about what the minimum duration of an activity is to be worth showing it to the user. If the activity ends before this time threshold, then it will not be displayed at all.\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default minimum display time of UI blocker. Default value is 0 ms.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Default minimum display time of UI blocker. Its main purpose is to avoid flashes showing and hiding it so fast. For instance, setting it to 200ms will force UI blocker to be shown for at least this time (regardless of calling <code>stopAnimating()</code> ealier).\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default message displayed in UI blocker. Default value is nil.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE_SPACING\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE_SPACING</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default message spacing to activity indicator view in UI blocker. Default value is 8.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE_FONT\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE_FONT</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default font of message displayed in UI blocker. Default value is bold system font, size 20.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_BACKGROUND_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_BACKGROUND_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default background color of UI blocker. Default value is UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_FADE_IN_ANIMATION\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_FADE_IN_ANIMATION</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default fade in animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_FADE_OUT_ANIMATION\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_FADE_OUT_ANIMATION</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default fade out animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/type\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">type</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Animation type.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/color\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">color</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Color of activity indicator view.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/padding\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">padding</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Padding of activity indicator view.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/isAnimating\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">isAnimating</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Current status of animation, read-only.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/init(coder:)\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">init(coder:<wbr>)</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns an object initialized from data in a given unarchiver.\nself, initialized using the data in decoder.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/init(frame:type:color:padding:)\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">init(frame:<wbr>type:<wbr>color:<wbr>padding:<wbr>)</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create a activity indicator view.</p>\n\n<p>Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/intrinsicContentSize\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">intrinsicContentSize</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the natural size for the receiving view, considering only properties of the view itself.</p>\n\n<p>A size indicating the natural size for the receiving view based on its intrinsic properties.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/bounds\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">bounds</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        \n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/startAnimating()\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">startAnimating()</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Start animating.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/stopAnimating()\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">stopAnimating()</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Stop animating.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Classes  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Classes\" class=\"dashAnchor\"></a>\n\n    <a title=\"Classes  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Classes  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Classes</h1>\n            <p>The following classes are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Class/NVActivityIndicatorView\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">NVActivityIndicatorView</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Activity indicator view with nice animations</p>\n\n                        <a href=\"Classes/NVActivityIndicatorView.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums/NVActivityIndicatorType.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorType Enumeration Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Enum/NVActivityIndicatorType\" class=\"dashAnchor\"></a>\n\n    <a title=\"NVActivityIndicatorType Enumeration Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"../index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"../img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"../index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      <a class=\"breadcrumb\" href=\"../Enums.html\">Enumerations</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      NVActivityIndicatorType Enumeration Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>NVActivityIndicatorType</h1>\n            <p>Enum of animation types used for activity indicator view.</p>\n\n<ul>\n<li>Blank:                   Blank animation.</li>\n<li>BallPulse:               BallPulse animation.</li>\n<li>BallGridPulse:           BallGridPulse animation.</li>\n<li>BallClipRotate:          BallClipRotate animation.</li>\n<li>SquareSpin:              SquareSpin animation.</li>\n<li>BallClipRotatePulse:     BallClipRotatePulse animation.</li>\n<li>BallClipRotateMultiple:  BallClipRotateMultiple animation.</li>\n<li>BallPulseRise:           BallPulseRise animation.</li>\n<li>BallRotate:              BallRotate animation.</li>\n<li>CubeTransition:          CubeTransition animation.</li>\n<li>BallZigZag:              BallZigZag animation.</li>\n<li>BallZigZagDeflect:       BallZigZagDeflect animation.</li>\n<li>BallTrianglePath:        BallTrianglePath animation.</li>\n<li>BallScale:               BallScale animation.</li>\n<li>LineScale:               LineScale animation.</li>\n<li>LineScaleParty:          LineScaleParty animation.</li>\n<li>BallScaleMultiple:       BallScaleMultiple animation.</li>\n<li>BallPulseSync:           BallPulseSync animation.</li>\n<li>BallBeat:                BallBeat animation.</li>\n<li>BallDoubleBounce:        BallDoubleBounce animation.</li>\n<li>LineScalePulseOut:       LineScalePulseOut animation.</li>\n<li>LineScalePulseOutRapid:  LineScalePulseOutRapid animation.</li>\n<li>BallScaleRipple:         BallScaleRipple animation.</li>\n<li>BallScaleRippleMultiple: BallScaleRippleMultiple animation.</li>\n<li>BallSpinFadeLoader:      BallSpinFadeLoader animation.</li>\n<li>LineSpinFadeLoader:      LineSpinFadeLoader animation.</li>\n<li>TriangleSkewSpin:        TriangleSkewSpin animation.</li>\n<li>Pacman:                  Pacman animation.</li>\n<li>BallGridBeat:            BallGridBeat animation.</li>\n<li>SemiCircleSpin:          SemiCircleSpin animation.</li>\n<li>BallRotateChase:         BallRotateChase animation.</li>\n<li>Orbit:                   Orbit animation.</li>\n<li>AudioEqualizer:          AudioEqualizer animation.</li>\n<li>CircleStrokeSpin:        CircleStrokeSpin animation.</li>\n</ul>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/blank\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">blank</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Blank.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballGridPulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballGridPulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallGridPulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotate.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/squareSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">squareSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>SquareSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotatePulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotatePulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotatePulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotateMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotateMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotateMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulseRise\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulseRise</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulseRise.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballRotate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballRotate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallRotate.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/cubeTransition\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">cubeTransition</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>CubeTransition.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballZigZag\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballZigZag</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallZigZag.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballZigZagDeflect\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballZigZagDeflect</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallZigZagDeflect</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballTrianglePath\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballTrianglePath</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallTrianglePath.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScale\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScale</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScale.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScale\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScale</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScale.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScaleParty\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScaleParty</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScaleParty.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulseSync\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulseSync</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulseSync.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballBeat\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballBeat</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallBeat.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballDoubleBounce\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballDoubleBounce</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallDoubleBounce.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScalePulseOut\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScalePulseOut</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScalePulseOut.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScalePulseOutRapid\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScalePulseOutRapid</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScalePulseOutRapid.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleRipple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleRipple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleRipple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleRippleMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleRippleMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleRippleMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballSpinFadeLoader\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballSpinFadeLoader</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineSpinFadeLoader\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineSpinFadeLoader</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/triangleSkewSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">triangleSkewSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>TriangleSkewSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/pacman\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">pacman</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Pacman.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballGridBeat\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballGridBeat</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallGridBeat.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/semiCircleSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">semiCircleSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>SemiCircleSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballRotateChase\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballRotateChase</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallRotateChase.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/orbit\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">orbit</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Orbit.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/audioEqualizer\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">audioEqualizer</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>AudioEqualizer.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/circleStrokeSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">circleStrokeSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Stroke.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Enumerations  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Enumerations\" class=\"dashAnchor\"></a>\n\n    <a title=\"Enumerations  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Enumerations  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Enumerations</h1>\n            <p>The following enumerations are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Enum/NVActivityIndicatorType\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">NVActivityIndicatorType</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enum of animation types used for activity indicator view.</p>\n\n<ul>\n<li>Blank:                   Blank animation.</li>\n<li>BallPulse:               BallPulse animation.</li>\n<li>BallGridPulse:           BallGridPulse animation.</li>\n<li>BallClipRotate:          BallClipRotate animation.</li>\n<li>SquareSpin:              SquareSpin animation.</li>\n<li>BallClipRotatePulse:     BallClipRotatePulse animation.</li>\n<li>BallClipRotateMultiple:  BallClipRotateMultiple animation.</li>\n<li>BallPulseRise:           BallPulseRise animation.</li>\n<li>BallRotate:              BallRotate animation.</li>\n<li>CubeTransition:          CubeTransition animation.</li>\n<li>BallZigZag:              BallZigZag animation.</li>\n<li>BallZigZagDeflect:       BallZigZagDeflect animation.</li>\n<li>BallTrianglePath:        BallTrianglePath animation.</li>\n<li>BallScale:               BallScale animation.</li>\n<li>LineScale:               LineScale animation.</li>\n<li>LineScaleParty:          LineScaleParty animation.</li>\n<li>BallScaleMultiple:       BallScaleMultiple animation.</li>\n<li>BallPulseSync:           BallPulseSync animation.</li>\n<li>BallBeat:                BallBeat animation.</li>\n<li>BallDoubleBounce:        BallDoubleBounce animation.</li>\n<li>LineScalePulseOut:       LineScalePulseOut animation.</li>\n<li>LineScalePulseOutRapid:  LineScalePulseOutRapid animation.</li>\n<li>BallScaleRipple:         BallScaleRipple animation.</li>\n<li>BallScaleRippleMultiple: BallScaleRippleMultiple animation.</li>\n<li>BallSpinFadeLoader:      BallSpinFadeLoader animation.</li>\n<li>LineSpinFadeLoader:      LineSpinFadeLoader animation.</li>\n<li>TriangleSkewSpin:        TriangleSkewSpin animation.</li>\n<li>Pacman:                  Pacman animation.</li>\n<li>BallGridBeat:            BallGridBeat animation.</li>\n<li>SemiCircleSpin:          SemiCircleSpin animation.</li>\n<li>BallRotateChase:         BallRotateChase animation.</li>\n<li>Orbit:                   Orbit animation.</li>\n<li>AudioEqualizer:          AudioEqualizer animation.</li>\n<li>CircleStrokeSpin:        CircleStrokeSpin animation.</li>\n</ul>\n\n                        <a href=\"Enums/NVActivityIndicatorType.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Typealiases.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Type Aliases  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Type Aliases\" class=\"dashAnchor\"></a>\n\n    <a title=\"Type Aliases  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Type Aliases  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Type Aliases</h1>\n            <p>The following type aliases are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Alias/FadeInAnimation\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">FadeInAnimation</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Function that performs fade in/out animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Alias/FadeOutAnimation\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">FadeOutAnimation</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Function that performs fade out animation.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Must call the second parameter on the animation completion.\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/css/highlight.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n/* Credit to https://gist.github.com/wataru420/2048287 */\n.highlight .c {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .err {\n  color: #a61717;\n  background-color: #e3d2d2; }\n\n.highlight .k {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .o {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .cm {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cp {\n  color: #999999;\n  font-weight: bold; }\n\n.highlight .c1 {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cs {\n  color: #999999;\n  font-weight: bold;\n  font-style: italic; }\n\n.highlight .gd {\n  color: #000000;\n  background-color: #ffdddd; }\n\n.highlight .gd .x {\n  color: #000000;\n  background-color: #ffaaaa; }\n\n.highlight .ge {\n  color: #000000;\n  font-style: italic; }\n\n.highlight .gr {\n  color: #aa0000; }\n\n.highlight .gh {\n  color: #999999; }\n\n.highlight .gi {\n  color: #000000;\n  background-color: #ddffdd; }\n\n.highlight .gi .x {\n  color: #000000;\n  background-color: #aaffaa; }\n\n.highlight .go {\n  color: #888888; }\n\n.highlight .gp {\n  color: #555555; }\n\n.highlight .gs {\n  font-weight: bold; }\n\n.highlight .gu {\n  color: #aaaaaa; }\n\n.highlight .gt {\n  color: #aa0000; }\n\n.highlight .kc {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kd {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kp {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kr {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kt {\n  color: #445588; }\n\n.highlight .m {\n  color: #009999; }\n\n.highlight .s {\n  color: #d14; }\n\n.highlight .na {\n  color: #008080; }\n\n.highlight .nb {\n  color: #0086B3; }\n\n.highlight .nc {\n  color: #445588;\n  font-weight: bold; }\n\n.highlight .no {\n  color: #008080; }\n\n.highlight .ni {\n  color: #800080; }\n\n.highlight .ne {\n  color: #990000;\n  font-weight: bold; }\n\n.highlight .nf {\n  color: #990000; }\n\n.highlight .nn {\n  color: #555555; }\n\n.highlight .nt {\n  color: #000080; }\n\n.highlight .nv {\n  color: #008080; }\n\n.highlight .ow {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .w {\n  color: #bbbbbb; }\n\n.highlight .mf {\n  color: #009999; }\n\n.highlight .mh {\n  color: #009999; }\n\n.highlight .mi {\n  color: #009999; }\n\n.highlight .mo {\n  color: #009999; }\n\n.highlight .sb {\n  color: #d14; }\n\n.highlight .sc {\n  color: #d14; }\n\n.highlight .sd {\n  color: #d14; }\n\n.highlight .s2 {\n  color: #d14; }\n\n.highlight .se {\n  color: #d14; }\n\n.highlight .sh {\n  color: #d14; }\n\n.highlight .si {\n  color: #d14; }\n\n.highlight .sx {\n  color: #d14; }\n\n.highlight .sr {\n  color: #009926; }\n\n.highlight .s1 {\n  color: #d14; }\n\n.highlight .ss {\n  color: #990073; }\n\n.highlight .bp {\n  color: #999999; }\n\n.highlight .vc {\n  color: #008080; }\n\n.highlight .vg {\n  color: #008080; }\n\n.highlight .vi {\n  color: #008080; }\n\n.highlight .il {\n  color: #009999; }\n"
  },
  {
    "path": "docs/css/jazzy.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n*, *:before, *:after {\n  box-sizing: inherit; }\n\nbody {\n  margin: 0;\n  background: #fff;\n  color: #333;\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  letter-spacing: .2px;\n  -webkit-font-smoothing: antialiased;\n  box-sizing: border-box; }\n\nh1 {\n  font-size: 2rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.6em; }\n\nh2 {\n  font-size: 1.75rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.3em; }\n\nh3 {\n  font-size: 1.5rem;\n  font-weight: 700;\n  margin: 1em 0 0.3em; }\n\nh4 {\n  font-size: 1.25rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em; }\n\nh5 {\n  font-size: 1rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em; }\n\nh6 {\n  font-size: 1rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em;\n  color: #777; }\n\np {\n  margin: 0 0 1em; }\n\nul, ol {\n  padding: 0 0 0 2em;\n  margin: 0 0 0.85em; }\n\nblockquote {\n  margin: 0 0 0.85em;\n  padding: 0 15px;\n  color: #858585;\n  border-left: 4px solid #e5e5e5; }\n\nimg {\n  max-width: 100%; }\n\na {\n  color: #4183c4;\n  text-decoration: none; }\n  a:hover, a:focus {\n    outline: 0;\n    text-decoration: underline; }\n  a.discouraged {\n    text-decoration: line-through; }\n    a.discouraged:hover, a.discouraged:focus {\n      text-decoration: underline line-through; }\n\ntable {\n  background: #fff;\n  width: 100%;\n  border-collapse: collapse;\n  border-spacing: 0;\n  overflow: auto;\n  margin: 0 0 0.85em; }\n\ntr:nth-child(2n) {\n  background-color: #fbfbfb; }\n\nth, td {\n  padding: 6px 13px;\n  border: 1px solid #ddd; }\n\nhr {\n  height: 1px;\n  border: none;\n  background-color: #ddd; }\n\npre {\n  margin: 0 0 1.275em;\n  padding: .85em 1em;\n  overflow: auto;\n  background: #f7f7f7;\n  font-size: .85em;\n  font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace; }\n\ncode {\n  font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace; }\n\n.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code {\n  background: #f7f7f7;\n  padding: .2em; }\n  .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after {\n    letter-spacing: -.2em;\n    content: \"\\00a0\"; }\n\npre code {\n  padding: 0;\n  white-space: pre; }\n\n.content-wrapper {\n  display: flex;\n  flex-direction: column; }\n  @media (min-width: 768px) {\n    .content-wrapper {\n      flex-direction: row; } }\n.header {\n  display: flex;\n  padding: 8px;\n  font-size: 0.875em;\n  background: #444;\n  color: #999; }\n\n.header-col {\n  margin: 0;\n  padding: 0 8px; }\n\n.header-col--primary {\n  flex: 1; }\n\n.header-link {\n  color: #fff; }\n\n.header-icon {\n  padding-right: 2px;\n  vertical-align: -3px;\n  height: 16px; }\n\n.breadcrumbs {\n  font-size: 0.875em;\n  padding: 8px 16px;\n  margin: 0;\n  background: #fbfbfb;\n  border-bottom: 1px solid #ddd; }\n\n.carat {\n  height: 10px;\n  margin: 0 5px; }\n\n.navigation {\n  order: 2; }\n  @media (min-width: 768px) {\n    .navigation {\n      order: 1;\n      width: 25%;\n      max-width: 300px;\n      padding-bottom: 64px;\n      overflow: hidden;\n      word-wrap: normal;\n      background: #fbfbfb;\n      border-right: 1px solid #ddd; } }\n.nav-groups {\n  list-style-type: none;\n  padding-left: 0; }\n\n.nav-group-name {\n  border-bottom: 1px solid #ddd;\n  padding: 8px 0 8px 16px; }\n\n.nav-group-name-link {\n  color: #333; }\n\n.nav-group-tasks {\n  margin: 8px 0;\n  padding: 0 0 0 8px; }\n\n.nav-group-task {\n  font-size: 1em;\n  list-style-type: none;\n  white-space: nowrap; }\n\n.nav-group-task-link {\n  color: #808080; }\n\n.main-content {\n  order: 1; }\n  @media (min-width: 768px) {\n    .main-content {\n      order: 2;\n      flex: 1;\n      padding-bottom: 60px; } }\n.section {\n  padding: 0 32px;\n  border-bottom: 1px solid #ddd; }\n\n.section-content {\n  max-width: 834px;\n  margin: 0 auto;\n  padding: 16px 0; }\n\n.section-name {\n  color: #666;\n  display: block; }\n  .section-name p {\n    margin-bottom: inherit; }\n\n.declaration .highlight {\n  overflow-x: initial;\n  padding: 8px 0;\n  margin: 0;\n  background-color: transparent;\n  border: none; }\n\n.task-group-section {\n  border-top: 1px solid #ddd; }\n\n.task-group {\n  padding-top: 0px; }\n\n.task-name-container a[name]:before {\n  content: \"\";\n  display: block; }\n\n.section-name-container {\n  position: relative; }\n  .section-name-container .section-name-link {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    right: 0;\n    margin-bottom: 0; }\n  .section-name-container .section-name {\n    position: relative;\n    pointer-events: none;\n    z-index: 1; }\n    .section-name-container .section-name a {\n      pointer-events: auto; }\n\n.item-container {\n  padding: 0; }\n\n.item {\n  padding-top: 8px;\n  width: 100%;\n  list-style-type: none; }\n  .item a[name]:before {\n    content: \"\";\n    display: block; }\n  .item .token, .item .direct-link {\n    display: inline-block;\n    text-indent: -20px;\n    padding-left: 3px;\n    margin-left: 20px;\n    font-size: 1rem; }\n\n.declaration-note {\n  font-size: .85em;\n  color: #808080;\n  font-style: italic; }\n\n.pointer-container {\n  border-bottom: 1px solid #ddd;\n  left: -23px;\n  padding-bottom: 13px;\n  position: relative;\n  width: 110%; }\n\n.pointer {\n  left: 21px;\n  top: 7px;\n  display: block;\n  position: absolute;\n  width: 12px;\n  height: 12px;\n  border-left: 1px solid #ddd;\n  border-top: 1px solid #ddd;\n  background: #fff;\n  transform: rotate(45deg); }\n\n.height-container {\n  display: none;\n  position: relative;\n  width: 100%;\n  overflow: hidden; }\n  .height-container .section {\n    background: #fff;\n    border: 1px solid #ddd;\n    border-top-width: 0;\n    padding-top: 10px;\n    padding-bottom: 5px;\n    padding: 8px 16px; }\n\n.aside, .language {\n  padding: 6px 12px;\n  margin: 12px 0;\n  border-left: 5px solid #dddddd;\n  overflow-y: hidden; }\n  .aside .aside-title, .language .aside-title {\n    font-size: 9px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    padding-bottom: 0;\n    margin: 0;\n    color: #aaa;\n    -webkit-user-select: none; }\n  .aside p:last-child, .language p:last-child {\n    margin-bottom: 0; }\n\n.language {\n  border-left: 5px solid #cde9f4; }\n  .language .aside-title {\n    color: #4183c4; }\n\n.aside-warning, .aside-deprecated, .aside-unavailable {\n  border-left: 5px solid #ff6666; }\n  .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title {\n    color: #ff0000; }\n\n.graybox {\n  border-collapse: collapse;\n  width: 100%; }\n  .graybox p {\n    margin: 0;\n    word-break: break-word;\n    min-width: 50px; }\n  .graybox td {\n    border: 1px solid #ddd;\n    padding: 5px 25px 5px 10px;\n    vertical-align: middle; }\n  .graybox tr td:first-of-type {\n    text-align: right;\n    padding: 7px;\n    vertical-align: top;\n    word-break: normal;\n    width: 40px; }\n\n.slightly-smaller {\n  font-size: 0.9em; }\n\n.footer {\n  padding: 8px 16px;\n  background: #444;\n  color: #ddd;\n  font-size: 0.8em; }\n  .footer p {\n    margin: 8px 0; }\n  .footer a {\n    color: #fff; }\n\nhtml.dash .header, html.dash .breadcrumbs, html.dash .navigation {\n  display: none; }\n\nhtml.dash .height-container {\n  display: block; }\n\nform[role=search] input {\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 24px;\n  padding: 0 10px;\n  margin: 0;\n  border: none;\n  border-radius: 1em; }\n  .loading form[role=search] input {\n    background: white url(../img/spinner.gif) center right 4px no-repeat; }\n\nform[role=search] .tt-menu {\n  margin: 0;\n  min-width: 300px;\n  background: #fbfbfb;\n  color: #333;\n  border: 1px solid #ddd; }\n\nform[role=search] .tt-highlight {\n  font-weight: bold; }\n\nform[role=search] .tt-suggestion {\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  padding: 0 8px; }\n  form[role=search] .tt-suggestion span {\n    display: table-cell;\n    white-space: nowrap; }\n  form[role=search] .tt-suggestion .doc-parent-name {\n    width: 100%;\n    text-align: right;\n    font-weight: normal;\n    font-size: 0.9em;\n    padding-left: 16px; }\n\nform[role=search] .tt-suggestion:hover,\nform[role=search] .tt-suggestion.tt-cursor {\n  cursor: pointer;\n  background-color: #4183c4;\n  color: #fff; }\n\nform[role=search] .tt-suggestion:hover .doc-parent-name,\nform[role=search] .tt-suggestion.tt-cursor .doc-parent-name {\n  color: #fff; }\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>CFBundleIdentifier</key>\n      <string>com.jazzy.nvactivityindicatorview</string>\n    <key>CFBundleName</key>\n      <string>NVActivityIndicatorView</string>\n    <key>DocSetPlatformFamily</key>\n      <string>nvactivityindicatorview</string>\n    <key>isDashDocset</key>\n      <true/>\n    <key>dashIndexFilePath</key>\n      <string>index.html</string>\n    <key>isJavaScriptEnabled</key>\n      <true/>\n    <key>DashDocSetFamily</key>\n      <string>dashtoc</string>\n  </dict>\n</plist>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes/NVActivityIndicatorView.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Class/NVActivityIndicatorView\" class=\"dashAnchor\"></a>\n\n    <a title=\"NVActivityIndicatorView Class Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"../index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"../img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"../index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      <a class=\"breadcrumb\" href=\"../Classes.html\">Classes</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      NVActivityIndicatorView Class Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>NVActivityIndicatorView</h1>\n            <p>Activity indicator view with nice animations</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_TYPE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_TYPE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default type. Default value is .BallSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default color of activity indicator. Default value is UIColor.white.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_TEXT_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_TEXT_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default color of text. Default value is UIColor.white.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_PADDING\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_PADDING</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default padding. Default value is 0.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_SIZE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_SIZE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default size of activity indicator view in UI blocker. Default value is 60x60.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default display time threshold to actually display UI blocker. Default value is 0 ms.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Default time that has to be elapsed (between calls of <code>startAnimating()</code> and <code>stopAnimating()</code>) in order to actually display UI blocker. It should be set thinking about what the minimum duration of an activity is to be worth showing it to the user. If the activity ends before this time threshold, then it will not be displayed at all.\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MINIMUM_DISPLAY_TIME</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default minimum display time of UI blocker. Default value is 0 ms.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Default minimum display time of UI blocker. Its main purpose is to avoid flashes showing and hiding it so fast. For instance, setting it to 200ms will force UI blocker to be shown for at least this time (regardless of calling <code>stopAnimating()</code> ealier).\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default message displayed in UI blocker. Default value is nil.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE_SPACING\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE_SPACING</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default message spacing to activity indicator view in UI blocker. Default value is 8.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_MESSAGE_FONT\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_MESSAGE_FONT</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default font of message displayed in UI blocker. Default value is bold system font, size 20.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_BLOCKER_BACKGROUND_COLOR\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_BLOCKER_BACKGROUND_COLOR</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default background color of UI blocker. Default value is UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_FADE_IN_ANIMATION\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_FADE_IN_ANIMATION</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default fade in animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Variable/DEFAULT_FADE_OUT_ANIMATION\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">DEFAULT_FADE_OUT_ANIMATION</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default fade out animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/type\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">type</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Animation type.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/color\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">color</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Color of activity indicator view.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/padding\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">padding</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Padding of activity indicator view.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/isAnimating\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">isAnimating</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Current status of animation, read-only.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/init(coder:)\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">init(coder:<wbr>)</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns an object initialized from data in a given unarchiver.\nself, initialized using the data in decoder.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/init(frame:type:color:padding:)\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">init(frame:<wbr>type:<wbr>color:<wbr>padding:<wbr>)</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create a activity indicator view.</p>\n\n<p>Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/intrinsicContentSize\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">intrinsicContentSize</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the natural size for the receiving view, considering only properties of the view itself.</p>\n\n<p>A size indicating the natural size for the receiving view based on its intrinsic properties.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Property/bounds\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">bounds</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        \n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/startAnimating()\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">startAnimating()</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Start animating.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Method/stopAnimating()\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">stopAnimating()</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Stop animating.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Classes  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Classes\" class=\"dashAnchor\"></a>\n\n    <a title=\"Classes  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Classes  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Classes</h1>\n            <p>The following classes are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Class/NVActivityIndicatorView\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">NVActivityIndicatorView</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Activity indicator view with nice animations</p>\n\n                        <a href=\"Classes/NVActivityIndicatorView.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums/NVActivityIndicatorType.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorType Enumeration Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Enum/NVActivityIndicatorType\" class=\"dashAnchor\"></a>\n\n    <a title=\"NVActivityIndicatorType Enumeration Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"../index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"../img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"../index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      <a class=\"breadcrumb\" href=\"../Enums.html\">Enumerations</a>\n      <img class=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n      NVActivityIndicatorType Enumeration Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"../Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"../Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>NVActivityIndicatorType</h1>\n            <p>Enum of animation types used for activity indicator view.</p>\n\n<ul>\n<li>Blank:                   Blank animation.</li>\n<li>BallPulse:               BallPulse animation.</li>\n<li>BallGridPulse:           BallGridPulse animation.</li>\n<li>BallClipRotate:          BallClipRotate animation.</li>\n<li>SquareSpin:              SquareSpin animation.</li>\n<li>BallClipRotatePulse:     BallClipRotatePulse animation.</li>\n<li>BallClipRotateMultiple:  BallClipRotateMultiple animation.</li>\n<li>BallPulseRise:           BallPulseRise animation.</li>\n<li>BallRotate:              BallRotate animation.</li>\n<li>CubeTransition:          CubeTransition animation.</li>\n<li>BallZigZag:              BallZigZag animation.</li>\n<li>BallZigZagDeflect:       BallZigZagDeflect animation.</li>\n<li>BallTrianglePath:        BallTrianglePath animation.</li>\n<li>BallScale:               BallScale animation.</li>\n<li>LineScale:               LineScale animation.</li>\n<li>LineScaleParty:          LineScaleParty animation.</li>\n<li>BallScaleMultiple:       BallScaleMultiple animation.</li>\n<li>BallPulseSync:           BallPulseSync animation.</li>\n<li>BallBeat:                BallBeat animation.</li>\n<li>BallDoubleBounce:        BallDoubleBounce animation.</li>\n<li>LineScalePulseOut:       LineScalePulseOut animation.</li>\n<li>LineScalePulseOutRapid:  LineScalePulseOutRapid animation.</li>\n<li>BallScaleRipple:         BallScaleRipple animation.</li>\n<li>BallScaleRippleMultiple: BallScaleRippleMultiple animation.</li>\n<li>BallSpinFadeLoader:      BallSpinFadeLoader animation.</li>\n<li>LineSpinFadeLoader:      LineSpinFadeLoader animation.</li>\n<li>TriangleSkewSpin:        TriangleSkewSpin animation.</li>\n<li>Pacman:                  Pacman animation.</li>\n<li>BallGridBeat:            BallGridBeat animation.</li>\n<li>SemiCircleSpin:          SemiCircleSpin animation.</li>\n<li>BallRotateChase:         BallRotateChase animation.</li>\n<li>Orbit:                   Orbit animation.</li>\n<li>AudioEqualizer:          AudioEqualizer animation.</li>\n<li>CircleStrokeSpin:        CircleStrokeSpin animation.</li>\n</ul>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/blank\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">blank</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Blank.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballGridPulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballGridPulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallGridPulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotate.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/squareSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">squareSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>SquareSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotatePulse\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotatePulse</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotatePulse.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballClipRotateMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballClipRotateMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallClipRotateMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulseRise\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulseRise</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulseRise.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballRotate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballRotate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallRotate.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/cubeTransition\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">cubeTransition</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>CubeTransition.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballZigZag\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballZigZag</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallZigZag.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballZigZagDeflect\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballZigZagDeflect</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallZigZagDeflect</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballTrianglePath\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballTrianglePath</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallTrianglePath.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScale\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScale</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScale.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScale\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScale</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScale.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScaleParty\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScaleParty</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScaleParty.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballPulseSync\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballPulseSync</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallPulseSync.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballBeat\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballBeat</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallBeat.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballDoubleBounce\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballDoubleBounce</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallDoubleBounce.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScalePulseOut\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScalePulseOut</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScalePulseOut.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineScalePulseOutRapid\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineScalePulseOutRapid</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineScalePulseOutRapid.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleRipple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleRipple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleRipple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballScaleRippleMultiple\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballScaleRippleMultiple</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallScaleRippleMultiple.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballSpinFadeLoader\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballSpinFadeLoader</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/lineSpinFadeLoader\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">lineSpinFadeLoader</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>LineSpinFadeLoader.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/triangleSkewSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">triangleSkewSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>TriangleSkewSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/pacman\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">pacman</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Pacman.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballGridBeat\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballGridBeat</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallGridBeat.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/semiCircleSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">semiCircleSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>SemiCircleSpin.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/ballRotateChase\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">ballRotateChase</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>BallRotateChase.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/orbit\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">orbit</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Orbit.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/audioEqualizer\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">audioEqualizer</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>AudioEqualizer.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Element/circleStrokeSpin\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">circleStrokeSpin</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Stroke.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Enumerations  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Enumerations\" class=\"dashAnchor\"></a>\n\n    <a title=\"Enumerations  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Enumerations  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Enumerations</h1>\n            <p>The following enumerations are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Enum/NVActivityIndicatorType\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">NVActivityIndicatorType</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enum of animation types used for activity indicator view.</p>\n\n<ul>\n<li>Blank:                   Blank animation.</li>\n<li>BallPulse:               BallPulse animation.</li>\n<li>BallGridPulse:           BallGridPulse animation.</li>\n<li>BallClipRotate:          BallClipRotate animation.</li>\n<li>SquareSpin:              SquareSpin animation.</li>\n<li>BallClipRotatePulse:     BallClipRotatePulse animation.</li>\n<li>BallClipRotateMultiple:  BallClipRotateMultiple animation.</li>\n<li>BallPulseRise:           BallPulseRise animation.</li>\n<li>BallRotate:              BallRotate animation.</li>\n<li>CubeTransition:          CubeTransition animation.</li>\n<li>BallZigZag:              BallZigZag animation.</li>\n<li>BallZigZagDeflect:       BallZigZagDeflect animation.</li>\n<li>BallTrianglePath:        BallTrianglePath animation.</li>\n<li>BallScale:               BallScale animation.</li>\n<li>LineScale:               LineScale animation.</li>\n<li>LineScaleParty:          LineScaleParty animation.</li>\n<li>BallScaleMultiple:       BallScaleMultiple animation.</li>\n<li>BallPulseSync:           BallPulseSync animation.</li>\n<li>BallBeat:                BallBeat animation.</li>\n<li>BallDoubleBounce:        BallDoubleBounce animation.</li>\n<li>LineScalePulseOut:       LineScalePulseOut animation.</li>\n<li>LineScalePulseOutRapid:  LineScalePulseOutRapid animation.</li>\n<li>BallScaleRipple:         BallScaleRipple animation.</li>\n<li>BallScaleRippleMultiple: BallScaleRippleMultiple animation.</li>\n<li>BallSpinFadeLoader:      BallSpinFadeLoader animation.</li>\n<li>LineSpinFadeLoader:      LineSpinFadeLoader animation.</li>\n<li>TriangleSkewSpin:        TriangleSkewSpin animation.</li>\n<li>Pacman:                  Pacman animation.</li>\n<li>BallGridBeat:            BallGridBeat animation.</li>\n<li>SemiCircleSpin:          SemiCircleSpin animation.</li>\n<li>BallRotateChase:         BallRotateChase animation.</li>\n<li>Orbit:                   Orbit animation.</li>\n<li>AudioEqualizer:          AudioEqualizer animation.</li>\n<li>CircleStrokeSpin:        CircleStrokeSpin animation.</li>\n</ul>\n\n                        <a href=\"Enums/NVActivityIndicatorType.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Typealiases.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Type Aliases  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n    <a name=\"//apple_ref/swift/Section/Type Aliases\" class=\"dashAnchor\"></a>\n\n    <a title=\"Type Aliases  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n      <img class=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n      Type Aliases  Reference\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            <h1>Type Aliases</h1>\n            <p>The following type aliases are available globally.</p>\n\n          </div>\n        </section>\n\n        <section class=\"section\">\n          <div class=\"section-content\">\n            <div class=\"task-group\">\n              <ul class=\"item-container\">\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Alias/FadeInAnimation\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">FadeInAnimation</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Function that performs fade in/out animation.</p>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/\"></a>\n                    <a name=\"//apple_ref/swift/Alias/FadeOutAnimation\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/\">FadeOutAnimation</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Function that performs fade out animation.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Must call the second parameter on the animation completion.\n\n</div>\n\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </section>\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/highlight.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n/* Credit to https://gist.github.com/wataru420/2048287 */\n.highlight .c {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .err {\n  color: #a61717;\n  background-color: #e3d2d2; }\n\n.highlight .k {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .o {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .cm {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cp {\n  color: #999999;\n  font-weight: bold; }\n\n.highlight .c1 {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cs {\n  color: #999999;\n  font-weight: bold;\n  font-style: italic; }\n\n.highlight .gd {\n  color: #000000;\n  background-color: #ffdddd; }\n\n.highlight .gd .x {\n  color: #000000;\n  background-color: #ffaaaa; }\n\n.highlight .ge {\n  color: #000000;\n  font-style: italic; }\n\n.highlight .gr {\n  color: #aa0000; }\n\n.highlight .gh {\n  color: #999999; }\n\n.highlight .gi {\n  color: #000000;\n  background-color: #ddffdd; }\n\n.highlight .gi .x {\n  color: #000000;\n  background-color: #aaffaa; }\n\n.highlight .go {\n  color: #888888; }\n\n.highlight .gp {\n  color: #555555; }\n\n.highlight .gs {\n  font-weight: bold; }\n\n.highlight .gu {\n  color: #aaaaaa; }\n\n.highlight .gt {\n  color: #aa0000; }\n\n.highlight .kc {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kd {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kp {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kr {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kt {\n  color: #445588; }\n\n.highlight .m {\n  color: #009999; }\n\n.highlight .s {\n  color: #d14; }\n\n.highlight .na {\n  color: #008080; }\n\n.highlight .nb {\n  color: #0086B3; }\n\n.highlight .nc {\n  color: #445588;\n  font-weight: bold; }\n\n.highlight .no {\n  color: #008080; }\n\n.highlight .ni {\n  color: #800080; }\n\n.highlight .ne {\n  color: #990000;\n  font-weight: bold; }\n\n.highlight .nf {\n  color: #990000; }\n\n.highlight .nn {\n  color: #555555; }\n\n.highlight .nt {\n  color: #000080; }\n\n.highlight .nv {\n  color: #008080; }\n\n.highlight .ow {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .w {\n  color: #bbbbbb; }\n\n.highlight .mf {\n  color: #009999; }\n\n.highlight .mh {\n  color: #009999; }\n\n.highlight .mi {\n  color: #009999; }\n\n.highlight .mo {\n  color: #009999; }\n\n.highlight .sb {\n  color: #d14; }\n\n.highlight .sc {\n  color: #d14; }\n\n.highlight .sd {\n  color: #d14; }\n\n.highlight .s2 {\n  color: #d14; }\n\n.highlight .se {\n  color: #d14; }\n\n.highlight .sh {\n  color: #d14; }\n\n.highlight .si {\n  color: #d14; }\n\n.highlight .sx {\n  color: #d14; }\n\n.highlight .sr {\n  color: #009926; }\n\n.highlight .s1 {\n  color: #d14; }\n\n.highlight .ss {\n  color: #990073; }\n\n.highlight .bp {\n  color: #999999; }\n\n.highlight .vc {\n  color: #008080; }\n\n.highlight .vg {\n  color: #008080; }\n\n.highlight .vi {\n  color: #008080; }\n\n.highlight .il {\n  color: #009999; }\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/jazzy.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n*, *:before, *:after {\n  box-sizing: inherit; }\n\nbody {\n  margin: 0;\n  background: #fff;\n  color: #333;\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  letter-spacing: .2px;\n  -webkit-font-smoothing: antialiased;\n  box-sizing: border-box; }\n\nh1 {\n  font-size: 2rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.6em; }\n\nh2 {\n  font-size: 1.75rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.3em; }\n\nh3 {\n  font-size: 1.5rem;\n  font-weight: 700;\n  margin: 1em 0 0.3em; }\n\nh4 {\n  font-size: 1.25rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em; }\n\nh5 {\n  font-size: 1rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em; }\n\nh6 {\n  font-size: 1rem;\n  font-weight: 700;\n  margin: 1.275em 0 0.85em;\n  color: #777; }\n\np {\n  margin: 0 0 1em; }\n\nul, ol {\n  padding: 0 0 0 2em;\n  margin: 0 0 0.85em; }\n\nblockquote {\n  margin: 0 0 0.85em;\n  padding: 0 15px;\n  color: #858585;\n  border-left: 4px solid #e5e5e5; }\n\nimg {\n  max-width: 100%; }\n\na {\n  color: #4183c4;\n  text-decoration: none; }\n  a:hover, a:focus {\n    outline: 0;\n    text-decoration: underline; }\n  a.discouraged {\n    text-decoration: line-through; }\n    a.discouraged:hover, a.discouraged:focus {\n      text-decoration: underline line-through; }\n\ntable {\n  background: #fff;\n  width: 100%;\n  border-collapse: collapse;\n  border-spacing: 0;\n  overflow: auto;\n  margin: 0 0 0.85em; }\n\ntr:nth-child(2n) {\n  background-color: #fbfbfb; }\n\nth, td {\n  padding: 6px 13px;\n  border: 1px solid #ddd; }\n\nhr {\n  height: 1px;\n  border: none;\n  background-color: #ddd; }\n\npre {\n  margin: 0 0 1.275em;\n  padding: .85em 1em;\n  overflow: auto;\n  background: #f7f7f7;\n  font-size: .85em;\n  font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace; }\n\ncode {\n  font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace; }\n\n.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code {\n  background: #f7f7f7;\n  padding: .2em; }\n  .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after {\n    letter-spacing: -.2em;\n    content: \"\\00a0\"; }\n\npre code {\n  padding: 0;\n  white-space: pre; }\n\n.content-wrapper {\n  display: flex;\n  flex-direction: column; }\n  @media (min-width: 768px) {\n    .content-wrapper {\n      flex-direction: row; } }\n.header {\n  display: flex;\n  padding: 8px;\n  font-size: 0.875em;\n  background: #444;\n  color: #999; }\n\n.header-col {\n  margin: 0;\n  padding: 0 8px; }\n\n.header-col--primary {\n  flex: 1; }\n\n.header-link {\n  color: #fff; }\n\n.header-icon {\n  padding-right: 2px;\n  vertical-align: -3px;\n  height: 16px; }\n\n.breadcrumbs {\n  font-size: 0.875em;\n  padding: 8px 16px;\n  margin: 0;\n  background: #fbfbfb;\n  border-bottom: 1px solid #ddd; }\n\n.carat {\n  height: 10px;\n  margin: 0 5px; }\n\n.navigation {\n  order: 2; }\n  @media (min-width: 768px) {\n    .navigation {\n      order: 1;\n      width: 25%;\n      max-width: 300px;\n      padding-bottom: 64px;\n      overflow: hidden;\n      word-wrap: normal;\n      background: #fbfbfb;\n      border-right: 1px solid #ddd; } }\n.nav-groups {\n  list-style-type: none;\n  padding-left: 0; }\n\n.nav-group-name {\n  border-bottom: 1px solid #ddd;\n  padding: 8px 0 8px 16px; }\n\n.nav-group-name-link {\n  color: #333; }\n\n.nav-group-tasks {\n  margin: 8px 0;\n  padding: 0 0 0 8px; }\n\n.nav-group-task {\n  font-size: 1em;\n  list-style-type: none;\n  white-space: nowrap; }\n\n.nav-group-task-link {\n  color: #808080; }\n\n.main-content {\n  order: 1; }\n  @media (min-width: 768px) {\n    .main-content {\n      order: 2;\n      flex: 1;\n      padding-bottom: 60px; } }\n.section {\n  padding: 0 32px;\n  border-bottom: 1px solid #ddd; }\n\n.section-content {\n  max-width: 834px;\n  margin: 0 auto;\n  padding: 16px 0; }\n\n.section-name {\n  color: #666;\n  display: block; }\n  .section-name p {\n    margin-bottom: inherit; }\n\n.declaration .highlight {\n  overflow-x: initial;\n  padding: 8px 0;\n  margin: 0;\n  background-color: transparent;\n  border: none; }\n\n.task-group-section {\n  border-top: 1px solid #ddd; }\n\n.task-group {\n  padding-top: 0px; }\n\n.task-name-container a[name]:before {\n  content: \"\";\n  display: block; }\n\n.section-name-container {\n  position: relative; }\n  .section-name-container .section-name-link {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    right: 0;\n    margin-bottom: 0; }\n  .section-name-container .section-name {\n    position: relative;\n    pointer-events: none;\n    z-index: 1; }\n    .section-name-container .section-name a {\n      pointer-events: auto; }\n\n.item-container {\n  padding: 0; }\n\n.item {\n  padding-top: 8px;\n  width: 100%;\n  list-style-type: none; }\n  .item a[name]:before {\n    content: \"\";\n    display: block; }\n  .item .token, .item .direct-link {\n    display: inline-block;\n    text-indent: -20px;\n    padding-left: 3px;\n    margin-left: 20px;\n    font-size: 1rem; }\n\n.declaration-note {\n  font-size: .85em;\n  color: #808080;\n  font-style: italic; }\n\n.pointer-container {\n  border-bottom: 1px solid #ddd;\n  left: -23px;\n  padding-bottom: 13px;\n  position: relative;\n  width: 110%; }\n\n.pointer {\n  left: 21px;\n  top: 7px;\n  display: block;\n  position: absolute;\n  width: 12px;\n  height: 12px;\n  border-left: 1px solid #ddd;\n  border-top: 1px solid #ddd;\n  background: #fff;\n  transform: rotate(45deg); }\n\n.height-container {\n  display: none;\n  position: relative;\n  width: 100%;\n  overflow: hidden; }\n  .height-container .section {\n    background: #fff;\n    border: 1px solid #ddd;\n    border-top-width: 0;\n    padding-top: 10px;\n    padding-bottom: 5px;\n    padding: 8px 16px; }\n\n.aside, .language {\n  padding: 6px 12px;\n  margin: 12px 0;\n  border-left: 5px solid #dddddd;\n  overflow-y: hidden; }\n  .aside .aside-title, .language .aside-title {\n    font-size: 9px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    padding-bottom: 0;\n    margin: 0;\n    color: #aaa;\n    -webkit-user-select: none; }\n  .aside p:last-child, .language p:last-child {\n    margin-bottom: 0; }\n\n.language {\n  border-left: 5px solid #cde9f4; }\n  .language .aside-title {\n    color: #4183c4; }\n\n.aside-warning, .aside-deprecated, .aside-unavailable {\n  border-left: 5px solid #ff6666; }\n  .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title {\n    color: #ff0000; }\n\n.graybox {\n  border-collapse: collapse;\n  width: 100%; }\n  .graybox p {\n    margin: 0;\n    word-break: break-word;\n    min-width: 50px; }\n  .graybox td {\n    border: 1px solid #ddd;\n    padding: 5px 25px 5px 10px;\n    vertical-align: middle; }\n  .graybox tr td:first-of-type {\n    text-align: right;\n    padding: 7px;\n    vertical-align: top;\n    word-break: normal;\n    width: 40px; }\n\n.slightly-smaller {\n  font-size: 0.9em; }\n\n.footer {\n  padding: 8px 16px;\n  background: #444;\n  color: #ddd;\n  font-size: 0.8em; }\n  .footer p {\n    margin: 8px 0; }\n  .footer a {\n    color: #fff; }\n\nhtml.dash .header, html.dash .breadcrumbs, html.dash .navigation {\n  display: none; }\n\nhtml.dash .height-container {\n  display: block; }\n\nform[role=search] input {\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 24px;\n  padding: 0 10px;\n  margin: 0;\n  border: none;\n  border-radius: 1em; }\n  .loading form[role=search] input {\n    background: white url(../img/spinner.gif) center right 4px no-repeat; }\n\nform[role=search] .tt-menu {\n  margin: 0;\n  min-width: 300px;\n  background: #fbfbfb;\n  color: #333;\n  border: 1px solid #ddd; }\n\nform[role=search] .tt-highlight {\n  font-weight: bold; }\n\nform[role=search] .tt-suggestion {\n  font: 16px/1.7 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  padding: 0 8px; }\n  form[role=search] .tt-suggestion span {\n    display: table-cell;\n    white-space: nowrap; }\n  form[role=search] .tt-suggestion .doc-parent-name {\n    width: 100%;\n    text-align: right;\n    font-weight: normal;\n    font-size: 0.9em;\n    padding-left: 16px; }\n\nform[role=search] .tt-suggestion:hover,\nform[role=search] .tt-suggestion.tt-cursor {\n  cursor: pointer;\n  background-color: #4183c4;\n  color: #fff; }\n\nform[role=search] .tt-suggestion:hover .doc-parent-name,\nform[role=search] .tt-suggestion.tt-cursor .doc-parent-name {\n  color: #fff; }\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n\n    <a title=\"NVActivityIndicatorView  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            \n            <h1 id='nvactivityindicatorview' class='heading'>NVActivityIndicatorView</h1>\n\n<p><a href=\"https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml\"><img src=\"https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml/badge.svg?event=push\" alt=\"Build Status\"></a>\n<a href=\"https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg\"><img src=\"https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg\" alt=\"Cocoapods Compatible\"></a>\n<a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" alt=\"Carthage Compatible\"></a></p>\n\n<p>⚠️ Check out <a href=\"https://github.com/ninjaprox/LoaderUI\">LoaderUI</a> (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. 🎉</p>\n<h2 id='introduction' class='heading'>Introduction</h2>\n\n<p><code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code> is a collection of awesome loading animations.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif\" alt=\"Demo\"></p>\n<h2 id='animation-types' class='heading'>Animation types</h2>\n\n<table><thead>\n<tr>\n<th>Type</th>\n<th>Type</th>\n<th>Type</th>\n<th>Type</th>\n</tr>\n</thead><tbody>\n<tr>\n<td>1. ballPulse</td>\n<td>2. ballGridPulse</td>\n<td>3. ballClipRotate</td>\n<td>4. squareSpin</td>\n</tr>\n<tr>\n<td>5. ballClipRotatePulse</td>\n<td>6. ballClipRotateMultiple</td>\n<td>7. ballPulseRise</td>\n<td>8. ballRotate</td>\n</tr>\n<tr>\n<td>9. cubeTransition</td>\n<td>10. ballZigZag</td>\n<td>11. ballZigZagDeflect</td>\n<td>12. ballTrianglePath</td>\n</tr>\n<tr>\n<td>13. ballScale</td>\n<td>14. lineScale</td>\n<td>15. lineScaleParty</td>\n<td>16. ballScaleMultiple</td>\n</tr>\n<tr>\n<td>17. ballPulseSync</td>\n<td>18. ballBeat</td>\n<td>19. lineScalePulseOut</td>\n<td>20. lineScalePulseOutRapid</td>\n</tr>\n<tr>\n<td>21. ballScaleRipple</td>\n<td>22. ballScaleRippleMultiple</td>\n<td>23. ballSpinFadeLoader</td>\n<td>24. lineSpinFadeLoader</td>\n</tr>\n<tr>\n<td>25. triangleSkewSpin</td>\n<td>26. pacman</td>\n<td>27. ballGridBeat</td>\n<td>28. semiCircleSpin</td>\n</tr>\n<tr>\n<td>29. ballRotateChase</td>\n<td>30. orbit</td>\n<td>31. audioEqualizer</td>\n<td>32. circleStrokeSpin</td>\n</tr>\n</tbody></table>\n<h2 id='installation' class='heading'>Installation</h2>\n<h3 id='cocoapods' class='heading'>Cocoapods</h3>\n\n<p><a href=\"https://cocoapods.org/#install\">Cocoapods</a> is a dependency manager for Swift and Objective-C Cocoa projects. To use NVActivityIndicatorView with CocoaPods, add it in your <code>Podfile</code>.</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'NVActivityIndicatorView'</span>\n</code></pre>\n<h3 id='carthage' class='heading'>Carthage</h3>\n\n<p><a href=\"https://github.com/Carthage/Carthage#installing-carthage\">Carthage</a> is intended to be the simplest way to add frameworks to your Cocoa application. To use NVActivityIndicatorView with Carthage, add it in your <code>Cartfile</code>.</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">github</span> <span class=\"s2\">\"ninjaprox/NVActivityIndicatorView\"</span>\n</code></pre>\n<h3 id='swift-package-manager' class='heading'>Swift Package Manager</h3>\n\n<p>The <a href=\"https://swift.org/package-manager/\">Swift Package Manager</a> is a tool for managing the distribution of Swift code. To use NVActivityIndicatorView with Swift Package Manger, add it to <code>dependencies</code> in your <code>Package.swift</code></p>\n<pre class=\"highlight swift\"><code><span class=\"nv\">dependencies</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n    <span class=\"o\">.</span><span class=\"nf\">package</span><span class=\"p\">(</span><span class=\"nv\">url</span><span class=\"p\">:</span> <span class=\"s\">\"https://github.com/ninjaprox/NVActivityIndicatorView.git\"</span><span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre>\n<h2 id='migration' class='heading'>Migration</h2>\n\n<p>Version <a href=\"https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0\">5.0.0</a> comes with breaking changes. Please refer to the release note for details.</p>\n<h2 id='usage' class='heading'>Usage</h2>\n\n<p>Firstly, import <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">NVActivityIndicatorView</span>\n</code></pre>\n<h3 id='initialization' class='heading'>Initialization</h3>\n\n<p>Then, there are two ways you can create <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>:</p>\n\n<ul>\n<li>By storyboard, changing class of any <code>UIView</code> to <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</li>\n</ul>\n\n<p><em><strong>Note:</strong> Set <code>Module</code> to <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</em></p>\n\n<ul>\n<li>By code, using initializer. All parameters other than <code>frame</code> are optional and <a href=\"https://nvactivityindicatorview.vinhis.me/Classes/NVActivityIndicatorView.html\"><code>NVActivityIndicatorView.DEFAULT_*</code></a> are used as default values.</li>\n</ul>\n<pre class=\"highlight swift\"><code><span class=\"kt\">NVActivityIndicatorView</span><span class=\"p\">(</span><span class=\"nv\">frame</span><span class=\"p\">:</span> <span class=\"n\">frame</span><span class=\"p\">,</span> <span class=\"nv\">type</span><span class=\"p\">:</span> <span class=\"n\">type</span><span class=\"p\">,</span> <span class=\"nv\">color</span><span class=\"p\">:</span> <span class=\"n\">color</span><span class=\"p\">,</span> <span class=\"nv\">padding</span><span class=\"p\">:</span> <span class=\"n\">padding</span><span class=\"p\">)</span>\n</code></pre>\n<h3 id='control' class='heading'>Control</h3>\n\n<p>Start animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"nf\">startAnimating</span><span class=\"p\">()</span>\n</code></pre>\n\n<p>Stop animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"nf\">stopAnimating</span><span class=\"p\">()</span>\n</code></pre>\n\n<p>Determine if it is animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">animating</span> <span class=\"o\">=</span> <span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"n\">isAnimating</span>\n</code></pre>\n<h3 id='change-properties' class='heading'>Change properties</h3>\n\n<p>In storyboard, you can change all properties in Attributes inspector tab of Utilities panel.</p>\n\n<p><em><strong>Note:</strong> Use one of values (case-insensitive) in <a href=\"#animation-types\">Animation types</a> for <code>Type Name</code>.</em></p>\n\n<p>All properties are public so you can change them after initializing.</p>\n\n<p><em><strong>Note:</strong> All changes must be made before calling <code>startAnimating()</code>.</em></p>\n<h2 id='documentation' class='heading'>Documentation</h2>\n\n<p><a href=\"https://nvactivityindicatorview.vinhis.me/\">https://nvactivityindicatorview.vinhis.me/</a></p>\n<h2 id='acknowledgment' class='heading'>Acknowledgment</h2>\n\n<p>Thanks <a href=\"https://github.com/ConnorAtherton\">Connor Atherton</a> for inspired <a href=\"https://github.com/ConnorAtherton/loaders.css\">Loaders.css</a> and <a href=\"https://github.com/gontovnik\">Danil Gontovnik</a> for <a href=\"https://github.com/gontovnik/DGActivityIndicatorView\">DGActivityIndicatorView</a>.</p>\n<h2 id='license' class='heading'>License</h2>\n\n<p>The MIT License (MIT)</p>\n\n<p>Copyright &copy; 2016 Vinh Nguyen <a href=\"http://twitter.com/ninjaprox\">@ninjaprox</a></p>\n\n          </div>\n        </section>\n\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docset': false}\nif (typeof window.dash != 'undefined') {\n  document.documentElement.className += ' dash'\n  window.jazzy.docset = true\n}\nif (navigator.userAgent.match(/xcode/i)) {\n  document.documentElement.className += ' xcode'\n  window.jazzy.docset = true\n}\n\nfunction toggleItem($link, $content) {\n  var animationDuration = 300;\n  $link.toggleClass('token-open');\n  $content.slideToggle(animationDuration);\n}\n\nfunction itemLinkToContent($link) {\n  return $link.parent().parent().next();\n}\n\n// On doc load + hash-change, open any targeted item\nfunction openCurrentItemIfClosed() {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(`a[name=\"${location.hash.substring(1)}\"]`).nextAll('.token');\n  $content = itemLinkToContent($link);\n  if ($content.is(':hidden')) {\n    toggleItem($link, $content);\n  }\n}\n\n$(openCurrentItemIfClosed);\n$(window).on('hashchange', openCurrentItemIfClosed);\n\n// On item link ('token') click, toggle its discussion\n$('.token').on('click', function(event) {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(this);\n  toggleItem($link, itemLinkToContent($link));\n\n  // Keeps the document from jumping to the hash.\n  var href = $link.attr('href');\n  if (history.pushState) {\n    history.pushState({}, '', href);\n  } else {\n    location.hash = href;\n  }\n  event.preventDefault();\n});\n\n// Clicks on links to the current, closed, item need to open the item\n$(\"a:not('.token')\").on('click', function() {\n  if (location == this.href) {\n    openCurrentItemIfClosed();\n  }\n});\n\n// KaTeX rendering\nif (\"katex\" in window) {\n  $($('.math').each( (_, element) => {\n    katex.render(element.textContent, element, {\n      displayMode: $(element).hasClass('m-block'),\n      throwOnError: false,\n      trust: true\n    });\n  }))\n}\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.search.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n  var $typeahead = $('[data-typeahead]');\n  var $form = $typeahead.parents('form');\n  var searchURL = $form.attr('action');\n\n  function displayTemplate(result) {\n    return result.name;\n  }\n\n  function suggestionTemplate(result) {\n    var t = '<div class=\"list-group-item clearfix\">';\n    t += '<span class=\"doc-name\">' + result.name + '</span>';\n    if (result.parent_name) {\n     t += '<span class=\"doc-parent-name label\">' + result.parent_name + '</span>';\n    }\n    t += '</div>';\n    return t;\n  }\n\n  $typeahead.one('focus', function() {\n    $form.addClass('loading');\n\n    $.getJSON(searchURL).then(function(searchData) {\n      const searchIndex = lunr(function() {\n        this.ref('url');\n        this.field('name');\n        this.field('abstract');\n        for (const [url, doc] of Object.entries(searchData)) {\n          this.add({url: url, name: doc.name, abstract: doc.abstract});\n        }\n      });\n\n      $typeahead.typeahead(\n        {\n          highlight: true,\n          minLength: 3,\n          autoselect: true\n        },\n        {\n          limit: 10,\n          display: displayTemplate,\n          templates: { suggestion: suggestionTemplate },\n          source: function(query, sync) {\n            const lcSearch = query.toLowerCase();\n            const results = searchIndex.query(function(q) {\n                q.term(lcSearch, { boost: 100 });\n                q.term(lcSearch, {\n                  boost: 10,\n                  wildcard: lunr.Query.wildcard.TRAILING\n                });\n            }).map(function(result) {\n              var doc = searchData[result.ref];\n              doc.url = result.ref;\n              return doc;\n            });\n            sync(results);\n          }\n        }\n      );\n      $form.removeClass('loading');\n      $typeahead.trigger('focus');\n    });\n  });\n\n  var baseURL = searchURL.slice(0, -\"search.json\".length);\n\n  $typeahead.on('typeahead:select', function(e, result) {\n    window.location = baseURL + result.url;\n  });\n});\n"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/typeahead.jquery.js",
    "content": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and other contributors; Licensed MIT\n */\n\n\n(function(root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define([ \"jquery\" ], function(a0) {\n            return factory(a0);\n        });\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory(require(\"jquery\"));\n    } else {\n        factory(root[\"jQuery\"]);\n    }\n})(this, function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            isElement: function(obj) {\n                return !!(obj && obj.nodeType === 1);\n            },\n            isJQuery: function(obj) {\n                return obj instanceof $;\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            identity: function(x) {\n                return x;\n            },\n            clone: function(obj) {\n                return $.extend(true, {}, obj);\n            },\n            getIdGenerator: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            },\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            stringify: function(val) {\n                return _.isString(val) ? val : JSON.stringify(val);\n            },\n            guid: function() {\n                function _p8(s) {\n                    var p = (Math.random().toString(16) + \"000000000\").substr(2, 8);\n                    return s ? \"-\" + p.substr(0, 4) + \"-\" + p.substr(4, 4) : p;\n                }\n                return \"tt-\" + _p8() + _p8(true) + _p8(true) + _p8();\n            },\n            noop: function() {}\n        };\n    }();\n    var WWW = function() {\n        \"use strict\";\n        var defaultClassNames = {\n            wrapper: \"twitter-typeahead\",\n            input: \"tt-input\",\n            hint: \"tt-hint\",\n            menu: \"tt-menu\",\n            dataset: \"tt-dataset\",\n            suggestion: \"tt-suggestion\",\n            selectable: \"tt-selectable\",\n            empty: \"tt-empty\",\n            open: \"tt-open\",\n            cursor: \"tt-cursor\",\n            highlight: \"tt-highlight\"\n        };\n        return build;\n        function build(o) {\n            var www, classes;\n            classes = _.mixin({}, defaultClassNames, o);\n            www = {\n                css: buildCss(),\n                classes: classes,\n                html: buildHtml(classes),\n                selectors: buildSelectors(classes)\n            };\n            return {\n                css: www.css,\n                html: www.html,\n                classes: www.classes,\n                selectors: www.selectors,\n                mixin: function(o) {\n                    _.mixin(o, www);\n                }\n            };\n        }\n        function buildHtml(c) {\n            return {\n                wrapper: '<span class=\"' + c.wrapper + '\"></span>',\n                menu: '<div role=\"listbox\" class=\"' + c.menu + '\"></div>'\n            };\n        }\n        function buildSelectors(classes) {\n            var selectors = {};\n            _.each(classes, function(v, k) {\n                selectors[k] = \".\" + v;\n            });\n            return selectors;\n        }\n        function buildCss() {\n            var css = {\n                wrapper: {\n                    position: \"relative\",\n                    display: \"inline-block\"\n                },\n                hint: {\n                    position: \"absolute\",\n                    top: \"0\",\n                    left: \"0\",\n                    borderColor: \"transparent\",\n                    boxShadow: \"none\",\n                    opacity: \"1\"\n                },\n                input: {\n                    position: \"relative\",\n                    verticalAlign: \"top\",\n                    backgroundColor: \"transparent\"\n                },\n                inputWithNoHint: {\n                    position: \"relative\",\n                    verticalAlign: \"top\"\n                },\n                menu: {\n                    position: \"absolute\",\n                    top: \"100%\",\n                    left: \"0\",\n                    zIndex: \"100\",\n                    display: \"none\"\n                },\n                ltr: {\n                    left: \"0\",\n                    right: \"auto\"\n                },\n                rtl: {\n                    left: \"auto\",\n                    right: \" 0\"\n                }\n            };\n            if (_.isMsie()) {\n                _.mixin(css.input, {\n                    backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n                });\n            }\n            return css;\n        }\n    }();\n    var EventBus = function() {\n        \"use strict\";\n        var namespace, deprecationMap;\n        namespace = \"typeahead:\";\n        deprecationMap = {\n            render: \"rendered\",\n            cursorchange: \"cursorchanged\",\n            select: \"selected\",\n            autocomplete: \"autocompleted\"\n        };\n        function EventBus(o) {\n            if (!o || !o.el) {\n                $.error(\"EventBus initialized without el\");\n            }\n            this.$el = $(o.el);\n        }\n        _.mixin(EventBus.prototype, {\n            _trigger: function(type, args) {\n                var $e = $.Event(namespace + type);\n                this.$el.trigger.call(this.$el, $e, args || []);\n                return $e;\n            },\n            before: function(type) {\n                var args, $e;\n                args = [].slice.call(arguments, 1);\n                $e = this._trigger(\"before\" + type, args);\n                return $e.isDefaultPrevented();\n            },\n            trigger: function(type) {\n                var deprecatedType;\n                this._trigger(type, [].slice.call(arguments, 1));\n                if (deprecatedType = deprecationMap[type]) {\n                    this._trigger(deprecatedType, [].slice.call(arguments, 1));\n                }\n            }\n        });\n        return EventBus;\n    }();\n    var EventEmitter = function() {\n        \"use strict\";\n        var splitter = /\\s+/, nextTick = getNextTick();\n        return {\n            onSync: onSync,\n            onAsync: onAsync,\n            off: off,\n            trigger: trigger\n        };\n        function on(method, types, cb, context) {\n            var type;\n            if (!cb) {\n                return this;\n            }\n            types = types.split(splitter);\n            cb = context ? bindContext(cb, context) : cb;\n            this._callbacks = this._callbacks || {};\n            while (type = types.shift()) {\n                this._callbacks[type] = this._callbacks[type] || {\n                    sync: [],\n                    async: []\n                };\n                this._callbacks[type][method].push(cb);\n            }\n            return this;\n        }\n        function onAsync(types, cb, context) {\n            return on.call(this, \"async\", types, cb, context);\n        }\n        function onSync(types, cb, context) {\n            return on.call(this, \"sync\", types, cb, context);\n        }\n        function off(types) {\n            var type;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            while (type = types.shift()) {\n                delete this._callbacks[type];\n            }\n            return this;\n        }\n        function trigger(types) {\n            var type, callbacks, args, syncFlush, asyncFlush;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            args = [].slice.call(arguments, 1);\n            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n                syncFlush() && nextTick(asyncFlush);\n            }\n            return this;\n        }\n        function getFlush(callbacks, context, args) {\n            return flush;\n            function flush() {\n                var cancelled;\n                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n                    cancelled = callbacks[i].apply(context, args) === false;\n                }\n                return !cancelled;\n            }\n        }\n        function getNextTick() {\n            var nextTickFn;\n            if (window.setImmediate) {\n                nextTickFn = function nextTickSetImmediate(fn) {\n                    setImmediate(function() {\n                        fn();\n                    });\n                };\n            } else {\n                nextTickFn = function nextTickSetTimeout(fn) {\n                    setTimeout(function() {\n                        fn();\n                    }, 0);\n                };\n            }\n            return nextTickFn;\n        }\n        function bindContext(fn, context) {\n            return fn.bind ? fn.bind(context) : function() {\n                fn.apply(context, [].slice.call(arguments, 0));\n            };\n        }\n    }();\n    var highlight = function(doc) {\n        \"use strict\";\n        var defaults = {\n            node: null,\n            pattern: null,\n            tagName: \"strong\",\n            className: null,\n            wordsOnly: false,\n            caseSensitive: false,\n            diacriticInsensitive: false\n        };\n        var accented = {\n            A: \"[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Ａａ]\",\n            B: \"[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Ｂｂ]\",\n            C: \"[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Ｃｃ]\",\n            D: \"[DdĎďǄ-ǆǱ-ǳᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Ｄｄ]\",\n            E: \"[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ｅｅ]\",\n            F: \"[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ﬀ-ﬄＦｆ]\",\n            G: \"[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Ｇｇ]\",\n            H: \"[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Ｈｈ]\",\n            I: \"[IiÌ-Ïì-ïĨ-İĲĳǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕ﬁﬃＩｉ]\",\n            J: \"[JjĲ-ĵǇ-ǌǰʲᴶⅉ⒥ⒿⓙⱼＪｊ]\",\n            K: \"[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Ｋｋ]\",\n            L: \"[LlĹ-ŀǇ-ǉˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿ﬂﬄＬｌ]\",\n            M: \"[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Ｍｍ]\",\n            N: \"[NnÑñŃ-ŉǊ-ǌǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Ｎｎ]\",\n            O: \"[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Ｏｏ]\",\n            P: \"[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Ｐｐ]\",\n            Q: \"[Qqℚ⒬Ⓠⓠ㏃Ｑｑ]\",\n            R: \"[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Ｒｒ]\",\n            S: \"[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜ﬆＳｓ]\",\n            T: \"[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ﬅﬆＴｔ]\",\n            U: \"[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Ｕｕ]\",\n            V: \"[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Ｖｖ]\",\n            W: \"[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ｗｗ]\",\n            X: \"[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Ｘｘ]\",\n            Y: \"[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Ｙｙ]\",\n            Z: \"[ZzŹ-žǱ-ǳᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Ｚｚ]\"\n        };\n        return function hightlight(o) {\n            var regex;\n            o = _.mixin({}, defaults, o);\n            if (!o.node || !o.pattern) {\n                return;\n            }\n            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);\n            traverse(o.node, hightlightTextNode);\n            function hightlightTextNode(textNode) {\n                var match, patternNode, wrapperNode;\n                if (match = regex.exec(textNode.data)) {\n                    wrapperNode = doc.createElement(o.tagName);\n                    o.className && (wrapperNode.className = o.className);\n                    patternNode = textNode.splitText(match.index);\n                    patternNode.splitText(match[0].length);\n                    wrapperNode.appendChild(patternNode.cloneNode(true));\n                    textNode.parentNode.replaceChild(wrapperNode, patternNode);\n                }\n                return !!match;\n            }\n            function traverse(el, hightlightTextNode) {\n                var childNode, TEXT_NODE_TYPE = 3;\n                for (var i = 0; i < el.childNodes.length; i++) {\n                    childNode = el.childNodes[i];\n                    if (childNode.nodeType === TEXT_NODE_TYPE) {\n                        i += hightlightTextNode(childNode) ? 1 : 0;\n                    } else {\n                        traverse(childNode, hightlightTextNode);\n                    }\n                }\n            }\n        };\n        function accent_replacer(chr) {\n            return accented[chr.toUpperCase()] || chr;\n        }\n        function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {\n            var escapedPatterns = [], regexStr;\n            for (var i = 0, len = patterns.length; i < len; i++) {\n                var escapedWord = _.escapeRegExChars(patterns[i]);\n                if (diacriticInsensitive) {\n                    escapedWord = escapedWord.replace(/\\S/g, accent_replacer);\n                }\n                escapedPatterns.push(escapedWord);\n            }\n            regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n        }\n    }(window.document);\n    var Input = function() {\n        \"use strict\";\n        var specialKeyCodeMap;\n        specialKeyCodeMap = {\n            9: \"tab\",\n            27: \"esc\",\n            37: \"left\",\n            39: \"right\",\n            13: \"enter\",\n            38: \"up\",\n            40: \"down\"\n        };\n        function Input(o, www) {\n            var id;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"input is missing\");\n            }\n            www.mixin(this);\n            this.$hint = $(o.hint);\n            this.$input = $(o.input);\n            this.$menu = $(o.menu);\n            id = this.$input.attr(\"id\") || _.guid();\n            this.$menu.attr(\"id\", id + \"_listbox\");\n            this.$hint.attr({\n                \"aria-hidden\": true\n            });\n            this.$input.attr({\n                \"aria-owns\": id + \"_listbox\",\n                \"aria-controls\": id + \"_listbox\",\n                role: \"combobox\",\n                \"aria-autocomplete\": \"list\",\n                \"aria-expanded\": false\n            });\n            this.query = this.$input.val();\n            this.queryWhenFocused = this.hasFocus() ? this.query : null;\n            this.$overflowHelper = buildOverflowHelper(this.$input);\n            this._checkLanguageDirection();\n            if (this.$hint.length === 0) {\n                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n            }\n            this.onSync(\"cursorchange\", this._updateDescendent);\n        }\n        Input.normalizeQuery = function(str) {\n            return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n        };\n        _.mixin(Input.prototype, EventEmitter, {\n            _onBlur: function onBlur() {\n                this.resetInputValue();\n                this.trigger(\"blurred\");\n            },\n            _onFocus: function onFocus() {\n                this.queryWhenFocused = this.query;\n                this.trigger(\"focused\");\n            },\n            _onKeydown: function onKeydown($e) {\n                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n                this._managePreventDefault(keyName, $e);\n                if (keyName && this._shouldTrigger(keyName, $e)) {\n                    this.trigger(keyName + \"Keyed\", $e);\n                }\n            },\n            _onInput: function onInput() {\n                this._setQuery(this.getInputValue());\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            _managePreventDefault: function managePreventDefault(keyName, $e) {\n                var preventDefault;\n                switch (keyName) {\n                  case \"up\":\n                  case \"down\":\n                    preventDefault = !withModifier($e);\n                    break;\n\n                  default:\n                    preventDefault = false;\n                }\n                preventDefault && $e.preventDefault();\n            },\n            _shouldTrigger: function shouldTrigger(keyName, $e) {\n                var trigger;\n                switch (keyName) {\n                  case \"tab\":\n                    trigger = !withModifier($e);\n                    break;\n\n                  default:\n                    trigger = true;\n                }\n                return trigger;\n            },\n            _checkLanguageDirection: function checkLanguageDirection() {\n                var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.$hint.attr(\"dir\", dir);\n                    this.trigger(\"langDirChanged\", dir);\n                }\n            },\n            _setQuery: function setQuery(val, silent) {\n                var areEquivalent, hasDifferentWhitespace;\n                areEquivalent = areQueriesEquivalent(val, this.query);\n                hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n                this.query = val;\n                if (!silent && !areEquivalent) {\n                    this.trigger(\"queryChanged\", this.query);\n                } else if (!silent && hasDifferentWhitespace) {\n                    this.trigger(\"whitespaceChanged\", this.query);\n                }\n            },\n            _updateDescendent: function updateDescendent(event, id) {\n                this.$input.attr(\"aria-activedescendant\", id);\n            },\n            bind: function() {\n                var that = this, onBlur, onFocus, onKeydown, onInput;\n                onBlur = _.bind(this._onBlur, this);\n                onFocus = _.bind(this._onFocus, this);\n                onKeydown = _.bind(this._onKeydown, this);\n                onInput = _.bind(this._onInput, this);\n                this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n                if (!_.isMsie() || _.isMsie() > 9) {\n                    this.$input.on(\"input.tt\", onInput);\n                } else {\n                    this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n                        if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n                            return;\n                        }\n                        _.defer(_.bind(that._onInput, that, $e));\n                    });\n                }\n                return this;\n            },\n            focus: function focus() {\n                this.$input.focus();\n            },\n            blur: function blur() {\n                this.$input.blur();\n            },\n            getLangDir: function getLangDir() {\n                return this.dir;\n            },\n            getQuery: function getQuery() {\n                return this.query || \"\";\n            },\n            setQuery: function setQuery(val, silent) {\n                this.setInputValue(val);\n                this._setQuery(val, silent);\n            },\n            hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n                return this.query !== this.queryWhenFocused;\n            },\n            getInputValue: function getInputValue() {\n                return this.$input.val();\n            },\n            setInputValue: function setInputValue(value) {\n                this.$input.val(value);\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            resetInputValue: function resetInputValue() {\n                this.setInputValue(this.query);\n            },\n            getHint: function getHint() {\n                return this.$hint.val();\n            },\n            setHint: function setHint(value) {\n                this.$hint.val(value);\n            },\n            clearHint: function clearHint() {\n                this.setHint(\"\");\n            },\n            clearHintIfInvalid: function clearHintIfInvalid() {\n                var val, hint, valIsPrefixOfHint, isValid;\n                val = this.getInputValue();\n                hint = this.getHint();\n                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n                isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n                !isValid && this.clearHint();\n            },\n            hasFocus: function hasFocus() {\n                return this.$input.is(\":focus\");\n            },\n            hasOverflow: function hasOverflow() {\n                var constraint = this.$input.width() - 2;\n                this.$overflowHelper.text(this.getInputValue());\n                return this.$overflowHelper.width() >= constraint;\n            },\n            isCursorAtEnd: function() {\n                var valueLength, selectionStart, range;\n                valueLength = this.$input.val().length;\n                selectionStart = this.$input[0].selectionStart;\n                if (_.isNumber(selectionStart)) {\n                    return selectionStart === valueLength;\n                } else if (document.selection) {\n                    range = document.selection.createRange();\n                    range.moveStart(\"character\", -valueLength);\n                    return valueLength === range.text.length;\n                }\n                return true;\n            },\n            destroy: function destroy() {\n                this.$hint.off(\".tt\");\n                this.$input.off(\".tt\");\n                this.$overflowHelper.remove();\n                this.$hint = this.$input = this.$overflowHelper = $(\"<div>\");\n            },\n            setAriaExpanded: function setAriaExpanded(value) {\n                this.$input.attr(\"aria-expanded\", value);\n            }\n        });\n        return Input;\n        function buildOverflowHelper($input) {\n            return $('<pre aria-hidden=\"true\"></pre>').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var keys, nameGenerator;\n        keys = {\n            dataset: \"tt-selectable-dataset\",\n            val: \"tt-selectable-display\",\n            obj: \"tt-selectable-object\"\n        };\n        nameGenerator = _.getIdGenerator();\n        function Dataset(o, www) {\n            o = o || {};\n            o.templates = o.templates || {};\n            o.templates.notFound = o.templates.notFound || o.templates.empty;\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (!o.node) {\n                $.error(\"missing node\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            www.mixin(this);\n            this.highlight = !!o.highlight;\n            this.name = _.toStr(o.name || nameGenerator());\n            this.limit = o.limit || 5;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n            this._resetLastSuggestion();\n            this.$el = $(o.node).attr(\"role\", \"presentation\").addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n        }\n        Dataset.extractData = function extractData(el) {\n            var $el = $(el);\n            if ($el.data(keys.obj)) {\n                return {\n                    dataset: $el.data(keys.dataset) || \"\",\n                    val: $el.data(keys.val) || \"\",\n                    obj: $el.data(keys.obj) || null\n                };\n            }\n            return null;\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _overwrite: function overwrite(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (this.async && this.templates.pending) {\n                    this._renderPending(query);\n                } else if (!this.async && this.templates.notFound) {\n                    this._renderNotFound(query);\n                } else {\n                    this._empty();\n                }\n                this.trigger(\"rendered\", suggestions, false, this.name);\n            },\n            _append: function append(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length && this.$lastSuggestion.length) {\n                    this._appendSuggestions(query, suggestions);\n                } else if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n                    this._renderNotFound(query);\n                }\n                this.trigger(\"rendered\", suggestions, true, this.name);\n            },\n            _renderSuggestions: function renderSuggestions(query, suggestions) {\n                var $fragment;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                this.$lastSuggestion = $fragment.children().last();\n                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n            },\n            _appendSuggestions: function appendSuggestions(query, suggestions) {\n                var $fragment, $lastSuggestion;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                $lastSuggestion = $fragment.children().last();\n                this.$lastSuggestion.after($fragment);\n                this.$lastSuggestion = $lastSuggestion;\n            },\n            _renderPending: function renderPending(query) {\n                var template = this.templates.pending;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _renderNotFound: function renderNotFound(query) {\n                var template = this.templates.notFound;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _empty: function empty() {\n                this.$el.empty();\n                this._resetLastSuggestion();\n            },\n            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n                var that = this, fragment;\n                fragment = document.createDocumentFragment();\n                _.each(suggestions, function getSuggestionNode(suggestion) {\n                    var $el, context;\n                    context = that._injectQuery(query, suggestion);\n                    $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n                    fragment.appendChild($el[0]);\n                });\n                this.highlight && highlight({\n                    className: this.classes.highlight,\n                    node: fragment,\n                    pattern: query\n                });\n                return $(fragment);\n            },\n            _getFooter: function getFooter(query, suggestions) {\n                return this.templates.footer ? this.templates.footer({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _getHeader: function getHeader(query, suggestions) {\n                return this.templates.header ? this.templates.header({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _resetLastSuggestion: function resetLastSuggestion() {\n                this.$lastSuggestion = $();\n            },\n            _injectQuery: function injectQuery(query, obj) {\n                return _.isObject(obj) ? _.mixin({\n                    _query: query\n                }, obj) : obj;\n            },\n            update: function update(query) {\n                var that = this, canceled = false, syncCalled = false, rendered = 0;\n                this.cancel();\n                this.cancel = function cancel() {\n                    canceled = true;\n                    that.cancel = $.noop;\n                    that.async && that.trigger(\"asyncCanceled\", query, that.name);\n                };\n                this.source(query, sync, async);\n                !syncCalled && sync([]);\n                function sync(suggestions) {\n                    if (syncCalled) {\n                        return;\n                    }\n                    syncCalled = true;\n                    suggestions = (suggestions || []).slice(0, that.limit);\n                    rendered = suggestions.length;\n                    that._overwrite(query, suggestions);\n                    if (rendered < that.limit && that.async) {\n                        that.trigger(\"asyncRequested\", query, that.name);\n                    }\n                }\n                function async(suggestions) {\n                    suggestions = suggestions || [];\n                    if (!canceled && rendered < that.limit) {\n                        that.cancel = $.noop;\n                        var idx = Math.abs(rendered - that.limit);\n                        rendered += idx;\n                        that._append(query, suggestions.slice(0, idx));\n                        that.async && that.trigger(\"asyncReceived\", query, that.name);\n                    }\n                }\n            },\n            cancel: $.noop,\n            clear: function clear() {\n                this._empty();\n                this.cancel();\n                this.trigger(\"cleared\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = $(\"<div>\");\n            }\n        });\n        return Dataset;\n        function getDisplayFn(display) {\n            display = display || _.stringify;\n            return _.isFunction(display) ? display : displayFn;\n            function displayFn(obj) {\n                return obj[display];\n            }\n        }\n        function getTemplates(templates, displayFn) {\n            return {\n                notFound: templates.notFound && _.templatify(templates.notFound),\n                pending: templates.pending && _.templatify(templates.pending),\n                header: templates.header && _.templatify(templates.header),\n                footer: templates.footer && _.templatify(templates.footer),\n                suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate\n            };\n            function userSuggestionTemplate(context) {\n                var template = templates.suggestion;\n                return $(template(context)).attr(\"id\", _.guid());\n            }\n            function suggestionTemplate(context) {\n                return $('<div role=\"option\">').attr(\"id\", _.guid()).text(displayFn(context));\n            }\n        }\n        function isValidName(str) {\n            return /^[_a-zA-Z0-9-]+$/.test(str);\n        }\n    }();\n    var Menu = function() {\n        \"use strict\";\n        function Menu(o, www) {\n            var that = this;\n            o = o || {};\n            if (!o.node) {\n                $.error(\"node is required\");\n            }\n            www.mixin(this);\n            this.$node = $(o.node);\n            this.query = null;\n            this.datasets = _.map(o.datasets, initializeDataset);\n            function initializeDataset(oDataset) {\n                var node = that.$node.find(oDataset.node).first();\n                oDataset.node = node.length ? node : $(\"<div>\").appendTo(that.$node);\n                return new Dataset(oDataset, www);\n            }\n        }\n        _.mixin(Menu.prototype, EventEmitter, {\n            _onSelectableClick: function onSelectableClick($e) {\n                this.trigger(\"selectableClicked\", $($e.currentTarget));\n            },\n            _onRendered: function onRendered(type, dataset, suggestions, async) {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetRendered\", dataset, suggestions, async);\n            },\n            _onCleared: function onCleared() {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetCleared\");\n            },\n            _propagate: function propagate() {\n                this.trigger.apply(this, arguments);\n            },\n            _allDatasetsEmpty: function allDatasetsEmpty() {\n                return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {\n                    var isEmpty = dataset.isEmpty();\n                    this.$node.attr(\"aria-expanded\", !isEmpty);\n                    return isEmpty;\n                }, this));\n            },\n            _getSelectables: function getSelectables() {\n                return this.$node.find(this.selectors.selectable);\n            },\n            _removeCursor: function _removeCursor() {\n                var $selectable = this.getActiveSelectable();\n                $selectable && $selectable.removeClass(this.classes.cursor);\n            },\n            _ensureVisible: function ensureVisible($el) {\n                var elTop, elBottom, nodeScrollTop, nodeHeight;\n                elTop = $el.position().top;\n                elBottom = elTop + $el.outerHeight(true);\n                nodeScrollTop = this.$node.scrollTop();\n                nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n                if (elTop < 0) {\n                    this.$node.scrollTop(nodeScrollTop + elTop);\n                } else if (nodeHeight < elBottom) {\n                    this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n                }\n            },\n            bind: function() {\n                var that = this, onSelectableClick;\n                onSelectableClick = _.bind(this._onSelectableClick, this);\n                this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n                this.$node.on(\"mouseover\", this.selectors.selectable, function() {\n                    that.setCursor($(this));\n                });\n                this.$node.on(\"mouseleave\", function() {\n                    that._removeCursor();\n                });\n                _.each(this.datasets, function(dataset) {\n                    dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                return this.$node.hasClass(this.classes.open);\n            },\n            open: function open() {\n                this.$node.scrollTop(0);\n                this.$node.addClass(this.classes.open);\n            },\n            close: function close() {\n                this.$node.attr(\"aria-expanded\", false);\n                this.$node.removeClass(this.classes.open);\n                this._removeCursor();\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.attr(\"dir\", dir);\n            },\n            selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n                var $selectables, $oldCursor, oldIndex, newIndex;\n                $oldCursor = this.getActiveSelectable();\n                $selectables = this._getSelectables();\n                oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n                newIndex = oldIndex + delta;\n                newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n                newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n                return newIndex === -1 ? null : $selectables.eq(newIndex);\n            },\n            setCursor: function setCursor($selectable) {\n                this._removeCursor();\n                if ($selectable = $selectable && $selectable.first()) {\n                    $selectable.addClass(this.classes.cursor);\n                    this._ensureVisible($selectable);\n                }\n            },\n            getSelectableData: function getSelectableData($el) {\n                return $el && $el.length ? Dataset.extractData($el) : null;\n            },\n            getActiveSelectable: function getActiveSelectable() {\n                var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n                return $selectable.length ? $selectable : null;\n            },\n            getTopSelectable: function getTopSelectable() {\n                var $selectable = this._getSelectables().first();\n                return $selectable.length ? $selectable : null;\n            },\n            update: function update(query) {\n                var isValidUpdate = query !== this.query;\n                if (isValidUpdate) {\n                    this.query = query;\n                    _.each(this.datasets, updateDataset);\n                }\n                return isValidUpdate;\n                function updateDataset(dataset) {\n                    dataset.update(query);\n                }\n            },\n            empty: function empty() {\n                _.each(this.datasets, clearDataset);\n                this.query = null;\n                this.$node.addClass(this.classes.empty);\n                function clearDataset(dataset) {\n                    dataset.clear();\n                }\n            },\n            destroy: function destroy() {\n                this.$node.off(\".tt\");\n                this.$node = $(\"<div>\");\n                _.each(this.datasets, destroyDataset);\n                function destroyDataset(dataset) {\n                    dataset.destroy();\n                }\n            }\n        });\n        return Menu;\n    }();\n    var Status = function() {\n        \"use strict\";\n        function Status(options) {\n            this.$el = $(\"<span></span>\", {\n                role: \"status\",\n                \"aria-live\": \"polite\"\n            }).css({\n                position: \"absolute\",\n                padding: \"0\",\n                border: \"0\",\n                height: \"1px\",\n                width: \"1px\",\n                \"margin-bottom\": \"-1px\",\n                \"margin-right\": \"-1px\",\n                overflow: \"hidden\",\n                clip: \"rect(0 0 0 0)\",\n                \"white-space\": \"nowrap\"\n            });\n            options.$input.after(this.$el);\n            _.each(options.menu.datasets, _.bind(function(dataset) {\n                if (dataset.onSync) {\n                    dataset.onSync(\"rendered\", _.bind(this.update, this));\n                    dataset.onSync(\"cleared\", _.bind(this.cleared, this));\n                }\n            }, this));\n        }\n        _.mixin(Status.prototype, {\n            update: function update(event, suggestions) {\n                var length = suggestions.length;\n                var words;\n                if (length === 1) {\n                    words = {\n                        result: \"result\",\n                        is: \"is\"\n                    };\n                } else {\n                    words = {\n                        result: \"results\",\n                        is: \"are\"\n                    };\n                }\n                this.$el.text(length + \" \" + words.result + \" \" + words.is + \" available, use up and down arrow keys to navigate.\");\n            },\n            cleared: function() {\n                this.$el.text(\"\");\n            }\n        });\n        return Status;\n    }();\n    var DefaultMenu = function() {\n        \"use strict\";\n        var s = Menu.prototype;\n        function DefaultMenu() {\n            Menu.apply(this, [].slice.call(arguments, 0));\n        }\n        _.mixin(DefaultMenu.prototype, Menu.prototype, {\n            open: function open() {\n                !this._allDatasetsEmpty() && this._show();\n                return s.open.apply(this, [].slice.call(arguments, 0));\n            },\n            close: function close() {\n                this._hide();\n                return s.close.apply(this, [].slice.call(arguments, 0));\n            },\n            _onRendered: function onRendered() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onRendered.apply(this, [].slice.call(arguments, 0));\n            },\n            _onCleared: function onCleared() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onCleared.apply(this, [].slice.call(arguments, 0));\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n                return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n            },\n            _hide: function hide() {\n                this.$node.hide();\n            },\n            _show: function show() {\n                this.$node.css(\"display\", \"block\");\n            }\n        });\n        return DefaultMenu;\n    }();\n    var Typeahead = function() {\n        \"use strict\";\n        function Typeahead(o, www) {\n            var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"missing input\");\n            }\n            if (!o.menu) {\n                $.error(\"missing menu\");\n            }\n            if (!o.eventBus) {\n                $.error(\"missing event bus\");\n            }\n            www.mixin(this);\n            this.eventBus = o.eventBus;\n            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n            this.input = o.input;\n            this.menu = o.menu;\n            this.enabled = true;\n            this.autoselect = !!o.autoselect;\n            this.active = false;\n            this.input.hasFocus() && this.activate();\n            this.dir = this.input.getLangDir();\n            this._hacks();\n            this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n            onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n            onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n            onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n            onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n            onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n            onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n            onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n            onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n            onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n            onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n            onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n            this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n        }\n        _.mixin(Typeahead.prototype, {\n            _hacks: function hacks() {\n                var $input, $menu;\n                $input = this.input.$input || $(\"<div>\");\n                $menu = this.menu.$node || $(\"<div>\");\n                $input.on(\"blur.tt\", function($e) {\n                    var active, isActive, hasActive;\n                    active = document.activeElement;\n                    isActive = $menu.is(active);\n                    hasActive = $menu.has(active).length > 0;\n                    if (_.isMsie() && (isActive || hasActive)) {\n                        $e.preventDefault();\n                        $e.stopImmediatePropagation();\n                        _.defer(function() {\n                            $input.focus();\n                        });\n                    }\n                });\n                $menu.on(\"mousedown.tt\", function($e) {\n                    $e.preventDefault();\n                });\n            },\n            _onSelectableClicked: function onSelectableClicked(type, $el) {\n                this.select($el);\n            },\n            _onDatasetCleared: function onDatasetCleared() {\n                this._updateHint();\n            },\n            _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {\n                this._updateHint();\n                if (this.autoselect) {\n                    var cursorClass = this.selectors.cursor.substr(1);\n                    this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);\n                }\n                this.eventBus.trigger(\"render\", suggestions, async, dataset);\n            },\n            _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n                this.eventBus.trigger(\"asyncrequest\", query, dataset);\n            },\n            _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n                this.eventBus.trigger(\"asynccancel\", query, dataset);\n            },\n            _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n                this.eventBus.trigger(\"asyncreceive\", query, dataset);\n            },\n            _onFocused: function onFocused() {\n                this._minLengthMet() && this.menu.update(this.input.getQuery());\n            },\n            _onBlurred: function onBlurred() {\n                if (this.input.hasQueryChangedSinceLastFocus()) {\n                    this.eventBus.trigger(\"change\", this.input.getQuery());\n                }\n            },\n            _onEnterKeyed: function onEnterKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    if (this.select($selectable)) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                } else if (this.autoselect) {\n                    if (this.select(this.menu.getTopSelectable())) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                }\n            },\n            _onTabKeyed: function onTabKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    this.select($selectable) && $e.preventDefault();\n                } else if (this.autoselect) {\n                    if ($selectable = this.menu.getTopSelectable()) {\n                        this.autocomplete($selectable) && $e.preventDefault();\n                    }\n                }\n            },\n            _onEscKeyed: function onEscKeyed() {\n                this.close();\n            },\n            _onUpKeyed: function onUpKeyed() {\n                this.moveCursor(-1);\n            },\n            _onDownKeyed: function onDownKeyed() {\n                this.moveCursor(+1);\n            },\n            _onLeftKeyed: function onLeftKeyed() {\n                if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onRightKeyed: function onRightKeyed() {\n                if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onQueryChanged: function onQueryChanged(e, query) {\n                this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n            },\n            _onWhitespaceChanged: function onWhitespaceChanged() {\n                this._updateHint();\n            },\n            _onLangDirChanged: function onLangDirChanged(e, dir) {\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.menu.setLanguageDirection(dir);\n                }\n            },\n            _openIfActive: function openIfActive() {\n                this.isActive() && this.open();\n            },\n            _minLengthMet: function minLengthMet(query) {\n                query = _.isString(query) ? query : this.input.getQuery() || \"\";\n                return query.length >= this.minLength;\n            },\n            _updateHint: function updateHint() {\n                var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n                $selectable = this.menu.getTopSelectable();\n                data = this.menu.getSelectableData($selectable);\n                val = this.input.getInputValue();\n                if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n                    query = Input.normalizeQuery(val);\n                    escapedQuery = _.escapeRegExChars(query);\n                    frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n                    match = frontMatchRegEx.exec(data.val);\n                    match && this.input.setHint(val + match[1]);\n                } else {\n                    this.input.clearHint();\n                }\n            },\n            isEnabled: function isEnabled() {\n                return this.enabled;\n            },\n            enable: function enable() {\n                this.enabled = true;\n            },\n            disable: function disable() {\n                this.enabled = false;\n            },\n            isActive: function isActive() {\n                return this.active;\n            },\n            activate: function activate() {\n                if (this.isActive()) {\n                    return true;\n                } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n                    return false;\n                } else {\n                    this.active = true;\n                    this.eventBus.trigger(\"active\");\n                    return true;\n                }\n            },\n            deactivate: function deactivate() {\n                if (!this.isActive()) {\n                    return true;\n                } else if (this.eventBus.before(\"idle\")) {\n                    return false;\n                } else {\n                    this.active = false;\n                    this.close();\n                    this.eventBus.trigger(\"idle\");\n                    return true;\n                }\n            },\n            isOpen: function isOpen() {\n                return this.menu.isOpen();\n            },\n            open: function open() {\n                if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n                    this.input.setAriaExpanded(true);\n                    this.menu.open();\n                    this._updateHint();\n                    this.eventBus.trigger(\"open\");\n                }\n                return this.isOpen();\n            },\n            close: function close() {\n                if (this.isOpen() && !this.eventBus.before(\"close\")) {\n                    this.input.setAriaExpanded(false);\n                    this.menu.close();\n                    this.input.clearHint();\n                    this.input.resetInputValue();\n                    this.eventBus.trigger(\"close\");\n                }\n                return !this.isOpen();\n            },\n            setVal: function setVal(val) {\n                this.input.setQuery(_.toStr(val));\n            },\n            getVal: function getVal() {\n                return this.input.getQuery();\n            },\n            select: function select($selectable) {\n                var data = this.menu.getSelectableData($selectable);\n                if (data && !this.eventBus.before(\"select\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val, true);\n                    this.eventBus.trigger(\"select\", data.obj, data.dataset);\n                    this.close();\n                    return true;\n                }\n                return false;\n            },\n            autocomplete: function autocomplete($selectable) {\n                var query, data, isValid;\n                query = this.input.getQuery();\n                data = this.menu.getSelectableData($selectable);\n                isValid = data && query !== data.val;\n                if (isValid && !this.eventBus.before(\"autocomplete\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val);\n                    this.eventBus.trigger(\"autocomplete\", data.obj, data.dataset);\n                    return true;\n                }\n                return false;\n            },\n            moveCursor: function moveCursor(delta) {\n                var query, $candidate, data, suggestion, datasetName, cancelMove, id;\n                query = this.input.getQuery();\n                $candidate = this.menu.selectableRelativeToCursor(delta);\n                data = this.menu.getSelectableData($candidate);\n                suggestion = data ? data.obj : null;\n                datasetName = data ? data.dataset : null;\n                id = $candidate ? $candidate.attr(\"id\") : null;\n                this.input.trigger(\"cursorchange\", id);\n                cancelMove = this._minLengthMet() && this.menu.update(query);\n                if (!cancelMove && !this.eventBus.before(\"cursorchange\", suggestion, datasetName)) {\n                    this.menu.setCursor($candidate);\n                    if (data) {\n                        if (typeof data.val === \"string\") {\n                            this.input.setInputValue(data.val);\n                        }\n                    } else {\n                        this.input.resetInputValue();\n                        this._updateHint();\n                    }\n                    this.eventBus.trigger(\"cursorchange\", suggestion, datasetName);\n                    return true;\n                }\n                return false;\n            },\n            destroy: function destroy() {\n                this.input.destroy();\n                this.menu.destroy();\n            }\n        });\n        return Typeahead;\n        function c(ctx) {\n            var methods = [].slice.call(arguments, 1);\n            return function() {\n                var args = [].slice.call(arguments);\n                _.each(methods, function(method) {\n                    return ctx[method].apply(ctx, args);\n                });\n            };\n        }\n    }();\n    (function() {\n        \"use strict\";\n        var old, keys, methods;\n        old = $.fn.typeahead;\n        keys = {\n            www: \"tt-www\",\n            attrs: \"tt-attrs\",\n            typeahead: \"tt-typeahead\"\n        };\n        methods = {\n            initialize: function initialize(o, datasets) {\n                var www;\n                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n                o = o || {};\n                www = WWW(o.classNames);\n                return this.each(attach);\n                function attach() {\n                    var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;\n                    _.each(datasets, function(d) {\n                        d.highlight = !!o.highlight;\n                    });\n                    $input = $(this);\n                    $wrapper = $(www.html.wrapper);\n                    $hint = $elOrNull(o.hint);\n                    $menu = $elOrNull(o.menu);\n                    defaultHint = o.hint !== false && !$hint;\n                    defaultMenu = o.menu !== false && !$menu;\n                    defaultHint && ($hint = buildHintFromInput($input, www));\n                    defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n                    $hint && $hint.val(\"\");\n                    $input = prepInput($input, www);\n                    if (defaultHint || defaultMenu) {\n                        $wrapper.css(www.css.wrapper);\n                        $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n                        $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n                    }\n                    MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n                    eventBus = new EventBus({\n                        el: $input\n                    });\n                    input = new Input({\n                        hint: $hint,\n                        input: $input,\n                        menu: $menu\n                    }, www);\n                    menu = new MenuConstructor({\n                        node: $menu,\n                        datasets: datasets\n                    }, www);\n                    status = new Status({\n                        $input: $input,\n                        menu: menu\n                    });\n                    typeahead = new Typeahead({\n                        input: input,\n                        menu: menu,\n                        eventBus: eventBus,\n                        minLength: o.minLength,\n                        autoselect: o.autoselect\n                    }, www);\n                    $input.data(keys.www, www);\n                    $input.data(keys.typeahead, typeahead);\n                }\n            },\n            isEnabled: function isEnabled() {\n                var enabled;\n                ttEach(this.first(), function(t) {\n                    enabled = t.isEnabled();\n                });\n                return enabled;\n            },\n            enable: function enable() {\n                ttEach(this, function(t) {\n                    t.enable();\n                });\n                return this;\n            },\n            disable: function disable() {\n                ttEach(this, function(t) {\n                    t.disable();\n                });\n                return this;\n            },\n            isActive: function isActive() {\n                var active;\n                ttEach(this.first(), function(t) {\n                    active = t.isActive();\n                });\n                return active;\n            },\n            activate: function activate() {\n                ttEach(this, function(t) {\n                    t.activate();\n                });\n                return this;\n            },\n            deactivate: function deactivate() {\n                ttEach(this, function(t) {\n                    t.deactivate();\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                var open;\n                ttEach(this.first(), function(t) {\n                    open = t.isOpen();\n                });\n                return open;\n            },\n            open: function open() {\n                ttEach(this, function(t) {\n                    t.open();\n                });\n                return this;\n            },\n            close: function close() {\n                ttEach(this, function(t) {\n                    t.close();\n                });\n                return this;\n            },\n            select: function select(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.select($el);\n                });\n                return success;\n            },\n            autocomplete: function autocomplete(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.autocomplete($el);\n                });\n                return success;\n            },\n            moveCursor: function moveCursoe(delta) {\n                var success = false;\n                ttEach(this.first(), function(t) {\n                    success = t.moveCursor(delta);\n                });\n                return success;\n            },\n            val: function val(newVal) {\n                var query;\n                if (!arguments.length) {\n                    ttEach(this.first(), function(t) {\n                        query = t.getVal();\n                    });\n                    return query;\n                } else {\n                    ttEach(this, function(t) {\n                        t.setVal(_.toStr(newVal));\n                    });\n                    return this;\n                }\n            },\n            destroy: function destroy() {\n                ttEach(this, function(typeahead, $input) {\n                    revert($input);\n                    typeahead.destroy();\n                });\n                return this;\n            }\n        };\n        $.fn.typeahead = function(method) {\n            if (methods[method]) {\n                return methods[method].apply(this, [].slice.call(arguments, 1));\n            } else {\n                return methods.initialize.apply(this, arguments);\n            }\n        };\n        $.fn.typeahead.noConflict = function noConflict() {\n            $.fn.typeahead = old;\n            return this;\n        };\n        function ttEach($els, fn) {\n            $els.each(function() {\n                var $input = $(this), typeahead;\n                (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n            });\n        }\n        function buildHintFromInput($input, www) {\n            return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({\n                readonly: true,\n                required: false\n            }).removeAttr(\"id name placeholder\").removeClass(\"required\").attr({\n                spellcheck: \"false\",\n                tabindex: -1\n            });\n        }\n        function prepInput($input, www) {\n            $input.data(keys.attrs, {\n                dir: $input.attr(\"dir\"),\n                autocomplete: $input.attr(\"autocomplete\"),\n                spellcheck: $input.attr(\"spellcheck\"),\n                style: $input.attr(\"style\")\n            });\n            $input.addClass(www.classes.input).attr({\n                spellcheck: false\n            });\n            try {\n                !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n            } catch (e) {}\n            return $input;\n        }\n        function getBackgroundStyles($el) {\n            return {\n                backgroundAttachment: $el.css(\"background-attachment\"),\n                backgroundClip: $el.css(\"background-clip\"),\n                backgroundColor: $el.css(\"background-color\"),\n                backgroundImage: $el.css(\"background-image\"),\n                backgroundOrigin: $el.css(\"background-origin\"),\n                backgroundPosition: $el.css(\"background-position\"),\n                backgroundRepeat: $el.css(\"background-repeat\"),\n                backgroundSize: $el.css(\"background-size\")\n            };\n        }\n        function revert($input) {\n            var www, $wrapper;\n            www = $input.data(keys.www);\n            $wrapper = $input.parent().filter(www.selectors.wrapper);\n            _.each($input.data(keys.attrs), function(val, key) {\n                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n            });\n            $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n            if ($wrapper.length) {\n                $input.detach().insertAfter($wrapper);\n                $wrapper.remove();\n            }\n        }\n        function $elOrNull(obj) {\n            var isValid, $el;\n            isValid = _.isJQuery(obj) || _.isElement(obj);\n            $el = isValid ? $(obj).first() : [];\n            return $el.length ? $el : null;\n        }\n    })();\n});"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset=\"utf-8\">\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n  </head>\n  <body>\n\n\n    <a title=\"NVActivityIndicatorView  Reference\"></a>\n\n    <header class=\"header\">\n      <p class=\"header-col header-col--primary\">\n        <a class=\"header-link\" href=\"index.html\">\n          NVActivityIndicatorView 5.2.0 Docs\n        </a>\n        \n      </p>\n    \n    \n        <p class=\"header-col header-col--secondary\">\n          <a class=\"header-link\" href=\"https://github.com/ninjaprox/NVActivityIndicatorView\">\n            <img class=\"header-icon\" src=\"img/gh.png\" alt=\"GitHub\"/>\n            View on GitHub\n          </a>\n        </p>\n    \n    </header>\n\n    <p class=\"breadcrumbs\">\n      <a class=\"breadcrumb\" href=\"index.html\">NVActivityIndicatorView</a>\n    </p>\n\n    <div class=\"content-wrapper\">\n      <nav class=\"navigation\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Enums/NVActivityIndicatorType.html\">NVActivityIndicatorType</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a class=\"nav-group-name-link\" href=\"Typealiases.html\">Type Aliases</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeInAnimation\">FadeInAnimation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a class=\"nav-group-task-link\" href=\"Typealiases.html#/FadeOutAnimation\">FadeOutAnimation</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n\n        <section class=\"section\">\n          <div class=\"section-content top-matter\">\n            \n            <h1 id='nvactivityindicatorview' class='heading'>NVActivityIndicatorView</h1>\n\n<p><a href=\"https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml\"><img src=\"https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml/badge.svg?event=push\" alt=\"Build Status\"></a>\n<a href=\"https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg\"><img src=\"https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg\" alt=\"Cocoapods Compatible\"></a>\n<a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" alt=\"Carthage Compatible\"></a></p>\n\n<p>⚠️ Check out <a href=\"https://github.com/ninjaprox/LoaderUI\">LoaderUI</a> (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. 🎉</p>\n<h2 id='introduction' class='heading'>Introduction</h2>\n\n<p><code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code> is a collection of awesome loading animations.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif\" alt=\"Demo\"></p>\n<h2 id='animation-types' class='heading'>Animation types</h2>\n\n<table><thead>\n<tr>\n<th>Type</th>\n<th>Type</th>\n<th>Type</th>\n<th>Type</th>\n</tr>\n</thead><tbody>\n<tr>\n<td>1. ballPulse</td>\n<td>2. ballGridPulse</td>\n<td>3. ballClipRotate</td>\n<td>4. squareSpin</td>\n</tr>\n<tr>\n<td>5. ballClipRotatePulse</td>\n<td>6. ballClipRotateMultiple</td>\n<td>7. ballPulseRise</td>\n<td>8. ballRotate</td>\n</tr>\n<tr>\n<td>9. cubeTransition</td>\n<td>10. ballZigZag</td>\n<td>11. ballZigZagDeflect</td>\n<td>12. ballTrianglePath</td>\n</tr>\n<tr>\n<td>13. ballScale</td>\n<td>14. lineScale</td>\n<td>15. lineScaleParty</td>\n<td>16. ballScaleMultiple</td>\n</tr>\n<tr>\n<td>17. ballPulseSync</td>\n<td>18. ballBeat</td>\n<td>19. lineScalePulseOut</td>\n<td>20. lineScalePulseOutRapid</td>\n</tr>\n<tr>\n<td>21. ballScaleRipple</td>\n<td>22. ballScaleRippleMultiple</td>\n<td>23. ballSpinFadeLoader</td>\n<td>24. lineSpinFadeLoader</td>\n</tr>\n<tr>\n<td>25. triangleSkewSpin</td>\n<td>26. pacman</td>\n<td>27. ballGridBeat</td>\n<td>28. semiCircleSpin</td>\n</tr>\n<tr>\n<td>29. ballRotateChase</td>\n<td>30. orbit</td>\n<td>31. audioEqualizer</td>\n<td>32. circleStrokeSpin</td>\n</tr>\n</tbody></table>\n<h2 id='installation' class='heading'>Installation</h2>\n<h3 id='cocoapods' class='heading'>Cocoapods</h3>\n\n<p><a href=\"https://cocoapods.org/#install\">Cocoapods</a> is a dependency manager for Swift and Objective-C Cocoa projects. To use NVActivityIndicatorView with CocoaPods, add it in your <code>Podfile</code>.</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'NVActivityIndicatorView'</span>\n</code></pre>\n<h3 id='carthage' class='heading'>Carthage</h3>\n\n<p><a href=\"https://github.com/Carthage/Carthage#installing-carthage\">Carthage</a> is intended to be the simplest way to add frameworks to your Cocoa application. To use NVActivityIndicatorView with Carthage, add it in your <code>Cartfile</code>.</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">github</span> <span class=\"s2\">\"ninjaprox/NVActivityIndicatorView\"</span>\n</code></pre>\n<h3 id='swift-package-manager' class='heading'>Swift Package Manager</h3>\n\n<p>The <a href=\"https://swift.org/package-manager/\">Swift Package Manager</a> is a tool for managing the distribution of Swift code. To use NVActivityIndicatorView with Swift Package Manger, add it to <code>dependencies</code> in your <code>Package.swift</code></p>\n<pre class=\"highlight swift\"><code><span class=\"nv\">dependencies</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n    <span class=\"o\">.</span><span class=\"nf\">package</span><span class=\"p\">(</span><span class=\"nv\">url</span><span class=\"p\">:</span> <span class=\"s\">\"https://github.com/ninjaprox/NVActivityIndicatorView.git\"</span><span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre>\n<h2 id='migration' class='heading'>Migration</h2>\n\n<p>Version <a href=\"https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0\">5.0.0</a> comes with breaking changes. Please refer to the release note for details.</p>\n<h2 id='usage' class='heading'>Usage</h2>\n\n<p>Firstly, import <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">NVActivityIndicatorView</span>\n</code></pre>\n<h3 id='initialization' class='heading'>Initialization</h3>\n\n<p>Then, there are two ways you can create <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>:</p>\n\n<ul>\n<li>By storyboard, changing class of any <code>UIView</code> to <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</li>\n</ul>\n\n<p><em><strong>Note:</strong> Set <code>Module</code> to <code><a href=\"Classes/NVActivityIndicatorView.html\">NVActivityIndicatorView</a></code>.</em></p>\n\n<ul>\n<li>By code, using initializer. All parameters other than <code>frame</code> are optional and <a href=\"https://nvactivityindicatorview.vinhis.me/Classes/NVActivityIndicatorView.html\"><code>NVActivityIndicatorView.DEFAULT_*</code></a> are used as default values.</li>\n</ul>\n<pre class=\"highlight swift\"><code><span class=\"kt\">NVActivityIndicatorView</span><span class=\"p\">(</span><span class=\"nv\">frame</span><span class=\"p\">:</span> <span class=\"n\">frame</span><span class=\"p\">,</span> <span class=\"nv\">type</span><span class=\"p\">:</span> <span class=\"n\">type</span><span class=\"p\">,</span> <span class=\"nv\">color</span><span class=\"p\">:</span> <span class=\"n\">color</span><span class=\"p\">,</span> <span class=\"nv\">padding</span><span class=\"p\">:</span> <span class=\"n\">padding</span><span class=\"p\">)</span>\n</code></pre>\n<h3 id='control' class='heading'>Control</h3>\n\n<p>Start animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"nf\">startAnimating</span><span class=\"p\">()</span>\n</code></pre>\n\n<p>Stop animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"nf\">stopAnimating</span><span class=\"p\">()</span>\n</code></pre>\n\n<p>Determine if it is animating.</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">animating</span> <span class=\"o\">=</span> <span class=\"n\">activityIndicatorView</span><span class=\"o\">.</span><span class=\"n\">isAnimating</span>\n</code></pre>\n<h3 id='change-properties' class='heading'>Change properties</h3>\n\n<p>In storyboard, you can change all properties in Attributes inspector tab of Utilities panel.</p>\n\n<p><em><strong>Note:</strong> Use one of values (case-insensitive) in <a href=\"#animation-types\">Animation types</a> for <code>Type Name</code>.</em></p>\n\n<p>All properties are public so you can change them after initializing.</p>\n\n<p><em><strong>Note:</strong> All changes must be made before calling <code>startAnimating()</code>.</em></p>\n<h2 id='documentation' class='heading'>Documentation</h2>\n\n<p><a href=\"https://nvactivityindicatorview.vinhis.me/\">https://nvactivityindicatorview.vinhis.me/</a></p>\n<h2 id='acknowledgment' class='heading'>Acknowledgment</h2>\n\n<p>Thanks <a href=\"https://github.com/ConnorAtherton\">Connor Atherton</a> for inspired <a href=\"https://github.com/ConnorAtherton/loaders.css\">Loaders.css</a> and <a href=\"https://github.com/gontovnik\">Danil Gontovnik</a> for <a href=\"https://github.com/gontovnik/DGActivityIndicatorView\">DGActivityIndicatorView</a>.</p>\n<h2 id='license' class='heading'>License</h2>\n\n<p>The MIT License (MIT)</p>\n\n<p>Copyright &copy; 2016 Vinh Nguyen <a href=\"http://twitter.com/ninjaprox\">@ninjaprox</a></p>\n\n          </div>\n        </section>\n\n\n      </article>\n    </div>\n    <section class=\"footer\">\n      <p>&copy; 2026 <a class=\"link\" href=\"https://github.com/ninjaprox\" target=\"_blank\" rel=\"external noopener\">Vinh Nguyen</a>. All rights reserved. (Last updated: 2026-03-18)</p>\n      <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/js/jazzy.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docset': false}\nif (typeof window.dash != 'undefined') {\n  document.documentElement.className += ' dash'\n  window.jazzy.docset = true\n}\nif (navigator.userAgent.match(/xcode/i)) {\n  document.documentElement.className += ' xcode'\n  window.jazzy.docset = true\n}\n\nfunction toggleItem($link, $content) {\n  var animationDuration = 300;\n  $link.toggleClass('token-open');\n  $content.slideToggle(animationDuration);\n}\n\nfunction itemLinkToContent($link) {\n  return $link.parent().parent().next();\n}\n\n// On doc load + hash-change, open any targeted item\nfunction openCurrentItemIfClosed() {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(`a[name=\"${location.hash.substring(1)}\"]`).nextAll('.token');\n  $content = itemLinkToContent($link);\n  if ($content.is(':hidden')) {\n    toggleItem($link, $content);\n  }\n}\n\n$(openCurrentItemIfClosed);\n$(window).on('hashchange', openCurrentItemIfClosed);\n\n// On item link ('token') click, toggle its discussion\n$('.token').on('click', function(event) {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(this);\n  toggleItem($link, itemLinkToContent($link));\n\n  // Keeps the document from jumping to the hash.\n  var href = $link.attr('href');\n  if (history.pushState) {\n    history.pushState({}, '', href);\n  } else {\n    location.hash = href;\n  }\n  event.preventDefault();\n});\n\n// Clicks on links to the current, closed, item need to open the item\n$(\"a:not('.token')\").on('click', function() {\n  if (location == this.href) {\n    openCurrentItemIfClosed();\n  }\n});\n\n// KaTeX rendering\nif (\"katex\" in window) {\n  $($('.math').each( (_, element) => {\n    katex.render(element.textContent, element, {\n      displayMode: $(element).hasClass('m-block'),\n      throwOnError: false,\n      trust: true\n    });\n  }))\n}\n"
  },
  {
    "path": "docs/js/jazzy.search.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n  var $typeahead = $('[data-typeahead]');\n  var $form = $typeahead.parents('form');\n  var searchURL = $form.attr('action');\n\n  function displayTemplate(result) {\n    return result.name;\n  }\n\n  function suggestionTemplate(result) {\n    var t = '<div class=\"list-group-item clearfix\">';\n    t += '<span class=\"doc-name\">' + result.name + '</span>';\n    if (result.parent_name) {\n     t += '<span class=\"doc-parent-name label\">' + result.parent_name + '</span>';\n    }\n    t += '</div>';\n    return t;\n  }\n\n  $typeahead.one('focus', function() {\n    $form.addClass('loading');\n\n    $.getJSON(searchURL).then(function(searchData) {\n      const searchIndex = lunr(function() {\n        this.ref('url');\n        this.field('name');\n        this.field('abstract');\n        for (const [url, doc] of Object.entries(searchData)) {\n          this.add({url: url, name: doc.name, abstract: doc.abstract});\n        }\n      });\n\n      $typeahead.typeahead(\n        {\n          highlight: true,\n          minLength: 3,\n          autoselect: true\n        },\n        {\n          limit: 10,\n          display: displayTemplate,\n          templates: { suggestion: suggestionTemplate },\n          source: function(query, sync) {\n            const lcSearch = query.toLowerCase();\n            const results = searchIndex.query(function(q) {\n                q.term(lcSearch, { boost: 100 });\n                q.term(lcSearch, {\n                  boost: 10,\n                  wildcard: lunr.Query.wildcard.TRAILING\n                });\n            }).map(function(result) {\n              var doc = searchData[result.ref];\n              doc.url = result.ref;\n              return doc;\n            });\n            sync(results);\n          }\n        }\n      );\n      $form.removeClass('loading');\n      $typeahead.trigger('focus');\n    });\n  });\n\n  var baseURL = searchURL.slice(0, -\"search.json\".length);\n\n  $typeahead.on('typeahead:select', function(e, result) {\n    window.location = baseURL + result.url;\n  });\n});\n"
  },
  {
    "path": "docs/js/typeahead.jquery.js",
    "content": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and other contributors; Licensed MIT\n */\n\n\n(function(root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define([ \"jquery\" ], function(a0) {\n            return factory(a0);\n        });\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory(require(\"jquery\"));\n    } else {\n        factory(root[\"jQuery\"]);\n    }\n})(this, function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            isElement: function(obj) {\n                return !!(obj && obj.nodeType === 1);\n            },\n            isJQuery: function(obj) {\n                return obj instanceof $;\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            identity: function(x) {\n                return x;\n            },\n            clone: function(obj) {\n                return $.extend(true, {}, obj);\n            },\n            getIdGenerator: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            },\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            stringify: function(val) {\n                return _.isString(val) ? val : JSON.stringify(val);\n            },\n            guid: function() {\n                function _p8(s) {\n                    var p = (Math.random().toString(16) + \"000000000\").substr(2, 8);\n                    return s ? \"-\" + p.substr(0, 4) + \"-\" + p.substr(4, 4) : p;\n                }\n                return \"tt-\" + _p8() + _p8(true) + _p8(true) + _p8();\n            },\n            noop: function() {}\n        };\n    }();\n    var WWW = function() {\n        \"use strict\";\n        var defaultClassNames = {\n            wrapper: \"twitter-typeahead\",\n            input: \"tt-input\",\n            hint: \"tt-hint\",\n            menu: \"tt-menu\",\n            dataset: \"tt-dataset\",\n            suggestion: \"tt-suggestion\",\n            selectable: \"tt-selectable\",\n            empty: \"tt-empty\",\n            open: \"tt-open\",\n            cursor: \"tt-cursor\",\n            highlight: \"tt-highlight\"\n        };\n        return build;\n        function build(o) {\n            var www, classes;\n            classes = _.mixin({}, defaultClassNames, o);\n            www = {\n                css: buildCss(),\n                classes: classes,\n                html: buildHtml(classes),\n                selectors: buildSelectors(classes)\n            };\n            return {\n                css: www.css,\n                html: www.html,\n                classes: www.classes,\n                selectors: www.selectors,\n                mixin: function(o) {\n                    _.mixin(o, www);\n                }\n            };\n        }\n        function buildHtml(c) {\n            return {\n                wrapper: '<span class=\"' + c.wrapper + '\"></span>',\n                menu: '<div role=\"listbox\" class=\"' + c.menu + '\"></div>'\n            };\n        }\n        function buildSelectors(classes) {\n            var selectors = {};\n            _.each(classes, function(v, k) {\n                selectors[k] = \".\" + v;\n            });\n            return selectors;\n        }\n        function buildCss() {\n            var css = {\n                wrapper: {\n                    position: \"relative\",\n                    display: \"inline-block\"\n                },\n                hint: {\n                    position: \"absolute\",\n                    top: \"0\",\n                    left: \"0\",\n                    borderColor: \"transparent\",\n                    boxShadow: \"none\",\n                    opacity: \"1\"\n                },\n                input: {\n                    position: \"relative\",\n                    verticalAlign: \"top\",\n                    backgroundColor: \"transparent\"\n                },\n                inputWithNoHint: {\n                    position: \"relative\",\n                    verticalAlign: \"top\"\n                },\n                menu: {\n                    position: \"absolute\",\n                    top: \"100%\",\n                    left: \"0\",\n                    zIndex: \"100\",\n                    display: \"none\"\n                },\n                ltr: {\n                    left: \"0\",\n                    right: \"auto\"\n                },\n                rtl: {\n                    left: \"auto\",\n                    right: \" 0\"\n                }\n            };\n            if (_.isMsie()) {\n                _.mixin(css.input, {\n                    backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n                });\n            }\n            return css;\n        }\n    }();\n    var EventBus = function() {\n        \"use strict\";\n        var namespace, deprecationMap;\n        namespace = \"typeahead:\";\n        deprecationMap = {\n            render: \"rendered\",\n            cursorchange: \"cursorchanged\",\n            select: \"selected\",\n            autocomplete: \"autocompleted\"\n        };\n        function EventBus(o) {\n            if (!o || !o.el) {\n                $.error(\"EventBus initialized without el\");\n            }\n            this.$el = $(o.el);\n        }\n        _.mixin(EventBus.prototype, {\n            _trigger: function(type, args) {\n                var $e = $.Event(namespace + type);\n                this.$el.trigger.call(this.$el, $e, args || []);\n                return $e;\n            },\n            before: function(type) {\n                var args, $e;\n                args = [].slice.call(arguments, 1);\n                $e = this._trigger(\"before\" + type, args);\n                return $e.isDefaultPrevented();\n            },\n            trigger: function(type) {\n                var deprecatedType;\n                this._trigger(type, [].slice.call(arguments, 1));\n                if (deprecatedType = deprecationMap[type]) {\n                    this._trigger(deprecatedType, [].slice.call(arguments, 1));\n                }\n            }\n        });\n        return EventBus;\n    }();\n    var EventEmitter = function() {\n        \"use strict\";\n        var splitter = /\\s+/, nextTick = getNextTick();\n        return {\n            onSync: onSync,\n            onAsync: onAsync,\n            off: off,\n            trigger: trigger\n        };\n        function on(method, types, cb, context) {\n            var type;\n            if (!cb) {\n                return this;\n            }\n            types = types.split(splitter);\n            cb = context ? bindContext(cb, context) : cb;\n            this._callbacks = this._callbacks || {};\n            while (type = types.shift()) {\n                this._callbacks[type] = this._callbacks[type] || {\n                    sync: [],\n                    async: []\n                };\n                this._callbacks[type][method].push(cb);\n            }\n            return this;\n        }\n        function onAsync(types, cb, context) {\n            return on.call(this, \"async\", types, cb, context);\n        }\n        function onSync(types, cb, context) {\n            return on.call(this, \"sync\", types, cb, context);\n        }\n        function off(types) {\n            var type;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            while (type = types.shift()) {\n                delete this._callbacks[type];\n            }\n            return this;\n        }\n        function trigger(types) {\n            var type, callbacks, args, syncFlush, asyncFlush;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            args = [].slice.call(arguments, 1);\n            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n                syncFlush() && nextTick(asyncFlush);\n            }\n            return this;\n        }\n        function getFlush(callbacks, context, args) {\n            return flush;\n            function flush() {\n                var cancelled;\n                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n                    cancelled = callbacks[i].apply(context, args) === false;\n                }\n                return !cancelled;\n            }\n        }\n        function getNextTick() {\n            var nextTickFn;\n            if (window.setImmediate) {\n                nextTickFn = function nextTickSetImmediate(fn) {\n                    setImmediate(function() {\n                        fn();\n                    });\n                };\n            } else {\n                nextTickFn = function nextTickSetTimeout(fn) {\n                    setTimeout(function() {\n                        fn();\n                    }, 0);\n                };\n            }\n            return nextTickFn;\n        }\n        function bindContext(fn, context) {\n            return fn.bind ? fn.bind(context) : function() {\n                fn.apply(context, [].slice.call(arguments, 0));\n            };\n        }\n    }();\n    var highlight = function(doc) {\n        \"use strict\";\n        var defaults = {\n            node: null,\n            pattern: null,\n            tagName: \"strong\",\n            className: null,\n            wordsOnly: false,\n            caseSensitive: false,\n            diacriticInsensitive: false\n        };\n        var accented = {\n            A: \"[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Ａａ]\",\n            B: \"[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Ｂｂ]\",\n            C: \"[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Ｃｃ]\",\n            D: \"[DdĎďǄ-ǆǱ-ǳᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Ｄｄ]\",\n            E: \"[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ｅｅ]\",\n            F: \"[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ﬀ-ﬄＦｆ]\",\n            G: \"[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Ｇｇ]\",\n            H: \"[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Ｈｈ]\",\n            I: \"[IiÌ-Ïì-ïĨ-İĲĳǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕ﬁﬃＩｉ]\",\n            J: \"[JjĲ-ĵǇ-ǌǰʲᴶⅉ⒥ⒿⓙⱼＪｊ]\",\n            K: \"[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Ｋｋ]\",\n            L: \"[LlĹ-ŀǇ-ǉˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿ﬂﬄＬｌ]\",\n            M: \"[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Ｍｍ]\",\n            N: \"[NnÑñŃ-ŉǊ-ǌǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Ｎｎ]\",\n            O: \"[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Ｏｏ]\",\n            P: \"[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Ｐｐ]\",\n            Q: \"[Qqℚ⒬Ⓠⓠ㏃Ｑｑ]\",\n            R: \"[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Ｒｒ]\",\n            S: \"[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜ﬆＳｓ]\",\n            T: \"[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ﬅﬆＴｔ]\",\n            U: \"[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Ｕｕ]\",\n            V: \"[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Ｖｖ]\",\n            W: \"[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ｗｗ]\",\n            X: \"[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Ｘｘ]\",\n            Y: \"[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Ｙｙ]\",\n            Z: \"[ZzŹ-žǱ-ǳᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Ｚｚ]\"\n        };\n        return function hightlight(o) {\n            var regex;\n            o = _.mixin({}, defaults, o);\n            if (!o.node || !o.pattern) {\n                return;\n            }\n            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);\n            traverse(o.node, hightlightTextNode);\n            function hightlightTextNode(textNode) {\n                var match, patternNode, wrapperNode;\n                if (match = regex.exec(textNode.data)) {\n                    wrapperNode = doc.createElement(o.tagName);\n                    o.className && (wrapperNode.className = o.className);\n                    patternNode = textNode.splitText(match.index);\n                    patternNode.splitText(match[0].length);\n                    wrapperNode.appendChild(patternNode.cloneNode(true));\n                    textNode.parentNode.replaceChild(wrapperNode, patternNode);\n                }\n                return !!match;\n            }\n            function traverse(el, hightlightTextNode) {\n                var childNode, TEXT_NODE_TYPE = 3;\n                for (var i = 0; i < el.childNodes.length; i++) {\n                    childNode = el.childNodes[i];\n                    if (childNode.nodeType === TEXT_NODE_TYPE) {\n                        i += hightlightTextNode(childNode) ? 1 : 0;\n                    } else {\n                        traverse(childNode, hightlightTextNode);\n                    }\n                }\n            }\n        };\n        function accent_replacer(chr) {\n            return accented[chr.toUpperCase()] || chr;\n        }\n        function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {\n            var escapedPatterns = [], regexStr;\n            for (var i = 0, len = patterns.length; i < len; i++) {\n                var escapedWord = _.escapeRegExChars(patterns[i]);\n                if (diacriticInsensitive) {\n                    escapedWord = escapedWord.replace(/\\S/g, accent_replacer);\n                }\n                escapedPatterns.push(escapedWord);\n            }\n            regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n        }\n    }(window.document);\n    var Input = function() {\n        \"use strict\";\n        var specialKeyCodeMap;\n        specialKeyCodeMap = {\n            9: \"tab\",\n            27: \"esc\",\n            37: \"left\",\n            39: \"right\",\n            13: \"enter\",\n            38: \"up\",\n            40: \"down\"\n        };\n        function Input(o, www) {\n            var id;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"input is missing\");\n            }\n            www.mixin(this);\n            this.$hint = $(o.hint);\n            this.$input = $(o.input);\n            this.$menu = $(o.menu);\n            id = this.$input.attr(\"id\") || _.guid();\n            this.$menu.attr(\"id\", id + \"_listbox\");\n            this.$hint.attr({\n                \"aria-hidden\": true\n            });\n            this.$input.attr({\n                \"aria-owns\": id + \"_listbox\",\n                \"aria-controls\": id + \"_listbox\",\n                role: \"combobox\",\n                \"aria-autocomplete\": \"list\",\n                \"aria-expanded\": false\n            });\n            this.query = this.$input.val();\n            this.queryWhenFocused = this.hasFocus() ? this.query : null;\n            this.$overflowHelper = buildOverflowHelper(this.$input);\n            this._checkLanguageDirection();\n            if (this.$hint.length === 0) {\n                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n            }\n            this.onSync(\"cursorchange\", this._updateDescendent);\n        }\n        Input.normalizeQuery = function(str) {\n            return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n        };\n        _.mixin(Input.prototype, EventEmitter, {\n            _onBlur: function onBlur() {\n                this.resetInputValue();\n                this.trigger(\"blurred\");\n            },\n            _onFocus: function onFocus() {\n                this.queryWhenFocused = this.query;\n                this.trigger(\"focused\");\n            },\n            _onKeydown: function onKeydown($e) {\n                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n                this._managePreventDefault(keyName, $e);\n                if (keyName && this._shouldTrigger(keyName, $e)) {\n                    this.trigger(keyName + \"Keyed\", $e);\n                }\n            },\n            _onInput: function onInput() {\n                this._setQuery(this.getInputValue());\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            _managePreventDefault: function managePreventDefault(keyName, $e) {\n                var preventDefault;\n                switch (keyName) {\n                  case \"up\":\n                  case \"down\":\n                    preventDefault = !withModifier($e);\n                    break;\n\n                  default:\n                    preventDefault = false;\n                }\n                preventDefault && $e.preventDefault();\n            },\n            _shouldTrigger: function shouldTrigger(keyName, $e) {\n                var trigger;\n                switch (keyName) {\n                  case \"tab\":\n                    trigger = !withModifier($e);\n                    break;\n\n                  default:\n                    trigger = true;\n                }\n                return trigger;\n            },\n            _checkLanguageDirection: function checkLanguageDirection() {\n                var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.$hint.attr(\"dir\", dir);\n                    this.trigger(\"langDirChanged\", dir);\n                }\n            },\n            _setQuery: function setQuery(val, silent) {\n                var areEquivalent, hasDifferentWhitespace;\n                areEquivalent = areQueriesEquivalent(val, this.query);\n                hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n                this.query = val;\n                if (!silent && !areEquivalent) {\n                    this.trigger(\"queryChanged\", this.query);\n                } else if (!silent && hasDifferentWhitespace) {\n                    this.trigger(\"whitespaceChanged\", this.query);\n                }\n            },\n            _updateDescendent: function updateDescendent(event, id) {\n                this.$input.attr(\"aria-activedescendant\", id);\n            },\n            bind: function() {\n                var that = this, onBlur, onFocus, onKeydown, onInput;\n                onBlur = _.bind(this._onBlur, this);\n                onFocus = _.bind(this._onFocus, this);\n                onKeydown = _.bind(this._onKeydown, this);\n                onInput = _.bind(this._onInput, this);\n                this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n                if (!_.isMsie() || _.isMsie() > 9) {\n                    this.$input.on(\"input.tt\", onInput);\n                } else {\n                    this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n                        if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n                            return;\n                        }\n                        _.defer(_.bind(that._onInput, that, $e));\n                    });\n                }\n                return this;\n            },\n            focus: function focus() {\n                this.$input.focus();\n            },\n            blur: function blur() {\n                this.$input.blur();\n            },\n            getLangDir: function getLangDir() {\n                return this.dir;\n            },\n            getQuery: function getQuery() {\n                return this.query || \"\";\n            },\n            setQuery: function setQuery(val, silent) {\n                this.setInputValue(val);\n                this._setQuery(val, silent);\n            },\n            hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n                return this.query !== this.queryWhenFocused;\n            },\n            getInputValue: function getInputValue() {\n                return this.$input.val();\n            },\n            setInputValue: function setInputValue(value) {\n                this.$input.val(value);\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            resetInputValue: function resetInputValue() {\n                this.setInputValue(this.query);\n            },\n            getHint: function getHint() {\n                return this.$hint.val();\n            },\n            setHint: function setHint(value) {\n                this.$hint.val(value);\n            },\n            clearHint: function clearHint() {\n                this.setHint(\"\");\n            },\n            clearHintIfInvalid: function clearHintIfInvalid() {\n                var val, hint, valIsPrefixOfHint, isValid;\n                val = this.getInputValue();\n                hint = this.getHint();\n                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n                isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n                !isValid && this.clearHint();\n            },\n            hasFocus: function hasFocus() {\n                return this.$input.is(\":focus\");\n            },\n            hasOverflow: function hasOverflow() {\n                var constraint = this.$input.width() - 2;\n                this.$overflowHelper.text(this.getInputValue());\n                return this.$overflowHelper.width() >= constraint;\n            },\n            isCursorAtEnd: function() {\n                var valueLength, selectionStart, range;\n                valueLength = this.$input.val().length;\n                selectionStart = this.$input[0].selectionStart;\n                if (_.isNumber(selectionStart)) {\n                    return selectionStart === valueLength;\n                } else if (document.selection) {\n                    range = document.selection.createRange();\n                    range.moveStart(\"character\", -valueLength);\n                    return valueLength === range.text.length;\n                }\n                return true;\n            },\n            destroy: function destroy() {\n                this.$hint.off(\".tt\");\n                this.$input.off(\".tt\");\n                this.$overflowHelper.remove();\n                this.$hint = this.$input = this.$overflowHelper = $(\"<div>\");\n            },\n            setAriaExpanded: function setAriaExpanded(value) {\n                this.$input.attr(\"aria-expanded\", value);\n            }\n        });\n        return Input;\n        function buildOverflowHelper($input) {\n            return $('<pre aria-hidden=\"true\"></pre>').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var keys, nameGenerator;\n        keys = {\n            dataset: \"tt-selectable-dataset\",\n            val: \"tt-selectable-display\",\n            obj: \"tt-selectable-object\"\n        };\n        nameGenerator = _.getIdGenerator();\n        function Dataset(o, www) {\n            o = o || {};\n            o.templates = o.templates || {};\n            o.templates.notFound = o.templates.notFound || o.templates.empty;\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (!o.node) {\n                $.error(\"missing node\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            www.mixin(this);\n            this.highlight = !!o.highlight;\n            this.name = _.toStr(o.name || nameGenerator());\n            this.limit = o.limit || 5;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n            this._resetLastSuggestion();\n            this.$el = $(o.node).attr(\"role\", \"presentation\").addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n        }\n        Dataset.extractData = function extractData(el) {\n            var $el = $(el);\n            if ($el.data(keys.obj)) {\n                return {\n                    dataset: $el.data(keys.dataset) || \"\",\n                    val: $el.data(keys.val) || \"\",\n                    obj: $el.data(keys.obj) || null\n                };\n            }\n            return null;\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _overwrite: function overwrite(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (this.async && this.templates.pending) {\n                    this._renderPending(query);\n                } else if (!this.async && this.templates.notFound) {\n                    this._renderNotFound(query);\n                } else {\n                    this._empty();\n                }\n                this.trigger(\"rendered\", suggestions, false, this.name);\n            },\n            _append: function append(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length && this.$lastSuggestion.length) {\n                    this._appendSuggestions(query, suggestions);\n                } else if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n                    this._renderNotFound(query);\n                }\n                this.trigger(\"rendered\", suggestions, true, this.name);\n            },\n            _renderSuggestions: function renderSuggestions(query, suggestions) {\n                var $fragment;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                this.$lastSuggestion = $fragment.children().last();\n                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n            },\n            _appendSuggestions: function appendSuggestions(query, suggestions) {\n                var $fragment, $lastSuggestion;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                $lastSuggestion = $fragment.children().last();\n                this.$lastSuggestion.after($fragment);\n                this.$lastSuggestion = $lastSuggestion;\n            },\n            _renderPending: function renderPending(query) {\n                var template = this.templates.pending;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _renderNotFound: function renderNotFound(query) {\n                var template = this.templates.notFound;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _empty: function empty() {\n                this.$el.empty();\n                this._resetLastSuggestion();\n            },\n            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n                var that = this, fragment;\n                fragment = document.createDocumentFragment();\n                _.each(suggestions, function getSuggestionNode(suggestion) {\n                    var $el, context;\n                    context = that._injectQuery(query, suggestion);\n                    $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n                    fragment.appendChild($el[0]);\n                });\n                this.highlight && highlight({\n                    className: this.classes.highlight,\n                    node: fragment,\n                    pattern: query\n                });\n                return $(fragment);\n            },\n            _getFooter: function getFooter(query, suggestions) {\n                return this.templates.footer ? this.templates.footer({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _getHeader: function getHeader(query, suggestions) {\n                return this.templates.header ? this.templates.header({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _resetLastSuggestion: function resetLastSuggestion() {\n                this.$lastSuggestion = $();\n            },\n            _injectQuery: function injectQuery(query, obj) {\n                return _.isObject(obj) ? _.mixin({\n                    _query: query\n                }, obj) : obj;\n            },\n            update: function update(query) {\n                var that = this, canceled = false, syncCalled = false, rendered = 0;\n                this.cancel();\n                this.cancel = function cancel() {\n                    canceled = true;\n                    that.cancel = $.noop;\n                    that.async && that.trigger(\"asyncCanceled\", query, that.name);\n                };\n                this.source(query, sync, async);\n                !syncCalled && sync([]);\n                function sync(suggestions) {\n                    if (syncCalled) {\n                        return;\n                    }\n                    syncCalled = true;\n                    suggestions = (suggestions || []).slice(0, that.limit);\n                    rendered = suggestions.length;\n                    that._overwrite(query, suggestions);\n                    if (rendered < that.limit && that.async) {\n                        that.trigger(\"asyncRequested\", query, that.name);\n                    }\n                }\n                function async(suggestions) {\n                    suggestions = suggestions || [];\n                    if (!canceled && rendered < that.limit) {\n                        that.cancel = $.noop;\n                        var idx = Math.abs(rendered - that.limit);\n                        rendered += idx;\n                        that._append(query, suggestions.slice(0, idx));\n                        that.async && that.trigger(\"asyncReceived\", query, that.name);\n                    }\n                }\n            },\n            cancel: $.noop,\n            clear: function clear() {\n                this._empty();\n                this.cancel();\n                this.trigger(\"cleared\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = $(\"<div>\");\n            }\n        });\n        return Dataset;\n        function getDisplayFn(display) {\n            display = display || _.stringify;\n            return _.isFunction(display) ? display : displayFn;\n            function displayFn(obj) {\n                return obj[display];\n            }\n        }\n        function getTemplates(templates, displayFn) {\n            return {\n                notFound: templates.notFound && _.templatify(templates.notFound),\n                pending: templates.pending && _.templatify(templates.pending),\n                header: templates.header && _.templatify(templates.header),\n                footer: templates.footer && _.templatify(templates.footer),\n                suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate\n            };\n            function userSuggestionTemplate(context) {\n                var template = templates.suggestion;\n                return $(template(context)).attr(\"id\", _.guid());\n            }\n            function suggestionTemplate(context) {\n                return $('<div role=\"option\">').attr(\"id\", _.guid()).text(displayFn(context));\n            }\n        }\n        function isValidName(str) {\n            return /^[_a-zA-Z0-9-]+$/.test(str);\n        }\n    }();\n    var Menu = function() {\n        \"use strict\";\n        function Menu(o, www) {\n            var that = this;\n            o = o || {};\n            if (!o.node) {\n                $.error(\"node is required\");\n            }\n            www.mixin(this);\n            this.$node = $(o.node);\n            this.query = null;\n            this.datasets = _.map(o.datasets, initializeDataset);\n            function initializeDataset(oDataset) {\n                var node = that.$node.find(oDataset.node).first();\n                oDataset.node = node.length ? node : $(\"<div>\").appendTo(that.$node);\n                return new Dataset(oDataset, www);\n            }\n        }\n        _.mixin(Menu.prototype, EventEmitter, {\n            _onSelectableClick: function onSelectableClick($e) {\n                this.trigger(\"selectableClicked\", $($e.currentTarget));\n            },\n            _onRendered: function onRendered(type, dataset, suggestions, async) {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetRendered\", dataset, suggestions, async);\n            },\n            _onCleared: function onCleared() {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetCleared\");\n            },\n            _propagate: function propagate() {\n                this.trigger.apply(this, arguments);\n            },\n            _allDatasetsEmpty: function allDatasetsEmpty() {\n                return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {\n                    var isEmpty = dataset.isEmpty();\n                    this.$node.attr(\"aria-expanded\", !isEmpty);\n                    return isEmpty;\n                }, this));\n            },\n            _getSelectables: function getSelectables() {\n                return this.$node.find(this.selectors.selectable);\n            },\n            _removeCursor: function _removeCursor() {\n                var $selectable = this.getActiveSelectable();\n                $selectable && $selectable.removeClass(this.classes.cursor);\n            },\n            _ensureVisible: function ensureVisible($el) {\n                var elTop, elBottom, nodeScrollTop, nodeHeight;\n                elTop = $el.position().top;\n                elBottom = elTop + $el.outerHeight(true);\n                nodeScrollTop = this.$node.scrollTop();\n                nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n                if (elTop < 0) {\n                    this.$node.scrollTop(nodeScrollTop + elTop);\n                } else if (nodeHeight < elBottom) {\n                    this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n                }\n            },\n            bind: function() {\n                var that = this, onSelectableClick;\n                onSelectableClick = _.bind(this._onSelectableClick, this);\n                this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n                this.$node.on(\"mouseover\", this.selectors.selectable, function() {\n                    that.setCursor($(this));\n                });\n                this.$node.on(\"mouseleave\", function() {\n                    that._removeCursor();\n                });\n                _.each(this.datasets, function(dataset) {\n                    dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                return this.$node.hasClass(this.classes.open);\n            },\n            open: function open() {\n                this.$node.scrollTop(0);\n                this.$node.addClass(this.classes.open);\n            },\n            close: function close() {\n                this.$node.attr(\"aria-expanded\", false);\n                this.$node.removeClass(this.classes.open);\n                this._removeCursor();\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.attr(\"dir\", dir);\n            },\n            selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n                var $selectables, $oldCursor, oldIndex, newIndex;\n                $oldCursor = this.getActiveSelectable();\n                $selectables = this._getSelectables();\n                oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n                newIndex = oldIndex + delta;\n                newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n                newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n                return newIndex === -1 ? null : $selectables.eq(newIndex);\n            },\n            setCursor: function setCursor($selectable) {\n                this._removeCursor();\n                if ($selectable = $selectable && $selectable.first()) {\n                    $selectable.addClass(this.classes.cursor);\n                    this._ensureVisible($selectable);\n                }\n            },\n            getSelectableData: function getSelectableData($el) {\n                return $el && $el.length ? Dataset.extractData($el) : null;\n            },\n            getActiveSelectable: function getActiveSelectable() {\n                var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n                return $selectable.length ? $selectable : null;\n            },\n            getTopSelectable: function getTopSelectable() {\n                var $selectable = this._getSelectables().first();\n                return $selectable.length ? $selectable : null;\n            },\n            update: function update(query) {\n                var isValidUpdate = query !== this.query;\n                if (isValidUpdate) {\n                    this.query = query;\n                    _.each(this.datasets, updateDataset);\n                }\n                return isValidUpdate;\n                function updateDataset(dataset) {\n                    dataset.update(query);\n                }\n            },\n            empty: function empty() {\n                _.each(this.datasets, clearDataset);\n                this.query = null;\n                this.$node.addClass(this.classes.empty);\n                function clearDataset(dataset) {\n                    dataset.clear();\n                }\n            },\n            destroy: function destroy() {\n                this.$node.off(\".tt\");\n                this.$node = $(\"<div>\");\n                _.each(this.datasets, destroyDataset);\n                function destroyDataset(dataset) {\n                    dataset.destroy();\n                }\n            }\n        });\n        return Menu;\n    }();\n    var Status = function() {\n        \"use strict\";\n        function Status(options) {\n            this.$el = $(\"<span></span>\", {\n                role: \"status\",\n                \"aria-live\": \"polite\"\n            }).css({\n                position: \"absolute\",\n                padding: \"0\",\n                border: \"0\",\n                height: \"1px\",\n                width: \"1px\",\n                \"margin-bottom\": \"-1px\",\n                \"margin-right\": \"-1px\",\n                overflow: \"hidden\",\n                clip: \"rect(0 0 0 0)\",\n                \"white-space\": \"nowrap\"\n            });\n            options.$input.after(this.$el);\n            _.each(options.menu.datasets, _.bind(function(dataset) {\n                if (dataset.onSync) {\n                    dataset.onSync(\"rendered\", _.bind(this.update, this));\n                    dataset.onSync(\"cleared\", _.bind(this.cleared, this));\n                }\n            }, this));\n        }\n        _.mixin(Status.prototype, {\n            update: function update(event, suggestions) {\n                var length = suggestions.length;\n                var words;\n                if (length === 1) {\n                    words = {\n                        result: \"result\",\n                        is: \"is\"\n                    };\n                } else {\n                    words = {\n                        result: \"results\",\n                        is: \"are\"\n                    };\n                }\n                this.$el.text(length + \" \" + words.result + \" \" + words.is + \" available, use up and down arrow keys to navigate.\");\n            },\n            cleared: function() {\n                this.$el.text(\"\");\n            }\n        });\n        return Status;\n    }();\n    var DefaultMenu = function() {\n        \"use strict\";\n        var s = Menu.prototype;\n        function DefaultMenu() {\n            Menu.apply(this, [].slice.call(arguments, 0));\n        }\n        _.mixin(DefaultMenu.prototype, Menu.prototype, {\n            open: function open() {\n                !this._allDatasetsEmpty() && this._show();\n                return s.open.apply(this, [].slice.call(arguments, 0));\n            },\n            close: function close() {\n                this._hide();\n                return s.close.apply(this, [].slice.call(arguments, 0));\n            },\n            _onRendered: function onRendered() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onRendered.apply(this, [].slice.call(arguments, 0));\n            },\n            _onCleared: function onCleared() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onCleared.apply(this, [].slice.call(arguments, 0));\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n                return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n            },\n            _hide: function hide() {\n                this.$node.hide();\n            },\n            _show: function show() {\n                this.$node.css(\"display\", \"block\");\n            }\n        });\n        return DefaultMenu;\n    }();\n    var Typeahead = function() {\n        \"use strict\";\n        function Typeahead(o, www) {\n            var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"missing input\");\n            }\n            if (!o.menu) {\n                $.error(\"missing menu\");\n            }\n            if (!o.eventBus) {\n                $.error(\"missing event bus\");\n            }\n            www.mixin(this);\n            this.eventBus = o.eventBus;\n            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n            this.input = o.input;\n            this.menu = o.menu;\n            this.enabled = true;\n            this.autoselect = !!o.autoselect;\n            this.active = false;\n            this.input.hasFocus() && this.activate();\n            this.dir = this.input.getLangDir();\n            this._hacks();\n            this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n            onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n            onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n            onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n            onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n            onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n            onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n            onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n            onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n            onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n            onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n            onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n            this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n        }\n        _.mixin(Typeahead.prototype, {\n            _hacks: function hacks() {\n                var $input, $menu;\n                $input = this.input.$input || $(\"<div>\");\n                $menu = this.menu.$node || $(\"<div>\");\n                $input.on(\"blur.tt\", function($e) {\n                    var active, isActive, hasActive;\n                    active = document.activeElement;\n                    isActive = $menu.is(active);\n                    hasActive = $menu.has(active).length > 0;\n                    if (_.isMsie() && (isActive || hasActive)) {\n                        $e.preventDefault();\n                        $e.stopImmediatePropagation();\n                        _.defer(function() {\n                            $input.focus();\n                        });\n                    }\n                });\n                $menu.on(\"mousedown.tt\", function($e) {\n                    $e.preventDefault();\n                });\n            },\n            _onSelectableClicked: function onSelectableClicked(type, $el) {\n                this.select($el);\n            },\n            _onDatasetCleared: function onDatasetCleared() {\n                this._updateHint();\n            },\n            _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {\n                this._updateHint();\n                if (this.autoselect) {\n                    var cursorClass = this.selectors.cursor.substr(1);\n                    this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);\n                }\n                this.eventBus.trigger(\"render\", suggestions, async, dataset);\n            },\n            _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n                this.eventBus.trigger(\"asyncrequest\", query, dataset);\n            },\n            _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n                this.eventBus.trigger(\"asynccancel\", query, dataset);\n            },\n            _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n                this.eventBus.trigger(\"asyncreceive\", query, dataset);\n            },\n            _onFocused: function onFocused() {\n                this._minLengthMet() && this.menu.update(this.input.getQuery());\n            },\n            _onBlurred: function onBlurred() {\n                if (this.input.hasQueryChangedSinceLastFocus()) {\n                    this.eventBus.trigger(\"change\", this.input.getQuery());\n                }\n            },\n            _onEnterKeyed: function onEnterKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    if (this.select($selectable)) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                } else if (this.autoselect) {\n                    if (this.select(this.menu.getTopSelectable())) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                }\n            },\n            _onTabKeyed: function onTabKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    this.select($selectable) && $e.preventDefault();\n                } else if (this.autoselect) {\n                    if ($selectable = this.menu.getTopSelectable()) {\n                        this.autocomplete($selectable) && $e.preventDefault();\n                    }\n                }\n            },\n            _onEscKeyed: function onEscKeyed() {\n                this.close();\n            },\n            _onUpKeyed: function onUpKeyed() {\n                this.moveCursor(-1);\n            },\n            _onDownKeyed: function onDownKeyed() {\n                this.moveCursor(+1);\n            },\n            _onLeftKeyed: function onLeftKeyed() {\n                if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onRightKeyed: function onRightKeyed() {\n                if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onQueryChanged: function onQueryChanged(e, query) {\n                this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n            },\n            _onWhitespaceChanged: function onWhitespaceChanged() {\n                this._updateHint();\n            },\n            _onLangDirChanged: function onLangDirChanged(e, dir) {\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.menu.setLanguageDirection(dir);\n                }\n            },\n            _openIfActive: function openIfActive() {\n                this.isActive() && this.open();\n            },\n            _minLengthMet: function minLengthMet(query) {\n                query = _.isString(query) ? query : this.input.getQuery() || \"\";\n                return query.length >= this.minLength;\n            },\n            _updateHint: function updateHint() {\n                var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n                $selectable = this.menu.getTopSelectable();\n                data = this.menu.getSelectableData($selectable);\n                val = this.input.getInputValue();\n                if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n                    query = Input.normalizeQuery(val);\n                    escapedQuery = _.escapeRegExChars(query);\n                    frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n                    match = frontMatchRegEx.exec(data.val);\n                    match && this.input.setHint(val + match[1]);\n                } else {\n                    this.input.clearHint();\n                }\n            },\n            isEnabled: function isEnabled() {\n                return this.enabled;\n            },\n            enable: function enable() {\n                this.enabled = true;\n            },\n            disable: function disable() {\n                this.enabled = false;\n            },\n            isActive: function isActive() {\n                return this.active;\n            },\n            activate: function activate() {\n                if (this.isActive()) {\n                    return true;\n                } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n                    return false;\n                } else {\n                    this.active = true;\n                    this.eventBus.trigger(\"active\");\n                    return true;\n                }\n            },\n            deactivate: function deactivate() {\n                if (!this.isActive()) {\n                    return true;\n                } else if (this.eventBus.before(\"idle\")) {\n                    return false;\n                } else {\n                    this.active = false;\n                    this.close();\n                    this.eventBus.trigger(\"idle\");\n                    return true;\n                }\n            },\n            isOpen: function isOpen() {\n                return this.menu.isOpen();\n            },\n            open: function open() {\n                if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n                    this.input.setAriaExpanded(true);\n                    this.menu.open();\n                    this._updateHint();\n                    this.eventBus.trigger(\"open\");\n                }\n                return this.isOpen();\n            },\n            close: function close() {\n                if (this.isOpen() && !this.eventBus.before(\"close\")) {\n                    this.input.setAriaExpanded(false);\n                    this.menu.close();\n                    this.input.clearHint();\n                    this.input.resetInputValue();\n                    this.eventBus.trigger(\"close\");\n                }\n                return !this.isOpen();\n            },\n            setVal: function setVal(val) {\n                this.input.setQuery(_.toStr(val));\n            },\n            getVal: function getVal() {\n                return this.input.getQuery();\n            },\n            select: function select($selectable) {\n                var data = this.menu.getSelectableData($selectable);\n                if (data && !this.eventBus.before(\"select\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val, true);\n                    this.eventBus.trigger(\"select\", data.obj, data.dataset);\n                    this.close();\n                    return true;\n                }\n                return false;\n            },\n            autocomplete: function autocomplete($selectable) {\n                var query, data, isValid;\n                query = this.input.getQuery();\n                data = this.menu.getSelectableData($selectable);\n                isValid = data && query !== data.val;\n                if (isValid && !this.eventBus.before(\"autocomplete\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val);\n                    this.eventBus.trigger(\"autocomplete\", data.obj, data.dataset);\n                    return true;\n                }\n                return false;\n            },\n            moveCursor: function moveCursor(delta) {\n                var query, $candidate, data, suggestion, datasetName, cancelMove, id;\n                query = this.input.getQuery();\n                $candidate = this.menu.selectableRelativeToCursor(delta);\n                data = this.menu.getSelectableData($candidate);\n                suggestion = data ? data.obj : null;\n                datasetName = data ? data.dataset : null;\n                id = $candidate ? $candidate.attr(\"id\") : null;\n                this.input.trigger(\"cursorchange\", id);\n                cancelMove = this._minLengthMet() && this.menu.update(query);\n                if (!cancelMove && !this.eventBus.before(\"cursorchange\", suggestion, datasetName)) {\n                    this.menu.setCursor($candidate);\n                    if (data) {\n                        if (typeof data.val === \"string\") {\n                            this.input.setInputValue(data.val);\n                        }\n                    } else {\n                        this.input.resetInputValue();\n                        this._updateHint();\n                    }\n                    this.eventBus.trigger(\"cursorchange\", suggestion, datasetName);\n                    return true;\n                }\n                return false;\n            },\n            destroy: function destroy() {\n                this.input.destroy();\n                this.menu.destroy();\n            }\n        });\n        return Typeahead;\n        function c(ctx) {\n            var methods = [].slice.call(arguments, 1);\n            return function() {\n                var args = [].slice.call(arguments);\n                _.each(methods, function(method) {\n                    return ctx[method].apply(ctx, args);\n                });\n            };\n        }\n    }();\n    (function() {\n        \"use strict\";\n        var old, keys, methods;\n        old = $.fn.typeahead;\n        keys = {\n            www: \"tt-www\",\n            attrs: \"tt-attrs\",\n            typeahead: \"tt-typeahead\"\n        };\n        methods = {\n            initialize: function initialize(o, datasets) {\n                var www;\n                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n                o = o || {};\n                www = WWW(o.classNames);\n                return this.each(attach);\n                function attach() {\n                    var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;\n                    _.each(datasets, function(d) {\n                        d.highlight = !!o.highlight;\n                    });\n                    $input = $(this);\n                    $wrapper = $(www.html.wrapper);\n                    $hint = $elOrNull(o.hint);\n                    $menu = $elOrNull(o.menu);\n                    defaultHint = o.hint !== false && !$hint;\n                    defaultMenu = o.menu !== false && !$menu;\n                    defaultHint && ($hint = buildHintFromInput($input, www));\n                    defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n                    $hint && $hint.val(\"\");\n                    $input = prepInput($input, www);\n                    if (defaultHint || defaultMenu) {\n                        $wrapper.css(www.css.wrapper);\n                        $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n                        $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n                    }\n                    MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n                    eventBus = new EventBus({\n                        el: $input\n                    });\n                    input = new Input({\n                        hint: $hint,\n                        input: $input,\n                        menu: $menu\n                    }, www);\n                    menu = new MenuConstructor({\n                        node: $menu,\n                        datasets: datasets\n                    }, www);\n                    status = new Status({\n                        $input: $input,\n                        menu: menu\n                    });\n                    typeahead = new Typeahead({\n                        input: input,\n                        menu: menu,\n                        eventBus: eventBus,\n                        minLength: o.minLength,\n                        autoselect: o.autoselect\n                    }, www);\n                    $input.data(keys.www, www);\n                    $input.data(keys.typeahead, typeahead);\n                }\n            },\n            isEnabled: function isEnabled() {\n                var enabled;\n                ttEach(this.first(), function(t) {\n                    enabled = t.isEnabled();\n                });\n                return enabled;\n            },\n            enable: function enable() {\n                ttEach(this, function(t) {\n                    t.enable();\n                });\n                return this;\n            },\n            disable: function disable() {\n                ttEach(this, function(t) {\n                    t.disable();\n                });\n                return this;\n            },\n            isActive: function isActive() {\n                var active;\n                ttEach(this.first(), function(t) {\n                    active = t.isActive();\n                });\n                return active;\n            },\n            activate: function activate() {\n                ttEach(this, function(t) {\n                    t.activate();\n                });\n                return this;\n            },\n            deactivate: function deactivate() {\n                ttEach(this, function(t) {\n                    t.deactivate();\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                var open;\n                ttEach(this.first(), function(t) {\n                    open = t.isOpen();\n                });\n                return open;\n            },\n            open: function open() {\n                ttEach(this, function(t) {\n                    t.open();\n                });\n                return this;\n            },\n            close: function close() {\n                ttEach(this, function(t) {\n                    t.close();\n                });\n                return this;\n            },\n            select: function select(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.select($el);\n                });\n                return success;\n            },\n            autocomplete: function autocomplete(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.autocomplete($el);\n                });\n                return success;\n            },\n            moveCursor: function moveCursoe(delta) {\n                var success = false;\n                ttEach(this.first(), function(t) {\n                    success = t.moveCursor(delta);\n                });\n                return success;\n            },\n            val: function val(newVal) {\n                var query;\n                if (!arguments.length) {\n                    ttEach(this.first(), function(t) {\n                        query = t.getVal();\n                    });\n                    return query;\n                } else {\n                    ttEach(this, function(t) {\n                        t.setVal(_.toStr(newVal));\n                    });\n                    return this;\n                }\n            },\n            destroy: function destroy() {\n                ttEach(this, function(typeahead, $input) {\n                    revert($input);\n                    typeahead.destroy();\n                });\n                return this;\n            }\n        };\n        $.fn.typeahead = function(method) {\n            if (methods[method]) {\n                return methods[method].apply(this, [].slice.call(arguments, 1));\n            } else {\n                return methods.initialize.apply(this, arguments);\n            }\n        };\n        $.fn.typeahead.noConflict = function noConflict() {\n            $.fn.typeahead = old;\n            return this;\n        };\n        function ttEach($els, fn) {\n            $els.each(function() {\n                var $input = $(this), typeahead;\n                (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n            });\n        }\n        function buildHintFromInput($input, www) {\n            return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({\n                readonly: true,\n                required: false\n            }).removeAttr(\"id name placeholder\").removeClass(\"required\").attr({\n                spellcheck: \"false\",\n                tabindex: -1\n            });\n        }\n        function prepInput($input, www) {\n            $input.data(keys.attrs, {\n                dir: $input.attr(\"dir\"),\n                autocomplete: $input.attr(\"autocomplete\"),\n                spellcheck: $input.attr(\"spellcheck\"),\n                style: $input.attr(\"style\")\n            });\n            $input.addClass(www.classes.input).attr({\n                spellcheck: false\n            });\n            try {\n                !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n            } catch (e) {}\n            return $input;\n        }\n        function getBackgroundStyles($el) {\n            return {\n                backgroundAttachment: $el.css(\"background-attachment\"),\n                backgroundClip: $el.css(\"background-clip\"),\n                backgroundColor: $el.css(\"background-color\"),\n                backgroundImage: $el.css(\"background-image\"),\n                backgroundOrigin: $el.css(\"background-origin\"),\n                backgroundPosition: $el.css(\"background-position\"),\n                backgroundRepeat: $el.css(\"background-repeat\"),\n                backgroundSize: $el.css(\"background-size\")\n            };\n        }\n        function revert($input) {\n            var www, $wrapper;\n            www = $input.data(keys.www);\n            $wrapper = $input.parent().filter(www.selectors.wrapper);\n            _.each($input.data(keys.attrs), function(val, key) {\n                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n            });\n            $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n            if ($wrapper.length) {\n                $input.detach().insertAfter($wrapper);\n                $wrapper.remove();\n            }\n        }\n        function $elOrNull(obj) {\n            var isValid, $el;\n            isValid = _.isJQuery(obj) || _.isElement(obj);\n            $el = isValid ? $(obj).first() : [];\n            return $el.length ? $el : null;\n        }\n    })();\n});"
  },
  {
    "path": "docs/undocumented.json",
    "content": "{\n  \"warnings\": [\n\n  ],\n  \"source_directory\": \"/Users/vinhnguyen/Workspace/NVActivityIndicatorView\"\n}"
  },
  {
    "path": "scripts/bump-version.sh",
    "content": "#!/bin/bash\n\ntype=\"${1:-patch}\"\n\nfastlane run increment_build_number\nfastlane run increment_version_number bump_type:\"$type\"\nfastlane run version_bump_podspec bump_type:\"$type\" path:\"NVActivityIndicatorView.podspec\"\n\n"
  }
]