[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\n\norbs:\n  rn: react-native-community/react-native@1.1.0\n\njobs:\n  checkout_code:\n    executor: rn/linux_js\n    steps:\n      - checkout\n      - persist_to_workspace:\n          root: .\n          paths: .\n  analyse:\n    executor: rn/linux_js\n    steps:\n      - attach_workspace:\n          at: .\n      - rn/yarn_install\n      - run:\n          name: Lint JS Code (ESLint)\n          command: yarn lint\n      - run:\n          name: Flow\n          command: yarn flow-check\n      - run:\n          name: Unit Tests\n          command: yarn test\n\nworkflows:\n  test:\n    jobs:\n      - checkout_code\n      - analyse:\n          requires:\n            - checkout_code\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  extends: ['@react-native-community'],\n  env: {\n    jest: true\n  }\n};\n"
  },
  {
    "path": ".flowconfig",
    "content": "[ignore]\n; We fork some components by platform\n.*/*[.]android.js\n\n; Ignore \"BUCK\" generated dirs\n<PROJECT_ROOT>/\\.buckd/\n\n; Ignore unexpected extra \"@providesModule\"\n.*/node_modules/.*/node_modules/fbjs/.*\n\n; Ignore duplicate module providers\n; For RN Apps installed via npm, \"Libraries\" folder is inside\n; \"node_modules/react-native\" but in the source repo it is in the root\n.*/Libraries/react-native/React.js\n\n; Ignore polyfills\n.*/Libraries/polyfills/.*\n\n; Ignore metro\n.*/node_modules/metro/.*\n\n[include]\n\n[libs]\nnode_modules/react-native/Libraries/react-native/react-native-interface.js\nnode_modules/react-native/flow/\n\n[options]\nemoji=true\n\nesproposal.optional_chaining=enable\nesproposal.nullish_coalescing=enable\n\nmodule.system=haste\nmodule.system.haste.use_name_reducers=true\n# get basename\nmodule.system.haste.name_reducers='^.*/\\([a-zA-Z0-9$_.-]+\\.js\\(\\.flow\\)?\\)$' -> '\\1'\n# strip .js or .js.flow suffix\nmodule.system.haste.name_reducers='^\\(.*\\)\\.js\\(\\.flow\\)?$' -> '\\1'\n# strip .ios suffix\nmodule.system.haste.name_reducers='^\\(.*\\)\\.ios$' -> '\\1'\nmodule.system.haste.name_reducers='^\\(.*\\)\\.android$' -> '\\1'\nmodule.system.haste.name_reducers='^\\(.*\\)\\.native$' -> '\\1'\nmodule.system.haste.paths.blacklist=.*/__tests__/.*\nmodule.system.haste.paths.blacklist=.*/__mocks__/.*\nmodule.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.*\nmodule.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.*\n\nmunge_underscores=true\n\nmodule.name_mapper='\\(@react-native-community/art\\)' -> '<PROJECT_ROOT>/lib/index.js'\nmodule.name_mapper='^[./a-zA-Z0-9$_-]+\\.\\(bmp\\|gif\\|jpg\\|jpeg\\|png\\|psd\\|svg\\|webp\\|m4v\\|mov\\|mp4\\|mpeg\\|mpg\\|webm\\|aac\\|aiff\\|caf\\|m4a\\|mp3\\|wav\\|html\\|pdf\\)$' -> 'RelativeImageStub'\n\nmodule.file_ext=.js\nmodule.file_ext=.jsx\nmodule.file_ext=.json\nmodule.file_ext=.native.js\n\nsuppress_type=$FlowIssue\nsuppress_type=$FlowFixMe\nsuppress_type=$FlowFixMeProps\nsuppress_type=$FlowFixMeState\n\nsuppress_comment=\\\\(.\\\\|\\n\\\\)*\\\\$FlowFixMe\\\\($\\\\|[^(]\\\\|(\\\\(<VERSION>\\\\)? *\\\\(site=[a-z,_]*react_native[a-z,_]*\\\\)?)\\\\)\nsuppress_comment=\\\\(.\\\\|\\n\\\\)*\\\\$FlowIssue\\\\((\\\\(<VERSION>\\\\)? *\\\\(site=[a-z,_]*react_native[a-z,_]*\\\\)?)\\\\)?:? #[0-9]+\nsuppress_comment=\\\\(.\\\\|\\n\\\\)*\\\\$FlowFixedInNextDeploy\nsuppress_comment=\\\\(.\\\\|\\n\\\\)*\\\\$FlowExpectedError\n\n[version]\n^0.92.0\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.pbxproj -text\n"
  },
  {
    "path": ".gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\nbuck-out/\n\\.buckd/\n*.keystore\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/\n\n*/fastlane/report.xml\n*/fastlane/Preview.html\n*/fastlane/screenshots\n\n# Bundle artifact\n*.jsbundle\n\n.eslintcache\n"
  },
  {
    "path": ".npmignore",
    "content": ".circleci\n.github\nexample\nandroid/build\nios/build\n"
  },
  {
    "path": ".prettierrc.js",
    "content": "module.exports = {\n  singleQuote: true,\n  trailingComma: 'all',\n  bracketSpacing: false,\n  jsxBracketSameLine: true,\n};\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to React Native ART\n\n## Development Process\n\nAll work on React Native ART happens directly on GitHub. Contributors send pull requests which go through review process.\n\n> **Working on your first pull request?** You can learn how from this _free_ series: [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).\n\n1. Fork the repo and create your branch from `master` (a guide on [how to fork a repository](https://help.github.com/articles/fork-a-repo/)).\n2. Run `yarn` or `npm install` to install all required dependencies.\n3. Now you are ready to do the changes.\n\n## Testing your changes\n\nYou can test your changes by installing `example` app on a simulator or device:\n\nInstalling on iOS:\n\n- Run `yarn ios`\n\nor\n\n- Open `example/ios/example.xcodeproj`\n- Click `run` in the top left corner of `Xcode`.\n\nInstalling on Android:\n\n- Connect Android Device or open Android Emulator\n- Run `yarn android`\n\n## Typechecking, linting and testing\n\nCurrently we use flow for typechecking, eslint with prettier for linting and formatting the code and jest for testing.\n\n- `yarn flow`: run flow\n- `yarn lint`: run eslint and prettier\n- `yarn test`: run unit tests\n\n## Sending Pull Request\n\nWhen you're sending a pull request:\n\n- Prefer small pull requests focused on one change.\n- Verify that flow, eslint and all tests are passing.\n- Preview the documentation to make sure it looks good.\n- Follow the pull request template when opening a pull request.\n\n## Reporting issues\n\nYou can report issues on our [bug tracker](https://github.com/react-native-community/art/issues). Please follow the issue template when opening an issue.\n\n## License\n\nBy contributing to React Native ART, you agree that your contributions will be licensed under its **MIT** license.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 react-native-community\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."
  },
  {
    "path": "README.md",
    "content": "# **DEPRECATED** - This package is deprecated. If you need a similar package please consider using [react-native-svg](https://github.com/react-native-svg/react-native-svg).\n# `@react-native-community/art`\n\n[![CircleCI][circle-ci-badge]][circle-ci]\n![MIT License][license-badge]\n[![PRs Welcome][pr-welcome-badge]][make-a-pr]\n![Supports Android and iOS][support-badge]\n[![Lean Core Badge][lean-core-badge]][lean-core-issue]\n\n> _NOTE: ART was extracted from core `react-native` as a part of \"[Lean Core](https://github.com/facebook/react-native/issues/23313)\" effort._\n\nReact Native module that allows you to draw vector graphics\n\n# Getting started\n\n## Installing module\n\n```sh\nyarn add @react-native-community/art\n```\n\nor\n\n```sh\nnpm install @react-native-community/art --save\n```\n\n## Linking module\n\n### Mostly automatic linking\n\nFor `react-native >= 0.60` ReactNativeART should be autolinked and no additional action is required.\n\nFor `react-native < 0.60` you need to link ReactNative ART:\n\n```js\nreact-native link @react-native-community/art\n```\n\n### Manual linking\n\n<details>\n<summary>Manually linking the library for iOS</summary>\n\n#### `Open project.xcodeproj in Xcode`\n\nDrag `RNCSlider.xcodeproj` to your project on Xcode (usually under the Libraries group on Xcode):\n![xcode-add](https://facebook.github.io/react-native/docs/assets/AddToLibraries.png)\n\n#### Link `libART.a` binary with libraries\n\nClick on your main project file (the one that represents the `.xcodeproj`) select `Build Phases` and drag the static library from the `Products` folder inside the Library you are importing to `Link Binary With Libraries` (or use the `+` sign and choose library from the list):\n\n![xcode-link](https://facebook.github.io/react-native/docs/assets/AddToBuildPhases.png)\n\n</details>\n\n<details>\n<summary>Manually linking the library for Android</summary>\n\n#### `android/settings.gradle`\n\n```groovy\ninclude ':react-native-art'\nproject(':react-native-art').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/art/android')\n```\n\n#### `android/app/build.gradle`\n\n```groovy\ndependencies {\n   ...\n   implementation project(':react-native-art')\n}\n```\n\n#### `android/app/src/main/.../MainApplication.java`\n\nOn top, where imports are:\n\n```java\nimport com.reactnativecommunity.art.ARTPackage;\n```\n\nAdd the `ARTPackage` class to your list of exported packages.\n\n```java\n@Override\nprotected List<ReactPackage> getPackages() {\n    return Arrays.asList(\n            new MainReactPackage(),\n            new ARTPackage()\n    );\n}\n```\n\n</details>\n\n# Migrating from the core `react-native` module\n\nTo migrate to this module you need to follow all the installation instructions above and change your imports from:\n\n```js\nimport {ART} from 'react-native';\nconst {Surface, Shape} = ART;\n```\n\nto:\n\n```js\nimport {Surface, Shape} from '@react-native-community/art';\n```\n\n# Documentation\n\nYou can find API reference [here](https://github.com/react-native-community/art/tree/master/docs/api.md).\n\n## Related\n\n- [react-native-svg](https://github.com/react-native-community/react-native-svg) - Render SVGs in any React project\n\n## License\n\nThe library is released under the MIT licence. For more information see `LICENSE`.\n\n[support-badge]:https://img.shields.io/badge/platforms-android%20|%20ios-lightgrey.svg?style=flat-square\n[make-a-pr]:http://makeapullrequest.com\n[pr-welcome-badge]:https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\n[license-badge]:https://img.shields.io/npm/l/@react-native-community/slider.svg?style=flat-square\n[circle-ci]:https://circleci.com/gh/react-native-community/art\n[circle-ci-badge]: https://img.shields.io/circleci/project/github/react-native-community/art/master.svg?style=flat-square\n[lean-core-badge]: https://img.shields.io/badge/Lean%20Core-Extracted-brightgreen.svg?style=flat-square\n[lean-core-issue]: https://github.com/facebook/react-native/issues/23313\n"
  },
  {
    "path": "ReactNativeART.podspec",
    "content": "# coding: utf-8\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\nrequire \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n\nPod::Spec.new do |s|\n  s.name                   = \"ReactNativeART\"\n  s.version                = package['version']\n  s.summary                = package['description']\n  s.license                = package['license']\n  s.authors                = package['author']\n  s.homepage               = package['homepage']\n  s.platforms              = { :ios => \"9.0\", :tvos => \"9.2\" }\n\n  s.source                 = { :git => \"https://github.com/react-native-community/art.git\", :tag => \"v#{s.version}\" }\n  s.source_files           = \"ios/**/*.{h,m}\"\n\n  s.dependency \"React\"\nend\n"
  },
  {
    "path": "android/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n  repositories {\n    google()\n    jcenter()\n  }\n\n  dependencies {\n    classpath 'com.android.tools.build:gradle:3.2.1'\n  }\n}\n\ndef getExtOrDefault(name) {\n  return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ReactNativeART_' + name]\n}\n\ndef getExtOrIntegerDefault(name) {\n  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties['ReactNativeART_' + name]).toInteger()\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n  compileSdkVersion getExtOrIntegerDefault('compileSdkVersion')\n  buildToolsVersion getExtOrDefault('buildToolsVersion')\n\n  defaultConfig {\n    minSdkVersion getExtOrIntegerDefault('minSdkVersion')\n    targetSdkVersion getExtOrIntegerDefault('targetSdkVersion')\n  }\n}\n\nrepositories {\n  google()\n  jcenter()\n  mavenCentral()\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            url \"$rootDir/../node_modules/react-native/android\"\n        }\n    }\n}\n\ndependencies {\n    //noinspection GradleDynamicVersion\n    api 'com.facebook.react:react-native:+'\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 07 12:29:57 CEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.1-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nReactNativeART_compileSdkVersion=28\nReactNativeART_buildToolsVersion=28.0.3\nReactNativeART_targetSdkVersion=27\nReactNativeART_minSdkVersion=16\nReactNativeART_supportLibVersion=28.0.0\n"
  },
  {
    "path": "android/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "android/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.reactnativecommunity.art\" />\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTGroupShadowNode.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport javax.annotation.Nullable;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.graphics.Region;\n\nimport com.facebook.react.bridge.JSApplicationIllegalArgumentException;\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.uimanager.annotations.ReactProp;\nimport com.facebook.react.uimanager.ReactShadowNodeImpl;\n\n/**\n * Shadow node for virtual ARTGroup view\n */\npublic class ARTGroupShadowNode extends ARTVirtualNode {\n\n  protected @Nullable RectF mClipping;\n\n  public ARTGroupShadowNode() { }\n\n  @ReactProp(name = \"clipping\")\n  public void setClipping(@Nullable ReadableArray clippingDims) {\n    float[] clippingData = PropHelper.toFloatArray(clippingDims);\n    if (clippingData != null) {\n      mClipping = createClipping(clippingData);\n      markUpdated();\n    }\n  }\n\n  @Override\n  public boolean isVirtual() {\n    return true;\n  }\n\n  public void draw(Canvas canvas, Paint paint, float opacity) {\n    opacity *= mOpacity;\n    if (opacity > MIN_OPACITY_FOR_DRAW) {\n      saveAndSetupCanvas(canvas);\n\n      if (mClipping != null) {\n        canvas.clipRect(\n          mClipping.left * mScale,\n          mClipping.top * mScale,\n          mClipping.right * mScale,\n          mClipping.bottom * mScale,\n          Region.Op.REPLACE);\n      }\n\n      for (int i = 0; i < getChildCount(); i++) {\n        ARTVirtualNode child = (ARTVirtualNode) getChildAt(i);\n        child.draw(canvas, paint, opacity);\n        child.markUpdateSeen();\n      }\n\n      restoreCanvas(canvas);\n    }\n  }\n\n  /**\n   * Creates a {@link RectF} from an array of dimensions\n   * (e.g. [x, y, width, height])\n   *\n   * @param data the array of dimensions\n   * @return the {@link RectF} that can used to clip the canvas\n   */\n  private static RectF createClipping(float[] data) {\n    if (data.length != 4) {\n      throw new JSApplicationIllegalArgumentException(\n          \"Clipping should be array of length 4 (e.g. [x, y, width, height])\");\n    }\n    RectF clippingRect = new RectF(\n      data[0], data[1], data[0] + data[2], data[1] + data[3]);\n    return clippingRect;\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTGroupViewManager.java",
    "content": "// Copyright (c) Facebook, Inc. and its affiliates.\n\n// This source code is licensed under the MIT license found in the\n// LICENSE file in the root directory of this source tree.\n\npackage com.reactnativecommunity.art;\n\nimport com.facebook.react.module.annotations.ReactModule;\n\n/**\n * ViewManager for shadowed ART group views.\n */\n@ReactModule(name = ARTRenderableViewManager.CLASS_GROUP)\npublic class ARTGroupViewManager extends ARTRenderableViewManager {\n\n  /* package */ ARTGroupViewManager() {\n    super(CLASS_GROUP);\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTPackage.java",
    "content": "package com.reactnativecommunity.art;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.bridge.NativeModule;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.uimanager.ViewManager;\nimport com.facebook.react.bridge.JavaScriptModule;\n\npublic class ARTPackage implements ReactPackage {\n    @Override\n    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {\n        return Collections.emptyList();\n    }\n\n    // Deprecated from RN 0.47\n    public List<Class<? extends JavaScriptModule>> createJSModules() {\n        return Collections.emptyList();\n    }\n\n    @Override\n    @SuppressWarnings(\"rawtypes\")\n    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {\n        return Arrays.<ViewManager>asList(\n                ARTRenderableViewManager.createARTGroupViewManager(),\n                ARTRenderableViewManager.createARTShapeViewManager(),\n                ARTRenderableViewManager.createARTTextViewManager(),\n                new ARTSurfaceViewManager()\n        );\n    }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTRenderableViewManager.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport android.view.View;\n\nimport com.facebook.react.uimanager.ReactShadowNode;\nimport com.facebook.react.uimanager.ThemedReactContext;\nimport com.facebook.react.uimanager.ViewManager;\n\n/**\n * ViewManager for all shadowed ART views: Group, Shape and Text. Since these never get rendered\n * into native views and don't need any logic (all the logic is in {@link ARTSurfaceView}), this\n * \"stubbed\" ViewManager is used for all of them.\n */\npublic class ARTRenderableViewManager extends ViewManager<View, ReactShadowNode> {\n\n  public static final String CLASS_GROUP = \"ARTGroup\";\n  public static final String CLASS_SHAPE = \"ARTShape\";\n  public static final String CLASS_TEXT = \"ARTText\";\n\n  private final String mClassName;\n\n  public static ARTRenderableViewManager createARTGroupViewManager() {\n    return new ARTGroupViewManager();\n  }\n\n  public static ARTRenderableViewManager createARTShapeViewManager() {\n    return new ARTShapeViewManager();\n  }\n\n  public static ARTRenderableViewManager createARTTextViewManager() {\n    return new ARTTextViewManager();\n  }\n\n  /* package */ ARTRenderableViewManager(String className) {\n    mClassName = className;\n  }\n\n  @Override\n  public String getName() {\n    return mClassName;\n  }\n\n  @Override\n  public ReactShadowNode createShadowNodeInstance() {\n    if (CLASS_GROUP.equals(mClassName)) {\n      return new ARTGroupShadowNode();\n    } else if (CLASS_SHAPE.equals(mClassName)) {\n      return new ARTShapeShadowNode();\n    } else if (CLASS_TEXT.equals(mClassName)) {\n      return new ARTTextShadowNode();\n    } else {\n      throw new IllegalStateException(\"Unexpected type \" + mClassName);\n    }\n  }\n\n  @Override\n  public Class<? extends ReactShadowNode> getShadowNodeClass() {\n    if (CLASS_GROUP.equals(mClassName)) {\n      return ARTGroupShadowNode.class;\n    } else if (CLASS_SHAPE.equals(mClassName)) {\n      return ARTShapeShadowNode.class;\n    } else if (CLASS_TEXT.equals(mClassName)) {\n      return ARTTextShadowNode.class;\n    } else {\n      throw new IllegalStateException(\"Unexpected type \" + mClassName);\n    }\n  }\n\n  @Override\n  protected View createViewInstance(ThemedReactContext reactContext) {\n    throw new IllegalStateException(\"ARTShape does not map into a native view\");\n  }\n\n  @Override\n  public void updateExtraData(View root, Object extraData) {\n    throw new IllegalStateException(\"ARTShape does not map into a native view\");\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTShapeShadowNode.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.DashPathEffect;\nimport android.graphics.LinearGradient;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.RectF;\nimport android.graphics.Shader;\nimport com.facebook.common.logging.FLog;\nimport com.facebook.react.bridge.JSApplicationIllegalArgumentException;\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.common.ReactConstants;\nimport com.facebook.react.uimanager.annotations.ReactProp;\nimport javax.annotation.Nullable;\n\nimport static com.facebook.react.common.ArrayUtils.copyArray;\n\n/**\n * Shadow node for virtual ARTShape view\n */\npublic class ARTShapeShadowNode extends ARTVirtualNode {\n\n  private static final int CAP_BUTT = 0;\n  private static final int CAP_ROUND = 1;\n  private static final int CAP_SQUARE = 2;\n\n  private static final int JOIN_BEVEL = 2;\n  private static final int JOIN_MITER = 0;\n  private static final int JOIN_ROUND = 1;\n\n  private static final int PATH_TYPE_ARC = 4;\n  private static final int PATH_TYPE_CLOSE = 1;\n  private static final int PATH_TYPE_CURVETO = 3;\n  private static final int PATH_TYPE_LINETO = 2;\n  private static final int PATH_TYPE_MOVETO = 0;\n\n  // For color type JS and ObjectiveC definitions counterparts\n  // refer to ReactNativeART.js and RCTConvert+ART.m\n  private static final int COLOR_TYPE_SOLID_COLOR = 0;\n  private static final int COLOR_TYPE_LINEAR_GRADIENT = 1;\n  private static final int COLOR_TYPE_RADIAL_GRADIENT = 2;\n  private static final int COLOR_TYPE_PATTERN = 3;\n\n  protected @Nullable Path mPath;\n  private @Nullable String mStrokeColor;\n  private @Nullable float[] mBrushData;\n  private @Nullable float[] mStrokeDash;\n  private float mStrokeWidth = 1;\n  private int mStrokeCap = CAP_ROUND;\n  private int mStrokeJoin = JOIN_ROUND;\n\n  public ARTShapeShadowNode() { }\n\n  @ReactProp(name = \"d\")\n  public void setShapePath(@Nullable ReadableArray shapePath) {\n    float[] pathData = PropHelper.toFloatArray(shapePath);\n    mPath = createPath(pathData);\n    markUpdated();\n  }\n\n  @ReactProp(name = \"stroke\")\n  public void setStroke(@Nullable String strokeColors) {\n    mStrokeColor = strokeColors;\n    markUpdated();\n  }\n\n  @ReactProp(name = \"strokeDash\")\n  public void setStrokeDash(@Nullable ReadableArray strokeDash) {\n    mStrokeDash = PropHelper.toFloatArray(strokeDash);\n    markUpdated();\n  }\n\n  @ReactProp(name = \"fill\")\n  public void setFill(@Nullable ReadableArray fillColors) {\n    mBrushData = PropHelper.toFloatArray(fillColors);\n    markUpdated();\n  }\n\n  @ReactProp(name = \"strokeWidth\", defaultFloat = 1f)\n  public void setStrokeWidth(float strokeWidth) {\n    mStrokeWidth = strokeWidth;\n    markUpdated();\n  }\n\n  @ReactProp(name = \"strokeCap\", defaultInt = CAP_ROUND)\n  public void setStrokeCap(int strokeCap) {\n    mStrokeCap = strokeCap;\n    markUpdated();\n  }\n\n  @ReactProp(name = \"strokeJoin\", defaultInt = JOIN_ROUND)\n  public void setStrokeJoin(int strokeJoin) {\n    mStrokeJoin = strokeJoin;\n    markUpdated();\n  }\n\n  @Override\n  public void draw(Canvas canvas, Paint paint, float opacity) {\n    opacity *= mOpacity;\n    if (opacity > MIN_OPACITY_FOR_DRAW) {\n      saveAndSetupCanvas(canvas);\n      if (mPath == null) {\n        throw new JSApplicationIllegalArgumentException(\n            \"Shapes should have a valid path (d) prop\");\n      }\n      if (setupFillPaint(paint, opacity)) {\n        canvas.drawPath(mPath, paint);\n      }\n      if (setupStrokePaint(paint, opacity)) {\n        canvas.drawPath(mPath, paint);\n      }\n      restoreCanvas(canvas);\n    }\n    markUpdateSeen();\n  }\n\n  /**\n   * Sets up {@link #mPaint} according to the props set on a shadow view. Returns {@code true}\n   * if the stroke should be drawn, {@code false} if not.\n   */\n  protected boolean setupStrokePaint(Paint paint, float opacity) {\n    if (mStrokeWidth == 0 || mStrokeColor == null) {\n      return false;\n    }\n    paint.reset();\n    paint.setFlags(Paint.ANTI_ALIAS_FLAG);\n    paint.setStyle(Paint.Style.STROKE);\n    switch (mStrokeCap) {\n      case CAP_BUTT:\n        paint.setStrokeCap(Paint.Cap.BUTT);\n        break;\n      case CAP_SQUARE:\n        paint.setStrokeCap(Paint.Cap.SQUARE);\n        break;\n      case CAP_ROUND:\n        paint.setStrokeCap(Paint.Cap.ROUND);\n        break;\n      default:\n        throw new JSApplicationIllegalArgumentException(\n            \"strokeCap \" + mStrokeCap + \" unrecognized\");\n    }\n    switch (mStrokeJoin) {\n      case JOIN_MITER:\n        paint.setStrokeJoin(Paint.Join.MITER);\n        break;\n      case JOIN_BEVEL:\n        paint.setStrokeJoin(Paint.Join.BEVEL);\n        break;\n      case JOIN_ROUND:\n        paint.setStrokeJoin(Paint.Join.ROUND);\n        break;\n      default:\n        throw new JSApplicationIllegalArgumentException(\n            \"strokeJoin \" + mStrokeJoin + \" unrecognized\");\n    }\n    paint.setStrokeWidth(mStrokeWidth * mScale);\n    paint.setColor(Color.parseColor(mStrokeColor));\n    if (mStrokeDash != null && mStrokeDash.length > 0) {\n      paint.setPathEffect(new DashPathEffect(mStrokeDash, 0));\n    }\n    if (mShadowOpacity > 0) {\n      paint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mShadowColor);\n    }\n    return true;\n  }\n\n  /**\n   * Sets up {@link #mPaint} according to the props set on a shadow view. Returns {@code true}\n   * if the fill should be drawn, {@code false} if not.\n   */\n  protected boolean setupFillPaint(Paint paint, float opacity) {\n    if (mBrushData != null && mBrushData.length > 0) {\n      paint.reset();\n      paint.setFlags(Paint.ANTI_ALIAS_FLAG);\n      paint.setStyle(Paint.Style.FILL);\n      int colorType = (int) mBrushData[0];\n      switch (colorType) {\n        case COLOR_TYPE_SOLID_COLOR:\n          paint.setARGB(\n              (int) (mBrushData.length > 4 ? mBrushData[4] * opacity * 255 : opacity * 255),\n              (int) (mBrushData[1] * 255),\n              (int) (mBrushData[2] * 255),\n              (int) (mBrushData[3] * 255));\n          break;\n        case COLOR_TYPE_LINEAR_GRADIENT:\n          // For mBrushData format refer to LinearGradient and insertColorStopsIntoArray functions in ReactNativeART.js\n          if (mBrushData.length < 5) {\n            FLog.w(ReactConstants.TAG,\n              \"[ARTShapeShadowNode setupFillPaint] expects 5 elements, received \"\n              + mBrushData.length);\n            return false;\n          }\n          float gradientStartX = mBrushData[1] * mScale;\n          float gradientStartY = mBrushData[2] * mScale;\n          float gradientEndX = mBrushData[3] * mScale;\n          float gradientEndY = mBrushData[4] * mScale;\n          int stops = (mBrushData.length - 5) / 5;\n          int[] colors = null;\n          float[] positions = null;\n          if (stops > 0) {\n            colors = new int[stops];\n            positions = new float[stops];\n            for (int i=0; i<stops; i++) {\n              positions[i] = mBrushData[5 + 4*stops + i];\n              int r = (int) (255 * mBrushData[5 + 4*i + 0]);\n              int g = (int) (255 * mBrushData[5 + 4*i + 1]);\n              int b = (int) (255 * mBrushData[5 + 4*i + 2]);\n              int a = (int) (255 * mBrushData[5 + 4*i + 3]);\n              colors[i] = Color.argb(a, r, g, b);\n            }\n          }\n          paint.setShader(\n            new LinearGradient(\n              gradientStartX, gradientStartY,\n              gradientEndX, gradientEndY,\n              colors, positions,\n              Shader.TileMode.CLAMP\n            )\n          );\n          break;\n        case COLOR_TYPE_RADIAL_GRADIENT:\n          // TODO(6352048): Support radial gradient etc.\n        case COLOR_TYPE_PATTERN:\n          // TODO(6352048): Support patterns etc.\n        default:\n          FLog.w(ReactConstants.TAG, \"ART: Color type \" + colorType + \" not supported!\");\n      }\n      if (mShadowOpacity > 0) {\n        paint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mShadowColor);\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Returns the floor modulus of the float arguments. Java modulus will return a negative remainder\n   * when the divisor is negative. Modulus should always be positive. This mimics the behavior of\n   * Math.floorMod, introduced in Java 8.\n   */\n  private float modulus(float x, float y) {\n    float remainder = x % y;\n    float modulus = remainder;\n    if (remainder < 0) {\n      modulus += y;\n    }\n    return modulus;\n  }\n\n  /**\n   * Creates a {@link Path} from an array of instructions constructed by JS\n   * (see ARTSerializablePath.js). Each instruction starts with a type (see PATH_TYPE_*) followed\n   * by arguments for that instruction. For example, to create a line the instruction will be\n   * 2 (PATH_LINE_TO), x, y. This will draw a line from the last draw point (or 0,0) to x,y.\n   *\n   * @param data the array of instructions\n   * @return the {@link Path} that can be drawn to a canvas\n   */\n  private Path createPath(float[] data) {\n    Path path = new Path();\n    path.moveTo(0, 0);\n    int i = 0;\n    while (i < data.length) {\n      int type = (int) data[i++];\n      switch (type) {\n        case PATH_TYPE_MOVETO:\n          path.moveTo(data[i++] * mScale, data[i++] * mScale);\n          break;\n        case PATH_TYPE_CLOSE:\n          path.close();\n          break;\n        case PATH_TYPE_LINETO:\n          path.lineTo(data[i++] * mScale, data[i++] * mScale);\n          break;\n        case PATH_TYPE_CURVETO:\n          path.cubicTo(\n              data[i++] * mScale,\n              data[i++] * mScale,\n              data[i++] * mScale,\n              data[i++] * mScale,\n              data[i++] * mScale,\n              data[i++] * mScale);\n          break;\n        case PATH_TYPE_ARC:\n        {\n          float x = data[i++] * mScale;\n          float y = data[i++] * mScale;\n          float r = data[i++] * mScale;\n          float start = (float) Math.toDegrees(data[i++]);\n          float end = (float) Math.toDegrees(data[i++]);\n\n          boolean counterClockwise = !(data[i++] == 1f);\n          float sweep = end - start;\n          if (Math.abs(sweep) >= 360) {\n            path.addCircle(x, y, r, counterClockwise ? Path.Direction.CCW : Path.Direction.CW);\n          } else {\n            sweep = modulus(sweep, 360);\n            if (counterClockwise && sweep < 360) {\n              // Counter-clockwise sweeps are negative\n              sweep = -1 * (360 - sweep);\n            }\n\n            RectF oval = new RectF(x - r, y - r, x + r, y + r);\n            path.arcTo(oval, start, sweep);\n          }\n          break;\n        }\n        default:\n          throw new JSApplicationIllegalArgumentException(\n              \"Unrecognized drawing instruction \" + type);\n      }\n    }\n    return path;\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTShapeViewManager.java",
    "content": "// Copyright (c) Facebook, Inc. and its affiliates.\n\n// This source code is licensed under the MIT license found in the\n// LICENSE file in the root directory of this source tree.\n\npackage com.reactnativecommunity.art;\n\nimport com.facebook.react.module.annotations.ReactModule;\n\n/**\n * ViewManager for shadowed ART shape views.\n */\n@ReactModule(name = ARTRenderableViewManager.CLASS_SHAPE)\npublic class ARTShapeViewManager extends ARTRenderableViewManager {\n\n  /* package */ ARTShapeViewManager() {\n    super(CLASS_SHAPE);\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTSurfaceView.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport android.content.Context;\nimport android.view.TextureView;\n\n/**\n * Custom {@link View} implementation that draws an ARTSurface React view and its children.\n */\npublic class ARTSurfaceView extends TextureView {\n  public ARTSurfaceView(Context context) {\n    super(context);\n    setOpaque(false);\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTSurfaceViewManager.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport com.facebook.yoga.YogaMeasureMode;\nimport com.facebook.yoga.YogaMeasureFunction;\nimport com.facebook.yoga.YogaNode;\nimport com.facebook.react.module.annotations.ReactModule;\nimport com.facebook.react.uimanager.BaseViewManager;\nimport com.facebook.react.uimanager.ThemedReactContext;\n\n/**\n * ViewManager for ARTSurfaceView React views. Renders as a {@link ARTSurfaceView} and handles\n * invalidating the native view on shadow view updates happening in the underlying tree.\n */\n@ReactModule(name = ARTSurfaceViewManager.REACT_CLASS)\npublic class ARTSurfaceViewManager extends\n    BaseViewManager<ARTSurfaceView, ARTSurfaceViewShadowNode> {\n\n  public static final String REACT_CLASS = \"ARTSurfaceView\";\n\n  private static final YogaMeasureFunction MEASURE_FUNCTION = new YogaMeasureFunction() {\n    @Override\n    public long measure(\n        YogaNode node,\n        float width,\n        YogaMeasureMode widthMode,\n        float height,\n        YogaMeasureMode heightMode) {\n      throw new IllegalStateException(\"SurfaceView should have explicit width and height set\");\n    }\n  };\n\n  @Override\n  public String getName() {\n    return REACT_CLASS;\n  }\n\n  @Override\n  public ARTSurfaceViewShadowNode createShadowNodeInstance() {\n    ARTSurfaceViewShadowNode node = new ARTSurfaceViewShadowNode();\n    node.setMeasureFunction(MEASURE_FUNCTION);\n    return node;\n  }\n\n  @Override\n  public Class<ARTSurfaceViewShadowNode> getShadowNodeClass() {\n    return ARTSurfaceViewShadowNode.class;\n  }\n\n  @Override\n  protected ARTSurfaceView createViewInstance(ThemedReactContext reactContext) {\n    return new ARTSurfaceView(reactContext);\n  }\n\n  @Override\n  public void updateExtraData(ARTSurfaceView root, Object extraData) {\n    ARTSurfaceViewShadowNode shadowNode = (ARTSurfaceViewShadowNode) extraData;\n    shadowNode.setupSurfaceTextureListener(root);\n  }\n\n  @Override\n  public void setBackgroundColor(ARTSurfaceView view, int backgroundColor) {\n    // As of Android N TextureView does not support calling setBackground on it.\n    // It will also throw an exception when target SDK is set to N or higher.\n\n    // Setting the background color for this view is handled in the shadow node.\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTSurfaceViewShadowNode.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport javax.annotation.Nullable;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Color;\nimport android.view.Surface;\nimport android.graphics.PorterDuff;\nimport android.graphics.SurfaceTexture;\nimport android.view.TextureView;\nimport android.os.Build;\n\nimport com.facebook.common.logging.FLog;\nimport com.facebook.react.common.ReactConstants;\nimport com.facebook.react.uimanager.LayoutShadowNode;\nimport com.facebook.react.uimanager.UIViewOperationQueue;\nimport com.facebook.react.uimanager.ReactShadowNode;\nimport com.facebook.react.uimanager.ViewProps;\nimport com.facebook.react.uimanager.ThemedReactContext;\nimport com.facebook.react.uimanager.annotations.ReactProp;\nimport com.facebook.react.bridge.LifecycleEventListener;\n\n/**\n * Shadow node for ART virtual tree root - ARTSurfaceView\n */\npublic class ARTSurfaceViewShadowNode extends LayoutShadowNode\n  implements TextureView.SurfaceTextureListener, LifecycleEventListener {\n\n  private @Nullable Surface mSurface;\n\n  private @Nullable Integer mBackgroundColor;\n\n  @ReactProp(name = ViewProps.BACKGROUND_COLOR, customType = \"Color\")\n  public void setBackgroundColor(Integer color) {\n    mBackgroundColor = color;\n    markUpdated();\n  }\n\n  @Override\n  public boolean isVirtual() {\n    return false;\n  }\n\n  @Override\n  public boolean isVirtualAnchor() {\n    return true;\n  }\n\n  @Override\n  public void onCollectExtraUpdates(UIViewOperationQueue uiUpdater) {\n    super.onCollectExtraUpdates(uiUpdater);\n    drawOutput(false);\n    uiUpdater.enqueueUpdateExtraData(getReactTag(), this);\n  }\n\n  private void drawOutput(boolean markAsUpdated) {\n    if (mSurface == null || !mSurface.isValid()) {\n      markChildrenUpdatesSeen(this);\n      return;\n    }\n\n    try {\n      Canvas canvas = mSurface.lockCanvas(null);\n      canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);\n      if (mBackgroundColor != null) {\n        canvas.drawColor(mBackgroundColor);\n      }\n\n      Paint paint = new Paint();\n      for (int i = 0; i < getChildCount(); i++) {\n        ARTVirtualNode child = (ARTVirtualNode) getChildAt(i);\n        child.draw(canvas, paint, 1f);\n        if (markAsUpdated) {\n          child.markUpdated();\n        } else {\n          child.markUpdateSeen();\n        }\n      }\n\n      if (mSurface == null) {\n        return;\n      }\n      mSurface.unlockCanvasAndPost(canvas);\n    } catch (IllegalArgumentException | IllegalStateException e) {\n      FLog.e(ReactConstants.TAG, e.getClass().getSimpleName() + \" in Surface.unlockCanvasAndPost\");\n    }\n  }\n\n  public void setupSurfaceTextureListener(ARTSurfaceView surfaceView) {\n    SurfaceTexture surface = surfaceView.getSurfaceTexture();\n    surfaceView.setSurfaceTextureListener(this);\n    if (surface != null && mSurface == null) {\n      mSurface = new Surface(surface);\n      drawOutput(true);\n    }\n  }\n\n  private void markChildrenUpdatesSeen(ReactShadowNode shadowNode) {\n    for (int i = 0; i < shadowNode.getChildCount(); i++) {\n      ReactShadowNode child = shadowNode.getChildAt(i);\n      child.markUpdateSeen();\n      markChildrenUpdatesSeen(child);\n    }\n  }\n\n  @Override\n  public void setThemedContext(ThemedReactContext themedContext) {\n    super.setThemedContext(themedContext);\n    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {\n      themedContext.addLifecycleEventListener(this);\n    }\n  }\n\n  @Override\n  public void dispose() {\n    super.dispose();\n    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {\n      getThemedContext().removeLifecycleEventListener(this);\n    }\n  }\n\n  @Override\n  public void onHostResume() {\n    drawOutput(false);\n  }\n\n  @Override\n  public void onHostPause() {}\n\n  @Override\n  public void onHostDestroy() {}\n\n  @Override\n  public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {\n    mSurface = new Surface(surface);\n    drawOutput(false);\n  }\n\n  @Override\n  public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {\n    mSurface.release();\n    mSurface = null;\n    return true;\n  }\n\n  @Override\n  public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}\n\n  @Override\n  public void onSurfaceTextureUpdated(SurfaceTexture surface) {}\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTTextShadowNode.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport javax.annotation.Nullable;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Typeface;\nimport android.text.TextUtils;\n\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.bridge.ReadableMap;\nimport com.facebook.react.uimanager.annotations.ReactProp;\n\n/**\n * Shadow node for virtual ARTText view\n */\npublic class ARTTextShadowNode extends ARTShapeShadowNode {\n\n  private static final String PROP_LINES = \"lines\";\n\n  private static final String PROP_FONT = \"font\";\n  private static final String PROP_FONT_FAMILY = \"fontFamily\";\n  private static final String PROP_FONT_SIZE = \"fontSize\";\n  private static final String PROP_FONT_STYLE = \"fontStyle\";\n  private static final String PROP_FONT_WEIGHT = \"fontWeight\";\n\n  private static final int DEFAULT_FONT_SIZE = 12;\n\n  private static final int TEXT_ALIGNMENT_CENTER = 2;\n  private static final int TEXT_ALIGNMENT_LEFT = 0;\n  private static final int TEXT_ALIGNMENT_RIGHT = 1;\n\n  private @Nullable ReadableMap mFrame;\n  private int mTextAlignment = TEXT_ALIGNMENT_LEFT;\n\n  public ARTTextShadowNode() { }\n\n  @ReactProp(name = \"frame\")\n  public void setFrame(@Nullable ReadableMap frame) {\n    mFrame = frame;\n  }\n\n  @ReactProp(name = \"alignment\", defaultInt = TEXT_ALIGNMENT_LEFT)\n  public void setAlignment(int alignment) {\n    mTextAlignment = alignment;\n  }\n\n  @Override\n  public void draw(Canvas canvas, Paint paint, float opacity) {\n    if (mFrame == null) {\n      return;\n    }\n    opacity *= mOpacity;\n    if (opacity <= MIN_OPACITY_FOR_DRAW) {\n      return;\n    }\n    if (!mFrame.hasKey(PROP_LINES)) {\n      return;\n    }\n    ReadableArray linesProp = mFrame.getArray(PROP_LINES);\n    if (linesProp == null || linesProp.size() == 0) {\n      return;\n    }\n\n    // only set up the canvas if we have something to draw\n    saveAndSetupCanvas(canvas);\n    String[] lines = new String[linesProp.size()];\n    for (int i = 0; i < lines.length; i++) {\n      lines[i] = linesProp.getString(i);\n    }\n    String text = TextUtils.join(\"\\n\", lines);\n    if (setupStrokePaint(paint, opacity)) {\n      applyTextPropertiesToPaint(paint);\n      if (mPath == null) {\n        canvas.drawText(text, 0, -paint.ascent(), paint);\n      } else {\n        canvas.drawTextOnPath(text, mPath, 0, 0, paint);\n      }\n    }\n    if (setupFillPaint(paint, opacity)) {\n      applyTextPropertiesToPaint(paint);\n      if (mPath == null) {\n        canvas.drawText(text, 0, -paint.ascent(), paint);\n      } else {\n        canvas.drawTextOnPath(text, mPath, 0, 0, paint);\n      }\n    }\n    if (mShadowOpacity > 0) {\n      paint.setShadowLayer(mShadowRadius, mShadowOffsetX, mShadowOffsetY, mShadowColor);\n    }\n    restoreCanvas(canvas);\n    markUpdateSeen();\n  }\n\n  private void applyTextPropertiesToPaint(Paint paint) {\n    int alignment = mTextAlignment;\n    switch (alignment) {\n      case TEXT_ALIGNMENT_LEFT:\n        paint.setTextAlign(Paint.Align.LEFT);\n        break;\n      case TEXT_ALIGNMENT_RIGHT:\n        paint.setTextAlign(Paint.Align.RIGHT);\n        break;\n      case TEXT_ALIGNMENT_CENTER:\n        paint.setTextAlign(Paint.Align.CENTER);\n        break;\n    }\n    if (mFrame != null) {\n      if (mFrame.hasKey(PROP_FONT)) {\n        ReadableMap font = mFrame.getMap(PROP_FONT);\n        if (font != null) {\n          float fontSize = DEFAULT_FONT_SIZE;\n          if (font.hasKey(PROP_FONT_SIZE)) {\n            fontSize = (float) font.getDouble(PROP_FONT_SIZE);\n          }\n          paint.setTextSize(fontSize * mScale);\n          boolean isBold =\n              font.hasKey(PROP_FONT_WEIGHT) && \"bold\".equals(font.getString(PROP_FONT_WEIGHT));\n          boolean isItalic =\n              font.hasKey(PROP_FONT_STYLE) && \"italic\".equals(font.getString(PROP_FONT_STYLE));\n          int fontStyle;\n          if (isBold && isItalic) {\n            fontStyle = Typeface.BOLD_ITALIC;\n          } else if (isBold) {\n            fontStyle = Typeface.BOLD;\n          } else if (isItalic) {\n            fontStyle = Typeface.ITALIC;\n          } else {\n            fontStyle = Typeface.NORMAL;\n          }\n          // NB: if the font family is null / unsupported, the default one will be used\n          paint.setTypeface(Typeface.create(font.getString(PROP_FONT_FAMILY), fontStyle));\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTTextViewManager.java",
    "content": "// Copyright (c) Facebook, Inc. and its affiliates.\n\n// This source code is licensed under the MIT license found in the\n// LICENSE file in the root directory of this source tree.\n\npackage com.reactnativecommunity.art;\n\nimport com.facebook.react.module.annotations.ReactModule;\n\n/**\n * ViewManager for shadowed ART text views.\n */\n@ReactModule(name = ARTRenderableViewManager.CLASS_TEXT)\npublic class ARTTextViewManager extends ARTRenderableViewManager {\n\n  /* package */ ARTTextViewManager() {\n    super(CLASS_TEXT);\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/ARTVirtualNode.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Matrix;\nimport android.graphics.Paint;\nimport androidx.core.graphics.ColorUtils;\n\nimport com.facebook.react.bridge.JSApplicationIllegalArgumentException;\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.uimanager.DisplayMetricsHolder;\nimport com.facebook.react.uimanager.ReactShadowNodeImpl;\nimport com.facebook.react.uimanager.annotations.ReactProp;\nimport javax.annotation.Nullable;\n\n/**\n * Base class for ARTView virtual nodes: {@link ARTGroupShadowNode}, {@link ARTShapeShadowNode} and\n * indirectly for {@link ARTTextShadowNode}.\n */\npublic abstract class ARTVirtualNode extends ReactShadowNodeImpl {\n\n  protected static final float MIN_OPACITY_FOR_DRAW = 0.01f;\n\n  private static final float[] sMatrixData = new float[9];\n  private static final float[] sRawMatrix = new float[9];\n\n  protected float mOpacity = 1f;\n  private @Nullable Matrix mMatrix = new Matrix();\n  protected int mShadowColor = 0;\n  protected float mShadowOpacity = 1;\n  protected float mShadowRadius = 0;\n  protected float mShadowOffsetX = 0;\n  protected float mShadowOffsetY = 0;\n\n  protected final float mScale;\n\n  public ARTVirtualNode() {\n    mScale = DisplayMetricsHolder.getWindowDisplayMetrics().density;\n  }\n\n  @Override\n  public boolean isVirtual() {\n    return true;\n  }\n\n  public abstract void draw(Canvas canvas, Paint paint, float opacity);\n\n  /**\n   * Sets up the transform matrix on the canvas before an element is drawn.\n   *\n   * NB: for perf reasons this does not apply opacity, as that would mean creating a new canvas\n   * layer (which allocates an offscreen bitmap) and having it composited afterwards. Instead, the\n   * drawing code should apply opacity recursively.\n   *\n   * @param canvas the canvas to set up\n   */\n  protected final void saveAndSetupCanvas(Canvas canvas) {\n    canvas.save();\n    if (mMatrix != null) {\n      canvas.concat(mMatrix);\n    }\n  }\n\n  /**\n   * Restore the canvas after an element was drawn. This is always called in mirror with\n   * {@link #saveAndSetupCanvas}.\n   *\n   * @param canvas the canvas to restore\n   */\n  protected void restoreCanvas(Canvas canvas) {\n    canvas.restore();\n  }\n\n  @ReactProp(name = \"opacity\", defaultFloat = 1f)\n  public void setOpacity(float opacity) {\n    mOpacity = opacity;\n    markUpdated();\n  }\n\n  @ReactProp(name = \"transform\")\n  public void setTransform(@Nullable ReadableArray transformArray) {\n    if (transformArray != null) {\n      int matrixSize = PropHelper.toFloatArray(transformArray, sMatrixData);\n      if (matrixSize == 6) {\n        setupMatrix();\n      } else if (matrixSize != -1) {\n        throw new JSApplicationIllegalArgumentException(\"Transform matrices must be of size 6\");\n      }\n    } else {\n      mMatrix = null;\n    }\n    markUpdated();\n  }\n\n  @ReactProp(name = \"shadow\")\n  public void setShadow(@Nullable ReadableArray shadowArray) {\n    if (shadowArray != null) {\n      mShadowOpacity = (float)shadowArray.getDouble(1);\n      mShadowRadius = (float)shadowArray.getDouble(2);\n      mShadowOffsetX = (float)shadowArray.getDouble(3);\n      mShadowOffsetY = (float)shadowArray.getDouble(4);\n\n      int color = shadowArray.getInt(0);\n\n      if (mShadowOpacity < 1) {\n        color = ColorUtils.setAlphaComponent(color, (int)(mShadowOpacity * 255));\n      }\n\n      mShadowColor = color;\n\n    } else {\n      mShadowColor = 0;\n      mShadowOpacity = 0;\n      mShadowRadius = 0;\n      mShadowOffsetX = 0;\n      mShadowOffsetY = 0;\n    }\n    markUpdated();\n  }\n\n  protected void setupMatrix() {\n    sRawMatrix[0] = sMatrixData[0];\n    sRawMatrix[1] = sMatrixData[2];\n    sRawMatrix[2] = sMatrixData[4] * mScale;\n    sRawMatrix[3] = sMatrixData[1];\n    sRawMatrix[4] = sMatrixData[3];\n    sRawMatrix[5] = sMatrixData[5] * mScale;\n    sRawMatrix[6] = 0;\n    sRawMatrix[7] = 0;\n    sRawMatrix[8] = 1;\n    if (mMatrix == null) {\n      mMatrix = new Matrix();\n    }\n    mMatrix.setValues(sRawMatrix);\n  }\n}\n"
  },
  {
    "path": "android/src/main/java/com/reactnativecommunity/art/PropHelper.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\npackage com.reactnativecommunity.art;\n\nimport javax.annotation.Nullable;\n\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.uimanager.ReactStylesDiffMap;\n\n/**\n * Contains static helper methods for accessing props.\n */\n/* package */ class PropHelper {\n\n  /**\n   * Converts {@link ReadableArray} to an array of {@code float}. Returns newly created array.\n   *\n   * @return a {@code float[]} if converted successfully, or {@code null} if {@param value} was\n   * {@code null}.\n   */\n  /*package*/ static @Nullable float[] toFloatArray(@Nullable ReadableArray value) {\n    if (value != null) {\n      float[] result = new float[value.size()];\n      toFloatArray(value, result);\n      return result;\n    }\n    return null;\n  }\n\n  /**\n   * Converts given {@link ReadableArray} to an array of {@code float}. Writes result to the array\n   * passed in {@param into}. This method will write to the output array up to the number of items\n   * from the input array. If the input array is longer than output the remaining part of the input\n   * will not be converted.\n   *\n   * @param value input array\n   * @param into output array\n   * @return number of items copied from input to the output array\n   */\n  /*package*/ static int toFloatArray(ReadableArray value, float[] into) {\n    int length = value.size() > into.length ? into.length : value.size();\n    for (int i = 0; i < length; i++) {\n      into[i] = (float) value.getDouble(i);\n    }\n    return value.size();\n  }\n}\n"
  },
  {
    "path": "android/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">ReactNativeART</string>\n</resources>\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: ['module:metro-react-native-babel-preset'],\n};\n"
  },
  {
    "path": "docs/api.md",
    "content": "# API\n\n## Surface\n\nContainer for all other ART components\n\n|   Prop   |     Type     | Default |\n| :------: | :----------: | :-----: |\n|  height  |   `number`   |   `0`   |\n|  width   |   `number`   |   `0`   |\n|  style   |    `any`     |   ---   |\n| children | `React.Node` |   ---   |\n\n```jsx\nimport {Surface} from '@react-native-community/art';\n\nfunction Heart() {\n  return (\n    <Surface width={500} height={500}>\n      {renderARTShapes()}\n    </Surface>\n  );\n}\n```\n\n## Group\n\nContainer to combine shapes or other groups into hierarchies that can be transformed as a set.\n\n|       Prop        |                 Type                  | Default |\n| :---------------: | :-----------------------------------: | :-----: |\n|  ...opacityProps  |   [`OpacityProps`](###OpacityProps)   |   ---   |\n| ...transformProps | [`TransformProps`](###TransformProps) |   ---   |\n|  ...shadowProps   |    [`ShadowProps`](###ShadowProps)    |   ---   |\n|     children      |             `React.Node`              |   ---   |\n\n```jsx\nimport {Surface, Group} from '@react-native-community/art';\n\nfunction GrouppedHearts() {\n  return (\n    <Surface width={500} height={500}>\n      <Group>{renderARTGroupContents()}</Group>\n    </Surface>\n  );\n}\n```\n\n## Shape\n\nUsed to draw arbitrary vector shapes from Path. Shape implements Transform as a mixin which means it has all transform methods available for moving, scaling and rotating a shape.\n\n|       Prop        |                 Type                  |  Default  |\n| :---------------: | :-----------------------------------: | :-------: |\n|  ...opacityProps  |   [`OpacityProps`](###OpacityProps)   |    ---    |\n| ...transformProps | [`TransformProps`](###TransformProps) |    ---    |\n|  ...shadowProps   |    [`ShadowProps`](###ShadowProps)    |    ---    |\n|        fill        |           `string \\| Brush`           |    ---    |\n|      stroke       |               `string`                |    ---    |\n|     strokeCap     |    `'butt' \\| 'square' \\| 'round'`    | `'round'` |\n|    strokeDash     |            `Array<number>`            |    ---    |\n|    strokeJoin     |    `'miter' \\| 'bevel' \\| 'round'`    | `'round'` |\n|    strokeWidth    |               `number`                |    `1`    |\n|         d         |           `string \\| Path`            |    ---    |\n|       width       |               `number`                |    `0`    |\n|      height       |               `number`                |    `0`    |\n|     children      |             `React.Node`              |    ---    |\n\n```jsx\nimport {Surface, Shape, Path} from '@react-native-community/art';\n\nfunction SomeShape() {\n  return (\n    <Surface width={500} height={500}>\n      <Shape d={new Path().moveTo(0, 0).lineTo(200, 200)} fill=\"#d39494\" />\n    </Surface>\n  );\n}\n```\n\n## Text\n\nText component creates a shape based on text content using native text rendering.\n\n|       Prop        |                 Type                  |  Default  |\n| :---------------: | :-----------------------------------: | :-------: |\n|  ...opacityProps  |   [`OpacityProps`](###OpacityProps)   |    ---    |\n| ...transformProps | [`TransformProps`](###TransformProps) |    ---    |\n|  ...shadowProps   |    [`ShadowProps`](###ShadowProps)    |    ---    |\n|        fill        |           `string \\| Brush`           |    ---    |\n|      stroke       |               `string`                |    ---    |\n|     strokeCap     |    `'butt' \\| 'square' \\| 'round'`    | `'round'` |\n|    strokeDash     |            `Array<number>`            |    ---    |\n|    strokeJoin     |    `'miter' \\| 'bevel' \\| 'round'`    | `'round'` |\n|    strokeWidth    |               `number`                |    `1`    |\n|       width       |               `number`                |    `0`    |\n|      height       |               `number`                |    `0`    |\n|     alignment     |    `'center' \\| 'left' \\| 'right'`    | `'left'`  |\n|       font        |           `string \\| Font`            |    ---    |\n|       path        |           `string \\| Path`            |    ---    |\n|     children      |       `string \\| Array<string>`       |    ---    |\n\n## Path\n\nGenerate an SVG `path` that you can pass to the `Shape` element.\n\n### `constructor`\n\n```jsx\nnew Path(path: string | Path)\n```\n\n### `move`\n\nMove current context from current position by `x` and `y`.\n\n```jsx\nfunction move(x: number, y: number): Path;\n```\n\n### `moveTo`\n\nMove current context from current position to absolute coordinate `x` and `y`.\n\n```jsx\nfunction moveTo(x: number, y: number): Path;\n```\n\n### `line`\n\nDraw a line from current position to relative `x` and `y`.\n\n```jsx\nfunction line(x: number, y: number): Path;\n```\n\n### `lineTo`\n\nDraw a line from current poistion to absolute coordinate `x` and `y`.\n\n```jsx\nfunction lineTo(x: number, y: number): Path;\n```\n\n### `curve`\n\nDraw a cubic bezier curve to relative position.\n\n```jsx\nfunction curve(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  deltaX: number,\n  deltaY: number,\n): Path;\n```\n\n### `curveTo`\n\nDraw a bezier curve to absolute position.\n\n```jsx\nfunction curveTo(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  deltaX: number,\n  deltaY: number,\n): Path\n```\n\n### `arc`\n\nDraw an arc with specific arguments.\n\n```jsx\nfunction arc(\n  x: number,\n  y: number,\n  xRadius: number,\n  yRadius: number,\n  outer?: boolean,\n  counterClockWise?: boolean,\n  rotation?: number,\n): Path;\n```\n\n### `arcTo`\n\nDraw an arc to absolute coordinates.\n\n```jsx\nfunction arcTo(\n  x: number,\n  y: number,\n  xRadius: number,\n  yRadius: number,\n  outer?: boolean,\n  counterClockWise?: boolean,\n  rotation?: number,\n): Path;\n```\n\n### `counterArc`\n\nSame as `arc`, opposite clockwise.\n\n### `counterArcTo`\n\nSame as `arcTo`, opposite clockwise.\n\n### `close`\n\nDraws a line to the first point in the current sub-path and begins a new sub-path.\n\n```jsx\nfunction close(): Path;\n```\n\n### `reset`\n\nReset the current path.\n\n```jsx\nfunction reset(): Path;\n```\n\n### `toJSON`\n\nReturn the current path points, which can be used on Shape d attribute.\n\n```jsx\nfunction toJSON() => Array<number | string>;\n```\n\n## LinearGradient\n\nCreates a linear gradient fill.\n\n```jsx\nfunction LinearGradient({\n  stops: GradientStops,\n  x1?: number,\n  y1?: number,\n  x2?: number,\n  y2?: number,\n}): Brush;\n```\n\n## RadialGradient\n\nCreates a radial gradient fill.\n\n```jsx\nfunction RadialGradient({\n  stops: GradientStops,\n  x1?: number,\n  y1?: number,\n  x2?: number,\n  y2?: number,\n}): Brush;\n```\n\n## Pattern\n\nCreates a pattern fill.\n\n> _This component is not exactly working as expected. [More context here.](https://github.com/facebook/react-native/issues/1462)_\n\n```jsx\nfunction Pattern(\n  url: number | string,\n  width: number,\n  height: number,\n  left?: number,\n  top?: number,\n): Brush;\n```\n\n## Transform\n\nGenerate a transform that can applied to ART elements.\n\n[Transform docs](https://github.com/sebmarkbage/art/blob/842d2d56c6436adc0bbb0c065a296f295b95bc0a/docs/ART/ART.Transform.md)\n\n## ClippingRectangle\n\nControl display area of graphic.\n\n|      Prop       |      Type      | Default |\n| :-------------: | :------------: | :-----: |\n| ...opacityProps | `OpacityProps` |   ---   |\n|        x        |    `number`    |   `0`   |\n|        y        |    `number`    |   `0`   |\n|      width      |    `number`    |   `0`   |\n|     height      |    `number`    |   `0`   |\n|    children     |  `React.Node`  |   ---   |\n\n```jsx\nimport React from 'react';\nimport {\n  Surface,\n  ClippingRectangle,\n  Shape,\n  Path,\n} from '@react-native-community/art';\n\nfunction Component() {\n  return (\n    <Surface width={200} height={200}>\n      <ClippingRectangle width={20} height={20} x={100} y={100}>\n        <Shape\n          d={new Path().moveTo(0, 0).lineTo(200, 200)}\n          stroke=\"black\"\n          strokeWidth={10}\n        />\n      </ClippingRectangle>\n    </Surface>\n  );\n}\n```\n\n## Common types\n\n### OpacityProps\n\n|  Prop   |   Type    | Default |\n| :-----: | :-------: | :-----: |\n| visible | `boolean` | `true`  |\n| opacity | `number`  |   ---   |\n\n### TransformObject\n\n| Prop |   Type   | Default |\n| :--: | :------: | :-----: |\n|  y   | `number` |   `0`   |\n|  x   | `number` |   `0`   |\n|  yy  | `number` |   `1`   |\n|  xx  | `number` |   `1`   |\n|  yx  | `number` |   `0`   |\n|  xy  | `number` |   `0`   |\n\n### TransformProps\n\n|   Prop    |       Type        | Default |\n| :-------: | :---------------: | :-----: |\n|  scaleX   |     `number`      |   `1`   |\n|  scaleY   |     `number`      |   `1`   |\n|   scale   |     `number`      |   ---   |\n|     x     |     `number`      |   `0`   |\n|     y     |     `number`      |   `0`   |\n| rotation  |     `number`      |   `0`   |\n|  originX  |     `number`      |   ---   |\n|  originY  |     `number`      |   ---   |\n| transform | `TransformObject` |   ---   |\n\n### ShadowProps\n\n|     Prop      |         Type         | Default  |\n| :-----------: | :------------------: | :------: |\n| shadowOpacity |       `number`       |    `1`   |\n| shadowColor   |       `string`       |  `black` |\n| shadowRadius  |       `number`       |    `0`   |\n| shadowOffset  | `ShadowOffsetObject` |    ---   |\n\n### ShadowOffsetObject\n\n| Prop |   Type   | Default |\n| :--: | :------: | :-----: |\n|  y   | `number` |   `0`   |\n|  x   | `number` |   `0`   |\n\n### Font\n\n|    Prop    |   Type   | Default |\n| :--------: | :------: | :-----: |\n| fontFamily | `string` |   ---   |\n|  fontSize  | `number` |  `12`   |\n| fontWeight | `string` | `'400'` |\n| fontStyle  | `string` |   ---   |\n"
  },
  {
    "path": "example/App.js",
    "content": "// @flow\nimport React from 'react';\nimport {StyleSheet, ScrollView, SafeAreaView} from 'react-native';\nimport Heart from './components/Heart';\nimport CustomShape from './components/CustomShape';\nimport CustomText from './components/CustomText';\n\nexport default function App() {\n  return (\n    <SafeAreaView style={styles.container}>\n      <ScrollView>\n        <CustomText />\n        <Heart />\n        <CustomShape />\n      </ScrollView>\n    </SafeAreaView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flexGrow: 1,\n    backgroundColor: '#F5FCFF',\n  },\n});\n"
  },
  {
    "path": "example/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation\n *   entryFile: \"index.android.js\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    entryFile: \"index.js\"\n]\n\napply from: \"../../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.example\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits\n            def versionCodes = [\"armeabi-v7a\":1, \"x86\":2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    implementation \"com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}\"\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n    implementation project(':react-native-art')\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n"
  },
  {
    "path": "example/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "example/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/java/com/example/MainActivity.java",
    "content": "package com.example;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n    /**\n     * Returns the name of the main component registered from JavaScript.\n     * This is used to schedule rendering of the component.\n     */\n    @Override\n    protected String getMainComponentName() {\n        return \"example\";\n    }\n}\n"
  },
  {
    "path": "example/android/app/src/main/java/com/example/MainApplication.java",
    "content": "package com.example;\n\nimport android.app.Application;\n\nimport com.reactnativecommunity.art.ARTPackage;\n\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.shell.MainReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage(),\n          new ARTPackage()\n      );\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return \"example/index\";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n  }\n}\n"
  },
  {
    "path": "example/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">example</string>\n</resources>\n"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "example/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n        supportLibVersion = \"28.0.0\"\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:3.4.0\")\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url \"$rootDir/../../node_modules/react-native/android\"\n        }\n    }\n}\n"
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "example/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "example/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "example/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      http://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "example/android/keystores/debug.keystore.properties",
    "content": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "example/android/settings.gradle",
    "content": "rootProject.name = 'example'\n\ninclude ':app'\ninclude ':react-native-art'\nproject(':react-native-art').projectDir = new File(rootProject.projectDir, '../../android')\n"
  },
  {
    "path": "example/app.json",
    "content": "{\n  \"name\": \"example\",\n  \"displayName\": \"example\"\n}"
  },
  {
    "path": "example/components/CustomShape.js",
    "content": "// @flow\nimport React from 'react';\nimport {StyleSheet, Dimensions} from 'react-native';\nimport {\n  Surface,\n  Shape,\n  Group,\n  Path,\n  Transform,\n  LinearGradient,\n} from '@react-native-community/art';\n\nexport default function CustomShape() {\n  const surfaceWidth = Dimensions.get('window').width;\n  const surfaceHeight = surfaceWidth / 2;\n  const gradient = new LinearGradient(\n    {\n      '.5': 'blue',\n      '1': 'black',\n    },\n    0,\n    0,\n    250,\n    250,\n  );\n\n  const path = new Path()\n    .line(40, 200)\n    .line(150, 80)\n    .line(150, -80)\n    .line(40, -200)\n    .line(-190, 120);\n\n  return (\n    <Surface width={surfaceWidth} height={surfaceHeight} style={styles.surface}>\n      <Group\n        transform={new Transform().scale(0.5, 0.5)}\n        x={surfaceWidth / 2 - 90}\n        y={surfaceHeight / 2 - 70}>\n        <Shape d={path} fill={gradient} />\n      </Group>\n    </Surface>\n  );\n}\nconst styles = StyleSheet.create({\n  surface: {\n    backgroundColor: '#d39494',\n  },\n});\n"
  },
  {
    "path": "example/components/CustomText.js",
    "content": "import React from 'react';\nimport {Dimensions, StyleSheet} from 'react-native';\nimport {Surface, Text, Group} from '@react-native-community/art';\n\nconst SHADOW = {\n  shadowOpacity: 0.5,\n  shadowColor: 'blue',\n  shadowRadius: 10,\n  shadowOffset: {x: 4, y: 4},\n};\n\nexport default function CustomText() {\n  const surfaceWidth = Dimensions.get('window').width;\n  const surfaceHeight = surfaceWidth / 3;\n\n  return (\n    <Surface width={surfaceWidth} height={surfaceHeight} style={styles.surface}>\n      <Group x={surfaceWidth / 2 - 100} y={surfaceHeight / 2}>\n        <Text\n          font={'18px \"Helvetica Neue\", \"Helvetica\", Arial'}\n          fill=\"#000000\"\n          {...SHADOW}>\n          React Native Community\n        </Text>\n      </Group>\n    </Surface>\n  );\n}\n\nconst styles = StyleSheet.create({\n  surface: {\n    backgroundColor: 'transparent',\n  },\n});\n"
  },
  {
    "path": "example/components/Heart.js",
    "content": "// @flow\nimport React from 'react';\nimport {StyleSheet, Dimensions} from 'react-native';\nimport {\n  Surface,\n  Shape,\n  Group,\n  RadialGradient,\n} from '@react-native-community/art';\n\nconst HEART_SHAPE =\n  'M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z';\n\nconst SHADOW = {\n  shadowOpacity: 1,\n  shadowColor: 'red',\n  shadowRadius: 8,\n  shadowOffset: {x: 0, y: 0},\n};\n\nexport default function Heart() {\n  const surfaceDimensions = Dimensions.get('window').width;\n  const gradient = new RadialGradient(\n    {\n      '.1': 'red',\n      '0.4': '#8c0505',\n      '1': '#d39494',\n    },\n    50,\n    50,\n    20,\n    20,\n    50,\n    50,\n  );\n\n  return (\n    <Surface\n      width={surfaceDimensions}\n      height={surfaceDimensions / 2}\n      style={styles.surface}>\n      <Group\n        x={surfaceDimensions / 2 - 50}\n        y={surfaceDimensions / 4 - 50}\n        visible={true}>\n        <Shape\n          d={HEART_SHAPE}\n          strokeWidth={5}\n          stroke={'#00ff00'}\n          fill={gradient}\n          visible={true}\n          {...SHADOW}\n        />\n      </Group>\n    </Surface>\n  );\n}\n\nconst styles = StyleSheet.create({\n  surface: {\n    backgroundColor: 'black',\n  },\n});\n"
  },
  {
    "path": "example/index.js",
    "content": "/**\n * @format\n */\n\nimport {AppRegistry} from 'react-native';\nimport App from './App';\nimport {name as appName} from './app.json';\n\nAppRegistry.registerComponent(appName, () => App);\n"
  },
  {
    "path": "example/ios/example/AppDelegate.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "example/ios/example/AppDelegate.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  NSURL *jsCodeLocation;\n\n  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"example/index\" fallbackResource:nil];\n\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation\n                                                moduleName:@\"example\"\n                                                initialProperties:nil\n                                                launchOptions:launchOptions];\n  rootView.backgroundColor = [UIColor blackColor];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "example/ios/example/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"example\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "example/ios/example/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/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>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>example</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n    <key>NSAllowsArbitraryLoads</key>\n    <true/>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/example/main.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "example/ios/example-tvOS/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>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>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>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/example.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };\n\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };\n\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };\n\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };\n\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };\n\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };\n\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };\n\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; };\n\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; };\n\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; };\n\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };\n\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };\n\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };\n\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };\n\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };\n\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };\n\t\tE73EAAC822AA4D8E0051DFD6 /* libART.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E73EAA9822AA4D7C0051DFD6 /* libART.a */; };\n\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };\n\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTActionSheet;\n\t\t};\n\t\t00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTGeolocation;\n\t\t};\n\t\t00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5115D1A9E6B3D00147676;\n\t\t\tremoteInfo = RCTImage;\n\t\t};\n\t\t00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B511DB1A9E6C8500147676;\n\t\t\tremoteInfo = RCTNetwork;\n\t\t};\n\t\t00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 832C81801AAF6DEF007FA2F7;\n\t\t\tremoteInfo = RCTVibration;\n\t\t};\n\t\t139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTSettings;\n\t\t};\n\t\t139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3C86DF461ADF2C930047B81A;\n\t\t\tremoteInfo = RCTWebSocket;\n\t\t};\n\t\t146834031AC3E56700842450 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;\n\t\t\tremoteInfo = React;\n\t\t};\n\t\t2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ADD01A681E09402E00F6D226;\n\t\t\tremoteInfo = \"RCTBlob-tvOS\";\n\t\t};\n\t\t2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D001F3B181A0099AA32;\n\t\t\tremoteInfo = fishhook;\n\t\t};\n\t\t2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32;\n\t\t\tremoteInfo = \"fishhook-tvOS\";\n\t\t};\n\t\t2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BDC1FC498900052F4D5;\n\t\t\tremoteInfo = jsinspector;\n\t\t};\n\t\t2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;\n\t\t\tremoteInfo = \"jsinspector-tvOS\";\n\t\t};\n\t\t2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7ECE1E25DB7D00323FB7;\n\t\t\tremoteInfo = \"third-party\";\n\t\t};\n\t\t2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D3C1EBD27B6005632C8;\n\t\t\tremoteInfo = \"third-party-tvOS\";\n\t\t};\n\t\t2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7E881E25C6D100323FB7;\n\t\t\tremoteInfo = \"double-conversion\";\n\t\t};\n\t\t2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D621EBD27B9005632C8;\n\t\t\tremoteInfo = \"double-conversion-tvOS\";\n\t\t};\n\t\t3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A283A1D9B042B00D4039D;\n\t\t\tremoteInfo = \"RCTImage-tvOS\";\n\t\t};\n\t\t3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28471D9B043800D4039D;\n\t\t\tremoteInfo = \"RCTLinking-tvOS\";\n\t\t};\n\t\t3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28541D9B044C00D4039D;\n\t\t\tremoteInfo = \"RCTNetwork-tvOS\";\n\t\t};\n\t\t3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28611D9B046600D4039D;\n\t\t\tremoteInfo = \"RCTSettings-tvOS\";\n\t\t};\n\t\t3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A287B1D9B048500D4039D;\n\t\t\tremoteInfo = \"RCTText-tvOS\";\n\t\t};\n\t\t3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28881D9B049200D4039D;\n\t\t\tremoteInfo = \"RCTWebSocket-tvOS\";\n\t\t};\n\t\t3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28131D9B038B00D4039D;\n\t\t\tremoteInfo = \"React-tvOS\";\n\t\t};\n\t\t3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C059A1DE3340900C268FA;\n\t\t\tremoteInfo = yoga;\n\t\t};\n\t\t3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C06751DE3340C00C268FA;\n\t\t\tremoteInfo = \"yoga-tvOS\";\n\t\t};\n\t\t3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;\n\t\t\tremoteInfo = cxxreact;\n\t\t};\n\t\t3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;\n\t\t\tremoteInfo = \"cxxreact-tvOS\";\n\t\t};\n\t\t5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTAnimation;\n\t\t};\n\t\t5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28201D9B03D100D4039D;\n\t\t\tremoteInfo = \"RCTAnimation-tvOS\";\n\t\t};\n\t\t78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTLinking;\n\t\t};\n\t\t832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5119B1A9E6C1200147676;\n\t\t\tremoteInfo = RCTText;\n\t\t};\n\t\tADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 358F4ED71D1E81A9004DF814;\n\t\t\tremoteInfo = RCTBlob;\n\t\t};\n\t\tE73EAA9722AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = E73EAA9222AA4D7C0051DFD6 /* ART.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C;\n\t\t\tremoteInfo = ART;\n\t\t};\n\t\tE73EAA9922AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = E73EAA9222AA4D7C0051DFD6 /* ART.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 323A12871E5F266B004975B8;\n\t\t\tremoteInfo = \"ART-tvOS\";\n\t\t};\n\t\tE73EAAC022AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;\n\t\t\tremoteInfo = jsi;\n\t\t};\n\t\tE73EAAC222AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC73B214B45A300DD5AC8;\n\t\t\tremoteInfo = jsiexecutor;\n\t\t};\n\t\tE73EAAC422AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FB6214C9A0900B7C4FE;\n\t\t\tremoteInfo = \"jsi-tvOS\";\n\t\t};\n\t\tE73EAAC622AA4D7C0051DFD6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FEE214C9CF800B7C4FE;\n\t\t\tremoteInfo = \"jsiexecutor-tvOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTActionSheet.xcodeproj; path = \"../../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTGeolocation.xcodeproj; path = \"../../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTImage.xcodeproj; path = \"../../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTNetwork.xcodeproj; path = \"../../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVibration.xcodeproj; path = \"../../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTSettings.xcodeproj; path = \"../../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTWebSocket.xcodeproj; path = \"../../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = \"<group>\"; };\n\t\t146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = React.xcodeproj; path = \"../../node_modules/react-native/React/React.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"example-tvOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTAnimation.xcodeproj; path = \"../../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTLinking.xcodeproj; path = \"../../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTText.xcodeproj; path = \"../../node_modules/react-native/Libraries/Text/RCTText.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTBlob.xcodeproj; path = \"../../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tE73EAA9222AA4D7C0051DFD6 /* ART.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = ART.xcodeproj; path = ../../ios/ART.xcodeproj; sourceTree = \"<group>\"; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\tE73EAAC822AA4D8E0051DFD6 /* libART.a in Frameworks */,\n\t\t\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,\n\t\t\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */,\n\t\t\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,\n\t\t\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,\n\t\t\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,\n\t\t\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,\n\t\t\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,\n\t\t\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,\n\t\t\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,\n\t\t\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,\n\t\t\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */,\n\t\t\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00C302A81ABCB8CE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302B61ABCB90400DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302BC1ABCB91800DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,\n\t\t\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302D41ABCB9D200DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,\n\t\t\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302E01ABCB9EE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139105B71AF99BAD00B5F7CC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,\n\t\t\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139FDEE71B06529A00C62182 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,\n\t\t\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,\n\t\t\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */,\n\t\t\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t146834001AC3E56700842450 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t146834041AC3E56700842450 /* libReact.a */,\n\t\t\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */,\n\t\t\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */,\n\t\t\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,\n\t\t\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\tE73EAAC122AA4D7C0051DFD6 /* libjsi.a */,\n\t\t\t\tE73EAAC322AA4D7C0051DFD6 /* libjsiexecutor.a */,\n\t\t\t\tE73EAAC522AA4D7C0051DFD6 /* libjsi-tvOS.a */,\n\t\t\t\tE73EAAC722AA4D7C0051DFD6 /* libjsiexecutor-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E91572E1DD0AC6500FF2AA8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78C398B11ACF4ADC00677621 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */,\n\t\t\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE73EAA9222AA4D7C0051DFD6 /* ART.xcodeproj */,\n\t\t\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,\n\t\t\t\t146833FF1AC3E56700842450 /* React.xcodeproj */,\n\t\t\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,\n\t\t\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */,\n\t\t\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,\n\t\t\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,\n\t\t\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,\n\t\t\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,\n\t\t\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,\n\t\t\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,\n\t\t\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,\n\t\t\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341B11AAA6A8300B99B32 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */,\n\t\t\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* example */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* example.app */,\n\t\t\t\t2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tADBDB9201DFEBF0600ED6528 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */,\n\t\t\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE73EAA9322AA4D7C0051DFD6 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE73EAA9822AA4D7C0051DFD6 /* libART.a */,\n\t\t\t\tE73EAA9A22AA4D7C0051DFD6 /* libART-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t13B07F861A680F5B00A75B9A /* example */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"example\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = example;\n\t\t\tproductName = \"Hello World\";\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* example.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E47A1E0B4A5D006451C7 /* example-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"example-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E4771E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E4791E0B4A5D006451C7 /* Resources */,\n\t\t\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"example-tvOS\";\n\t\t\tproductName = \"example-tvOS\";\n\t\t\tproductReference = 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t2D02E47A1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"example\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = E73EAA9322AA4D7C0051DFD6 /* Products */;\n\t\t\t\t\tProjectRef = E73EAA9222AA4D7C0051DFD6 /* ART.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;\n\t\t\t\t\tProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */;\n\t\t\t\t\tProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 78C398B11ACF4ADC00677621 /* Products */;\n\t\t\t\t\tProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;\n\t\t\t\t\tProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 832341B11AAA6A8300B99B32 /* Products */;\n\t\t\t\t\tProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139FDEE71B06529A00C62182 /* Products */;\n\t\t\t\t\tProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 146834001AC3E56700842450 /* Products */;\n\t\t\t\t\tProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* example */,\n\t\t\t\t2D02E47A1E0B4A5D006451C7 /* example-tvOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTActionSheet.a;\n\t\t\tremoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTGeolocation.a;\n\t\t\tremoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTImage.a;\n\t\t\tremoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTNetwork.a;\n\t\t\tremoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVibration.a;\n\t\t\tremoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTSettings.a;\n\t\t\tremoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTWebSocket.a;\n\t\t\tremoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t146834041AC3E56700842450 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTBlob-tvOS.a\";\n\t\t\tremoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libfishhook.a;\n\t\t\tremoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libfishhook-tvOS.a\";\n\t\t\tremoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsinspector.a;\n\t\t\tremoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsinspector-tvOS.a\";\n\t\t\tremoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTImage-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTLinking-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTNetwork-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTSettings-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTText-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTWebSocket-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTLinking.a;\n\t\t\tremoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTText.a;\n\t\t\tremoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTBlob.a;\n\t\t\tremoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAA9822AA4D7C0051DFD6 /* libART.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libART.a;\n\t\t\tremoteRef = E73EAA9722AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAA9A22AA4D7C0051DFD6 /* libART-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libART-tvOS.a\";\n\t\t\tremoteRef = E73EAA9922AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAAC122AA4D7C0051DFD6 /* libjsi.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsi.a;\n\t\t\tremoteRef = E73EAAC022AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAAC322AA4D7C0051DFD6 /* libjsiexecutor.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsiexecutor.a;\n\t\t\tremoteRef = E73EAAC222AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAAC522AA4D7C0051DFD6 /* libjsi-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsi-tvOS.a\";\n\t\t\tremoteRef = E73EAAC422AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tE73EAAC722AA4D7C0051DFD6 /* libjsiexecutor-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsiexecutor-tvOS.a\";\n\t\t\tremoteRef = E73EAAC622AA4D7C0051DFD6 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4791E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native Code And Images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4771E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,\n\t\t\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tINFOPLIST_FILE = example/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = example;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tINFOPLIST_FILE = example/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = example;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4971E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"example-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.facebook.REACT.example-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E4981E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"example-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.facebook.REACT.example-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"example-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4971E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E4981E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\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 = \"2D2A28121D9B038B00D4039D\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React-tvOS\"\n               ReferencedContainer = \"container:../../node_modules/react-native/React/React.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 = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"example-tvOS.app\"\n               BlueprintName = \"example-tvOS\"\n               ReferencedContainer = \"container:example.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"example-tvOSTests.xctest\"\n               BlueprintName = \"example-tvOSTests\"\n               ReferencedContainer = \"container:example.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 = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"example-tvOSTests.xctest\"\n               BlueprintName = \"example-tvOSTests\"\n               ReferencedContainer = \"container:example.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"example-tvOS.app\"\n            BlueprintName = \"example-tvOS\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"example-tvOS.app\"\n            BlueprintName = \"example-tvOS\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"example-tvOS.app\"\n            BlueprintName = \"example-tvOS\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\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 = \"83CBBA2D1A601D0E00E9B192\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React\"\n               ReferencedContainer = \"container:../../node_modules/react-native/React/React.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 = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"example.app\"\n               BlueprintName = \"example\"\n               ReferencedContainer = \"container:example.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"exampleTests.xctest\"\n               BlueprintName = \"exampleTests\"\n               ReferencedContainer = \"container:example.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 = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"exampleTests.xctest\"\n               BlueprintName = \"exampleTests\"\n               ReferencedContainer = \"container:example.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"example.app\"\n            BlueprintName = \"example\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"example.app\"\n            BlueprintName = \"example\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"example.app\"\n            BlueprintName = \"example\"\n            ReferencedContainer = \"container:example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/metro.config.js",
    "content": "/**\n * Metro configuration for React Native\n * https://github.com/facebook/react-native\n *\n * @format\n */\n\nmodule.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: {\n        experimentalImportSupport: false,\n        inlineRequires: false,\n      },\n    }),\n  },\n};\n"
  },
  {
    "path": "index.d.ts",
    "content": "declare module '@react-native-community/art' {\n  import {ViewStyle, StyleProp} from 'react-native';\n  import React from 'react';\n\n  export interface ARTNodeMixin {\n    opacity?: number;\n    originX?: number;\n    originY?: number;\n    scaleX?: number;\n    scaleY?: number;\n    scale?: number;\n    title?: string;\n    x?: number;\n    y?: number;\n    visible?: boolean;\n    shadowOpacity?: number;\n    shadowColor?: string | number;\n    shadowRadius?: number;\n    shadowOffset?: {\n      x: number,\n      y: number,\n    }\n  }\n\n  export interface ARTGroupProps extends ARTNodeMixin {\n    width?: number;\n    height?: number;\n  }\n\n  export interface ARTClippingRectangleProps extends ARTNodeMixin {\n    width?: number;\n    height?: number;\n  }\n\n  export interface ARTRenderableMixin extends ARTNodeMixin {\n    fill?: string;\n    stroke?: string;\n    strokeCap?: 'butt' | 'square' | 'round';\n    strokeDash?: number[];\n    strokeJoin?: 'bevel' | 'miter' | 'round';\n    strokeWidth?: number;\n  }\n\n  export interface ARTShapeProps extends ARTRenderableMixin {\n    d: string;\n    width?: number;\n    height?: number;\n  }\n\n  export interface ARTTextProps extends ARTRenderableMixin {\n    font?: string;\n    alignment?: string;\n  }\n\n  export interface ARTSurfaceProps {\n    style?: StyleProp<ViewStyle>;\n    width: number;\n    height: number;\n  }\n\n  export class ClippingRectangle extends React.Component<ARTClippingRectangleProps> {}\n\n  export class Group extends React.Component<ARTGroupProps> {}\n\n  export class Shape extends React.Component<ARTShapeProps> {}\n\n  export class Surface extends React.Component<ARTSurfaceProps> {}\n\n  export class Text extends React.Component<ARTTextProps> {}\n}\n"
  },
  {
    "path": "ios/ART.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0CF68B051AF0549300FF9E5C /* ARTGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68ADE1AF0549300FF9E5C /* ARTGroup.m */; };\n\t\t0CF68B061AF0549300FF9E5C /* ARTNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE01AF0549300FF9E5C /* ARTNode.m */; };\n\t\t0CF68B071AF0549300FF9E5C /* ARTRenderable.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE21AF0549300FF9E5C /* ARTRenderable.m */; };\n\t\t0CF68B081AF0549300FF9E5C /* ARTShape.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE41AF0549300FF9E5C /* ARTShape.m */; };\n\t\t0CF68B091AF0549300FF9E5C /* ARTSurfaceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE61AF0549300FF9E5C /* ARTSurfaceView.m */; };\n\t\t0CF68B0A1AF0549300FF9E5C /* ARTText.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE81AF0549300FF9E5C /* ARTText.m */; };\n\t\t0CF68B0B1AF0549300FF9E5C /* ARTBrush.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AEC1AF0549300FF9E5C /* ARTBrush.m */; };\n\t\t0CF68B0C1AF0549300FF9E5C /* ARTLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AEE1AF0549300FF9E5C /* ARTLinearGradient.m */; };\n\t\t0CF68B0D1AF0549300FF9E5C /* ARTPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF01AF0549300FF9E5C /* ARTPattern.m */; };\n\t\t0CF68B0E1AF0549300FF9E5C /* ARTRadialGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF21AF0549300FF9E5C /* ARTRadialGradient.m */; };\n\t\t0CF68B0F1AF0549300FF9E5C /* ARTSolidColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF41AF0549300FF9E5C /* ARTSolidColor.m */; };\n\t\t0CF68B101AF0549300FF9E5C /* RCTConvert+ART.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF71AF0549300FF9E5C /* RCTConvert+ART.m */; };\n\t\t0CF68B111AF0549300FF9E5C /* ARTGroupManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFA1AF0549300FF9E5C /* ARTGroupManager.m */; };\n\t\t0CF68B121AF0549300FF9E5C /* ARTNodeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFC1AF0549300FF9E5C /* ARTNodeManager.m */; };\n\t\t0CF68B131AF0549300FF9E5C /* ARTRenderableManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFE1AF0549300FF9E5C /* ARTRenderableManager.m */; };\n\t\t0CF68B141AF0549300FF9E5C /* ARTShapeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B001AF0549300FF9E5C /* ARTShapeManager.m */; };\n\t\t0CF68B151AF0549300FF9E5C /* ARTSurfaceViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B021AF0549300FF9E5C /* ARTSurfaceViewManager.m */; };\n\t\t0CF68B161AF0549300FF9E5C /* ARTTextManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B041AF0549300FF9E5C /* ARTTextManager.m */; };\n\t\t325CF7AD1E5F2ABA00AC9606 /* ARTBrush.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AEC1AF0549300FF9E5C /* ARTBrush.m */; };\n\t\t325CF7AE1E5F2ABA00AC9606 /* ARTLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AEE1AF0549300FF9E5C /* ARTLinearGradient.m */; };\n\t\t325CF7AF1E5F2ABA00AC9606 /* ARTPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF01AF0549300FF9E5C /* ARTPattern.m */; };\n\t\t325CF7B01E5F2ABA00AC9606 /* ARTRadialGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF21AF0549300FF9E5C /* ARTRadialGradient.m */; };\n\t\t325CF7B11E5F2ABA00AC9606 /* ARTSolidColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF41AF0549300FF9E5C /* ARTSolidColor.m */; };\n\t\t325CF7B21E5F2ABA00AC9606 /* ARTGroupManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFA1AF0549300FF9E5C /* ARTGroupManager.m */; };\n\t\t325CF7B31E5F2ABA00AC9606 /* ARTNodeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFC1AF0549300FF9E5C /* ARTNodeManager.m */; };\n\t\t325CF7B41E5F2ABA00AC9606 /* ARTRenderableManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AFE1AF0549300FF9E5C /* ARTRenderableManager.m */; };\n\t\t325CF7B51E5F2ABA00AC9606 /* ARTShapeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B001AF0549300FF9E5C /* ARTShapeManager.m */; };\n\t\t325CF7B61E5F2ABA00AC9606 /* ARTSurfaceViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B021AF0549300FF9E5C /* ARTSurfaceViewManager.m */; };\n\t\t325CF7B71E5F2ABA00AC9606 /* ARTTextManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68B041AF0549300FF9E5C /* ARTTextManager.m */; };\n\t\t325CF7B81E5F2ABA00AC9606 /* ARTGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68ADE1AF0549300FF9E5C /* ARTGroup.m */; };\n\t\t325CF7B91E5F2ABA00AC9606 /* ARTNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE01AF0549300FF9E5C /* ARTNode.m */; };\n\t\t325CF7BA1E5F2ABA00AC9606 /* ARTRenderable.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE21AF0549300FF9E5C /* ARTRenderable.m */; };\n\t\t325CF7BB1E5F2ABA00AC9606 /* ARTShape.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE41AF0549300FF9E5C /* ARTShape.m */; };\n\t\t325CF7BC1E5F2ABA00AC9606 /* ARTSurfaceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE61AF0549300FF9E5C /* ARTSurfaceView.m */; };\n\t\t325CF7BD1E5F2ABA00AC9606 /* ARTText.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AE81AF0549300FF9E5C /* ARTText.m */; };\n\t\t325CF7BE1E5F2ABA00AC9606 /* RCTConvert+ART.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF68AF71AF0549300FF9E5C /* RCTConvert+ART.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t0CF68ABF1AF0540F00FF9E5C /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t323A12851E5F266B004975B8 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t09966EAF23996E3900E9C452 /* ARTShadow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ARTShadow.h; sourceTree = \"<group>\"; };\n\t\t0CF68AC11AF0540F00FF9E5C /* libART.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libART.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0CF68ADB1AF0549300FF9E5C /* ARTCGFloatArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTCGFloatArray.h; sourceTree = \"<group>\"; };\n\t\t0CF68ADC1AF0549300FF9E5C /* ARTContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTContainer.h; sourceTree = \"<group>\"; };\n\t\t0CF68ADD1AF0549300FF9E5C /* ARTGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTGroup.h; sourceTree = \"<group>\"; };\n\t\t0CF68ADE1AF0549300FF9E5C /* ARTGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTGroup.m; sourceTree = \"<group>\"; };\n\t\t0CF68ADF1AF0549300FF9E5C /* ARTNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTNode.h; sourceTree = \"<group>\"; };\n\t\t0CF68AE01AF0549300FF9E5C /* ARTNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTNode.m; sourceTree = \"<group>\"; };\n\t\t0CF68AE11AF0549300FF9E5C /* ARTRenderable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTRenderable.h; sourceTree = \"<group>\"; };\n\t\t0CF68AE21AF0549300FF9E5C /* ARTRenderable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTRenderable.m; sourceTree = \"<group>\"; };\n\t\t0CF68AE31AF0549300FF9E5C /* ARTShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTShape.h; sourceTree = \"<group>\"; };\n\t\t0CF68AE41AF0549300FF9E5C /* ARTShape.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTShape.m; sourceTree = \"<group>\"; };\n\t\t0CF68AE51AF0549300FF9E5C /* ARTSurfaceView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTSurfaceView.h; sourceTree = \"<group>\"; };\n\t\t0CF68AE61AF0549300FF9E5C /* ARTSurfaceView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTSurfaceView.m; sourceTree = \"<group>\"; };\n\t\t0CF68AE71AF0549300FF9E5C /* ARTText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTText.h; sourceTree = \"<group>\"; };\n\t\t0CF68AE81AF0549300FF9E5C /* ARTText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTText.m; sourceTree = \"<group>\"; };\n\t\t0CF68AE91AF0549300FF9E5C /* ARTTextFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTTextFrame.h; sourceTree = \"<group>\"; };\n\t\t0CF68AEB1AF0549300FF9E5C /* ARTBrush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTBrush.h; sourceTree = \"<group>\"; };\n\t\t0CF68AEC1AF0549300FF9E5C /* ARTBrush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTBrush.m; sourceTree = \"<group>\"; };\n\t\t0CF68AED1AF0549300FF9E5C /* ARTLinearGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTLinearGradient.h; sourceTree = \"<group>\"; };\n\t\t0CF68AEE1AF0549300FF9E5C /* ARTLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTLinearGradient.m; sourceTree = \"<group>\"; };\n\t\t0CF68AEF1AF0549300FF9E5C /* ARTPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTPattern.h; sourceTree = \"<group>\"; };\n\t\t0CF68AF01AF0549300FF9E5C /* ARTPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTPattern.m; sourceTree = \"<group>\"; };\n\t\t0CF68AF11AF0549300FF9E5C /* ARTRadialGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTRadialGradient.h; sourceTree = \"<group>\"; };\n\t\t0CF68AF21AF0549300FF9E5C /* ARTRadialGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTRadialGradient.m; sourceTree = \"<group>\"; };\n\t\t0CF68AF31AF0549300FF9E5C /* ARTSolidColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTSolidColor.h; sourceTree = \"<group>\"; };\n\t\t0CF68AF41AF0549300FF9E5C /* ARTSolidColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTSolidColor.m; sourceTree = \"<group>\"; };\n\t\t0CF68AF61AF0549300FF9E5C /* RCTConvert+ART.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"RCTConvert+ART.h\"; sourceTree = \"<group>\"; };\n\t\t0CF68AF71AF0549300FF9E5C /* RCTConvert+ART.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"RCTConvert+ART.m\"; sourceTree = \"<group>\"; };\n\t\t0CF68AF91AF0549300FF9E5C /* ARTGroupManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTGroupManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68AFA1AF0549300FF9E5C /* ARTGroupManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTGroupManager.m; sourceTree = \"<group>\"; };\n\t\t0CF68AFB1AF0549300FF9E5C /* ARTNodeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTNodeManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68AFC1AF0549300FF9E5C /* ARTNodeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTNodeManager.m; sourceTree = \"<group>\"; };\n\t\t0CF68AFD1AF0549300FF9E5C /* ARTRenderableManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTRenderableManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68AFE1AF0549300FF9E5C /* ARTRenderableManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTRenderableManager.m; sourceTree = \"<group>\"; };\n\t\t0CF68AFF1AF0549300FF9E5C /* ARTShapeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTShapeManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68B001AF0549300FF9E5C /* ARTShapeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTShapeManager.m; sourceTree = \"<group>\"; };\n\t\t0CF68B011AF0549300FF9E5C /* ARTSurfaceViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTSurfaceViewManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68B021AF0549300FF9E5C /* ARTSurfaceViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTSurfaceViewManager.m; sourceTree = \"<group>\"; };\n\t\t0CF68B031AF0549300FF9E5C /* ARTTextManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARTTextManager.h; sourceTree = \"<group>\"; };\n\t\t0CF68B041AF0549300FF9E5C /* ARTTextManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ARTTextManager.m; sourceTree = \"<group>\"; };\n\t\t323A12871E5F266B004975B8 /* libART-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libART-tvOS.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0CF68ABE1AF0540F00FF9E5C /* 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\t323A12841E5F266B004975B8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0CF68AB81AF0540F00FF9E5C = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t09966EAF23996E3900E9C452 /* ARTShadow.h */,\n\t\t\t\t0CF68AEA1AF0549300FF9E5C /* Brushes */,\n\t\t\t\t0CF68AF81AF0549300FF9E5C /* ViewManagers */,\n\t\t\t\t0CF68ADB1AF0549300FF9E5C /* ARTCGFloatArray.h */,\n\t\t\t\t0CF68ADC1AF0549300FF9E5C /* ARTContainer.h */,\n\t\t\t\t0CF68ADD1AF0549300FF9E5C /* ARTGroup.h */,\n\t\t\t\t0CF68ADE1AF0549300FF9E5C /* ARTGroup.m */,\n\t\t\t\t0CF68ADF1AF0549300FF9E5C /* ARTNode.h */,\n\t\t\t\t0CF68AE01AF0549300FF9E5C /* ARTNode.m */,\n\t\t\t\t0CF68AE11AF0549300FF9E5C /* ARTRenderable.h */,\n\t\t\t\t0CF68AE21AF0549300FF9E5C /* ARTRenderable.m */,\n\t\t\t\t0CF68AE31AF0549300FF9E5C /* ARTShape.h */,\n\t\t\t\t0CF68AE41AF0549300FF9E5C /* ARTShape.m */,\n\t\t\t\t0CF68AE51AF0549300FF9E5C /* ARTSurfaceView.h */,\n\t\t\t\t0CF68AE61AF0549300FF9E5C /* ARTSurfaceView.m */,\n\t\t\t\t0CF68AE71AF0549300FF9E5C /* ARTText.h */,\n\t\t\t\t0CF68AE81AF0549300FF9E5C /* ARTText.m */,\n\t\t\t\t0CF68AE91AF0549300FF9E5C /* ARTTextFrame.h */,\n\t\t\t\t0CF68AF61AF0549300FF9E5C /* RCTConvert+ART.h */,\n\t\t\t\t0CF68AF71AF0549300FF9E5C /* RCTConvert+ART.m */,\n\t\t\t\t0CF68AC21AF0540F00FF9E5C /* Products */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t0CF68AC21AF0540F00FF9E5C /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CF68AC11AF0540F00FF9E5C /* libART.a */,\n\t\t\t\t323A12871E5F266B004975B8 /* libART-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CF68AEA1AF0549300FF9E5C /* Brushes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CF68AEB1AF0549300FF9E5C /* ARTBrush.h */,\n\t\t\t\t0CF68AEC1AF0549300FF9E5C /* ARTBrush.m */,\n\t\t\t\t0CF68AED1AF0549300FF9E5C /* ARTLinearGradient.h */,\n\t\t\t\t0CF68AEE1AF0549300FF9E5C /* ARTLinearGradient.m */,\n\t\t\t\t0CF68AEF1AF0549300FF9E5C /* ARTPattern.h */,\n\t\t\t\t0CF68AF01AF0549300FF9E5C /* ARTPattern.m */,\n\t\t\t\t0CF68AF11AF0549300FF9E5C /* ARTRadialGradient.h */,\n\t\t\t\t0CF68AF21AF0549300FF9E5C /* ARTRadialGradient.m */,\n\t\t\t\t0CF68AF31AF0549300FF9E5C /* ARTSolidColor.h */,\n\t\t\t\t0CF68AF41AF0549300FF9E5C /* ARTSolidColor.m */,\n\t\t\t);\n\t\t\tpath = Brushes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CF68AF81AF0549300FF9E5C /* ViewManagers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CF68AF91AF0549300FF9E5C /* ARTGroupManager.h */,\n\t\t\t\t0CF68AFA1AF0549300FF9E5C /* ARTGroupManager.m */,\n\t\t\t\t0CF68AFB1AF0549300FF9E5C /* ARTNodeManager.h */,\n\t\t\t\t0CF68AFC1AF0549300FF9E5C /* ARTNodeManager.m */,\n\t\t\t\t0CF68AFD1AF0549300FF9E5C /* ARTRenderableManager.h */,\n\t\t\t\t0CF68AFE1AF0549300FF9E5C /* ARTRenderableManager.m */,\n\t\t\t\t0CF68AFF1AF0549300FF9E5C /* ARTShapeManager.h */,\n\t\t\t\t0CF68B001AF0549300FF9E5C /* ARTShapeManager.m */,\n\t\t\t\t0CF68B011AF0549300FF9E5C /* ARTSurfaceViewManager.h */,\n\t\t\t\t0CF68B021AF0549300FF9E5C /* ARTSurfaceViewManager.m */,\n\t\t\t\t0CF68B031AF0549300FF9E5C /* ARTTextManager.h */,\n\t\t\t\t0CF68B041AF0549300FF9E5C /* ARTTextManager.m */,\n\t\t\t);\n\t\t\tpath = ViewManagers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t0CF68AC01AF0540F00FF9E5C /* ART */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0CF68AD51AF0540F00FF9E5C /* Build configuration list for PBXNativeTarget \"ART\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0CF68ABD1AF0540F00FF9E5C /* Sources */,\n\t\t\t\t0CF68ABE1AF0540F00FF9E5C /* Frameworks */,\n\t\t\t\t0CF68ABF1AF0540F00FF9E5C /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ART;\n\t\t\tproductName = ART;\n\t\t\tproductReference = 0CF68AC11AF0540F00FF9E5C /* libART.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t323A12861E5F266B004975B8 /* ART-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 323A128D1E5F266B004975B8 /* Build configuration list for PBXNativeTarget \"ART-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t323A12831E5F266B004975B8 /* Sources */,\n\t\t\t\t323A12841E5F266B004975B8 /* Frameworks */,\n\t\t\t\t323A12851E5F266B004975B8 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ART-tvOS\";\n\t\t\tproductName = \"ART-tvOS\";\n\t\t\tproductReference = 323A12871E5F266B004975B8 /* libART-tvOS.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0CF68AB91AF0540F00FF9E5C /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t0CF68AC01AF0540F00FF9E5C = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t};\n\t\t\t\t\t323A12861E5F266B004975B8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 0CF68ABC1AF0540F00FF9E5C /* Build configuration list for PBXProject \"ART\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 0CF68AB81AF0540F00FF9E5C;\n\t\t\tproductRefGroup = 0CF68AC21AF0540F00FF9E5C /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t0CF68AC01AF0540F00FF9E5C /* ART */,\n\t\t\t\t323A12861E5F266B004975B8 /* ART-tvOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t0CF68ABD1AF0540F00FF9E5C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0CF68B161AF0549300FF9E5C /* ARTTextManager.m in Sources */,\n\t\t\t\t0CF68B111AF0549300FF9E5C /* ARTGroupManager.m in Sources */,\n\t\t\t\t0CF68B0D1AF0549300FF9E5C /* ARTPattern.m in Sources */,\n\t\t\t\t0CF68B0A1AF0549300FF9E5C /* ARTText.m in Sources */,\n\t\t\t\t0CF68B121AF0549300FF9E5C /* ARTNodeManager.m in Sources */,\n\t\t\t\t0CF68B051AF0549300FF9E5C /* ARTGroup.m in Sources */,\n\t\t\t\t0CF68B131AF0549300FF9E5C /* ARTRenderableManager.m in Sources */,\n\t\t\t\t0CF68B091AF0549300FF9E5C /* ARTSurfaceView.m in Sources */,\n\t\t\t\t0CF68B0E1AF0549300FF9E5C /* ARTRadialGradient.m in Sources */,\n\t\t\t\t0CF68B151AF0549300FF9E5C /* ARTSurfaceViewManager.m in Sources */,\n\t\t\t\t0CF68B081AF0549300FF9E5C /* ARTShape.m in Sources */,\n\t\t\t\t0CF68B071AF0549300FF9E5C /* ARTRenderable.m in Sources */,\n\t\t\t\t0CF68B101AF0549300FF9E5C /* RCTConvert+ART.m in Sources */,\n\t\t\t\t0CF68B061AF0549300FF9E5C /* ARTNode.m in Sources */,\n\t\t\t\t0CF68B0F1AF0549300FF9E5C /* ARTSolidColor.m in Sources */,\n\t\t\t\t0CF68B0C1AF0549300FF9E5C /* ARTLinearGradient.m in Sources */,\n\t\t\t\t0CF68B0B1AF0549300FF9E5C /* ARTBrush.m in Sources */,\n\t\t\t\t0CF68B141AF0549300FF9E5C /* ARTShapeManager.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t323A12831E5F266B004975B8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t325CF7B71E5F2ABA00AC9606 /* ARTTextManager.m in Sources */,\n\t\t\t\t325CF7B21E5F2ABA00AC9606 /* ARTGroupManager.m in Sources */,\n\t\t\t\t325CF7AF1E5F2ABA00AC9606 /* ARTPattern.m in Sources */,\n\t\t\t\t325CF7BD1E5F2ABA00AC9606 /* ARTText.m in Sources */,\n\t\t\t\t325CF7B31E5F2ABA00AC9606 /* ARTNodeManager.m in Sources */,\n\t\t\t\t325CF7B81E5F2ABA00AC9606 /* ARTGroup.m in Sources */,\n\t\t\t\t325CF7B41E5F2ABA00AC9606 /* ARTRenderableManager.m in Sources */,\n\t\t\t\t325CF7BC1E5F2ABA00AC9606 /* ARTSurfaceView.m in Sources */,\n\t\t\t\t325CF7B01E5F2ABA00AC9606 /* ARTRadialGradient.m in Sources */,\n\t\t\t\t325CF7B61E5F2ABA00AC9606 /* ARTSurfaceViewManager.m in Sources */,\n\t\t\t\t325CF7BB1E5F2ABA00AC9606 /* ARTShape.m in Sources */,\n\t\t\t\t325CF7BA1E5F2ABA00AC9606 /* ARTRenderable.m in Sources */,\n\t\t\t\t325CF7BE1E5F2ABA00AC9606 /* RCTConvert+ART.m in Sources */,\n\t\t\t\t325CF7B91E5F2ABA00AC9606 /* ARTNode.m in Sources */,\n\t\t\t\t325CF7B11E5F2ABA00AC9606 /* ARTSolidColor.m in Sources */,\n\t\t\t\t325CF7AE1E5F2ABA00AC9606 /* ARTLinearGradient.m in Sources */,\n\t\t\t\t325CF7AD1E5F2ABA00AC9606 /* ARTBrush.m in Sources */,\n\t\t\t\t325CF7B51E5F2ABA00AC9606 /* ARTShapeManager.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0CF68AD31AF0540F00FF9E5C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0CF68AD41AF0540F00FF9E5C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\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 = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0CF68AD61AF0540F00FF9E5C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0CF68AD71AF0540F00FF9E5C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t323A128E1E5F266B004975B8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t323A128F1E5F266B004975B8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0CF68ABC1AF0540F00FF9E5C /* Build configuration list for PBXProject \"ART\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0CF68AD31AF0540F00FF9E5C /* Debug */,\n\t\t\t\t0CF68AD41AF0540F00FF9E5C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0CF68AD51AF0540F00FF9E5C /* Build configuration list for PBXNativeTarget \"ART\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0CF68AD61AF0540F00FF9E5C /* Debug */,\n\t\t\t\t0CF68AD71AF0540F00FF9E5C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t323A128D1E5F266B004975B8 /* Build configuration list for PBXNativeTarget \"ART-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t323A128E1E5F266B004975B8 /* Debug */,\n\t\t\t\t323A128F1E5F266B004975B8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0CF68AB91AF0540F00FF9E5C /* Project object */;\n}\n"
  },
  {
    "path": "ios/ARTCGFloatArray.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// A little helper to make sure we have the right memory allocation ready for use.\n// We assume that we will only this in one place so no reference counting is necessary.\n// Needs to be freed when deallocated.\n\n// This is fragile since this relies on these values not getting reused. Consider\n// wrapping these in an Obj-C class or some ARC hackery to get refcounting.\n\ntypedef struct {\n  size_t count;\n  CGFloat *array;\n} ARTCGFloatArray;\n"
  },
  {
    "path": "ios/ARTContainer.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@protocol ARTContainer <NSObject>\n\n// This is used as a hook for child to mark it's parent as dirty.\n// This bubbles up to the root which gets marked as dirty.\n- (void)invalidate;\n\n@end\n"
  },
  {
    "path": "ios/ARTGroup.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"ARTContainer.h\"\n#import \"ARTNode.h\"\n\n@interface ARTGroup : ARTNode <ARTContainer>\n\n@property (nonatomic, assign) CGRect clipping;\n\n@end\n"
  },
  {
    "path": "ios/ARTGroup.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTGroup.h\"\n\n@implementation ARTGroup\n\n- (void)renderLayerTo:(CGContextRef)context\n{\n\n  if (!CGRectIsEmpty(self.clipping)) {\n    CGContextClipToRect(context, self.clipping);\n  }\n\n  for (ARTNode *node in self.subviews) {\n    [node renderTo:context];\n  }\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTNode.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/UIView+React.h>\n#import \"ARTShadow.h\"\n/**\n * ART nodes are implemented as empty UIViews but this is just an implementation detail to fit\n * into the existing view management. They should also be shadow views and painted on a background\n * thread.\n */\n\n@interface ARTNode : UIView\n\n@property (nonatomic, assign) CGFloat opacity;\n@property (nonatomic, assign) ARTShadow shadow;\n\n- (void)invalidate;\n- (void)renderTo:(CGContextRef)context;\n\n/**\n * renderTo will take opacity into account and draw renderLayerTo off-screen if there is opacity\n * specified, then composite that onto the context. renderLayerTo always draws at opacity=1.\n * @abstract\n */\n- (void)renderLayerTo:(CGContextRef)context;\n\n@end\n"
  },
  {
    "path": "ios/ARTNode.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTNode.h\"\n\n#import \"ARTContainer.h\"\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTNode\n\n- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex\n{\n  [super insertReactSubview:subview atIndex:atIndex];\n  [self insertSubview:subview atIndex:atIndex];\n  [self invalidate];\n}\n\n- (void)removeReactSubview:(UIView *)subview\n{\n  [super removeReactSubview:subview];\n  [self invalidate];\n}\n\n- (void)didUpdateReactSubviews\n{\n  // Do nothing, as subviews are inserted by insertReactSubview:\n}\n\n- (void)setOpacity:(CGFloat)opacity\n{\n  [self invalidate];\n  _opacity = opacity;\n}\n\n- (void)setTransform:(CGAffineTransform)transform\n{\n  [self invalidate];\n  super.transform = transform;\n}\n\n- (void)setShadow:(ARTShadow)shadow\n{\n  [self invalidate];\n  _shadow = shadow;\n}\n\n- (void)invalidate\n{\n  id<ARTContainer> container = (id<ARTContainer>)self.superview;\n  [container invalidate];\n}\n\n- (void)renderTo:(CGContextRef)context\n{\n  if (self.opacity <= 0) {\n    // Nothing to paint\n    return;\n  }\n  if (self.opacity >= 1) {\n    // Just paint at full opacity\n    [self renderContentTo:context];\n    [self renderLayerTo:context];\n    CGContextRestoreGState(context);\n    return;\n  }\n  \n  // This needs to be painted on a layer before being composited.\n  [self renderContentTo:context];\n  CGContextBeginTransparencyLayer(context, NULL);\n  [self renderLayerTo:context];\n  CGContextEndTransparencyLayer(context);\n  CGContextRestoreGState(context);\n}\n\n- (void)renderContentTo:(CGContextRef)context {\n  CGContextSaveGState(context);\n  CGContextConcatCTM(context, self.transform);\n  CGContextSetAlpha(context, self.opacity);\n  UIColor *color = [UIColor colorWithCGColor:[RCTConvert CGColor:@(self.shadow.color)]];\n  color = [color colorWithAlphaComponent:self.shadow.alpha];\n  CGContextSetShadowWithColor(context, self.shadow.offset, self.shadow.blur, color.CGColor);\n}\n\n- (void)renderLayerTo:(CGContextRef)context\n{\n  // abstract\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTRenderable.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"ARTBrush.h\"\n#import \"ARTCGFloatArray.h\"\n#import \"ARTNode.h\"\n\n@interface ARTRenderable : ARTNode\n\n@property (nonatomic, strong) ARTBrush *fill;\n@property (nonatomic, assign) CGColorRef stroke;\n@property (nonatomic, assign) CGFloat strokeWidth;\n@property (nonatomic, assign) CGLineCap strokeCap;\n@property (nonatomic, assign) CGLineJoin strokeJoin;\n@property (nonatomic, assign) ARTCGFloatArray strokeDash;\n\n@end\n"
  },
  {
    "path": "ios/ARTRenderable.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTRenderable.h\"\n\n@implementation ARTRenderable\n\n- (void)setFill:(ARTBrush *)fill\n{\n  [self invalidate];\n  _fill = fill;\n}\n\n- (void)setStroke:(CGColorRef)stroke\n{\n  if (stroke == _stroke) {\n    return;\n  }\n  [self invalidate];\n  CGColorRelease(_stroke);\n  _stroke = CGColorRetain(stroke);\n}\n\n- (void)setStrokeWidth:(CGFloat)strokeWidth\n{\n  [self invalidate];\n  _strokeWidth = strokeWidth;\n}\n\n- (void)setStrokeCap:(CGLineCap)strokeCap\n{\n  [self invalidate];\n  _strokeCap = strokeCap;\n}\n\n- (void)setStrokeJoin:(CGLineJoin)strokeJoin\n{\n  [self invalidate];\n  _strokeJoin = strokeJoin;\n}\n\n- (void)setStrokeDash:(ARTCGFloatArray)strokeDash\n{\n  if (strokeDash.array == _strokeDash.array) {\n    return;\n  }\n  if (_strokeDash.array) {\n    free(_strokeDash.array);\n  }\n  [self invalidate];\n  _strokeDash = strokeDash;\n}\n\n- (void)dealloc\n{\n  CGColorRelease(_stroke);\n  if (_strokeDash.array) {\n    free(_strokeDash.array);\n  }\n}\n\n- (void)renderTo:(CGContextRef)context\n{\n  if (self.opacity <= 0 || self.opacity >= 1 || (self.fill && self.stroke)) {\n    // If we have both fill and stroke, we will need to paint this using normal compositing\n    [super renderTo: context];\n    return;\n  }\n  // This is a terminal with only one painting. Therefore we don't need to paint this\n  // off-screen. We can just composite it straight onto the buffer.\n  CGContextSaveGState(context);\n  CGContextConcatCTM(context, self.transform);\n  CGContextSetAlpha(context, self.opacity);\n  [self renderLayerTo:context];\n  CGContextRestoreGState(context);\n}\n\n- (void)renderLayerTo:(CGContextRef)context\n{\n  // abstract\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTShadow.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\ntypedef struct {\n  CGSize offset;\n  CGFloat blur;\n  CGFloat alpha;\n  CGFloat color;\n} ARTShadow;\n"
  },
  {
    "path": "ios/ARTShape.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"ARTRenderable.h\"\n\n@interface ARTShape : ARTRenderable\n\n@property (nonatomic, assign) CGPathRef d;\n\n@end\n"
  },
  {
    "path": "ios/ARTShape.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTShape.h\"\n\n@implementation ARTShape\n\n- (void)setD:(CGPathRef)d\n{\n  if (d == _d) {\n    return;\n  }\n  [self invalidate];\n  CGPathRelease(_d);\n  _d = CGPathRetain(d);\n}\n\n- (void)dealloc\n{\n  CGPathRelease(_d);\n}\n\n- (void)renderLayerTo:(CGContextRef)context\n{\n  if ((!self.fill && !self.stroke) || !self.d) {\n    return;\n  }\n\n  CGPathDrawingMode mode = kCGPathStroke;\n  if (self.fill) {\n    if ([self.fill applyFillColor:context]) {\n      mode = kCGPathFill;\n    } else {\n      CGContextSaveGState(context);\n      CGContextAddPath(context, self.d);\n      CGContextClip(context);\n      [self.fill paint:context];\n      CGContextRestoreGState(context);\n      if (!self.stroke) {\n        return;\n      }\n    }\n  }\n  if (self.stroke) {\n    CGContextSetStrokeColorWithColor(context, self.stroke);\n    CGContextSetLineWidth(context, self.strokeWidth);\n    CGContextSetLineCap(context, self.strokeCap);\n    CGContextSetLineJoin(context, self.strokeJoin);\n    ARTCGFloatArray dash = self.strokeDash;\n    if (dash.count) {\n      CGContextSetLineDash(context, 0, dash.array, dash.count);\n    }\n    if (mode == kCGPathFill) {\n      mode = kCGPathFillStroke;\n    }\n  }\n\n  CGContextAddPath(context, self.d);\n  CGContextDrawPath(context, mode);\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTSurfaceView.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"ARTContainer.h\"\n\n@interface ARTSurfaceView : UIView <ARTContainer>\n\n@end\n"
  },
  {
    "path": "ios/ARTSurfaceView.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTSurfaceView.h\"\n\n#import <React/RCTLog.h>\n\n#import \"ARTNode.h\"\n\n@implementation ARTSurfaceView\n\n- (instancetype)initWithFrame:(CGRect)frame\n{\n  if (self = [super initWithFrame:frame]) {\n    self.opaque = NO;\n  }\n\n  return self;\n}\n\n- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex\n{\n  [super insertReactSubview:subview atIndex:atIndex];\n  [self insertSubview:subview atIndex:atIndex];\n  [self invalidate];\n}\n\n- (void)removeReactSubview:(UIView *)subview\n{\n  [super removeReactSubview:subview];\n  [self invalidate];\n}\n\n- (void)didUpdateReactSubviews\n{\n  // Do nothing, as subviews are inserted by insertReactSubview:\n}\n\n- (void)invalidate\n{\n  [self setNeedsDisplay];\n}\n\n- (void)drawRect:(CGRect)rect\n{\n  CGContextRef context = UIGraphicsGetCurrentContext();\n  for (ARTNode *node in self.subviews) {\n    [node renderTo:context];\n  }\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTText.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"ARTRenderable.h\"\n#import \"ARTTextFrame.h\"\n\n@interface ARTText : ARTRenderable\n\n@property (nonatomic, assign) CTTextAlignment alignment;\n@property (nonatomic, assign) ARTTextFrame textFrame;\n\n@end\n"
  },
  {
    "path": "ios/ARTText.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTText.h\"\n\n#import <CoreText/CoreText.h>\n\n@implementation ARTText\n\n- (void)setAlignment:(CTTextAlignment)alignment\n{\n  [self invalidate];\n  _alignment = alignment;\n}\n\nstatic void ARTFreeTextFrame(ARTTextFrame frame)\n{\n  if (frame.count) {\n    // We must release each line before freeing up this struct\n    for (int i = 0; i < frame.count; i++) {\n      CFRelease(frame.lines[i]);\n    }\n    free(frame.lines);\n    free(frame.widths);\n  }\n}\n\n- (void)setTextFrame:(ARTTextFrame)frame\n{\n  if (frame.lines != _textFrame.lines) {\n    ARTFreeTextFrame(_textFrame);\n  }\n  [self invalidate];\n  _textFrame = frame;\n}\n\n- (void)dealloc\n{\n  ARTFreeTextFrame(_textFrame);\n}\n\n- (void)renderLayerTo:(CGContextRef)context\n{\n  ARTTextFrame frame = self.textFrame;\n\n  if ((!self.fill && !self.stroke) || !frame.count) {\n    return;\n  }\n\n  // to-do: draw along a path\n\n  CGTextDrawingMode mode = kCGTextStroke;\n  if (self.fill) {\n    if ([self.fill applyFillColor:context]) {\n      mode = kCGTextFill;\n    } else {\n\n      for (int i = 0; i < frame.count; i++) {\n        CGContextSaveGState(context);\n        // Inverse the coordinate space since CoreText assumes a bottom-up coordinate space\n        CGContextScaleCTM(context, 1.0, -1.0);\n        CGContextSetTextDrawingMode(context, kCGTextClip);\n        [self renderLineTo:context atIndex:i];\n        // Inverse the coordinate space back to the original before filling\n        CGContextScaleCTM(context, 1.0, -1.0);\n        [self.fill paint:context];\n        // Restore the state so that the next line can be clipped separately\n        CGContextRestoreGState(context);\n      }\n\n      if (!self.stroke) {\n        return;\n      }\n    }\n  }\n  if (self.stroke) {\n    CGContextSetStrokeColorWithColor(context, self.stroke);\n    CGContextSetLineWidth(context, self.strokeWidth);\n    CGContextSetLineCap(context, self.strokeCap);\n    CGContextSetLineJoin(context, self.strokeJoin);\n    ARTCGFloatArray dash = self.strokeDash;\n    if (dash.count) {\n      CGContextSetLineDash(context, 0, dash.array, dash.count);\n    }\n    if (mode == kCGTextFill) {\n      mode = kCGTextFillStroke;\n    }\n  }\n\n  CGContextSetTextDrawingMode(context, mode);\n\n  // Inverse the coordinate space since CoreText assumes a bottom-up coordinate space\n  CGContextScaleCTM(context, 1.0, -1.0);\n  for (int i = 0; i < frame.count; i++) {\n    [self renderLineTo:context atIndex:i];\n  }\n}\n\n- (void)renderLineTo:(CGContextRef)context atIndex:(int)index\n{\n  ARTTextFrame frame = self.textFrame;\n  CGFloat shift;\n  switch (self.alignment) {\n    case kCTTextAlignmentRight:\n      shift = frame.widths[index];\n      break;\n    case kCTTextAlignmentCenter:\n      shift = (frame.widths[index] / 2);\n      break;\n    default:\n      shift = 0;\n      break;\n  }\n  // We should consider snapping this shift to device pixels to improve rendering quality\n  // when a line has subpixel width.\n  CGContextSetTextPosition(context, -shift, -frame.baseLine - frame.lineHeight * index);\n  CTLineRef line = frame.lines[index];\n  CTLineDraw(line, context);\n}\n\n@end\n"
  },
  {
    "path": "ios/ARTTextFrame.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <CoreText/CoreText.h>\n\n// A little helper to make sure we have a set of lines including width ready for use.\n// We assume that we will only this in one place so no reference counting is necessary.\n// Needs to be freed when deallocated.\n\n// This is fragile since this relies on these values not getting reused. Consider\n// wrapping these in an Obj-C class or some ARC hackery to get refcounting.\n\ntypedef struct {\n  size_t count;\n  CGFloat baseLine; // Distance from the origin to the base line of the first line\n  CGFloat lineHeight; // Distance between lines\n  CTLineRef *lines;\n  CGFloat *widths; // Width of each line\n} ARTTextFrame;\n"
  },
  {
    "path": "ios/Brushes/ARTBrush.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <CoreGraphics/CoreGraphics.h>\n#import <Foundation/Foundation.h>\n\n@interface ARTBrush : NSObject\n\n/* @abstract */\n- (instancetype)initWithArray:(NSArray *)data NS_DESIGNATED_INITIALIZER;\n\n/**\n * For certain brushes we can fast path a combined fill and stroke.\n * For those brushes we override applyFillColor which sets the fill\n * color to be used by those batch paints. Those return YES.\n * We can't batch gradient painting in CoreGraphics, so those will\n * return NO and paint gets called instead.\n * @abstract\n */\n- (BOOL)applyFillColor:(CGContextRef)context;\n\n/**\n * paint fills the context with a brush. The context is assumed to\n * be clipped.\n * @abstract\n */\n- (void)paint:(CGContextRef)context;\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTBrush.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTBrush.h\"\n\n#import <React/RCTDefines.h>\n\n@implementation ARTBrush\n\n- (instancetype)initWithArray:(NSArray *)data\n{\n  return [super init];\n}\n\nRCT_NOT_IMPLEMENTED(- (instancetype)init)\n\n- (BOOL)applyFillColor:(CGContextRef)context\n{\n  return NO;\n}\n\n- (void)paint:(CGContextRef)context\n{\n  // abstract\n}\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTLinearGradient.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTBrush.h\"\n\n@interface ARTLinearGradient : ARTBrush\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTLinearGradient.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTLinearGradient.h\"\n\n#import <React/RCTLog.h>\n\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTLinearGradient\n{\n  CGGradientRef _gradient;\n  CGPoint _startPoint;\n  CGPoint _endPoint;\n}\n\n- (instancetype)initWithArray:(NSArray<NSNumber *> *)array\n{\n  if ((self = [super initWithArray:array])) {\n    if (array.count < 5) {\n      RCTLogError(@\"-[%@ %@] expects 5 elements, received %@\",\n                  self.class, NSStringFromSelector(_cmd), array);\n      return nil;\n    }\n    _startPoint = [RCTConvert CGPoint:array offset:1];\n    _endPoint = [RCTConvert CGPoint:array offset:3];\n    _gradient = CGGradientRetain([RCTConvert CGGradient:array offset:5]);\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  CGGradientRelease(_gradient);\n}\n\n- (void)paint:(CGContextRef)context\n{\n  CGGradientDrawingOptions extendOptions =\n    kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation;\n  CGContextDrawLinearGradient(context, _gradient, _startPoint, _endPoint, extendOptions);\n}\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTPattern.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTBrush.h\"\n\n@interface ARTPattern : ARTBrush\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTPattern.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTPattern.h\"\n\n#import <React/RCTLog.h>\n\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTPattern\n{\n  CGImageRef _image;\n  CGRect _rect;\n}\n\n- (instancetype)initWithArray:(NSArray<id /* imagesource + numbers */> *)array\n{\n  if ((self = [super initWithArray:array])) {\n    if (array.count < 6) {\n      RCTLogError(@\"-[%@ %@] expects 6 elements, received %@\",\n                  self.class, NSStringFromSelector(_cmd), array);\n      return nil;\n    }\n    _image = CGImageRetain([RCTConvert CGImage:array[1]]);\n    _rect = [RCTConvert CGRect:array offset:2];\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  CGImageRelease(_image);\n}\n\n// Note: This could use applyFillColor with a pattern. This could be more efficient but\n// to do that, we need to calculate our own user space CTM.\n\n- (void)paint:(CGContextRef)context\n{\n  CGContextDrawTiledImage(context, _rect, _image);\n}\n\n\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTRadialGradient.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTBrush.h\"\n\n@interface ARTRadialGradient : ARTBrush\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTRadialGradient.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTRadialGradient.h\"\n\n#import <React/RCTLog.h>\n\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTRadialGradient\n{\n  CGGradientRef _gradient;\n  CGPoint _focusPoint;\n  CGPoint _centerPoint;\n  CGFloat _radius;\n  CGFloat _radiusRatio;\n}\n\n- (instancetype)initWithArray:(NSArray<NSNumber *> *)array\n{\n  if ((self = [super initWithArray:array])) {\n    if (array.count < 7) {\n      RCTLogError(@\"-[%@ %@] expects 7 elements, received %@\",\n                  self.class, NSStringFromSelector(_cmd), array);\n      return nil;\n    }\n    _radius = [RCTConvert CGFloat:array[3]];\n    _radiusRatio = [RCTConvert CGFloat:array[4]] / _radius;\n    _focusPoint.x = [RCTConvert CGFloat:array[1]];\n    _focusPoint.y = [RCTConvert CGFloat:array[2]] / _radiusRatio;\n    _centerPoint.x = [RCTConvert CGFloat:array[5]];\n    _centerPoint.y = [RCTConvert CGFloat:array[6]] / _radiusRatio;\n    _gradient = CGGradientRetain([RCTConvert CGGradient:array offset:7]);\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  CGGradientRelease(_gradient);\n}\n\n- (void)paint:(CGContextRef)context\n{\n  CGAffineTransform transform = CGAffineTransformMakeScale(1, _radiusRatio);\n  CGContextConcatCTM(context, transform);\n  CGGradientDrawingOptions extendOptions = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation;\n  CGContextDrawRadialGradient(context, _gradient, _focusPoint, 0, _centerPoint, _radius, extendOptions);\n}\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTSolidColor.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTBrush.h\"\n\n@interface ARTSolidColor : ARTBrush\n\n@end\n"
  },
  {
    "path": "ios/Brushes/ARTSolidColor.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTSolidColor.h\"\n\n#import <React/RCTLog.h>\n\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTSolidColor\n{\n  CGColorRef _color;\n}\n\n- (instancetype)initWithArray:(NSArray<NSNumber *> *)array\n{\n  if ((self = [super initWithArray:array])) {\n    _color = CGColorRetain([RCTConvert CGColor:array offset:1]);\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  CGColorRelease(_color);\n}\n\n- (BOOL)applyFillColor:(CGContextRef)context\n{\n  CGContextSetFillColorWithColor(context, _color);\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "ios/RCTConvert+ART.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <QuartzCore/QuartzCore.h>\n\n#import <React/RCTConvert.h>\n\n#import \"ARTBrush.h\"\n#import \"ARTShadow.h\"\n#import \"ARTCGFloatArray.h\"\n#import \"ARTTextFrame.h\"\n\n@interface RCTConvert (ART)\n\n+ (CGPathRef)CGPath:(id)json CF_RETURNS_NOT_RETAINED;\n+ (CTTextAlignment)CTTextAlignment:(id)json;\n+ (ARTTextFrame)ARTTextFrame:(id)json;\n+ (ARTCGFloatArray)ARTCGFloatArray:(id)json;\n+ (ARTBrush *)ARTBrush:(id)json;\n+ (ARTShadow)ARTShadow:(id)json;\n\n+ (CGPoint)CGPoint:(id)json offset:(NSUInteger)offset;\n+ (CGRect)CGRect:(id)json offset:(NSUInteger)offset;\n+ (CGColorRef)CGColor:(id)json offset:(NSUInteger)offset CF_RETURNS_NOT_RETAINED;\n+ (CGGradientRef)CGGradient:(id)json offset:(NSUInteger)offset CF_RETURNS_NOT_RETAINED;\n\n@end\n"
  },
  {
    "path": "ios/RCTConvert+ART.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"RCTConvert+ART.h\"\n\n#import <React/RCTFont.h>\n#import <React/RCTLog.h>\n\n#import \"ARTLinearGradient.h\"\n#import \"ARTPattern.h\"\n#import \"ARTRadialGradient.h\"\n#import \"ARTSolidColor.h\"\n\n@implementation RCTConvert (ART)\n\n+ (CGPathRef)CGPath:(id)json\n{\n  NSArray *arr = [self NSNumberArray:json];\n\n  NSUInteger count = [arr count];\n\n#define NEXT_VALUE [self double:arr[i++]]\n\n  CGMutablePathRef path = CGPathCreateMutable();\n  CGPathMoveToPoint(path, NULL, 0, 0);\n\n  @try {\n    NSUInteger i = 0;\n    while (i < count) {\n      NSUInteger type = [arr[i++] unsignedIntegerValue];\n      switch (type) {\n        case 0:\n          CGPathMoveToPoint(path, NULL, NEXT_VALUE, NEXT_VALUE);\n          break;\n        case 1:\n          CGPathCloseSubpath(path);\n          break;\n        case 2:\n          CGPathAddLineToPoint(path, NULL, NEXT_VALUE, NEXT_VALUE);\n          break;\n        case 3:\n          CGPathAddCurveToPoint(path, NULL, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE);\n          break;\n        case 4:\n          CGPathAddArc(path, NULL, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE, NEXT_VALUE == 0);\n          break;\n        default:\n          RCTLogError(@\"Invalid CGPath type %llu at element %llu of %@\", (unsigned long long)type, (unsigned long long)i, arr);\n          CGPathRelease(path);\n          return NULL;\n      }\n    }\n  }\n  @catch (NSException *exception) {\n    RCTLogError(@\"Invalid CGPath format: %@\", arr);\n    CGPathRelease(path);\n    return NULL;\n  }\n\n  return (CGPathRef)CFAutorelease(path);\n}\n\nRCT_ENUM_CONVERTER(CTTextAlignment, (@{\n  @\"auto\": @(kCTTextAlignmentNatural),\n  @\"left\": @(kCTTextAlignmentLeft),\n  @\"center\": @(kCTTextAlignmentCenter),\n  @\"right\": @(kCTTextAlignmentRight),\n  @\"justify\": @(kCTTextAlignmentJustified),\n}), kCTTextAlignmentNatural, integerValue)\n\n// This takes a tuple of text lines and a font to generate a CTLine for each text line.\n// This prepares everything for rendering a frame of text in ARTText.\n+ (ARTTextFrame)ARTTextFrame:(id)json\n{\n  NSDictionary *dict = [self NSDictionary:json];\n  ARTTextFrame frame;\n  frame.count = 0;\n\n  NSArray *lines = [self NSArray:dict[@\"lines\"]];\n  NSUInteger lineCount = [lines count];\n  if (lineCount == 0) {\n    return frame;\n  }\n\n  CTFontRef font = (__bridge CTFontRef)[self UIFont:dict[@\"font\"]];\n  if (!font) {\n    return frame;\n  }\n\n  // Create a dictionary for this font\n  CFDictionaryRef attributes = (__bridge CFDictionaryRef)@{\n    (NSString *)kCTFontAttributeName:(__bridge id)font,\n    (NSString *)kCTForegroundColorFromContextAttributeName: @YES\n  };\n\n  // Set up text frame with font metrics\n  CGFloat size = CTFontGetSize(font);\n  frame.count = lineCount;\n  frame.baseLine = size; // estimate base line\n  frame.lineHeight = size * 1.1; // Base on ART canvas line height estimate\n  frame.lines = malloc(sizeof(CTLineRef) * lineCount);\n  frame.widths = malloc(sizeof(CGFloat) * lineCount);\n\n  [lines enumerateObjectsUsingBlock:^(NSString *text, NSUInteger i, BOOL *stop) {\n\n    CFStringRef string = (__bridge CFStringRef)text;\n    CFAttributedStringRef attrString = CFAttributedStringCreate(kCFAllocatorDefault, string, attributes);\n    CTLineRef line = CTLineCreateWithAttributedString(attrString);\n    CFRelease(attrString);\n\n    frame.lines[i] = line;\n    frame.widths[i] = CTLineGetTypographicBounds(line, NULL, NULL, NULL);\n  }];\n\n  return frame;\n}\n\n+ (ARTCGFloatArray)ARTCGFloatArray:(id)json\n{\n  NSArray *arr = [self NSNumberArray:json];\n  NSUInteger count = arr.count;\n\n  ARTCGFloatArray array;\n  array.count = count;\n  array.array = NULL;\n\n  if (count) {\n    // Ideally, these arrays should already use the same memory layout.\n    // In that case we shouldn't need this new malloc.\n    array.array = malloc(sizeof(CGFloat) * count);\n    for (NSUInteger i = 0; i < count; i++) {\n      array.array[i] = [arr[i] doubleValue];\n    }\n  }\n\n  return array;\n}\n\n+ (ARTBrush *)ARTBrush:(id)json\n{\n  NSArray *arr = [self NSArray:json];\n  NSUInteger type = [self NSUInteger:arr.firstObject];\n  switch (type) {\n    case 0: // solid color\n      // These are probably expensive allocations since it's often the same value.\n      // We should memoize colors but look ups may be just as expensive.\n      return [[ARTSolidColor alloc] initWithArray:arr];\n    case 1: // linear gradient\n      return [[ARTLinearGradient alloc] initWithArray:arr];\n    case 2: // radial gradient\n      return [[ARTRadialGradient alloc] initWithArray:arr];\n    case 3: // pattern\n      return [[ARTPattern alloc] initWithArray:arr];\n    default:\n      RCTLogError(@\"Unknown brush type: %llu\", (unsigned long long)type);\n      return nil;\n  }\n}\n\n+ (ARTShadow)ARTShadow:(id)json\n{\n  NSArray *arr = [self NSArray:json];\n  return (ARTShadow){\n    .color = [[arr objectAtIndex:0] doubleValue],\n    .alpha = [[arr objectAtIndex:1] floatValue],\n    .blur = [[arr objectAtIndex:2] floatValue],\n    .offset = (CGSize){\n      .width = [[arr objectAtIndex:3] floatValue],\n      .height = [[arr objectAtIndex:4] floatValue]\n    },\n  };\n}\n\n+ (CGPoint)CGPoint:(id)json offset:(NSUInteger)offset\n{\n  NSArray *arr = [self NSArray:json];\n  if (arr.count < offset + 2) {\n    RCTLogError(@\"Too few elements in array (expected at least %llu): %@\", (unsigned long long)(2 + offset), arr);\n    return CGPointZero;\n  }\n  return (CGPoint){\n    [self CGFloat:arr[offset]],\n    [self CGFloat:arr[offset + 1]],\n  };\n}\n\n+ (CGRect)CGRect:(id)json offset:(NSUInteger)offset\n{\n  NSArray *arr = [self NSArray:json];\n  if (arr.count < offset + 4) {\n    RCTLogError(@\"Too few elements in array (expected at least %llu): %@\", (unsigned long long)(4 + offset), arr);\n    return CGRectZero;\n  }\n  return (CGRect){\n    {[self CGFloat:arr[offset]], [self CGFloat:arr[offset + 1]]},\n    {[self CGFloat:arr[offset + 2]], [self CGFloat:arr[offset + 3]]},\n  };\n}\n\n+ (CGColorRef)CGColor:(id)json offset:(NSUInteger)offset\n{\n  NSArray *arr = [self NSArray:json];\n  if (arr.count < offset + 4) {\n    RCTLogError(@\"Too few elements in array (expected at least %llu): %@\", (unsigned long long)(4 + offset), arr);\n    return NULL;\n  }\n  return [self CGColor:[arr subarrayWithRange:(NSRange){offset, 4}]];\n}\n\n+ (CGGradientRef)CGGradient:(id)json offset:(NSUInteger)offset\n{\n  NSArray *arr = [self NSArray:json];\n  if (arr.count < offset) {\n    RCTLogError(@\"Too few elements in array (expected at least %llu): %@\", (unsigned long long)offset, arr);\n    return NULL;\n  }\n  arr = [arr subarrayWithRange:(NSRange){offset, arr.count - offset}];\n  ARTCGFloatArray colorsAndOffsets = [self ARTCGFloatArray:arr];\n  size_t stops = colorsAndOffsets.count / 5;\n  CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();\n  CGGradientRef gradient = CGGradientCreateWithColorComponents(\n    rgb,\n    colorsAndOffsets.array,\n    colorsAndOffsets.array + stops * 4,\n    stops\n  );\n  CGColorSpaceRelease(rgb);\n  free(colorsAndOffsets.array);\n  return (CGGradientRef)CFAutorelease(gradient);\n}\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTGroupManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTNodeManager.h\"\n\n@interface ARTGroupManager : ARTNodeManager\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTGroupManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTGroupManager.h\"\n\n#import \"ARTGroup.h\"\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTGroupManager\n\nRCT_EXPORT_MODULE()\n\n- (ARTNode *)node\n{\n  return [ARTGroup new];\n}\n\nRCT_EXPORT_VIEW_PROPERTY(clipping, CGRect)\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTNodeManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTViewManager.h>\n\n@class ARTNode;\n\n@interface ARTNodeManager : RCTViewManager\n\n- (ARTNode *)node;\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTNodeManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTNodeManager.h\"\n\n#import \"ARTNode.h\"\n\n@implementation ARTNodeManager\n\nRCT_EXPORT_MODULE()\n\n- (ARTNode *)node\n{\n  return [ARTNode new];\n}\n\n- (UIView *)view\n{\n  return [self node];\n}\n\n- (RCTShadowView *)shadowView\n{\n  return nil;\n}\n\nRCT_EXPORT_VIEW_PROPERTY(opacity, CGFloat)\nRCT_EXPORT_VIEW_PROPERTY(transform, CGAffineTransform)\nRCT_EXPORT_VIEW_PROPERTY(shadow, ARTShadow)\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTRenderableManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTNodeManager.h\"\n#import \"ARTRenderable.h\"\n\n@interface ARTRenderableManager : ARTNodeManager\n\n- (ARTRenderable *)node;\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTRenderableManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTRenderableManager.h\"\n\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTRenderableManager\n\nRCT_EXPORT_MODULE()\n\n- (ARTRenderable *)node\n{\n  return [ARTRenderable new];\n}\n\nRCT_EXPORT_VIEW_PROPERTY(strokeWidth, CGFloat)\nRCT_EXPORT_VIEW_PROPERTY(strokeCap, CGLineCap)\nRCT_EXPORT_VIEW_PROPERTY(strokeJoin, CGLineJoin)\nRCT_EXPORT_VIEW_PROPERTY(fill, ARTBrush)\nRCT_EXPORT_VIEW_PROPERTY(stroke, CGColor)\nRCT_EXPORT_VIEW_PROPERTY(strokeDash, ARTCGFloatArray)\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTShapeManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTRenderableManager.h\"\n\n@interface ARTShapeManager : ARTRenderableManager\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTShapeManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTShapeManager.h\"\n\n#import \"ARTShape.h\"\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTShapeManager\n\nRCT_EXPORT_MODULE()\n\n- (ARTRenderable *)node\n{\n  return [ARTShape new];\n}\n\nRCT_EXPORT_VIEW_PROPERTY(d, CGPath)\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTSurfaceViewManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTViewManager.h>\n\n@interface ARTSurfaceViewManager : RCTViewManager\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTSurfaceViewManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTSurfaceViewManager.h\"\n\n#import \"ARTSurfaceView.h\"\n\n@implementation ARTSurfaceViewManager\n\nRCT_EXPORT_MODULE()\n\n- (UIView *)view\n{\n  return [ARTSurfaceView new];\n}\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTTextManager.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTRenderableManager.h\"\n\n@interface ARTTextManager : ARTRenderableManager\n\n@end\n"
  },
  {
    "path": "ios/ViewManagers/ARTTextManager.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ARTTextManager.h\"\n\n#import \"ARTText.h\"\n#import \"RCTConvert+ART.h\"\n\n@implementation ARTTextManager\n\nRCT_EXPORT_MODULE()\n\n- (ARTRenderable *)node\n{\n  return [ARTText new];\n}\n\nRCT_EXPORT_VIEW_PROPERTY(alignment, CTTextAlignment)\nRCT_REMAP_VIEW_PROPERTY(frame, textFrame, ARTTextFrame)\n\n@end\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  preset: 'react-native',\n};\n"
  },
  {
    "path": "lib/ARTSerializablePath.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport Class from 'art/core/class';\nimport Path from 'art/core/path';\n\nconst MOVE_TO = 0;\nconst CLOSE = 1;\nconst LINE_TO = 2;\nconst CURVE_TO = 3;\nconst ARC = 4;\n\n// TODO: Refactor to class\nconst SerializablePath = Class(Path, {\n  initialize: function(path: string | SerializablePath) {\n    this.reset();\n    if (path instanceof SerializablePath) {\n      this.path = path.path.slice(0);\n    } else if (path) {\n      this.push(path);\n    }\n  },\n\n  onReset: function() {\n    this.path = [];\n  },\n\n  onMove: function(sx: number, sy: number, x: number, y: number) {\n    this.path.push(MOVE_TO, x, y);\n  },\n\n  onLine: function(sx: number, sy: number, x: number, y: number) {\n    this.path.push(LINE_TO, x, y);\n  },\n\n  onBezierCurve: function(\n    sx: number,\n    sy: number,\n    p1x: number,\n    p1y: number,\n    p2x: number,\n    p2y: number,\n    x: number,\n    y: number,\n  ) {\n    this.path.push(CURVE_TO, p1x, p1y, p2x, p2y, x, y);\n  },\n\n  _arcToBezier: Path.prototype.onArc,\n\n  onArc: function(\n    sx: number,\n    sy: number,\n    ex: number,\n    ey: number,\n    cx: number,\n    cy: number,\n    rx: number,\n    ry: number,\n    sa: number,\n    ea: number,\n    ccw: boolean,\n    rotation: number,\n  ) {\n    if (rx !== ry || rotation) {\n      return this._arcToBezier(\n        sx,\n        sy,\n        ex,\n        ey,\n        cx,\n        cy,\n        rx,\n        ry,\n        sa,\n        ea,\n        ccw,\n        rotation,\n      );\n    }\n    this.path.push(ARC, cx, cy, rx, sa, ea, ccw ? 0 : 1);\n  },\n\n  onClose: function() {\n    this.path.push(CLOSE);\n  },\n\n  toJSON: function() {\n    return this.path;\n  },\n});\n\nexport default SerializablePath;\n"
  },
  {
    "path": "lib/ClippingRectangle.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport * as React from 'react';\nimport {extractOpacity, extractTransform, extractShadow} from './helpers';\nimport {NativeGroup} from './nativeComponents';\nimport type {OpacityProps, TransformProps, ShadowProps} from './types';\n\ntype ClippingRectangleProps = OpacityProps &\n  TransformProps &\n  ShadowProps & {\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    children?: React.Node,\n  };\n\nexport default class ClippingRectangle extends React.Component<ClippingRectangleProps> {\n  static defaultProps = {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n\n  render() {\n    const clipping = [\n      this.props.x,\n      this.props.y,\n      this.props.width,\n      this.props.height,\n    ];\n\n    // The current clipping API requires x and y to be ignored in the transform\n    // $FlowFixMe\n    const {x, y, ...propsExcludingXAndY} = this.props;\n\n    return (\n      <NativeGroup\n        clipping={clipping}\n        opacity={extractOpacity(this.props)}\n        transform={extractTransform(propsExcludingXAndY)}\n        shadow={extractShadow(this.props)}>\n        {this.props.children}\n      </NativeGroup>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/Group.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport invariant from 'invariant';\nimport {NativeGroup} from './nativeComponents';\nimport {extractOpacity, extractTransform, extractShadow} from './helpers';\nimport type {OpacityProps, TransformProps, ShadowProps} from './types';\n\ntype GroupProps = OpacityProps &\n  ShadowProps &\n  TransformProps & {\n    children: React.Node,\n  };\n\nexport default class Group extends React.Component<GroupProps> {\n  static contextTypes = {\n    isInSurface: PropTypes.bool.isRequired,\n  };\n\n  render() {\n    invariant(\n      this.context.isInSurface,\n      'ART: <Group /> must be a child of a <Surface />',\n    );\n\n    return (\n      <NativeGroup\n        opacity={extractOpacity(this.props)}\n        transform={extractTransform(this.props)}\n        shadow={extractShadow(this.props)}>\n        {this.props.children}\n      </NativeGroup>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/LinearGradient.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport {insertColorStopsIntoArray} from './helpers';\nimport type {GradientStops, Brush} from './types';\n\nconst LINEAR_GRADIENT = 1;\n\nexport default function LinearGradient(\n  stops: GradientStops,\n  x1?: number,\n  y1?: number,\n  x2?: number,\n  y2?: number,\n): Brush {\n  const type = LINEAR_GRADIENT;\n\n  if (arguments.length < 5) {\n    const angle = ((x1 == null ? 270 : x1) * Math.PI) / 180;\n\n    let x = Math.cos(angle);\n    let y = -Math.sin(angle);\n    const l = (Math.abs(x) + Math.abs(y)) / 2;\n\n    x *= l;\n    y *= l;\n\n    x1 = 0.5 - x;\n    x2 = 0.5 + x;\n    y1 = 0.5 - y;\n    y2 = 0.5 + y;\n    this._bb = true;\n  } else {\n    this._bb = false;\n  }\n\n  const brushData = [type, +x1, +y1, +x2, +y2];\n  insertColorStopsIntoArray(stops, brushData, 5);\n  this._brush = brushData;\n  return this;\n}\n"
  },
  {
    "path": "lib/Pattern.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport type {Brush} from './types';\n\nconst PATTERN = 3;\n\nexport default function Pattern(\n  url: number,\n  width: number,\n  height: number,\n  left?: number,\n  top?: number,\n): Brush {\n  return {\n    _brush: [PATTERN, url, +left || 0, +top || 0, +width, +height],\n  };\n}\n"
  },
  {
    "path": "lib/RadialGradient.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport {insertDoubleColorStopsIntoArray} from './helpers';\nimport type {GradientStops, Brush} from './types';\n\nconst RADIAL_GRADIENT = 2;\n\nexport default function RadialGradient(\n  stops: GradientStops,\n  fx?: number,\n  fy?: number,\n  rx?: number,\n  ry?: number,\n  cx?: number,\n  cy?: number,\n): Brush {\n  if (ry == null) {\n    ry = rx;\n  }\n  if (cx == null) {\n    cx = fx;\n  }\n  if (cy == null) {\n    cy = fy;\n  }\n  if (fx == null) {\n    // As a convenience we allow the whole radial gradient to cover the\n    // bounding box. We should consider dropping this API.\n    fx = fy = rx = ry = cx = cy = 0.5;\n    this._bb = true;\n  } else {\n    this._bb = false;\n  }\n  // The ART API expects the radial gradient to be repeated at the edges.\n  // To simulate this we render the gradient twice as large and add double\n  // color stops. Ideally this API would become more restrictive so that this\n  // extra work isn't needed.\n  const brushData = [RADIAL_GRADIENT, +fx, +fy, +rx * 2, +ry * 2, +cx, +cy];\n  insertDoubleColorStopsIntoArray(stops, brushData, 7);\n  this._brush = brushData;\n  return this;\n}\n"
  },
  {
    "path": "lib/Shape.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport * as React from 'react';\nimport {NativeShape} from './nativeComponents';\nimport Path from './ARTSerializablePath';\nimport {\n  extractTransform,\n  extractShadow,\n  extractOpacity,\n  childrenAsString,\n  extractColor,\n  extractStrokeJoin,\n  extractStrokeCap,\n  extractBrush,\n} from './helpers';\nimport type {\n  TransformProps,\n  ShadowProps,\n  OpacityProps,\n  StrokeJoin,\n  StrokeCap,\n  Brush,\n} from './types';\n\nexport type ShapeProps = TransformProps &\n  ShadowProps &\n  OpacityProps & {\n    fill?: string | Brush,\n    stroke?: string,\n    strokeCap?: StrokeCap,\n    strokeDash?: Array<number>,\n    strokeJoin?: StrokeJoin,\n    strokeWidth: number,\n    children?: React.Node,\n    d?: string | Path,\n    children?: string | Array<string>,\n    width: number,\n    height: number,\n  };\n\nexport default class Shape extends React.Component<ShapeProps> {\n  static defaultProps = {\n    strokeWidth: 1,\n    width: 0,\n    height: 0,\n  };\n\n  render() {\n    const props = this.props;\n    const path = props.d || childrenAsString(props.children);\n    const d = (path instanceof Path ? path : new Path(path)).toJSON();\n\n    return (\n      <NativeShape\n        fill={extractBrush(props.fill, props)}\n        opacity={extractOpacity(props)}\n        stroke={extractColor(props.stroke)}\n        strokeCap={extractStrokeCap(props.strokeCap)}\n        strokeDash={props.strokeDash || null}\n        strokeJoin={extractStrokeJoin(props.strokeJoin)}\n        strokeWidth={props.strokeWidth}\n        transform={extractTransform(props)}\n        shadow={extractShadow(this.props)}\n        d={d}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/Surface.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport {NativeSurfaceView} from './nativeComponents';\n\ntype SurfaceProps = {\n  height: number,\n  width: number,\n  children: React.Node,\n  style?: any,\n};\n\nexport default class Surface extends React.Component<SurfaceProps> {\n  static childContextTypes = {\n    isInSurface: PropTypes.bool,\n  };\n  static defaultProps = {\n    height: 0,\n    width: 0,\n  };\n\n  getChildContext() {\n    return {isInSurface: true};\n  }\n\n  render() {\n    const {height, width} = this.props;\n\n    return (\n      <NativeSurfaceView style={[this.props.style, {height, width}]}>\n        {this.props.children}\n      </NativeSurfaceView>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/Text.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport * as React from 'react';\nimport Path from './ARTSerializablePath';\nimport {NativeText} from './nativeComponents';\nimport {\n  extractBrush,\n  extractOpacity,\n  extractColor,\n  extractStrokeCap,\n  extractStrokeJoin,\n  extractTransform,\n  extractShadow,\n  extractAlignment,\n  childrenAsString,\n  extractFontAndLines,\n} from './helpers';\nimport type {\n  TransformProps,\n  ShadowProps,\n  OpacityProps,\n  Alignment,\n  Brush,\n  StrokeCap,\n  StrokeJoin,\n  Font,\n} from './types';\n\nexport type TextProps = TransformProps &\n  ShadowProps &\n  OpacityProps & {\n    fill?: string | Brush,\n    stroke?: string,\n    strokeCap?: StrokeCap,\n    strokeDash?: mixed,\n    strokeJoin?: StrokeJoin,\n    strokeWidth?: mixed,\n    children?: string | Array<string>,\n    width: number,\n    height: number,\n    alignment?: Alignment,\n    font?: string | Font,\n    path?: string | Path,\n  };\n\nexport default class Text extends React.Component<TextProps> {\n  static defaultProps = {\n    strokeWidth: 1,\n    width: 0,\n    height: 0,\n  };\n\n  render() {\n    const props = this.props;\n    const path = props.path;\n    const textPath = path\n      ? (path instanceof Path ? path : new Path(path)).toJSON()\n      : null;\n    const textFrame = extractFontAndLines(\n      props.font,\n      childrenAsString(props.children),\n    );\n    return (\n      <NativeText\n        fill={extractBrush(props.fill, props)}\n        opacity={extractOpacity(props)}\n        stroke={extractColor(props.stroke)}\n        strokeCap={extractStrokeCap(props.strokeCap)}\n        strokeDash={props.strokeDash || null}\n        strokeJoin={extractStrokeJoin(props.strokeJoin)}\n        strokeWidth={props.strokeWidth}\n        transform={extractTransform(props)}\n        alignment={extractAlignment(props.alignment)}\n        shadow={extractShadow(this.props)}\n        frame={textFrame}\n        path={textPath}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/__tests__/helpers.test.js",
    "content": "// @flow\n\nimport {\n  childrenAsString,\n  extractOpacity,\n  extractStrokeJoin,\n  extractStrokeCap,\n  extractAlignment,\n} from '../helpers';\n\ndescribe('testing childrenAsString function', () => {\n  it('returns a given string', () => {\n    expect(childrenAsString('abc')).toBe('abc');\n  });\n  it('joins array of strings with \\n', () => {\n    let received = childrenAsString(['a', 'b', 'c', 'd']);\n    expect(received.replace(new RegExp('\\r?\\n', 'g'), '')).toBe('abcd');\n  });\n});\n\ndescribe('testing extractOpacity function', () => {\n  it('returns 0 if visible is false', () => {\n    expect(extractOpacity({visible: false})).toBe(0);\n    expect(extractOpacity({visible: false, opacity: 1})).toBe(0);\n    expect(extractOpacity({visible: false, opacity: 0.5})).toBe(0);\n  });\n\n  it('returns opacity if visible is true or undefined', () => {\n    expect(extractOpacity({visible: true, opacity: 0.5})).toBe(0.5);\n    expect(extractOpacity({opacity: 0.5})).toBe(0.5);\n  });\n});\n\ndescribe('testing extractStrokeJoin', () => {\n  const MITER = 0;\n  const BEVEL = 2;\n  const ROUND = 1;\n\n  it('returns enum', () => {\n    expect(extractStrokeJoin('miter')).toBe(MITER);\n    expect(extractStrokeJoin('bevel')).toBe(BEVEL);\n    expect(extractStrokeJoin('round')).toBe(ROUND);\n  });\n\n  it('default to round', () => {\n    expect(extractStrokeJoin()).toBe(ROUND);\n  });\n});\n\ndescribe('testing extractStrokeCap', () => {\n  const BUTT = 0;\n  const SQUARE = 2;\n  const ROUND = 1;\n\n  it('returns enum', () => {\n    expect(extractStrokeCap('butt')).toBe(BUTT);\n    expect(extractStrokeCap('square')).toBe(SQUARE);\n    expect(extractStrokeCap('round')).toBe(ROUND);\n  });\n\n  it('default to round', () => {\n    expect(extractStrokeCap()).toBe(ROUND);\n  });\n});\n\ndescribe('testing extractAlignment', () => {\n  const CENTER = 1;\n  const RIGHT = 2;\n  const LEFT = 0;\n\n  it('returns enum', () => {\n    expect(extractAlignment('center')).toBe(RIGHT);\n    expect(extractAlignment('right')).toBe(CENTER);\n    expect(extractAlignment('left')).toBe(LEFT);\n  });\n\n  it('default to left', () => {\n    expect(extractAlignment()).toBe(LEFT);\n  });\n});\n"
  },
  {
    "path": "lib/helpers.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport processColor from 'react-native/Libraries/StyleSheet/processColor';\nimport Color from 'art/core/color';\nimport Transform from 'art/core/transform';\nimport {Platform} from 'react-native';\nimport type {\n  Alignment,\n  Brush,\n  ColorType,\n  Font,\n  GradientStops,\n  OpacityProps,\n  StrokeCap,\n  StrokeJoin,\n  TransformProps,\n  ShadowProps,\n} from './types';\n\nexport function childrenAsString(children?: string | Array<string>) {\n  if (!children) {\n    return '';\n  }\n  if (typeof children === 'string') {\n    return children;\n  }\n  if (children.length) {\n    return children.join('\\n');\n  }\n  return '';\n}\n\nexport function extractOpacity({visible, opacity}: OpacityProps) {\n  // TODO: visible === false should also have no hit detection\n  if (visible === false) {\n    return 0;\n  }\n  if (opacity == null) {\n    return 1;\n  }\n  return +opacity;\n}\n\nconst pooledTransform = new Transform();\n\nexport function extractTransform(props: TransformProps): Array<number> {\n  const scaleX =\n    props.scaleX != null ? props.scaleX : props.scale != null ? props.scale : 1;\n  const scaleY =\n    props.scaleY != null ? props.scaleY : props.scale != null ? props.scale : 1;\n\n  pooledTransform\n    .transformTo(1, 0, 0, 1, 0, 0)\n    .move(props.x || 0, props.y || 0)\n    .rotate(props.rotation || 0, props.originX, props.originY)\n    .scale(scaleX, scaleY);\n\n  if (props.transform != null) {\n    pooledTransform.transform(props.transform);\n  }\n\n  return [\n    pooledTransform.xx,\n    pooledTransform.yx,\n    pooledTransform.xy,\n    pooledTransform.yy,\n    pooledTransform.x,\n    pooledTransform.y,\n  ];\n}\n\nfunction toHex(color: Color) {\n  const intValues = [color.red, color.green, color.blue];\n  if (color.alpha < 1) {\n    // Android uses AARRGGBB ; iOS uses RRGGBBAA\n    // https://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)\n    const position = Platform.OS === 'android' ? 0 : 3;\n    intValues.splice(position, 0, Math.round(color.alpha * 255));\n  }\n  const hexValues = intValues.map(iv => {\n    const sv = iv.toString(16);\n    return sv.length === 1 ? '0' + sv : sv;\n  });\n  return '#' + hexValues.join('');\n}\n\nexport function extractShadow(\n  props: ShadowProps,\n): Array<number | null | void> | void {\n  if (\n    !props.shadowColor &&\n    !props.shadowOpacity &&\n    !props.shadowRadius &&\n    !props.shadowOffset\n  ) {\n    return;\n  }\n\n  let opacity = props.shadowOpacity;\n\n  if (opacity === null || opacity === undefined) {\n    opacity = 1;\n  }\n\n  return [\n    processColor(props.shadowColor || 'black'),\n    opacity,\n    props.shadowRadius || 4,\n    props.shadowOffset?.x || 0,\n    props.shadowOffset?.y || 0,\n  ];\n}\n\nexport function extractColor(color?: ColorType) {\n  if (color == null) {\n    return null;\n  }\n  return toHex(new Color(color));\n}\n\nexport function extractStrokeJoin(strokeJoin?: StrokeJoin) {\n  switch (strokeJoin) {\n    case 'miter':\n      return 0;\n    case 'bevel':\n      return 2;\n    default:\n      return 1; // round\n  }\n}\n\nexport function extractStrokeCap(strokeCap?: StrokeCap) {\n  switch (strokeCap) {\n    case 'butt':\n      return 0;\n    case 'square':\n      return 2;\n    default:\n      return 1; // round\n  }\n}\n\nconst SOLID_COLOR = 0;\nconst LINEAR_GRADIENT = 1;\nconst RADIAL_GRADIENT = 2;\nconst PATTERN = 3;\n\n// TODO: Refactor and simplify applyBoundingBoxToBrushData and extractBrush\n\nfunction applyBoundingBoxToBrushData(\n  brushData: Array<number>,\n  props: {width: number, height: number},\n) {\n  const type = brushData[0];\n  const width = +props.width;\n  const height = +props.height;\n  if (type === LINEAR_GRADIENT) {\n    brushData[1] *= width;\n    brushData[2] *= height;\n    brushData[3] *= width;\n    brushData[4] *= height;\n  } else if (type === RADIAL_GRADIENT) {\n    brushData[1] *= width;\n    brushData[2] *= height;\n    brushData[3] *= width;\n    brushData[4] *= height;\n    brushData[5] *= width;\n    brushData[6] *= height;\n  } else if (type === PATTERN) {\n    // todo\n  }\n}\n\nexport function extractBrush(\n  colorOrBrush?: Brush | string,\n  props: {width: number, height: number},\n) {\n  if (colorOrBrush == null) {\n    return null;\n  }\n  if (colorOrBrush._brush) {\n    if (colorOrBrush._bb) {\n      // The legacy API for Gradients allow for the bounding box to be used\n      // as a convenience for specifying gradient positions. This should be\n      // deprecated. It's not properly implemented in canvas mode. ReactART\n      // doesn't handle update to the bounding box correctly. That's why we\n      // mutate this so that if it's reused, we reuse the same resolved box.\n\n      // $FlowFixMe\n      applyBoundingBoxToBrushData(colorOrBrush._brush, props);\n      // $FlowFixMe\n      colorOrBrush._bb = false;\n    }\n    return colorOrBrush._brush;\n  }\n  const c = new Color(colorOrBrush);\n  return [SOLID_COLOR, c.red / 255, c.green / 255, c.blue / 255, c.alpha];\n}\n\nexport function extractAlignment(alignment?: Alignment) {\n  switch (alignment) {\n    case 'right':\n      return 1;\n    case 'center':\n      return 2;\n    default:\n      return 0; // left\n  }\n}\n\nconst cachedFontObjectsFromString = {};\n\nconst fontFamilyPrefix = /^[\\s\"']*/;\nconst fontFamilySuffix = /[\\s\"']*$/;\n\nfunction extractSingleFontFamily(fontFamilyString: string) {\n  // ART on the web allows for multiple font-families to be specified.\n  // For compatibility, we extract the first font-family, hoping\n  // we'll get a match.\n  return fontFamilyString\n    .split(',')[0]\n    .replace(fontFamilyPrefix, '')\n    .replace(fontFamilySuffix, '');\n}\n\nfunction parseFontString(font: string) {\n  if (cachedFontObjectsFromString.hasOwnProperty(font)) {\n    return cachedFontObjectsFromString[font];\n  }\n  const regexp = /^\\s*((?:(?:normal|bold|italic)\\s+)*)(?:(\\d+(?:\\.\\d+)?)[ptexm\\%]*(?:\\s*\\/.*?)?\\s+)?\\s*\\\"?([^\\\"]*)/i;\n  const match = regexp.exec(font);\n  if (!match) {\n    return null;\n  }\n  const fontFamily = extractSingleFontFamily(match[3]);\n  const fontSize = +match[2] || 12;\n  const isBold = /bold/.exec(match[1]);\n  const isItalic = /italic/.exec(match[1]);\n  cachedFontObjectsFromString[font] = {\n    fontFamily: fontFamily,\n    fontSize: fontSize,\n    fontWeight: isBold ? 'bold' : 'normal',\n    fontStyle: isItalic ? 'italic' : 'normal',\n  };\n  return cachedFontObjectsFromString[font];\n}\n\nfunction extractFont(font?: string | Font) {\n  if (font == null) {\n    return null;\n  }\n  if (typeof font === 'string') {\n    return parseFontString(font);\n  }\n  const fontFamily = extractSingleFontFamily(font.fontFamily);\n  const fontSize = +font.fontSize || 12;\n  const fontWeight =\n    font.fontWeight != null ? font.fontWeight.toString() : '400';\n  return {\n    // Normalize\n    fontFamily: fontFamily,\n    fontSize: fontSize,\n    fontWeight: fontWeight,\n    fontStyle: font.fontStyle,\n  };\n}\n\nconst newLine = /\\n/g;\nexport function extractFontAndLines(font?: string | Font, text: string) {\n  return {font: extractFont(font), lines: text.split(newLine)};\n}\n\nfunction insertColorIntoArray(color: ColorType, targetArray, atIndex) {\n  const c = new Color(color);\n  targetArray[atIndex + 0] = c.red / 255;\n  targetArray[atIndex + 1] = c.green / 255;\n  targetArray[atIndex + 2] = c.blue / 255;\n  targetArray[atIndex + 3] = c.alpha;\n}\n\nfunction insertColorsIntoArray(\n  stops: GradientStops,\n  targetArray: Array<number>,\n  atIndex: number,\n) {\n  let i = 0;\n  if ('length' in stops) {\n    // $FlowFixMe: stops is Array here\n    while (i < stops.length) {\n      // $FlowFixMe: stops is Array here\n      insertColorIntoArray(stops[i], targetArray, atIndex + i * 4);\n      i++;\n    }\n  } else {\n    // $FlowFixMe stops is Object here\n    for (const offset in stops) {\n      insertColorIntoArray(stops[offset], targetArray, atIndex + i * 4);\n      i++;\n    }\n  }\n  return atIndex + i * 4;\n}\n\nfunction insertOffsetsIntoArray(\n  stops: GradientStops,\n  targetArray: Array<number>,\n  atIndex: number,\n  multi: number,\n  reverse: boolean,\n) {\n  let offsetNumber;\n  let i = 0;\n  if ('length' in stops) {\n    // $FlowFixMe: stops is Array here\n    while (i < stops.length) {\n      // $FlowFixMe: stops is Array here\n      offsetNumber = (i / (stops.length - 1)) * multi;\n      targetArray[atIndex + i] = reverse ? 1 - offsetNumber : offsetNumber;\n      i++;\n    }\n  } else {\n    // $FlowFixMe stops is Object here\n    for (const offsetString in stops) {\n      offsetNumber = +offsetString * multi;\n      targetArray[atIndex + i] = reverse ? 1 - offsetNumber : offsetNumber;\n      i++;\n    }\n  }\n  return atIndex + i;\n}\n\nexport function insertColorStopsIntoArray(\n  stops: GradientStops,\n  targetArray: Array<number>,\n  atIndex: number,\n) {\n  const lastIndex = insertColorsIntoArray(stops, targetArray, atIndex);\n  insertOffsetsIntoArray(stops, targetArray, lastIndex, 1, false);\n}\n\nexport function insertDoubleColorStopsIntoArray(\n  stops: GradientStops,\n  targetArray: Array<number>,\n  atIndex: number,\n) {\n  let lastIndex = insertColorsIntoArray(stops, targetArray, atIndex);\n  lastIndex = insertColorsIntoArray(stops, targetArray, lastIndex);\n  lastIndex = insertOffsetsIntoArray(stops, targetArray, lastIndex, 0.5, false);\n  insertOffsetsIntoArray(stops, targetArray, lastIndex, 0.5, true);\n}\n"
  },
  {
    "path": "lib/index.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nexport {default as Transform} from 'art/core/transform';\nexport {default as Path} from './ARTSerializablePath';\nexport {default as Surface} from './Surface';\nexport {default as Group} from './Group';\nexport {default as Shape} from './Shape';\nexport {default as Text} from './Text';\nexport {default as ClippingRectangle} from './ClippingRectangle';\nexport {default as LinearGradient} from './LinearGradient';\nexport {default as RadialGradient} from './RadialGradient';\nexport {default as Pattern} from './Pattern';\n"
  },
  {
    "path": "lib/nativeComponents.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nimport {requireNativeComponent} from 'react-native';\n\nconst NativeSurfaceView = requireNativeComponent('ARTSurfaceView');\nconst NativeGroup = requireNativeComponent('ARTGroup');\nconst NativeShape = requireNativeComponent('ARTShape');\nconst NativeText = requireNativeComponent('ARTText');\n\nexport {NativeSurfaceView, NativeGroup, NativeShape, NativeText};\n"
  },
  {
    "path": "lib/types.js",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow\n */\n\nexport type OpacityProps = {\n  visible?: boolean,\n  opacity?: number,\n};\n\nexport type TransformProps = {\n  scaleX?: number,\n  scaleY?: number,\n  scale?: number,\n  x?: number,\n  y?: number,\n  rotation?: number,\n  originX?: number,\n  originY?: number,\n  transform?: {\n    y?: number,\n    x?: number,\n    yy?: number,\n    xx?: number,\n    yx?: number,\n    xy?: number,\n  },\n};\n\nexport type ShadowProps = {\n  shadowOpacity?: number,\n  shadowColor?: string | number,\n  shadowRadius?: number,\n  shadowOffset?: {x: number, y: number},\n};\n\nexport type ARTColor = {\n  isColor: true,\n  red: string,\n  green: string,\n  blue: string,\n  alpha: string,\n};\nexport type ColorType = string | number | ARTColor;\n\nexport type StrokeJoin = 'miter' | 'bevel' | 'round';\nexport type StrokeCap = 'butt' | 'square' | 'round';\nexport type Alignment = 'center' | 'right' | 'left';\n\nexport type Brush = {_brush: Array<number>, _bb?: boolean};\nexport type Font = {\n  fontFamily: string,\n  fontSize?: number,\n  fontWeight?: string,\n  fontStyle?: string,\n};\n\nexport type GradientStops = {[key: string]: ColorType} | Array<ColorType>;\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@react-native-community/art\",\n  \"version\": \"1.2.0\",\n  \"license\": \"MIT\",\n  \"author\": \"@react-native-community\",\n  \"homepage\": \"https://github.com/react-native-community/react-native-art\",\n  \"description\": \"React Native module that allows you to draw vector graphics\",\n  \"main\": \"./lib/index.js\",\n  \"keywords\": [\n    \"react-native\",\n    \"react native\",\n    \"react-native-art\",\n    \"react-native-community\",\n    \"art\"\n  ],\n  \"scripts\": {\n    \"start\": \"node node_modules/react-native/local-cli/cli.js start\",\n    \"android\": \"react-native run-android --root example\",\n    \"ios\": \"react-native run-ios --project-path example/ios --scheme example\",\n    \"flow-check\": \"flow check\",\n    \"lint\": \"eslint . --cache\",\n    \"test\": \"jest\"\n  },\n  \"dependencies\": {\n    \"art\": \"^0.10.3\",\n    \"invariant\": \"^2.2.4\",\n    \"prop-types\": \"^15.7.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"*\",\n    \"react-native\": \"*\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.4.5\",\n    \"@babel/runtime\": \"^7.4.5\",\n    \"@react-native-community/eslint-config\": \"^0.0.5\",\n    \"eslint\": \"^5.16.0\",\n    \"flow-bin\": \"^0.92.0\",\n    \"jest\": \"^24.8.0\",\n    \"metro-react-native-babel-preset\": \"^0.54.1\",\n    \"react\": \"16.8.3\",\n    \"react-native\": \"0.59.9\"\n  }\n}\n"
  }
]