From 27c42a55c8fa95f0c9a9d7fbd840f91bfd931d26 Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Sun, 7 Oct 2018 21:10:38 -0300 Subject: [PATCH] Initial commit Signed-off-by: Chris Cromer --- .idea/jvon-mobile.iml | 13 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .npmignore | 2 + config.xml | 40 + hooks/README.md | 23 + node_modules/.bin/create | 1 + node_modules/cordova-android/.eslintignore | 1 + node_modules/cordova-android/.eslintrc.yml | 10 + node_modules/cordova-android/.gitattributes | 94 + .../.github/PULL_REQUEST_TEMPLATE.md | 22 + node_modules/cordova-android/.ratignore | 9 + node_modules/cordova-android/.reviewboardrc | 8 + node_modules/cordova-android/.travis.yml | 28 + node_modules/cordova-android/CONTRIBUTING.md | 38 + node_modules/cordova-android/LICENSE | 314 + node_modules/cordova-android/NOTICE | 15 + node_modules/cordova-android/README.md | 70 + node_modules/cordova-android/RELEASENOTES.md | 703 ++ node_modules/cordova-android/VERSION | 1 + node_modules/cordova-android/appveyor.yml | 38 + .../cordova-android/bin/android_sdk_version | 29 + .../bin/android_sdk_version.bat | 26 + node_modules/cordova-android/bin/check_reqs | 31 + .../cordova-android/bin/check_reqs.bat | 26 + node_modules/cordova-android/bin/create | 58 + node_modules/cordova-android/bin/create.bat | 26 + .../cordova-android/bin/lib/create.js | 360 + .../bin/templates/cordova/Api.js | 411 + .../bin/templates/cordova/build | 50 + .../bin/templates/cordova/build.bat | 26 + .../bin/templates/cordova/clean | 51 + .../bin/templates/cordova/clean.bat | 26 + .../bin/templates/cordova/defaults.xml | 26 + .../bin/templates/cordova/lib/Adb.js | 101 + .../templates/cordova/lib/AndroidManifest.js | 160 + .../templates/cordova/lib/AndroidProject.js | 209 + .../templates/cordova/lib/AndroidStudio.js | 42 + .../bin/templates/cordova/lib/android_sdk.js | 102 + .../bin/templates/cordova/lib/build.js | 294 + .../cordova/lib/builders/GenericBuilder.js | 124 + .../cordova/lib/builders/GradleBuilder.js | 331 + .../cordova/lib/builders/StudioBuilder.js | 303 + .../cordova/lib/builders/builders.js | 46 + .../bin/templates/cordova/lib/check_reqs.js | 424 + .../bin/templates/cordova/lib/device.js | 112 + .../bin/templates/cordova/lib/emulator.js | 533 ++ .../bin/templates/cordova/lib/getASPath.bat | 3 + .../bin/templates/cordova/lib/install-device | 42 + .../templates/cordova/lib/install-device.bat | 26 + .../templates/cordova/lib/install-emulator | 38 + .../cordova/lib/install-emulator.bat | 26 + .../bin/templates/cordova/lib/list-devices | 34 + .../templates/cordova/lib/list-devices.bat | 26 + .../cordova/lib/list-emulator-images | 34 + .../cordova/lib/list-emulator-images.bat | 26 + .../cordova/lib/list-started-emulators | 34 + .../cordova/lib/list-started-emulators.bat | 26 + .../bin/templates/cordova/lib/log.js | 56 + .../templates/cordova/lib/plugin-build.gradle | 72 + .../templates/cordova/lib/pluginHandlers.js | 320 + .../bin/templates/cordova/lib/prepare.js | 480 + .../bin/templates/cordova/lib/retry.js | 68 + .../bin/templates/cordova/lib/run.js | 132 + .../bin/templates/cordova/lib/start-emulator | 39 + .../templates/cordova/lib/start-emulator.bat | 26 + .../cordova-android/bin/templates/cordova/log | 36 + .../bin/templates/cordova/log.bat | 26 + .../bin/templates/cordova/loggingHelper.js | 18 + .../cordova-android/bin/templates/cordova/run | 53 + .../bin/templates/cordova/run.bat | 26 + .../bin/templates/cordova/version | 29 + .../bin/templates/cordova/version.bat | 26 + .../bin/templates/project/Activity.java | 41 + .../bin/templates/project/AndroidManifest.xml | 49 + .../bin/templates/project/app/build.gradle | 324 + .../templates/project/assets/www/cordova.js | 2189 +++++ .../project/assets/www/css/index.css | 115 + .../project/assets/www/img/cordova.png | Bin 0 -> 19932 bytes .../templates/project/assets/www/img/logo.png | Bin 0 -> 21814 bytes .../templates/project/assets/www/index.html | 49 + .../templates/project/assets/www/js/index.js | 51 + .../bin/templates/project/build.gradle | 54 + .../bin/templates/project/gitignore | 14 + .../bin/templates/project/legacy/build.gradle | 311 + .../bin/templates/project/project.properties | 13 + .../project/res/drawable-land-hdpi/screen.png | Bin 0 -> 64368 bytes .../project/res/drawable-land-ldpi/screen.png | Bin 0 -> 15341 bytes .../project/res/drawable-land-mdpi/screen.png | Bin 0 -> 31136 bytes .../res/drawable-land-xhdpi/screen.png | Bin 0 -> 142334 bytes .../res/drawable-land-xxhdpi/screen.png | Bin 0 -> 227190 bytes .../res/drawable-land-xxxhdpi/screen.png | Bin 0 -> 293416 bytes .../project/res/drawable-port-hdpi/screen.png | Bin 0 -> 67702 bytes .../project/res/drawable-port-ldpi/screen.png | Bin 0 -> 15345 bytes .../project/res/drawable-port-mdpi/screen.png | Bin 0 -> 30079 bytes .../res/drawable-port-xhdpi/screen.png | Bin 0 -> 141738 bytes .../res/drawable-port-xxhdpi/screen.png | Bin 0 -> 211817 bytes .../res/drawable-port-xxxhdpi/screen.png | Bin 0 -> 299018 bytes .../project/res/mipmap-hdpi/icon.png | Bin 0 -> 3345 bytes .../project/res/mipmap-ldpi/icon.png | Bin 0 -> 1821 bytes .../project/res/mipmap-mdpi/icon.png | Bin 0 -> 2368 bytes .../project/res/mipmap-xhdpi/icon.png | Bin 0 -> 4085 bytes .../project/res/mipmap-xxhdpi/icon.png | Bin 0 -> 6421 bytes .../project/res/mipmap-xxxhdpi/icon.png | Bin 0 -> 7934 bytes .../templates/project/res/values/strings.xml | 9 + .../bin/templates/project/res/xml/config.xml | 58 + .../bin/templates/project/wrapper.gradle | 1 + node_modules/cordova-android/bin/update | 37 + node_modules/cordova-android/bin/update.bat | 26 + .../android/nativeapiprovider.js | 36 + .../android/promptbasednativeapi.js | 35 + .../cordova-android/cordova-js-src/exec.js | 297 + .../cordova-js-src/platform.js | 125 + .../cordova-js-src/plugin/android/app.js | 108 + .../cordova-android/framework/.classpath | 9 + .../cordova-android/framework/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 4 + .../framework/AndroidManifest.xml | 23 + .../cordova-android/framework/ant.properties | 34 + .../cordova-android/framework/build.gradle | 137 + .../cordova-android/framework/build.xml | 192 + .../cordova-android/framework/cordova.gradle | 205 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../framework/project.properties | 16 + .../apache/cordova/AuthenticationToken.java | 69 + .../src/org/apache/cordova/BuildHelper.java | 70 + .../org/apache/cordova/CallbackContext.java | 142 + .../src/org/apache/cordova/CallbackMap.java | 65 + .../src/org/apache/cordova/Config.java | 71 + .../org/apache/cordova/ConfigXmlParser.java | 145 + .../org/apache/cordova/CordovaActivity.java | 519 ++ .../src/org/apache/cordova/CordovaArgs.java | 113 + .../src/org/apache/cordova/CordovaBridge.java | 187 + .../cordova/CordovaClientCertRequest.java | 105 + .../apache/cordova/CordovaDialogsHelper.java | 152 + .../cordova/CordovaHttpAuthHandler.java | 51 + .../org/apache/cordova/CordovaInterface.java | 97 + .../apache/cordova/CordovaInterfaceImpl.java | 249 + .../src/org/apache/cordova/CordovaPlugin.java | 422 + .../apache/cordova/CordovaPreferences.java | 101 + .../apache/cordova/CordovaResourceApi.java | 472 + .../org/apache/cordova/CordovaWebView.java | 142 + .../apache/cordova/CordovaWebViewEngine.java | 85 + .../apache/cordova/CordovaWebViewImpl.java | 615 ++ .../src/org/apache/cordova/CoreAndroid.java | 390 + .../src/org/apache/cordova/ExposedJsApi.java | 31 + .../cordova/ICordovaClientCertRequest.java | 66 + .../apache/cordova/ICordovaCookieManager.java | 33 + .../cordova/ICordovaHttpAuthHandler.java | 38 + .../framework/src/org/apache/cordova/LOG.java | 244 + .../cordova/NativeToJsMessageQueue.java | 542 ++ .../org/apache/cordova/PermissionHelper.java | 87 + .../src/org/apache/cordova/PluginEntry.java | 70 + .../src/org/apache/cordova/PluginManager.java | 526 ++ .../src/org/apache/cordova/PluginResult.java | 198 + .../org/apache/cordova/ResumeCallback.java | 76 + .../src/org/apache/cordova/Whitelist.java | 170 + .../cordova/engine/SystemCookieManager.java | 69 + .../cordova/engine/SystemExposedJsApi.java | 53 + .../cordova/engine/SystemWebChromeClient.java | 277 + .../apache/cordova/engine/SystemWebView.java | 88 + .../cordova/engine/SystemWebViewClient.java | 367 + .../cordova/engine/SystemWebViewEngine.java | 319 + .../cordova-android/node_modules/.bin/nopt | 1 + .../cordova-android/node_modules/.bin/semver | 1 + .../cordova-android/node_modules/.bin/shjs | 1 + .../node_modules/abbrev/LICENSE | 46 + .../node_modules/abbrev/README.md | 23 + .../node_modules/abbrev/abbrev.js | 61 + .../node_modules/abbrev/package.json | 57 + .../android-versions/.jshintignore | 8 + .../node_modules/android-versions/.jshintrc | 28 + .../node_modules/android-versions/.travis.yml | 3 + .../node_modules/android-versions/README.md | 87 + .../node_modules/android-versions/index.js | 154 + .../android-versions/package.json | 67 + .../android-versions/tests/index.test.js | 118 + .../node_modules/ansi/.jshintrc | 4 + .../node_modules/ansi/.npmignore | 1 + .../node_modules/ansi/History.md | 23 + .../cordova-android/node_modules/ansi/LICENSE | 24 + .../node_modules/ansi/README.md | 98 + .../node_modules/ansi/examples/beep/index.js | 16 + .../node_modules/ansi/examples/clear/index.js | 15 + .../ansi/examples/cursorPosition.js | 32 + .../ansi/examples/progress/index.js | 87 + .../node_modules/ansi/lib/ansi.js | 405 + .../node_modules/ansi/lib/newlines.js | 71 + .../node_modules/ansi/package.json | 56 + .../node_modules/balanced-match/.npmignore | 5 + .../node_modules/balanced-match/LICENSE.md | 21 + .../node_modules/balanced-match/README.md | 91 + .../node_modules/balanced-match/index.js | 59 + .../node_modules/balanced-match/package.json | 78 + .../node_modules/base64-js/LICENSE | 21 + .../node_modules/base64-js/README.md | 32 + .../node_modules/base64-js/base64js.min.js | 1 + .../node_modules/base64-js/index.js | 114 + .../node_modules/base64-js/package.json | 66 + .../node_modules/base64-js/test/big-data.js | 24 + .../node_modules/base64-js/test/convert.js | 48 + .../node_modules/base64-js/test/url-safe.js | 18 + .../node_modules/big-integer/BigInteger.d.ts | 2385 +++++ .../node_modules/big-integer/BigInteger.js | 1308 +++ .../big-integer/BigInteger.min.js | 1 + .../node_modules/big-integer/LICENSE | 24 + .../node_modules/big-integer/README.md | 570 ++ .../node_modules/big-integer/bower.json | 29 + .../node_modules/big-integer/package.json | 81 + .../node_modules/big-integer/tsconfig.json | 25 + .../node_modules/bplist-parser/.npmignore | 8 + .../node_modules/bplist-parser/README.md | 47 + .../bplist-parser/bplistParser.js | 357 + .../node_modules/bplist-parser/package.json | 59 + .../bplist-parser/test/airplay.bplist | Bin 0 -> 341 bytes .../bplist-parser/test/iTunes-small.bplist | Bin 0 -> 24433 bytes .../bplist-parser/test/int64.bplist | Bin 0 -> 84 bytes .../node_modules/bplist-parser/test/int64.xml | 10 + .../bplist-parser/test/parseTest.js | 159 + .../bplist-parser/test/sample1.bplist | Bin 0 -> 605 bytes .../bplist-parser/test/sample2.bplist | Bin 0 -> 384 bytes .../bplist-parser/test/uid.bplist | Bin 0 -> 365 bytes .../bplist-parser/test/utf16.bplist | Bin 0 -> 1273 bytes .../bplist-parser/test/utf16_chinese.plist | Bin 0 -> 2362 bytes .../node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 129 + .../node_modules/brace-expansion/index.js | 201 + .../node_modules/brace-expansion/package.json | 76 + .../node_modules/concat-map/.travis.yml | 4 + .../node_modules/concat-map/LICENSE | 18 + .../node_modules/concat-map/README.markdown | 62 + .../node_modules/concat-map/index.js | 13 + .../node_modules/concat-map/package.json | 89 + .../node_modules/concat-map/test/map.js | 39 + .../node_modules/cordova-common/.eslintignore | 1 + .../node_modules/cordova-common/.eslintrc.yml | 13 + .../.github/PULL_REQUEST_TEMPLATE.md | 22 + .../node_modules/cordova-common/.npmignore | 2 + .../node_modules/cordova-common/.ratignore | 4 + .../node_modules/cordova-common/.travis.yml | 17 + .../node_modules/cordova-common/README.md | 155 + .../cordova-common/RELEASENOTES.md | 153 + .../node_modules/cordova-common/appveyor.yml | 20 + .../cordova-common/cordova-common.js | 47 + .../node_modules/cordova-common/package.json | 81 + .../cordova-common/src/ActionStack.js | 85 + .../src/ConfigChanges/ConfigChanges.js | 426 + .../src/ConfigChanges/ConfigFile.js | 259 + .../src/ConfigChanges/ConfigKeeper.js | 64 + .../src/ConfigChanges/munge-util.js | 162 + .../src/ConfigParser/ConfigParser.js | 602 ++ .../cordova-common/src/CordovaCheck.js | 76 + .../src/CordovaError/CordovaError.js | 92 + .../CordovaExternalToolErrorContext.js | 48 + .../cordova-common/src/CordovaLogger.js | 220 + .../cordova-common/src/FileUpdater.js | 415 + .../cordova-common/src/PlatformJson.js | 277 + .../src/PluginInfo/PluginInfo.js | 439 + .../src/PluginInfo/PluginInfoProvider.js | 82 + .../cordova-common/src/PluginManager.js | 149 + .../node_modules/cordova-common/src/events.js | 72 + .../cordova-common/src/superspawn.js | 189 + .../cordova-common/src/util/addProperty.js | 32 + .../cordova-common/src/util/plist-helpers.js | 96 + .../cordova-common/src/util/xml-helpers.js | 365 + .../cordova-registry-mapper/.npmignore | 1 + .../cordova-registry-mapper/.travis.yml | 7 + .../cordova-registry-mapper/README.md | 14 + .../cordova-registry-mapper/index.js | 204 + .../cordova-registry-mapper/package.json | 54 + .../cordova-registry-mapper/tests/test.js | 11 + .../node_modules/elementtree/.npmignore | 1 + .../node_modules/elementtree/.travis.yml | 10 + .../node_modules/elementtree/CHANGES.md | 39 + .../node_modules/elementtree/LICENSE.txt | 203 + .../node_modules/elementtree/Makefile | 21 + .../node_modules/elementtree/NOTICE | 5 + .../node_modules/elementtree/README.md | 141 + .../node_modules/elementtree/lib/constants.js | 20 + .../elementtree/lib/elementpath.js | 343 + .../elementtree/lib/elementtree.js | 611 ++ .../node_modules/elementtree/lib/errors.js | 31 + .../node_modules/elementtree/lib/parser.js | 33 + .../elementtree/lib/parsers/index.js | 1 + .../elementtree/lib/parsers/sax.js | 56 + .../node_modules/elementtree/lib/sprintf.js | 86 + .../elementtree/lib/treebuilder.js | 60 + .../node_modules/elementtree/lib/utils.js | 72 + .../node_modules/elementtree/package.json | 81 + .../elementtree/tests/data/xml1.xml | 17 + .../elementtree/tests/data/xml2.xml | 14 + .../elementtree/tests/test-simple.js | 339 + .../cordova-android/node_modules/glob/LICENSE | 15 + .../node_modules/glob/README.md | 377 + .../node_modules/glob/common.js | 245 + .../cordova-android/node_modules/glob/glob.js | 752 ++ .../node_modules/glob/package.json | 76 + .../cordova-android/node_modules/glob/sync.js | 460 + .../node_modules/inflight/LICENSE | 15 + .../node_modules/inflight/README.md | 37 + .../node_modules/inflight/inflight.js | 54 + .../node_modules/inflight/package.json | 59 + .../node_modules/inherits/LICENSE | 16 + .../node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 7 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 62 + .../node_modules/minimatch/LICENSE | 15 + .../node_modules/minimatch/README.md | 209 + .../node_modules/minimatch/minimatch.js | 923 ++ .../node_modules/minimatch/package.json | 65 + .../node_modules/nopt/.npmignore | 1 + .../cordova-android/node_modules/nopt/LICENSE | 23 + .../node_modules/nopt/README.md | 209 + .../node_modules/nopt/bin/nopt.js | 54 + .../node_modules/nopt/examples/my-program.js | 30 + .../node_modules/nopt/lib/nopt.js | 414 + .../node_modules/nopt/package.json | 60 + .../node_modules/nopt/test/basic.js | 251 + .../cordova-android/node_modules/once/LICENSE | 15 + .../node_modules/once/README.md | 79 + .../cordova-android/node_modules/once/once.js | 42 + .../node_modules/once/package.json | 68 + .../node_modules/path-is-absolute/index.js | 20 + .../node_modules/path-is-absolute/license | 21 + .../path-is-absolute/package.json | 76 + .../node_modules/path-is-absolute/readme.md | 59 + .../node_modules/plist/.jshintrc | 4 + .../node_modules/plist/.travis.yml | 43 + .../node_modules/plist/History.md | 149 + .../node_modules/plist/LICENSE | 24 + .../node_modules/plist/Makefile | 76 + .../node_modules/plist/README.md | 141 + .../node_modules/plist/dist/plist-build.js | 3982 ++++++++ .../node_modules/plist/dist/plist-parse.js | 4055 +++++++++ .../node_modules/plist/dist/plist.js | 7987 ++++++++++++++++ .../plist/examples/browser/index.html | 14 + .../node_modules/plist/index.js | 13 + .../node_modules/plist/lib/build.js | 137 + .../node_modules/plist/lib/parse.js | 215 + .../node_modules/plist/package.json | 86 + .../properties-parser/README.markdown | 48 + .../node_modules/properties-parser/index.js | 354 + .../properties-parser/package.json | 57 + .../properties-parser/play-ground.js | 17 + .../cordova-android/node_modules/q/CHANGES.md | 786 ++ .../cordova-android/node_modules/q/LICENSE | 18 + .../cordova-android/node_modules/q/README.md | 881 ++ .../node_modules/q/package.json | 120 + .../cordova-android/node_modules/q/q.js | 2048 +++++ .../cordova-android/node_modules/q/queue.js | 35 + .../cordova-android/node_modules/sax/AUTHORS | 9 + .../cordova-android/node_modules/sax/LICENSE | 23 + .../node_modules/sax/README.md | 213 + .../sax/examples/big-not-pretty.xml | 8002 +++++++++++++++++ .../node_modules/sax/examples/example.js | 41 + .../node_modules/sax/examples/get-products.js | 58 + .../node_modules/sax/examples/hello-world.js | 4 + .../node_modules/sax/examples/not-pretty.xml | 8 + .../node_modules/sax/examples/pretty-print.js | 74 + .../node_modules/sax/examples/shopping.xml | 2 + .../node_modules/sax/examples/strict.dtd | 870 ++ .../node_modules/sax/examples/switch-bench.js | 45 + .../node_modules/sax/examples/test.html | 15 + .../node_modules/sax/examples/test.xml | 1254 +++ .../node_modules/sax/lib/sax.js | 1006 +++ .../node_modules/sax/package.json | 89 + .../node_modules/sax/test/buffer-overrun.js | 25 + .../node_modules/sax/test/cdata-chunked.js | 11 + .../node_modules/sax/test/cdata-end-split.js | 15 + .../node_modules/sax/test/cdata-fake-end.js | 28 + .../node_modules/sax/test/cdata-multiple.js | 15 + .../node_modules/sax/test/cdata.js | 10 + .../node_modules/sax/test/index.js | 86 + .../node_modules/sax/test/issue-23.js | 43 + .../node_modules/sax/test/issue-30.js | 24 + .../node_modules/sax/test/issue-35.js | 15 + .../node_modules/sax/test/issue-47.js | 13 + .../node_modules/sax/test/issue-49.js | 31 + .../node_modules/sax/test/parser-position.js | 28 + .../node_modules/sax/test/script.js | 12 + .../sax/test/self-closing-child-strict.js | 40 + .../sax/test/self-closing-child.js | 40 + .../node_modules/sax/test/self-closing-tag.js | 25 + .../node_modules/sax/test/stray-ending.js | 17 + .../sax/test/trailing-non-whitespace.js | 17 + .../node_modules/sax/test/unquoted.js | 17 + .../node_modules/sax/test/xmlns-issue-41.js | 67 + .../node_modules/sax/test/xmlns-rebinding.js | 59 + .../node_modules/sax/test/xmlns-strict.js | 71 + .../node_modules/sax/test/xmlns-unbound.js | 15 + .../xmlns-xml-default-prefix-attribute.js | 35 + .../sax/test/xmlns-xml-default-prefix.js | 20 + .../sax/test/xmlns-xml-default-redefine.js | 40 + .../node_modules/semver/LICENSE | 15 + .../node_modules/semver/README.md | 388 + .../node_modules/semver/bin/semver | 143 + .../node_modules/semver/package.json | 55 + .../node_modules/semver/range.bnf | 16 + .../node_modules/semver/semver.js | 1324 +++ .../node_modules/shelljs/.documentup.json | 6 + .../node_modules/shelljs/.jshintrc | 7 + .../node_modules/shelljs/.npmignore | 2 + .../node_modules/shelljs/.travis.yml | 6 + .../node_modules/shelljs/LICENSE | 26 + .../node_modules/shelljs/README.md | 579 ++ .../node_modules/shelljs/RELEASE.md | 9 + .../node_modules/shelljs/bin/shjs | 51 + .../node_modules/shelljs/global.js | 3 + .../node_modules/shelljs/make.js | 56 + .../node_modules/shelljs/package.json | 67 + .../shelljs/scripts/generate-docs.js | 21 + .../node_modules/shelljs/scripts/run-tests.js | 50 + .../node_modules/shelljs/shell.js | 159 + .../node_modules/shelljs/src/cat.js | 43 + .../node_modules/shelljs/src/cd.js | 19 + .../node_modules/shelljs/src/chmod.js | 208 + .../node_modules/shelljs/src/common.js | 203 + .../node_modules/shelljs/src/cp.js | 204 + .../node_modules/shelljs/src/dirs.js | 191 + .../node_modules/shelljs/src/echo.js | 20 + .../node_modules/shelljs/src/error.js | 10 + .../node_modules/shelljs/src/exec.js | 216 + .../node_modules/shelljs/src/find.js | 51 + .../node_modules/shelljs/src/grep.js | 52 + .../node_modules/shelljs/src/ln.js | 53 + .../node_modules/shelljs/src/ls.js | 126 + .../node_modules/shelljs/src/mkdir.js | 68 + .../node_modules/shelljs/src/mv.js | 80 + .../node_modules/shelljs/src/popd.js | 1 + .../node_modules/shelljs/src/pushd.js | 1 + .../node_modules/shelljs/src/pwd.js | 11 + .../node_modules/shelljs/src/rm.js | 163 + .../node_modules/shelljs/src/sed.js | 43 + .../node_modules/shelljs/src/tempdir.js | 56 + .../node_modules/shelljs/src/test.js | 85 + .../node_modules/shelljs/src/to.js | 29 + .../node_modules/shelljs/src/toEnd.js | 29 + .../node_modules/shelljs/src/which.js | 83 + .../node_modules/underscore/LICENSE | 23 + .../node_modules/underscore/README.md | 28 + .../node_modules/underscore/package.json | 82 + .../node_modules/underscore/underscore-min.js | 5 + .../underscore/underscore-min.js.map | 1 + .../node_modules/underscore/underscore.js | 1692 ++++ .../node_modules/unorm/LICENSE.md | 42 + .../node_modules/unorm/README.md | 118 + .../node_modules/unorm/lib/unorm.js | 442 + .../node_modules/unorm/package.json | 73 + .../node_modules/wrappy/LICENSE | 15 + .../node_modules/wrappy/README.md | 36 + .../node_modules/wrappy/package.json | 60 + .../node_modules/wrappy/wrappy.js | 33 + .../node_modules/xmlbuilder/.npmignore | 5 + .../node_modules/xmlbuilder/CHANGELOG.md | 395 + .../node_modules/xmlbuilder/LICENSE | 21 + .../node_modules/xmlbuilder/README.md | 85 + .../node_modules/xmlbuilder/lib/Utility.js | 139 + .../xmlbuilder/lib/XMLAttribute.js | 31 + .../node_modules/xmlbuilder/lib/XMLCData.js | 32 + .../node_modules/xmlbuilder/lib/XMLComment.js | 32 + .../xmlbuilder/lib/XMLDTDAttList.js | 50 + .../xmlbuilder/lib/XMLDTDElement.js | 35 + .../xmlbuilder/lib/XMLDTDEntity.js | 56 + .../xmlbuilder/lib/XMLDTDNotation.js | 37 + .../xmlbuilder/lib/XMLDeclaration.js | 40 + .../node_modules/xmlbuilder/lib/XMLDocType.js | 107 + .../xmlbuilder/lib/XMLDocument.js | 48 + .../xmlbuilder/lib/XMLDocumentCB.js | 402 + .../node_modules/xmlbuilder/lib/XMLElement.js | 111 + .../node_modules/xmlbuilder/lib/XMLNode.js | 432 + .../lib/XMLProcessingInstruction.js | 35 + .../node_modules/xmlbuilder/lib/XMLRaw.js | 32 + .../xmlbuilder/lib/XMLStreamWriter.js | 278 + .../xmlbuilder/lib/XMLStringWriter.js | 302 + .../xmlbuilder/lib/XMLStringifier.js | 192 + .../node_modules/xmlbuilder/lib/XMLText.js | 32 + .../xmlbuilder/lib/XMLWriterBase.js | 68 + .../node_modules/xmlbuilder/lib/index.js | 53 + .../node_modules/xmlbuilder/package.json | 66 + .../node_modules/xmldom/.npmignore | 5 + .../node_modules/xmldom/.travis.yml | 22 + .../node_modules/xmldom/LICENSE | 8 + .../node_modules/xmldom/__package__.js | 4 + .../node_modules/xmldom/changelog | 14 + .../node_modules/xmldom/component.json | 10 + .../node_modules/xmldom/dom-parser.js | 251 + .../node_modules/xmldom/dom.js | 1244 +++ .../node_modules/xmldom/package.json | 96 + .../node_modules/xmldom/readme.md | 219 + .../node_modules/xmldom/sax.js | 633 ++ node_modules/cordova-android/package.json | 140 + .../cordova-android/spec/.eslintrc.yml | 2 + .../plugin.xml | 41 + .../android/FakeLib/project.properties | 15 + .../fixtures/cordova-plugin-fake/plugin.xml | 44 + .../spec/e2e/helpers/projectActions.js | 150 + .../cordova-android/spec/e2e/jasmine.json | 8 + .../cordova-android/spec/e2e/plugin.spec.js | 44 + .../android_project/AndroidManifest.xml | 69 + .../android_project/assets/www/.gitkeep | 0 .../android_project/res/xml/config.xml | 54 + .../fixtures/android_project/src/.gitkeep | 0 .../android_studio_project/app/build.gradle | 26 + .../app/proguard-rules.pro | 17 + .../app/src/main/AndroidManifest.xml | 20 + .../app/src/main/res/layout/activity_main.xml | 17 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 11 + .../android_studio_project/build.gradle | 23 + .../android_studio_project/gradle.properties | 18 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../fixtures/android_studio_project/gradlew | 160 + .../android_studio_project/gradlew.bat | 90 + .../android_studio_project/settings.gradle | 1 + .../android-resource.xml | 1 + .../org.test.plugins.dummyplugin/extra.gradle | 1 + .../plugin-lib/AndroidManifest.xml | 5 + .../plugin-lib/libFile | 1 + .../plugin-lib/project.properties | 1 + .../plugin-lib2/AndroidManifest.xml | 5 + .../plugin-lib2/libFile | 1 + .../plugin-lib2/project.properties | 1 + .../org.test.plugins.dummyplugin/plugin.xml | 75 + .../src/android/DummyPlugin.java | 1 + .../src/android/TestLib.jar | 1 + .../www/dummyplugin.js | 0 .../www/dummyplugin/image.jpg | 1 + .../org.test.plugins.faultyplugin/plugin.xml | 63 + .../src/android/FaultyPlugin.java | 1 + .../fixtures/sdk25.2-android_list_avd.txt | 7 + .../fixtures/sdk25.2-android_list_targets.txt | 116 + .../fixtures/sdk25.3-avdmanager_list_avd.txt | 22 + .../sdk25.3-avdmanager_list_target.txt | 7 + .../spec/unit/AndroidProject.spec.js | 31 + .../spec/unit/AndroidStudio.spec.js | 16 + .../cordova-android/spec/unit/Api.spec.js | 74 + .../spec/unit/android_sdk.spec.js | 124 + .../spec/unit/builders/GradleBuilder.spec.js | 28 + .../spec/unit/check_reqs.spec.js | 239 + .../cordova-android/spec/unit/create.spec.js | 282 + .../spec/unit/emulator.spec.js | 224 + .../cordova-android/spec/unit/jasmine.json | 8 + .../spec/unit/pluginHandlers/common.spec.js | 171 + .../spec/unit/pluginHandlers/handlers.spec.js | 391 + .../cordova-android/spec/unit/run.spec.js | 38 + node_modules/cordova-android/test/README.md | 58 + .../cordova-android/test/app/build.gradle | 52 + .../test/app/proguard-rules.pro | 36 + .../unittests/BackButtonMultipageTest.java | 158 + .../unittests/EmbeddedWebViewTest.java | 53 + .../cordova/unittests/ErrorUrlTest.java | 68 + .../apache/cordova/unittests/IFrameTest.java | 114 + .../MessageChannelMultipageTest.java | 130 + .../unittests/StandardActivityTest.java | 100 + .../test/app/src/main/AndroidManifest.xml | 58 + .../assets/www/backbuttonmultipage/index.html | 40 + .../www/backbuttonmultipage/sample2.html | 40 + .../www/backbuttonmultipage/sample3.html | 42 + .../assets/www/backgroundcolor/index.html | 39 + .../test/app/src/main/assets/www/cordova.js | 2208 +++++ .../src/main/assets/www/cordova_plugins.js | 22 + .../src/main/assets/www/fullscreen/index.html | 40 + .../main/assets/www/htmlnotfound/error.html | 38 + .../app/src/main/assets/www/iframe/index.html | 49 + .../src/main/assets/www/iframe/index2.html | 40 + .../test/app/src/main/assets/www/index.html | 56 + .../src/main/assets/www/lifecycle/index.html | 112 + .../src/main/assets/www/lifecycle/index2.html | 110 + .../test/app/src/main/assets/www/main.js | 27 + .../test/app/src/main/assets/www/master.css | 136 + .../src/main/assets/www/whitelist/index.html | 45 + .../src/main/assets/www/whitelist/index2.html | 39 + .../unittests/EmbeddedWebViewActivity.java | 110 + .../cordova/unittests/LifeCyclePlugin.java | 49 + .../cordova/unittests/StandardActivity.java | 42 + .../cordova/unittests/TestActivity.java | 67 + .../app/src/main/res/layout/activity_main.xml | 34 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../app/src/main/res/values-w820dp/dimens.xml | 24 + .../test/app/src/main/res/values/colors.xml | 24 + .../test/app/src/main/res/values/dimens.xml | 23 + .../test/app/src/main/res/values/strings.xml | 22 + .../test/app/src/main/res/values/styles.xml | 29 + .../test/app/src/main/res/xml/config.xml | 44 + .../unittests/NativeToJsMessageQueueTest.java | 177 + .../cordova-android/test/gradle.properties | 17 + .../test/run_java_unit_tests.js | 47 + .../cordova-android/test/settings.gradle | 21 + .../cordova-plugin-splashscreen/.appveyor.yml | 28 + .../.github/PULL_REQUEST_TEMPLATE.md | 22 + .../cordova-plugin-splashscreen/.jshintignore | 1 + .../cordova-plugin-splashscreen/.jshintrc | 16 + .../cordova-plugin-splashscreen/.npmignore | 28 + .../cordova-plugin-splashscreen/.travis.yml | 98 + .../CONTRIBUTING.md | 37 + .../cordova-plugin-splashscreen/LICENSE | 202 + .../cordova-plugin-splashscreen/NOTICE | 5 + .../cordova-plugin-splashscreen/README.md | 522 ++ .../RELEASENOTES.md | 238 + .../doc/de/README.md | 119 + .../doc/de/index.md | 78 + .../doc/es/README.md | 119 + .../doc/es/index.md | 76 + .../doc/fr/README.md | 119 + .../doc/fr/index.md | 78 + .../doc/it/README.md | 119 + .../doc/it/index.md | 78 + .../doc/ja/README.md | 119 + .../doc/ja/index.md | 78 + .../doc/ko/README.md | 119 + .../doc/ko/index.md | 78 + .../doc/pl/README.md | 119 + .../doc/pl/index.md | 78 + .../doc/ru/index.md | 75 + .../doc/zh/README.md | 119 + .../doc/zh/index.md | 78 + .../cordova-plugin-splashscreen/package.json | 83 + .../cordova-plugin-splashscreen/plugin.xml | 82 + .../src/android/SplashScreen.java | 413 + .../src/browser/SplashScreenProxy.js | 170 + .../src/ios/CDVSplashScreen.h | 46 + .../src/ios/CDVSplashScreen.m | 514 ++ .../src/ios/CDVViewController+SplashScreen.h | 28 + .../src/ios/CDVViewController+SplashScreen.m | 89 + .../src/wp/ResolutionHelper.cs | 39 + .../src/wp/SplashScreen.cs | 255 + .../contents.xcworkspacedata | 7 + .../CDVSplashScreenTest.xccheckout | 41 + .../xcschemes/CordovaLib.xcscheme | 77 + .../tests/ios/CDVSplashScreenTest/.npmignore | 1 + .../CDVSplashScreenLibTests/ImageNameTest.m | 702 ++ .../ImageNameTestDelegates.h | 57 + .../ImageNameTestDelegates.m | 200 + .../CDVSplashScreenLibTests/Info.plist | 44 + .../project.pbxproj | 505 ++ .../contents.xcworkspacedata | 7 + .../CDVSplashScreenTest.xccheckout | 41 + .../xcschemes/CDVSplashScreenLib.xcscheme | 77 + .../CDVSplashScreenLibTests.xcscheme | 96 + .../tests/ios/README.md | 40 + .../tests/ios/doc/de/README.md | 39 + .../tests/ios/doc/es/README.md | 39 + .../tests/ios/doc/fr/README.md | 39 + .../tests/ios/doc/it/README.md | 39 + .../tests/ios/doc/ja/README.md | 39 + .../tests/ios/doc/ko/README.md | 39 + .../tests/ios/doc/pl/README.md | 39 + .../tests/ios/doc/zh/README.md | 39 + .../tests/ios/package.json | 13 + .../tests/package.json | 14 + .../tests/plugin.xml | 29 + .../tests/tests.js | 64 + .../types/index.d.ts | 17 + .../www/splashscreen.js | 33 + .../www/windows/SplashScreenProxy.js | 37 + .../.github/PULL_REQUEST_TEMPLATE.md | 22 + .../cordova-plugin-whitelist/CONTRIBUTING.md | 37 + node_modules/cordova-plugin-whitelist/LICENSE | 202 + node_modules/cordova-plugin-whitelist/NOTICE | 5 + .../cordova-plugin-whitelist/README.md | 163 + .../cordova-plugin-whitelist/RELEASENOTES.md | 75 + .../cordova-plugin-whitelist/doc/de/README.md | 148 + .../cordova-plugin-whitelist/doc/es/README.md | 148 + .../cordova-plugin-whitelist/doc/fr/README.md | 148 + .../cordova-plugin-whitelist/doc/it/README.md | 148 + .../cordova-plugin-whitelist/doc/ja/README.md | 148 + .../cordova-plugin-whitelist/doc/ko/README.md | 148 + .../cordova-plugin-whitelist/doc/pl/README.md | 148 + .../cordova-plugin-whitelist/doc/zh/README.md | 148 + .../cordova-plugin-whitelist/package.json | 64 + .../cordova-plugin-whitelist/plugin.xml | 48 + .../src/android/WhitelistPlugin.java | 161 + package-lock.json | 228 + package.json | 26 + plugins/android.json | 18 + .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-splashscreen/LICENSE | 202 + plugins/cordova-plugin-splashscreen/NOTICE | 5 + plugins/cordova-plugin-splashscreen/README.md | 522 ++ .../RELEASENOTES.md | 238 + .../doc/de/README.md | 119 + .../doc/de/index.md | 78 + .../doc/es/README.md | 119 + .../doc/es/index.md | 76 + .../doc/fr/README.md | 119 + .../doc/fr/index.md | 78 + .../doc/it/README.md | 119 + .../doc/it/index.md | 78 + .../doc/ja/README.md | 119 + .../doc/ja/index.md | 78 + .../doc/ko/README.md | 119 + .../doc/ko/index.md | 78 + .../doc/pl/README.md | 119 + .../doc/pl/index.md | 78 + .../doc/ru/index.md | 75 + .../doc/zh/README.md | 119 + .../doc/zh/index.md | 78 + .../cordova-plugin-splashscreen/package.json | 83 + .../cordova-plugin-splashscreen/plugin.xml | 82 + .../src/android/SplashScreen.java | 413 + .../src/browser/SplashScreenProxy.js | 170 + .../src/ios/CDVSplashScreen.h | 46 + .../src/ios/CDVSplashScreen.m | 514 ++ .../src/ios/CDVViewController+SplashScreen.h | 28 + .../src/ios/CDVViewController+SplashScreen.m | 89 + .../src/wp/ResolutionHelper.cs | 39 + .../src/wp/SplashScreen.cs | 255 + .../contents.xcworkspacedata | 7 + .../CDVSplashScreenTest.xccheckout | 41 + .../xcschemes/CordovaLib.xcscheme | 77 + .../tests/ios/CDVSplashScreenTest/.npmignore | 1 + .../CDVSplashScreenLibTests/ImageNameTest.m | 702 ++ .../ImageNameTestDelegates.h | 57 + .../ImageNameTestDelegates.m | 200 + .../CDVSplashScreenLibTests/Info.plist | 44 + .../project.pbxproj | 505 ++ .../contents.xcworkspacedata | 7 + .../CDVSplashScreenTest.xccheckout | 41 + .../xcschemes/CDVSplashScreenLib.xcscheme | 77 + .../CDVSplashScreenLibTests.xcscheme | 96 + .../tests/ios/README.md | 40 + .../tests/ios/doc/de/README.md | 39 + .../tests/ios/doc/es/README.md | 39 + .../tests/ios/doc/fr/README.md | 39 + .../tests/ios/doc/it/README.md | 39 + .../tests/ios/doc/ja/README.md | 39 + .../tests/ios/doc/ko/README.md | 39 + .../tests/ios/doc/pl/README.md | 39 + .../tests/ios/doc/zh/README.md | 39 + .../tests/ios/package.json | 13 + .../tests/package.json | 14 + .../tests/plugin.xml | 29 + .../tests/tests.js | 64 + .../types/index.d.ts | 17 + .../www/splashscreen.js | 33 + .../www/windows/SplashScreenProxy.js | 37 + .../cordova-plugin-whitelist/CONTRIBUTING.md | 37 + plugins/cordova-plugin-whitelist/LICENSE | 202 + plugins/cordova-plugin-whitelist/NOTICE | 5 + plugins/cordova-plugin-whitelist/README.md | 163 + .../cordova-plugin-whitelist/RELEASENOTES.md | 75 + .../cordova-plugin-whitelist/doc/de/README.md | 148 + .../cordova-plugin-whitelist/doc/es/README.md | 148 + .../cordova-plugin-whitelist/doc/fr/README.md | 148 + .../cordova-plugin-whitelist/doc/it/README.md | 148 + .../cordova-plugin-whitelist/doc/ja/README.md | 148 + .../cordova-plugin-whitelist/doc/ko/README.md | 148 + .../cordova-plugin-whitelist/doc/pl/README.md | 148 + .../cordova-plugin-whitelist/doc/zh/README.md | 148 + plugins/cordova-plugin-whitelist/package.json | 64 + plugins/cordova-plugin-whitelist/plugin.xml | 48 + .../src/android/WhitelistPlugin.java | 161 + plugins/fetch.json | 18 + res/README.md | 29 + res/icon/android/icon-36-ldpi.png | Bin 0 -> 2394 bytes res/icon/android/icon-48-mdpi.png | Bin 0 -> 3667 bytes res/icon/android/icon-72-hdpi.png | Bin 0 -> 6822 bytes res/icon/android/icon-96-xhdpi.png | Bin 0 -> 10560 bytes res/icon/bada-wac/icon-48-type5.png | Bin 0 -> 4111 bytes res/icon/bada-wac/icon-50-type3.png | Bin 0 -> 5758 bytes res/icon/bada-wac/icon-80-type4.png | Bin 0 -> 7287 bytes res/icon/bada/icon-128.png | Bin 0 -> 11401 bytes res/icon/blackberry/icon-80.png | Bin 0 -> 7287 bytes res/icon/blackberry10/icon-80.png | Bin 0 -> 7287 bytes res/icon/ios/icon-57-2x.png | Bin 0 -> 16072 bytes res/icon/ios/icon-57.png | Bin 0 -> 5015 bytes res/icon/ios/icon-72-2x.png | Bin 0 -> 24309 bytes res/icon/ios/icon-72.png | Bin 0 -> 7523 bytes res/icon/tizen/icon-128.png | Bin 0 -> 11401 bytes res/icon/webos/icon-64.png | Bin 0 -> 5463 bytes res/icon/windows-phone/icon-173-tile.png | Bin 0 -> 31851 bytes res/icon/windows-phone/icon-48.png | Bin 0 -> 3991 bytes res/icon/windows-phone/icon-62-tile.png | Bin 0 -> 5810 bytes res/screen/android/screen-hdpi-landscape.png | Bin 0 -> 22804 bytes res/screen/android/screen-hdpi-portrait.png | Bin 0 -> 22746 bytes res/screen/android/screen-ldpi-landscape.png | Bin 0 -> 16380 bytes res/screen/android/screen-ldpi-portrait.png | Bin 0 -> 16872 bytes res/screen/android/screen-mdpi-landscape.png | Bin 0 -> 16246 bytes res/screen/android/screen-mdpi-portrait.png | Bin 0 -> 18437 bytes res/screen/android/screen-xhdpi-landscape.png | Bin 0 -> 21787 bytes res/screen/android/screen-xhdpi-portrait.png | Bin 0 -> 21922 bytes res/screen/bada-wac/screen-type3.png | Bin 0 -> 90555 bytes res/screen/bada-wac/screen-type4.png | Bin 0 -> 222148 bytes res/screen/bada-wac/screen-type5.png | Bin 0 -> 107580 bytes res/screen/bada/screen-portrait.png | Bin 0 -> 222148 bytes res/screen/blackberry/screen-225.png | Bin 0 -> 16776 bytes res/screen/blackberry10/splash-1280x768.png | Bin 0 -> 60771 bytes res/screen/blackberry10/splash-720x720.png | Bin 0 -> 50431 bytes res/screen/blackberry10/splash-768x1280.png | Bin 0 -> 57145 bytes res/screen/ios/screen-ipad-landscape-2x.png | Bin 0 -> 343256 bytes res/screen/ios/screen-ipad-landscape.png | Bin 0 -> 22487 bytes res/screen/ios/screen-ipad-portrait-2x.png | Bin 0 -> 225134 bytes res/screen/ios/screen-ipad-portrait.png | Bin 0 -> 22415 bytes res/screen/ios/screen-iphone-landscape-2x.png | Bin 0 -> 339639 bytes res/screen/ios/screen-iphone-landscape.png | Bin 0 -> 92301 bytes res/screen/ios/screen-iphone-portrait-2x.png | Bin 0 -> 21402 bytes .../ios/screen-iphone-portrait-568h-2x.png | Bin 0 -> 22122 bytes res/screen/ios/screen-iphone-portrait.png | Bin 0 -> 24034 bytes res/screen/tizen/README.md | 24 + res/screen/webos/screen-64.png | Bin 0 -> 5463 bytes res/screen/windows-phone/screen-portrait.jpg | Bin 0 -> 34966 bytes www/css/index.css | 142 + www/img/logo.png | Bin 0 -> 21814 bytes www/index.html | 144 + www/scripts/angular/angular-sanitize.min.js | 16 + www/scripts/angular/angular-touch.min.js | 13 + www/scripts/angular/angular.min.js | 251 + .../cryptojs/components/mode-ecb-min.js | 7 + .../components/pad-zeropadding-min.js | 7 + www/scripts/cryptojs/rollups/aes.js | 35 + www/scripts/cryptojs/rollups/hmac-sha512.js | 25 + www/scripts/cryptojs/rollups/sha512.js | 23 + www/scripts/index.js | 25 + www/scripts/jvon-angular.js | 439 + www/scripts/jvon-interpret.js | 920 ++ www/scripts/platformOverrides.js | 1 + www/scripts/values/code.js | 17 + www/scripts/values/english.js | 28 + www/scripts/values/spanish.js | 28 + 833 files changed, 113813 insertions(+) create mode 100644 .idea/jvon-mobile.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .npmignore create mode 100644 config.xml create mode 100644 hooks/README.md create mode 120000 node_modules/.bin/create create mode 100644 node_modules/cordova-android/.eslintignore create mode 100644 node_modules/cordova-android/.eslintrc.yml create mode 100644 node_modules/cordova-android/.gitattributes create mode 100644 node_modules/cordova-android/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/cordova-android/.ratignore create mode 100644 node_modules/cordova-android/.reviewboardrc create mode 100644 node_modules/cordova-android/.travis.yml create mode 100644 node_modules/cordova-android/CONTRIBUTING.md create mode 100644 node_modules/cordova-android/LICENSE create mode 100644 node_modules/cordova-android/NOTICE create mode 100644 node_modules/cordova-android/README.md create mode 100644 node_modules/cordova-android/RELEASENOTES.md create mode 100644 node_modules/cordova-android/VERSION create mode 100644 node_modules/cordova-android/appveyor.yml create mode 100755 node_modules/cordova-android/bin/android_sdk_version create mode 100644 node_modules/cordova-android/bin/android_sdk_version.bat create mode 100755 node_modules/cordova-android/bin/check_reqs create mode 100644 node_modules/cordova-android/bin/check_reqs.bat create mode 100755 node_modules/cordova-android/bin/create create mode 100644 node_modules/cordova-android/bin/create.bat create mode 100755 node_modules/cordova-android/bin/lib/create.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/Api.js create mode 100755 node_modules/cordova-android/bin/templates/cordova/build create mode 100644 node_modules/cordova-android/bin/templates/cordova/build.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/clean create mode 100644 node_modules/cordova-android/bin/templates/cordova/clean.bat create mode 100644 node_modules/cordova-android/bin/templates/cordova/defaults.xml create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/Adb.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/AndroidManifest.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/AndroidProject.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/AndroidStudio.js create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/android_sdk.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/build.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/builders/GenericBuilder.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/builders/GradleBuilder.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/builders/StudioBuilder.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/builders/builders.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/check_reqs.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/device.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/emulator.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/getASPath.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/install-device create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/install-device.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/install-emulator create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/install-emulator.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/list-devices create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/list-devices.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/log.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/plugin-build.gradle create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/pluginHandlers.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/prepare.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/retry.js create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/run.js create mode 100755 node_modules/cordova-android/bin/templates/cordova/lib/start-emulator create mode 100644 node_modules/cordova-android/bin/templates/cordova/lib/start-emulator.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/log create mode 100644 node_modules/cordova-android/bin/templates/cordova/log.bat create mode 100644 node_modules/cordova-android/bin/templates/cordova/loggingHelper.js create mode 100755 node_modules/cordova-android/bin/templates/cordova/run create mode 100644 node_modules/cordova-android/bin/templates/cordova/run.bat create mode 100755 node_modules/cordova-android/bin/templates/cordova/version create mode 100644 node_modules/cordova-android/bin/templates/cordova/version.bat create mode 100644 node_modules/cordova-android/bin/templates/project/Activity.java create mode 100644 node_modules/cordova-android/bin/templates/project/AndroidManifest.xml create mode 100644 node_modules/cordova-android/bin/templates/project/app/build.gradle create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/cordova.js create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/css/index.css create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/img/cordova.png create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/img/logo.png create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/index.html create mode 100644 node_modules/cordova-android/bin/templates/project/assets/www/js/index.js create mode 100644 node_modules/cordova-android/bin/templates/project/build.gradle create mode 100644 node_modules/cordova-android/bin/templates/project/gitignore create mode 100644 node_modules/cordova-android/bin/templates/project/legacy/build.gradle create mode 100644 node_modules/cordova-android/bin/templates/project/project.properties create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-hdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-ldpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-mdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-xhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-xxhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-land-xxxhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-hdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-ldpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-mdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-xhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-xxhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/drawable-port-xxxhdpi/screen.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-hdpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-ldpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-mdpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-xhdpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-xxhdpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/mipmap-xxxhdpi/icon.png create mode 100644 node_modules/cordova-android/bin/templates/project/res/values/strings.xml create mode 100644 node_modules/cordova-android/bin/templates/project/res/xml/config.xml create mode 100644 node_modules/cordova-android/bin/templates/project/wrapper.gradle create mode 100755 node_modules/cordova-android/bin/update create mode 100644 node_modules/cordova-android/bin/update.bat create mode 100644 node_modules/cordova-android/cordova-js-src/android/nativeapiprovider.js create mode 100644 node_modules/cordova-android/cordova-js-src/android/promptbasednativeapi.js create mode 100644 node_modules/cordova-android/cordova-js-src/exec.js create mode 100644 node_modules/cordova-android/cordova-js-src/platform.js create mode 100644 node_modules/cordova-android/cordova-js-src/plugin/android/app.js create mode 100644 node_modules/cordova-android/framework/.classpath create mode 100644 node_modules/cordova-android/framework/.project create mode 100644 node_modules/cordova-android/framework/.settings/org.eclipse.jdt.core.prefs create mode 100755 node_modules/cordova-android/framework/AndroidManifest.xml create mode 100644 node_modules/cordova-android/framework/ant.properties create mode 100644 node_modules/cordova-android/framework/build.gradle create mode 100644 node_modules/cordova-android/framework/build.xml create mode 100644 node_modules/cordova-android/framework/cordova.gradle create mode 100644 node_modules/cordova-android/framework/gradle/wrapper/gradle-wrapper.properties create mode 100644 node_modules/cordova-android/framework/project.properties create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/AuthenticationToken.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/BuildHelper.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CallbackContext.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CallbackMap.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/Config.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ConfigXmlParser.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaActivity.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaArgs.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaBridge.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaClientCertRequest.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaDialogsHelper.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaHttpAuthHandler.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterface.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterfaceImpl.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaPlugin.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaPreferences.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaResourceApi.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaWebView.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaWebViewEngine.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/CordovaWebViewImpl.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/CoreAndroid.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ExposedJsApi.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ICordovaClientCertRequest.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ICordovaCookieManager.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ICordovaHttpAuthHandler.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/LOG.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/NativeToJsMessageQueue.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/PermissionHelper.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/PluginEntry.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/PluginManager.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/PluginResult.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/ResumeCallback.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/Whitelist.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemCookieManager.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemExposedJsApi.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java create mode 100644 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemWebView.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemWebViewClient.java create mode 100755 node_modules/cordova-android/framework/src/org/apache/cordova/engine/SystemWebViewEngine.java create mode 120000 node_modules/cordova-android/node_modules/.bin/nopt create mode 120000 node_modules/cordova-android/node_modules/.bin/semver create mode 120000 node_modules/cordova-android/node_modules/.bin/shjs create mode 100644 node_modules/cordova-android/node_modules/abbrev/LICENSE create mode 100644 node_modules/cordova-android/node_modules/abbrev/README.md create mode 100644 node_modules/cordova-android/node_modules/abbrev/abbrev.js create mode 100644 node_modules/cordova-android/node_modules/abbrev/package.json create mode 100644 node_modules/cordova-android/node_modules/android-versions/.jshintignore create mode 100644 node_modules/cordova-android/node_modules/android-versions/.jshintrc create mode 100644 node_modules/cordova-android/node_modules/android-versions/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/android-versions/README.md create mode 100644 node_modules/cordova-android/node_modules/android-versions/index.js create mode 100644 node_modules/cordova-android/node_modules/android-versions/package.json create mode 100644 node_modules/cordova-android/node_modules/android-versions/tests/index.test.js create mode 100644 node_modules/cordova-android/node_modules/ansi/.jshintrc create mode 100644 node_modules/cordova-android/node_modules/ansi/.npmignore create mode 100644 node_modules/cordova-android/node_modules/ansi/History.md create mode 100644 node_modules/cordova-android/node_modules/ansi/LICENSE create mode 100644 node_modules/cordova-android/node_modules/ansi/README.md create mode 100755 node_modules/cordova-android/node_modules/ansi/examples/beep/index.js create mode 100755 node_modules/cordova-android/node_modules/ansi/examples/clear/index.js create mode 100755 node_modules/cordova-android/node_modules/ansi/examples/cursorPosition.js create mode 100644 node_modules/cordova-android/node_modules/ansi/examples/progress/index.js create mode 100644 node_modules/cordova-android/node_modules/ansi/lib/ansi.js create mode 100644 node_modules/cordova-android/node_modules/ansi/lib/newlines.js create mode 100644 node_modules/cordova-android/node_modules/ansi/package.json create mode 100644 node_modules/cordova-android/node_modules/balanced-match/.npmignore create mode 100644 node_modules/cordova-android/node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/cordova-android/node_modules/balanced-match/README.md create mode 100644 node_modules/cordova-android/node_modules/balanced-match/index.js create mode 100644 node_modules/cordova-android/node_modules/balanced-match/package.json create mode 100644 node_modules/cordova-android/node_modules/base64-js/LICENSE create mode 100644 node_modules/cordova-android/node_modules/base64-js/README.md create mode 100644 node_modules/cordova-android/node_modules/base64-js/base64js.min.js create mode 100644 node_modules/cordova-android/node_modules/base64-js/index.js create mode 100644 node_modules/cordova-android/node_modules/base64-js/package.json create mode 100644 node_modules/cordova-android/node_modules/base64-js/test/big-data.js create mode 100644 node_modules/cordova-android/node_modules/base64-js/test/convert.js create mode 100644 node_modules/cordova-android/node_modules/base64-js/test/url-safe.js create mode 100644 node_modules/cordova-android/node_modules/big-integer/BigInteger.d.ts create mode 100644 node_modules/cordova-android/node_modules/big-integer/BigInteger.js create mode 100644 node_modules/cordova-android/node_modules/big-integer/BigInteger.min.js create mode 100644 node_modules/cordova-android/node_modules/big-integer/LICENSE create mode 100644 node_modules/cordova-android/node_modules/big-integer/README.md create mode 100644 node_modules/cordova-android/node_modules/big-integer/bower.json create mode 100644 node_modules/cordova-android/node_modules/big-integer/package.json create mode 100644 node_modules/cordova-android/node_modules/big-integer/tsconfig.json create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/.npmignore create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/README.md create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/bplistParser.js create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/package.json create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/airplay.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/iTunes-small.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/int64.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/int64.xml create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/parseTest.js create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/sample1.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/sample2.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/uid.bplist create mode 100644 node_modules/cordova-android/node_modules/bplist-parser/test/utf16.bplist create mode 100755 node_modules/cordova-android/node_modules/bplist-parser/test/utf16_chinese.plist create mode 100644 node_modules/cordova-android/node_modules/brace-expansion/LICENSE create mode 100644 node_modules/cordova-android/node_modules/brace-expansion/README.md create mode 100644 node_modules/cordova-android/node_modules/brace-expansion/index.js create mode 100644 node_modules/cordova-android/node_modules/brace-expansion/package.json create mode 100644 node_modules/cordova-android/node_modules/concat-map/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/concat-map/LICENSE create mode 100644 node_modules/cordova-android/node_modules/concat-map/README.markdown create mode 100644 node_modules/cordova-android/node_modules/concat-map/index.js create mode 100644 node_modules/cordova-android/node_modules/concat-map/package.json create mode 100644 node_modules/cordova-android/node_modules/concat-map/test/map.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.eslintignore create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.eslintrc.yml create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.npmignore create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.ratignore create mode 100644 node_modules/cordova-android/node_modules/cordova-common/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/cordova-common/README.md create mode 100644 node_modules/cordova-android/node_modules/cordova-common/RELEASENOTES.md create mode 100644 node_modules/cordova-android/node_modules/cordova-common/appveyor.yml create mode 100644 node_modules/cordova-android/node_modules/cordova-common/cordova-common.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/package.json create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ActionStack.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/munge-util.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/ConfigParser/ConfigParser.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/CordovaCheck.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaError.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/CordovaLogger.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/FileUpdater.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/PlatformJson.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfo.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/PluginManager.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/events.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/superspawn.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/util/addProperty.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/util/plist-helpers.js create mode 100644 node_modules/cordova-android/node_modules/cordova-common/src/util/xml-helpers.js create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/.npmignore create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/README.md create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/index.js create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/package.json create mode 100644 node_modules/cordova-android/node_modules/cordova-registry-mapper/tests/test.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/.npmignore create mode 100644 node_modules/cordova-android/node_modules/elementtree/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/elementtree/CHANGES.md create mode 100644 node_modules/cordova-android/node_modules/elementtree/LICENSE.txt create mode 100755 node_modules/cordova-android/node_modules/elementtree/Makefile create mode 100644 node_modules/cordova-android/node_modules/elementtree/NOTICE create mode 100644 node_modules/cordova-android/node_modules/elementtree/README.md create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/constants.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/elementpath.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/elementtree.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/errors.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/parser.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/parsers/index.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/parsers/sax.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/sprintf.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/treebuilder.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/lib/utils.js create mode 100644 node_modules/cordova-android/node_modules/elementtree/package.json create mode 100644 node_modules/cordova-android/node_modules/elementtree/tests/data/xml1.xml create mode 100644 node_modules/cordova-android/node_modules/elementtree/tests/data/xml2.xml create mode 100644 node_modules/cordova-android/node_modules/elementtree/tests/test-simple.js create mode 100644 node_modules/cordova-android/node_modules/glob/LICENSE create mode 100644 node_modules/cordova-android/node_modules/glob/README.md create mode 100644 node_modules/cordova-android/node_modules/glob/common.js create mode 100644 node_modules/cordova-android/node_modules/glob/glob.js create mode 100644 node_modules/cordova-android/node_modules/glob/package.json create mode 100644 node_modules/cordova-android/node_modules/glob/sync.js create mode 100644 node_modules/cordova-android/node_modules/inflight/LICENSE create mode 100644 node_modules/cordova-android/node_modules/inflight/README.md create mode 100644 node_modules/cordova-android/node_modules/inflight/inflight.js create mode 100644 node_modules/cordova-android/node_modules/inflight/package.json create mode 100644 node_modules/cordova-android/node_modules/inherits/LICENSE create mode 100644 node_modules/cordova-android/node_modules/inherits/README.md create mode 100644 node_modules/cordova-android/node_modules/inherits/inherits.js create mode 100644 node_modules/cordova-android/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/cordova-android/node_modules/inherits/package.json create mode 100644 node_modules/cordova-android/node_modules/minimatch/LICENSE create mode 100644 node_modules/cordova-android/node_modules/minimatch/README.md create mode 100644 node_modules/cordova-android/node_modules/minimatch/minimatch.js create mode 100644 node_modules/cordova-android/node_modules/minimatch/package.json create mode 100644 node_modules/cordova-android/node_modules/nopt/.npmignore create mode 100644 node_modules/cordova-android/node_modules/nopt/LICENSE create mode 100644 node_modules/cordova-android/node_modules/nopt/README.md create mode 100755 node_modules/cordova-android/node_modules/nopt/bin/nopt.js create mode 100755 node_modules/cordova-android/node_modules/nopt/examples/my-program.js create mode 100644 node_modules/cordova-android/node_modules/nopt/lib/nopt.js create mode 100644 node_modules/cordova-android/node_modules/nopt/package.json create mode 100644 node_modules/cordova-android/node_modules/nopt/test/basic.js create mode 100644 node_modules/cordova-android/node_modules/once/LICENSE create mode 100644 node_modules/cordova-android/node_modules/once/README.md create mode 100644 node_modules/cordova-android/node_modules/once/once.js create mode 100644 node_modules/cordova-android/node_modules/once/package.json create mode 100644 node_modules/cordova-android/node_modules/path-is-absolute/index.js create mode 100644 node_modules/cordova-android/node_modules/path-is-absolute/license create mode 100644 node_modules/cordova-android/node_modules/path-is-absolute/package.json create mode 100644 node_modules/cordova-android/node_modules/path-is-absolute/readme.md create mode 100644 node_modules/cordova-android/node_modules/plist/.jshintrc create mode 100644 node_modules/cordova-android/node_modules/plist/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/plist/History.md create mode 100644 node_modules/cordova-android/node_modules/plist/LICENSE create mode 100644 node_modules/cordova-android/node_modules/plist/Makefile create mode 100644 node_modules/cordova-android/node_modules/plist/README.md create mode 100644 node_modules/cordova-android/node_modules/plist/dist/plist-build.js create mode 100644 node_modules/cordova-android/node_modules/plist/dist/plist-parse.js create mode 100644 node_modules/cordova-android/node_modules/plist/dist/plist.js create mode 100644 node_modules/cordova-android/node_modules/plist/examples/browser/index.html create mode 100644 node_modules/cordova-android/node_modules/plist/index.js create mode 100644 node_modules/cordova-android/node_modules/plist/lib/build.js create mode 100644 node_modules/cordova-android/node_modules/plist/lib/parse.js create mode 100644 node_modules/cordova-android/node_modules/plist/package.json create mode 100644 node_modules/cordova-android/node_modules/properties-parser/README.markdown create mode 100644 node_modules/cordova-android/node_modules/properties-parser/index.js create mode 100644 node_modules/cordova-android/node_modules/properties-parser/package.json create mode 100644 node_modules/cordova-android/node_modules/properties-parser/play-ground.js create mode 100644 node_modules/cordova-android/node_modules/q/CHANGES.md create mode 100644 node_modules/cordova-android/node_modules/q/LICENSE create mode 100644 node_modules/cordova-android/node_modules/q/README.md create mode 100644 node_modules/cordova-android/node_modules/q/package.json create mode 100644 node_modules/cordova-android/node_modules/q/q.js create mode 100644 node_modules/cordova-android/node_modules/q/queue.js create mode 100644 node_modules/cordova-android/node_modules/sax/AUTHORS create mode 100644 node_modules/cordova-android/node_modules/sax/LICENSE create mode 100644 node_modules/cordova-android/node_modules/sax/README.md create mode 100644 node_modules/cordova-android/node_modules/sax/examples/big-not-pretty.xml create mode 100644 node_modules/cordova-android/node_modules/sax/examples/example.js create mode 100644 node_modules/cordova-android/node_modules/sax/examples/get-products.js create mode 100644 node_modules/cordova-android/node_modules/sax/examples/hello-world.js create mode 100644 node_modules/cordova-android/node_modules/sax/examples/not-pretty.xml create mode 100644 node_modules/cordova-android/node_modules/sax/examples/pretty-print.js create mode 100644 node_modules/cordova-android/node_modules/sax/examples/shopping.xml create mode 100644 node_modules/cordova-android/node_modules/sax/examples/strict.dtd create mode 100755 node_modules/cordova-android/node_modules/sax/examples/switch-bench.js create mode 100644 node_modules/cordova-android/node_modules/sax/examples/test.html create mode 100644 node_modules/cordova-android/node_modules/sax/examples/test.xml create mode 100644 node_modules/cordova-android/node_modules/sax/lib/sax.js create mode 100644 node_modules/cordova-android/node_modules/sax/package.json create mode 100644 node_modules/cordova-android/node_modules/sax/test/buffer-overrun.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/cdata-chunked.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/cdata-end-split.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/cdata-fake-end.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/cdata-multiple.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/cdata.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/index.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/issue-23.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/issue-30.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/issue-35.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/issue-47.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/issue-49.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/parser-position.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/script.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/self-closing-child-strict.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/self-closing-child.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/self-closing-tag.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/stray-ending.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/trailing-non-whitespace.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/unquoted.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-issue-41.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-rebinding.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-strict.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-unbound.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix.js create mode 100644 node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-redefine.js create mode 100644 node_modules/cordova-android/node_modules/semver/LICENSE create mode 100644 node_modules/cordova-android/node_modules/semver/README.md create mode 100755 node_modules/cordova-android/node_modules/semver/bin/semver create mode 100644 node_modules/cordova-android/node_modules/semver/package.json create mode 100644 node_modules/cordova-android/node_modules/semver/range.bnf create mode 100644 node_modules/cordova-android/node_modules/semver/semver.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/.documentup.json create mode 100644 node_modules/cordova-android/node_modules/shelljs/.jshintrc create mode 100644 node_modules/cordova-android/node_modules/shelljs/.npmignore create mode 100644 node_modules/cordova-android/node_modules/shelljs/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/shelljs/LICENSE create mode 100644 node_modules/cordova-android/node_modules/shelljs/README.md create mode 100644 node_modules/cordova-android/node_modules/shelljs/RELEASE.md create mode 100755 node_modules/cordova-android/node_modules/shelljs/bin/shjs create mode 100644 node_modules/cordova-android/node_modules/shelljs/global.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/make.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/package.json create mode 100755 node_modules/cordova-android/node_modules/shelljs/scripts/generate-docs.js create mode 100755 node_modules/cordova-android/node_modules/shelljs/scripts/run-tests.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/shell.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/cat.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/cd.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/chmod.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/common.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/cp.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/dirs.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/echo.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/error.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/exec.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/find.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/grep.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/ln.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/ls.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/mkdir.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/mv.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/popd.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/pushd.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/pwd.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/rm.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/sed.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/tempdir.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/test.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/to.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/toEnd.js create mode 100644 node_modules/cordova-android/node_modules/shelljs/src/which.js create mode 100644 node_modules/cordova-android/node_modules/underscore/LICENSE create mode 100644 node_modules/cordova-android/node_modules/underscore/README.md create mode 100644 node_modules/cordova-android/node_modules/underscore/package.json create mode 100644 node_modules/cordova-android/node_modules/underscore/underscore-min.js create mode 100644 node_modules/cordova-android/node_modules/underscore/underscore-min.js.map create mode 100644 node_modules/cordova-android/node_modules/underscore/underscore.js create mode 100644 node_modules/cordova-android/node_modules/unorm/LICENSE.md create mode 100644 node_modules/cordova-android/node_modules/unorm/README.md create mode 100644 node_modules/cordova-android/node_modules/unorm/lib/unorm.js create mode 100644 node_modules/cordova-android/node_modules/unorm/package.json create mode 100644 node_modules/cordova-android/node_modules/wrappy/LICENSE create mode 100644 node_modules/cordova-android/node_modules/wrappy/README.md create mode 100644 node_modules/cordova-android/node_modules/wrappy/package.json create mode 100644 node_modules/cordova-android/node_modules/wrappy/wrappy.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/.npmignore create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/CHANGELOG.md create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/LICENSE create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/README.md create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/Utility.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLAttribute.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLCData.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLComment.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDAttList.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDElement.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDEntity.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDNotation.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDeclaration.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocType.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocument.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocumentCB.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLElement.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLNode.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLRaw.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStreamWriter.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringWriter.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringifier.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLText.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLWriterBase.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/lib/index.js create mode 100644 node_modules/cordova-android/node_modules/xmlbuilder/package.json create mode 100644 node_modules/cordova-android/node_modules/xmldom/.npmignore create mode 100644 node_modules/cordova-android/node_modules/xmldom/.travis.yml create mode 100644 node_modules/cordova-android/node_modules/xmldom/LICENSE create mode 100644 node_modules/cordova-android/node_modules/xmldom/__package__.js create mode 100644 node_modules/cordova-android/node_modules/xmldom/changelog create mode 100644 node_modules/cordova-android/node_modules/xmldom/component.json create mode 100644 node_modules/cordova-android/node_modules/xmldom/dom-parser.js create mode 100644 node_modules/cordova-android/node_modules/xmldom/dom.js create mode 100644 node_modules/cordova-android/node_modules/xmldom/package.json create mode 100644 node_modules/cordova-android/node_modules/xmldom/readme.md create mode 100644 node_modules/cordova-android/node_modules/xmldom/sax.js create mode 100644 node_modules/cordova-android/package.json create mode 100644 node_modules/cordova-android/spec/.eslintrc.yml create mode 100644 node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake-ios-frameworks/plugin.xml create mode 100644 node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/platforms/android/FakeLib/project.properties create mode 100644 node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/plugin.xml create mode 100644 node_modules/cordova-android/spec/e2e/helpers/projectActions.js create mode 100644 node_modules/cordova-android/spec/e2e/jasmine.json create mode 100644 node_modules/cordova-android/spec/e2e/plugin.spec.js create mode 100644 node_modules/cordova-android/spec/fixtures/android_project/AndroidManifest.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_project/assets/www/.gitkeep create mode 100644 node_modules/cordova-android/spec/fixtures/android_project/res/xml/config.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_project/src/.gitkeep create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/build.gradle create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/proguard-rules.pro create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/AndroidManifest.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/layout/activity_main.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values-w820dp/dimens.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/colors.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/dimens.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/strings.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/styles.xml create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/build.gradle create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/gradle.properties create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/gradle/wrapper/gradle-wrapper.properties create mode 100755 node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew.bat create mode 100644 node_modules/cordova-android/spec/fixtures/android_studio_project/settings.gradle create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/android-resource.xml create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/extra.gradle create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/AndroidManifest.xml create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/libFile create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/project.properties create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/AndroidManifest.xml create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/libFile create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/project.properties create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin.xml create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/DummyPlugin.java create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/TestLib.jar create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin.js create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin/image.jpg create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/plugin.xml create mode 100644 node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/src/android/FaultyPlugin.java create mode 100644 node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_avd.txt create mode 100644 node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_targets.txt create mode 100644 node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_avd.txt create mode 100644 node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_target.txt create mode 100644 node_modules/cordova-android/spec/unit/AndroidProject.spec.js create mode 100644 node_modules/cordova-android/spec/unit/AndroidStudio.spec.js create mode 100644 node_modules/cordova-android/spec/unit/Api.spec.js create mode 100644 node_modules/cordova-android/spec/unit/android_sdk.spec.js create mode 100644 node_modules/cordova-android/spec/unit/builders/GradleBuilder.spec.js create mode 100644 node_modules/cordova-android/spec/unit/check_reqs.spec.js create mode 100644 node_modules/cordova-android/spec/unit/create.spec.js create mode 100644 node_modules/cordova-android/spec/unit/emulator.spec.js create mode 100644 node_modules/cordova-android/spec/unit/jasmine.json create mode 100644 node_modules/cordova-android/spec/unit/pluginHandlers/common.spec.js create mode 100644 node_modules/cordova-android/spec/unit/pluginHandlers/handlers.spec.js create mode 100644 node_modules/cordova-android/spec/unit/run.spec.js create mode 100644 node_modules/cordova-android/test/README.md create mode 100644 node_modules/cordova-android/test/app/build.gradle create mode 100644 node_modules/cordova-android/test/app/proguard-rules.pro create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java create mode 100644 node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java create mode 100644 node_modules/cordova-android/test/app/src/main/AndroidManifest.xml create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample2.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample3.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/backgroundcolor/index.html create mode 100644 node_modules/cordova-android/test/app/src/main/assets/www/cordova.js create mode 100644 node_modules/cordova-android/test/app/src/main/assets/www/cordova_plugins.js create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/fullscreen/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/htmlnotfound/error.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/iframe/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/iframe/index2.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index2.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/main.js create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/master.css create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index.html create mode 100755 node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index2.html create mode 100644 node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java create mode 100644 node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java create mode 100644 node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java create mode 100644 node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/TestActivity.java create mode 100644 node_modules/cordova-android/test/app/src/main/res/layout/activity_main.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/test/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/test/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/test/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 node_modules/cordova-android/test/app/src/main/res/values-w820dp/dimens.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/values/colors.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/values/dimens.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/values/strings.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/values/styles.xml create mode 100644 node_modules/cordova-android/test/app/src/main/res/xml/config.xml create mode 100644 node_modules/cordova-android/test/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java create mode 100644 node_modules/cordova-android/test/gradle.properties create mode 100644 node_modules/cordova-android/test/run_java_unit_tests.js create mode 100644 node_modules/cordova-android/test/settings.gradle create mode 100644 node_modules/cordova-plugin-splashscreen/.appveyor.yml create mode 100644 node_modules/cordova-plugin-splashscreen/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/cordova-plugin-splashscreen/.jshintignore create mode 100644 node_modules/cordova-plugin-splashscreen/.jshintrc create mode 100644 node_modules/cordova-plugin-splashscreen/.npmignore create mode 100644 node_modules/cordova-plugin-splashscreen/.travis.yml create mode 100644 node_modules/cordova-plugin-splashscreen/CONTRIBUTING.md create mode 100644 node_modules/cordova-plugin-splashscreen/LICENSE create mode 100644 node_modules/cordova-plugin-splashscreen/NOTICE create mode 100644 node_modules/cordova-plugin-splashscreen/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/RELEASENOTES.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/de/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/de/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/es/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/es/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/fr/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/fr/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/it/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/it/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/ja/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/ja/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/ko/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/ko/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/pl/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/pl/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/ru/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/zh/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/doc/zh/index.md create mode 100644 node_modules/cordova-plugin-splashscreen/package.json create mode 100644 node_modules/cordova-plugin-splashscreen/plugin.xml create mode 100644 node_modules/cordova-plugin-splashscreen/src/android/SplashScreen.java create mode 100644 node_modules/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js create mode 100644 node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h create mode 100644 node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m create mode 100644 node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.h create mode 100644 node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m create mode 100644 node_modules/cordova-plugin-splashscreen/src/wp/ResolutionHelper.cs create mode 100644 node_modules/cordova-plugin-splashscreen/src/wp/SplashScreen.cs create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/contents.xcworkspacedata create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/.npmignore create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTest.m create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.h create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.m create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/Info.plist create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.pbxproj create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLib.xcscheme create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLibTests.xcscheme create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/de/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/es/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/fr/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/it/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/ja/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/ko/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/pl/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/doc/zh/README.md create mode 100644 node_modules/cordova-plugin-splashscreen/tests/ios/package.json create mode 100644 node_modules/cordova-plugin-splashscreen/tests/package.json create mode 100644 node_modules/cordova-plugin-splashscreen/tests/plugin.xml create mode 100644 node_modules/cordova-plugin-splashscreen/tests/tests.js create mode 100644 node_modules/cordova-plugin-splashscreen/types/index.d.ts create mode 100644 node_modules/cordova-plugin-splashscreen/www/splashscreen.js create mode 100644 node_modules/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js create mode 100644 node_modules/cordova-plugin-whitelist/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/cordova-plugin-whitelist/CONTRIBUTING.md create mode 100644 node_modules/cordova-plugin-whitelist/LICENSE create mode 100644 node_modules/cordova-plugin-whitelist/NOTICE create mode 100644 node_modules/cordova-plugin-whitelist/README.md create mode 100644 node_modules/cordova-plugin-whitelist/RELEASENOTES.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/de/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/es/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/fr/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/it/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/ja/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/ko/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/pl/README.md create mode 100644 node_modules/cordova-plugin-whitelist/doc/zh/README.md create mode 100644 node_modules/cordova-plugin-whitelist/package.json create mode 100644 node_modules/cordova-plugin-whitelist/plugin.xml create mode 100644 node_modules/cordova-plugin-whitelist/src/android/WhitelistPlugin.java create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 plugins/android.json create mode 100644 plugins/cordova-plugin-splashscreen/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-splashscreen/LICENSE create mode 100644 plugins/cordova-plugin-splashscreen/NOTICE create mode 100644 plugins/cordova-plugin-splashscreen/README.md create mode 100644 plugins/cordova-plugin-splashscreen/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/de/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/de/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/es/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/es/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/fr/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/fr/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/it/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/it/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/ja/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/ja/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/ko/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/ko/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/pl/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/pl/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/ru/index.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/zh/README.md create mode 100644 plugins/cordova-plugin-splashscreen/doc/zh/index.md create mode 100644 plugins/cordova-plugin-splashscreen/package.json create mode 100644 plugins/cordova-plugin-splashscreen/plugin.xml create mode 100644 plugins/cordova-plugin-splashscreen/src/android/SplashScreen.java create mode 100644 plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js create mode 100644 plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h create mode 100644 plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m create mode 100644 plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.h create mode 100644 plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m create mode 100644 plugins/cordova-plugin-splashscreen/src/wp/ResolutionHelper.cs create mode 100644 plugins/cordova-plugin-splashscreen/src/wp/SplashScreen.cs create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/contents.xcworkspacedata create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/.npmignore create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTest.m create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.h create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.m create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/Info.plist create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.pbxproj create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLib.xcscheme create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLibTests.xcscheme create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/de/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/es/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/fr/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/it/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/ja/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/ko/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/pl/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/doc/zh/README.md create mode 100644 plugins/cordova-plugin-splashscreen/tests/ios/package.json create mode 100644 plugins/cordova-plugin-splashscreen/tests/package.json create mode 100644 plugins/cordova-plugin-splashscreen/tests/plugin.xml create mode 100644 plugins/cordova-plugin-splashscreen/tests/tests.js create mode 100644 plugins/cordova-plugin-splashscreen/types/index.d.ts create mode 100644 plugins/cordova-plugin-splashscreen/www/splashscreen.js create mode 100644 plugins/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js create mode 100644 plugins/cordova-plugin-whitelist/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-whitelist/LICENSE create mode 100644 plugins/cordova-plugin-whitelist/NOTICE create mode 100644 plugins/cordova-plugin-whitelist/README.md create mode 100644 plugins/cordova-plugin-whitelist/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-whitelist/doc/de/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/es/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/fr/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/it/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/ja/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/ko/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/pl/README.md create mode 100644 plugins/cordova-plugin-whitelist/doc/zh/README.md create mode 100644 plugins/cordova-plugin-whitelist/package.json create mode 100644 plugins/cordova-plugin-whitelist/plugin.xml create mode 100644 plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java create mode 100644 plugins/fetch.json create mode 100644 res/README.md create mode 100644 res/icon/android/icon-36-ldpi.png create mode 100644 res/icon/android/icon-48-mdpi.png create mode 100644 res/icon/android/icon-72-hdpi.png create mode 100644 res/icon/android/icon-96-xhdpi.png create mode 100644 res/icon/bada-wac/icon-48-type5.png create mode 100644 res/icon/bada-wac/icon-50-type3.png create mode 100644 res/icon/bada-wac/icon-80-type4.png create mode 100644 res/icon/bada/icon-128.png create mode 100644 res/icon/blackberry/icon-80.png create mode 100644 res/icon/blackberry10/icon-80.png create mode 100644 res/icon/ios/icon-57-2x.png create mode 100644 res/icon/ios/icon-57.png create mode 100644 res/icon/ios/icon-72-2x.png create mode 100644 res/icon/ios/icon-72.png create mode 100644 res/icon/tizen/icon-128.png create mode 100644 res/icon/webos/icon-64.png create mode 100644 res/icon/windows-phone/icon-173-tile.png create mode 100644 res/icon/windows-phone/icon-48.png create mode 100644 res/icon/windows-phone/icon-62-tile.png create mode 100644 res/screen/android/screen-hdpi-landscape.png create mode 100644 res/screen/android/screen-hdpi-portrait.png create mode 100644 res/screen/android/screen-ldpi-landscape.png create mode 100644 res/screen/android/screen-ldpi-portrait.png create mode 100644 res/screen/android/screen-mdpi-landscape.png create mode 100644 res/screen/android/screen-mdpi-portrait.png create mode 100644 res/screen/android/screen-xhdpi-landscape.png create mode 100644 res/screen/android/screen-xhdpi-portrait.png create mode 100755 res/screen/bada-wac/screen-type3.png create mode 100755 res/screen/bada-wac/screen-type4.png create mode 100755 res/screen/bada-wac/screen-type5.png create mode 100644 res/screen/bada/screen-portrait.png create mode 100644 res/screen/blackberry/screen-225.png create mode 100644 res/screen/blackberry10/splash-1280x768.png create mode 100644 res/screen/blackberry10/splash-720x720.png create mode 100644 res/screen/blackberry10/splash-768x1280.png create mode 100644 res/screen/ios/screen-ipad-landscape-2x.png create mode 100644 res/screen/ios/screen-ipad-landscape.png create mode 100644 res/screen/ios/screen-ipad-portrait-2x.png create mode 100644 res/screen/ios/screen-ipad-portrait.png create mode 100644 res/screen/ios/screen-iphone-landscape-2x.png create mode 100644 res/screen/ios/screen-iphone-landscape.png create mode 100644 res/screen/ios/screen-iphone-portrait-2x.png create mode 100644 res/screen/ios/screen-iphone-portrait-568h-2x.png create mode 100644 res/screen/ios/screen-iphone-portrait.png create mode 100644 res/screen/tizen/README.md create mode 100644 res/screen/webos/screen-64.png create mode 100644 res/screen/windows-phone/screen-portrait.jpg create mode 100644 www/css/index.css create mode 100644 www/img/logo.png create mode 100644 www/index.html create mode 100644 www/scripts/angular/angular-sanitize.min.js create mode 100644 www/scripts/angular/angular-touch.min.js create mode 100644 www/scripts/angular/angular.min.js create mode 100644 www/scripts/cryptojs/components/mode-ecb-min.js create mode 100644 www/scripts/cryptojs/components/pad-zeropadding-min.js create mode 100644 www/scripts/cryptojs/rollups/aes.js create mode 100644 www/scripts/cryptojs/rollups/hmac-sha512.js create mode 100644 www/scripts/cryptojs/rollups/sha512.js create mode 100644 www/scripts/index.js create mode 100644 www/scripts/jvon-angular.js create mode 100644 www/scripts/jvon-interpret.js create mode 100644 www/scripts/platformOverrides.js create mode 100644 www/scripts/values/code.js create mode 100644 www/scripts/values/english.js create mode 100644 www/scripts/values/spanish.js diff --git a/.idea/jvon-mobile.iml b/.idea/jvon-mobile.iml new file mode 100644 index 0000000..5da5fb5 --- /dev/null +++ b/.idea/jvon-mobile.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..990aa42 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..fd29596 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +# OS X +.DS_Store diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..ecc4f8d --- /dev/null +++ b/config.xml @@ -0,0 +1,40 @@ + + + JVON Movil + + Simulador de lenguaje basado en la arquitectura de John von Nuemann. + + + Chris Cromer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hooks/README.md b/hooks/README.md new file mode 100644 index 0000000..574ad4c --- /dev/null +++ b/hooks/README.md @@ -0,0 +1,23 @@ + +# Cordova Hooks + +Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system to customize cordova commands. See Hooks Guide for more details: http://cordova.apache.org/docs/en/edge/guide_appdev_hooks_index.md.html#Hooks%20Guide. diff --git a/node_modules/.bin/create b/node_modules/.bin/create new file mode 120000 index 0000000..077b8f8 --- /dev/null +++ b/node_modules/.bin/create @@ -0,0 +1 @@ +../cordova-android/bin/create \ No newline at end of file diff --git a/node_modules/cordova-android/.eslintignore b/node_modules/cordova-android/.eslintignore new file mode 100644 index 0000000..5027e1b --- /dev/null +++ b/node_modules/cordova-android/.eslintignore @@ -0,0 +1 @@ +bin/templates/project/assets/www/cordova.js \ No newline at end of file diff --git a/node_modules/cordova-android/.eslintrc.yml b/node_modules/cordova-android/.eslintrc.yml new file mode 100644 index 0000000..f6aae32 --- /dev/null +++ b/node_modules/cordova-android/.eslintrc.yml @@ -0,0 +1,10 @@ +root: true +extends: semistandard +rules: + indent: + - error + - 4 + camelcase: off + padded-blocks: off + operator-linebreak: off + no-throw-literal: off diff --git a/node_modules/cordova-android/.gitattributes b/node_modules/cordova-android/.gitattributes new file mode 100644 index 0000000..f63e59a --- /dev/null +++ b/node_modules/cordova-android/.gitattributes @@ -0,0 +1,94 @@ +* text eol=lf + +# source code +*.php text +*.css text +*.sass text +*.scss text +*.less text +*.styl text +*.js text +*.coffee text +*.json text +*.htm text +*.html text +*.xml text +*.svg text +*.txt text +*.ini text +*.inc text +*.pl text +*.rb text +*.py text +*.scm text +*.sql text +*.sh text +*.bat text + +# templates +*.ejs text +*.hbt text +*.jade text +*.haml text +*.hbs text +*.dot text +*.tmpl text +*.phtml text + +# server config +.htaccess text + +# git config +.gitattributes text +.gitignore text +.gitconfig text + +# code analysis config +.jshintrc text +.jscsrc text +.jshintignore text +.csslintrc text + +# misc config +*.yaml text +*.yml text +.editorconfig text + +# build config +*.npmignore text +*.bowerrc text + +# Heroku +Procfile text +.slugignore text + +# Documentation +*.md text +LICENSE text +AUTHORS text + + +# +## These files are binary and should be left untouched +# + +# (binary is a macro for -text -diff) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mov binary +*.mp4 binary +*.mp3 binary +*.flv binary +*.fla binary +*.swf binary +*.gz binary +*.zip binary +*.7z binary +*.ttf binary +*.eot binary +*.woff binary +*.pyc binary +*.pdf binary diff --git a/node_modules/cordova-android/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/cordova-android/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..91582f4 --- /dev/null +++ b/node_modules/cordova-android/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Platforms affected + + +### What does this PR do? + + +### What testing has been done on this change? + + +### Checklist +- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database +- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected. +- [ ] Added automated test coverage as appropriate for this change. diff --git a/node_modules/cordova-android/.ratignore b/node_modules/cordova-android/.ratignore new file mode 100644 index 0000000..74a80f2 --- /dev/null +++ b/node_modules/cordova-android/.ratignore @@ -0,0 +1,9 @@ +*.properties +bin +gen +proguard-project.txt +spec +appveyor.yml +framework/build +ic_launcher.png +build diff --git a/node_modules/cordova-android/.reviewboardrc b/node_modules/cordova-android/.reviewboardrc new file mode 100644 index 0000000..30e9587 --- /dev/null +++ b/node_modules/cordova-android/.reviewboardrc @@ -0,0 +1,8 @@ +# +# Settings for post-review (used for uploading diffs to reviews.apache.org). +# +GUESS_FIELDS = True +OPEN_BROWSER = True +TARGET_GROUPS = 'cordova' +REVIEWBOARD_URL = 'http://reviews.apache.org' + diff --git a/node_modules/cordova-android/.travis.yml b/node_modules/cordova-android/.travis.yml new file mode 100644 index 0000000..e0b8928 --- /dev/null +++ b/node_modules/cordova-android/.travis.yml @@ -0,0 +1,28 @@ +language: android +sudo: false +jdk: + - oraclejdk8 +env: + global: + - ANDROID_TOOLS=${ANDROID_HOME}/tools +before_install: + - nvm install 6 + # ensure at least gradle 3.3 is in place. + - wget http://services.gradle.org/distributions/gradle-3.3-bin.zip + - unzip gradle-3.3-bin.zip + - export GRADLE_HOME=$PWD/gradle-3.3 + - export PATH=${GRADLE_HOME}/bin:${ANDROID_HOME}:${ANDROID_HOME}/emulator:${ANDROID_TOOLS}:${ANDROID_TOOLS}/bin:${ANDROID_HOME}/platform-tools:$PATH + - node --version + - gradle --version + - echo y | android --silent update sdk --no-ui --all --filter platform-tools,tools,build-tools-26.0.2,android-26,android-25,extra-google-m2repository,extra-android-m2repository +android: + components: + - tools +install: + - npm install + - npm install -g codecov +script: + - npm test + - npm run cover +after_script: + - codecov diff --git a/node_modules/cordova-android/CONTRIBUTING.md b/node_modules/cordova-android/CONTRIBUTING.md new file mode 100644 index 0000000..07f5651 --- /dev/null +++ b/node_modules/cordova-android/CONTRIBUTING.md @@ -0,0 +1,38 @@ + + +# Contributing to Apache Cordova + +Anyone can contribute to Cordova. And we need your contributions. + +There are multiple ways to contribute: report bugs, improve the docs, and +contribute code. + +For instructions on this, start with the +[contribution overview](http://cordova.apache.org/contribute/). + +The details are explained there, but the important items are: + - Sign and submit an Apache ICLA (Contributor License Agreement). + - Have a Jira issue open that corresponds to your contribution. + - Run the tests so your patch doesn't break existing functionality. + +We look forward to your contributions! + diff --git a/node_modules/cordova-android/LICENSE b/node_modules/cordova-android/LICENSE new file mode 100644 index 0000000..c47288d --- /dev/null +++ b/node_modules/cordova-android/LICENSE @@ -0,0 +1,314 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 Apache Cordova + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + ADDITIONAL LICENSES: + +================================================================================ +bin/node_modules/q +================================================================================ + +Copyright 2009–2012 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +================================================================================ +bin/node_modules/shelljs +================================================================================ +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================================================ +bin/node_modules/nopt +================================================================================ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +================================================================================ +bin/node_modules/which +================================================================================ + +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/node_modules/cordova-android/NOTICE b/node_modules/cordova-android/NOTICE new file mode 100644 index 0000000..788ab0b --- /dev/null +++ b/node_modules/cordova-android/NOTICE @@ -0,0 +1,15 @@ +Apache Cordova +Copyright 2015 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org) + +========================================================================= +== NOTICE file corresponding to the section 4 d of == +== the Apache License, Version 2.0, == +== in this case for the Android-specific code. == +========================================================================= + +This product includes software developed as part of +The Android Open Source Project (http://source.android.com). + diff --git a/node_modules/cordova-android/README.md b/node_modules/cordova-android/README.md new file mode 100644 index 0000000..2b97582 --- /dev/null +++ b/node_modules/cordova-android/README.md @@ -0,0 +1,70 @@ + + +[![Build status](https://ci.appveyor.com/api/projects/status/github/apache/cordova-android?branch=master)](https://ci.appveyor.com/project/Humbedooh/cordova-android) +[![Build Status](https://travis-ci.org/apache/cordova-android.svg?branch=master)](https://travis-ci.org/apache/cordova-android) +[![codecov.io](https://codecov.io/github/apache/cordova-android/coverage.svg?branch=master)](https://codecov.io/github/apache/cordova-android?branch=master) + +# Cordova Android + +Cordova Android is an Android application library that allows for Cordova-based +projects to be built for the Android Platform. Cordova based applications are, +at the core, applications written with web technology: HTML, CSS and JavaScript. + +[Apache Cordova](https://cordova.apache.org) is a project of The Apache Software Foundation (ASF). + +:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Android%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + + +## Requires + +- Java JDK 1.8 or greater +- Android SDK [http://developer.android.com](http://developer.android.com) + + +## Cordova Android Developer Tools + +We recommend using the [Cordova command-line tool](https://www.npmjs.com/package/cordova) to create projects and be able to easily install plugins. + +However, the following scripts can be used instead: + + ./bin/create [path package activity] ... creates the ./example app or a cordova android project + ./bin/check_reqs ....................... checks that your environment is set up for cordova-android development + ./bin/update [path] .................... updates an existing cordova-android project to the version of the framework + +These commands live in a generated Cordova Android project. Any interactions with the emulator require you to have an AVD defined. + + ./cordova/clean ........................ cleans the project + ./cordova/build ........................ calls `clean` then compiles the project + ./cordova/log ........................ streams device or emulator logs to STDOUT + ./cordova/run ........................ calls `build` then deploys to a connected Android device. If no Android device is detected, will launch an emulator and deploy to it. + ./cordova/version ...................... returns the cordova-android version of the current project + +## Using Android Studio + +1. Create a project +2. Import it via "Non-Android Studio Project" + +## Running the Native Tests + +The `test/` directory in this project contains an Android test project that can +be used to run different kinds of native tests. Check out the +[README contained therein](test/README.md) for more details! diff --git a/node_modules/cordova-android/RELEASENOTES.md b/node_modules/cordova-android/RELEASENOTES.md new file mode 100644 index 0000000..73b2760 --- /dev/null +++ b/node_modules/cordova-android/RELEASENOTES.md @@ -0,0 +1,703 @@ + +## Release Notes for Cordova (Android) ## + +### 7.1.1 (Jul 11, 2018) +* Fix unsafe property access in run.js (#445) +* Emit log event instead of logging directly (#452) +* [CB-14101](https://issues.apache.org/jira/browse/CB-14101) Fix Java version check for Java >= 9 (#446) +* [CB-14127](https://issues.apache.org/jira/browse/CB-14127) (android) Move google maven repo ahead of jcenter +* [CB-13923](https://issues.apache.org/jira/browse/CB-13923) (android) fix -1 length for compressed files +* [CB-14145](https://issues.apache.org/jira/browse/CB-14145) use cordova-common@2.2.5 and update other dependencies to resolve `npm audit` warnings +* [CB-9366](https://issues.apache.org/jira/browse/CB-9366) log error.stack in cordova.js + +### 7.1.0 (Feb 20, 2018) +* [CB-13879](https://issues.apache.org/jira/browse/CB-13879) updated gradle tools dependency to 3.0.1 for project template +* [CB-13831](https://issues.apache.org/jira/browse/CB-13831) Update `android-versions` to 1.3.0 to support SDK 27. +* [CB-13800](https://issues.apache.org/jira/browse/CB-13800) Drop pre-KitKat specific code +* [CB-13724](https://issues.apache.org/jira/browse/CB-13724) Updated the **Android** Tooling required for the latest version on both the test project, and the template +* [CB-13724](https://issues.apache.org/jira/browse/CB-13724) Bump Target SDK to API 27 +* [CB-13646](https://issues.apache.org/jira/browse/CB-13646) Using the deprecated `NDK` by default breaks the build. Crosswalk users need to specify the Gradle parameters to keep it working. +* [CB-12218](https://issues.apache.org/jira/browse/CB-12218) Fix consistency of null result message +* [CB-13571](https://issues.apache.org/jira/browse/CB-13571) Prevent crash with unrecognized **Android** version +* [CB-13721](https://issues.apache.org/jira/browse/CB-13721) Fix build apps that use `cdvHelpers.getConfigPreference` +* [CB-13621](https://issues.apache.org/jira/browse/CB-13621) Wrote similar warning to [CB-12948](https://issues.apache.org/jira/browse/CB-12948) on **iOS**. We no longer support `cordova update` command. + +### 7.0.0 (Nov 30, 2017) +* [CB-13612](https://issues.apache.org/jira/browse/CB-13612) Fix the remapper so that XML files copy over and the Camera works again. +* [CB-13741](https://issues.apache.org/jira/browse/CB-13741) Bump `package.json` so we can install plugins +* [CB-13610](https://issues.apache.org/jira/browse/CB-13610) Compress the default app assets +* [CB-12835](https://issues.apache.org/jira/browse/CB-12835) add a Context getter in CordovaInterface +* [CB-8976](https://issues.apache.org/jira/browse/CB-8976) Added the `cdvVersionCodeForceAbiDigit` flag to the template build.gradle that appends 0 to the versionCode when `cdvBuildMultipleApks` is not set +* [CB-12291](https://issues.apache.org/jira/browse/CB-12291) (android) Add x86_64, arm64 and armeabi architecture flavors +* [CB-13602](https://issues.apache.org/jira/browse/CB-13602) We were setting the path wrong, this is hacky but it works +* [CB-13601](https://issues.apache.org/jira/browse/CB-13601) Fixing the standalone run scripts to make sure this works without using the CLI +* [CB-13580](https://issues.apache.org/jira/browse/CB-13580) fix build for multiple apks (different product flavors) +* [CB-13558](https://issues.apache.org/jira/browse/CB-13558) Upgrading the gradle so we can upload the AAR +* [CB-13297](https://issues.apache.org/jira/browse/CB-13297) This just works once you bump the project structure. Java 1.8 compatibility baked-in +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) **Android** Studio 3 work, things have changed with how the platform is built +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Found bug where the gradle subproject changes weren't actually getting written to the correct gradle file +* [CB-13470](https://issues.apache.org/jira/browse/CB-13470) Fix Clean so that it cleans the **Android** Studio structure +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Adding specs for resource files inside an **Android** Studio Project +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Added remapping for drawables +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Found bug in Api.js where xml/strings.xml is used instead of values/strings.xml +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Setup Api.js to support multiple builders based on project structure +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Changing directory creation, will most likely hide this behind a flag for the next release of `cordova-android`, and then make it default in the next major pending feedback +* Adding the Studio Builder to build a project based on **Android** Studio, and deleting Ant, since Google does not support Ant Builds anymore. Sorry guys! + +### 6.4.0 (Nov 06, 2017) +* [CB-13289](https://issues.apache.org/jira/browse/CB-13289) Fixing build problems with Studio Three, but keeping **Windows** Gradle fix for now, will be deprecated +* [CB-13289](https://issues.apache.org/jira/browse/CB-13289) Fix test to work with new Google **Android** Gradle DSL +* :CB-13501 : update appveyor node versions to support node 8 +* [CB-13499](https://issues.apache.org/jira/browse/CB-13499) Remove duplicate "setting" in error strings +* Include missing values for task.name when 'cdvBuildMultipleApks' option is true, 'task.name' can have 'validateSigningArmv7Release' or 'validateSigningX86Release' values too. +* [CB-13406](https://issues.apache.org/jira/browse/CB-13406) Fixed AVD API level comparison when choosing sub-par API level match. Added tests for the best_image method. +* [CB-13404](https://issues.apache.org/jira/browse/CB-13404) add **Android**-versions to bundledDependencies. Ignore best emulator selection when parsed AVD information does not include API level in the target +* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) : eslint ignoring cordova.js +* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) Temporarily disabling eslint since cordova-js does not have eslint yet. + +### 6.3.0 (Sep 25, 2017) +* [CB-6936](https://issues.apache.org/jira/browse/CB-6936) fix crash when calling methods on a destroyed webview +* [CB-12981](https://issues.apache.org/jira/browse/CB-12981) handle SDK 26.0.2 slightly different AVD list output for **Android** 8+ AVDs. Would cause "cannot read property replace of undefined" errors when trying to deploy an **Android** 8 emulator. +* Updated maven repo to include most recent lib versions +* [CB-13177](https://issues.apache.org/jira/browse/CB-13177) Updating to API Level 26 +* Revert [CB-12015](https://issues.apache.org/jira/browse/CB-12015) initial-scale values less than 1.0 are ignored on **Android** +* [CB-12730](https://issues.apache.org/jira/browse/CB-12730) The Cordova Compatibility Plugin is now integrated into cordova-android +* [CB-12453](https://issues.apache.org/jira/browse/CB-12453) Remove unnecessary double quotes from .bat files which are the causes of crash if project path contains spaces +* [CB-13031](https://issues.apache.org/jira/browse/CB-13031) Fix bug with case-sensitivity of **Android**-packageName +* [CB-10916](https://issues.apache.org/jira/browse/CB-10916) Support display name for **Android** +* [CB-12423](https://issues.apache.org/jira/browse/CB-12423) make explicit JDK 1.8 or greater is needed in the `README`, we require 1.8 for compilation, but do not have 1.8 Java features yet +* [CB-13006](https://issues.apache.org/jira/browse/CB-13006) removed create and update end-to-end tests, and instead added more unit test coverage. tweaked code coverage invocation so that we get coverage details on the create.js module. slight changes to the create.js module so that it is slightly easier to test. +* [CB-12950](https://issues.apache.org/jira/browse/CB-12950) lots of tweaks for end-to-end test runs, especially on CI: - rename npm tasks to reflect what they do (npm run unit-tests, npm run e2e-tests). main `npm test` runs linter, unit tests and e2e tests now. - locked jasmine down to ~2.6.0. - consolidate gitignores. - updated travis to run `npm test`. add **Android** sdk installation to appveyor ci run.align **Android** dpendencies across travis and appveyor. have appveyor install gradle. force gradle to version 3.4.1 in appveyor, as that seems to be the only version choco has. explicitly invoke sdkmanager to move license accepting process along. +* [CB-12605](https://issues.apache.org/jira/browse/CB-12605) In **Windows** get **Android** studio path from the registry +* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) : pointed `package.json` repo items to github mirrors instead of apache repos site +* [CB-12617](https://issues.apache.org/jira/browse/CB-12617) : removed node0.x support for platforms and added engineStrict + +### 6.2.3 (May 2, 2017) +* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) better handling of unrecognized Android SDK commands on **Windows**. +* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) flipped avd parsing logic so that it always tries to use avdmanager to retrieve avds first, then falls back to android command if avdmanager cannot be found (and errors with ENOENT). updated tests - and added explicit tests to ensure to shell out to singular forms of sub-commands when executing `android` +* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) support for android sdk tools 26.0.1. + +### 6.2.2 (Apr 24, 2017) +* [CB-12697](https://issues.apache.org/jira/browse/CB-12697) Updated checked-in `node_modules` + +### 6.2.1 (Apr 02, 2017) +* [CB-12621](https://issues.apache.org/jira/browse/CB-12621) reverted elementtree dep to 0.1.6 + +### 6.2.0 (Mar 28, 2017) +* [CB-12614](https://issues.apache.org/jira/browse/CB-12614) Adding headers to tests +* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Prepare copy `resource-files` from `config.xml` +* [CB-12605](https://issues.apache.org/jira/browse/CB-12605) Fix a requirements check failure on **Windows** +* [CB-12595](https://issues.apache.org/jira/browse/CB-12595) This should find an **Android Studio** installation and use the sweet gradle center found inside +* [CB-12546](https://issues.apache.org/jira/browse/CB-12546) leverage `avdmanager` if `android` warns it is no longer useful, which happens in **Android SDK Tools 25.3.1**. Explicitly set the `CWD` of the spawned emulator process to workaround a recent google android sdk bug. Rename `android_sdk_version.js` to `android_sdk.js`, to better reflect its contents. Have `create.js` copy over the `android_sdk_version` batch file. +* [CB-12524](https://issues.apache.org/jira/browse/CB-12524) Fix for missing gradle template error. This now fetches the template from inside of the **Android Studio** directory, and falls back to a locally installed Gradle instance +* [CB-12465](https://issues.apache.org/jira/browse/CB-12465) Writing new JUnit Test Instrumentation to replace tests and retire problmatic tests + +### 6.1.2 (Jan 26, 2017) +* **Security** Change to `https` by default +* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated tests to work with jasmine (promise matcher tests commented out for now) +* created directories and corresponding images for `xxhdpi` and `xxxhdpi`, both drawables and `mipmaps` + +### 6.1.1 (Jan 03, 2017) +* [CB-12159](https://issues.apache.org/jira/browse/CB-12159) **Android** Keystore password prompt won't show up +* [CB-12169](https://issues.apache.org/jira/browse/CB-12169) Check for build directory before running a clean +* Fixed `AndroidStudio` tests to actually run, removed `app/src/main/assets/` as a requirement and added `app/src/main/res` instead, added placeholder for `build/` folder, Removed dupe `gitignore` + +### 6.1.0 (Nov 02, 2016) +* [CB-12108](https://issues.apache.org/jira/browse/CB-12108) Updating gradle files to work with the latest version of Android Studio +* [CB-12102](https://issues.apache.org/jira/browse/CB-12102) Bump travis to build to API 25 +* Bumping up the version +* [CB-12101](https://issues.apache.org/jira/browse/CB-12101) Fix so that CLI builds don't conflict with Android Studio builds +* [CB-12077](https://issues.apache.org/jira/browse/CB-12077) Fix paths for Android icons/splashscreens +* added framework/build to .ratignore +* Fix for broken testUrl test +* Last minute change of test targets +* Update JS snapshot to version 6.1.0-dev (via coho) +* Set VERSION to 6.1.0-dev (via coho) + +### 6.0.0 (Oct 20, 2016) + +This release adds significant functionality, and also introduces a number +of breaking changes. Some of the changes to the code base will be of +particular interest to third party webview plugin developers. + +#### Major Changes #### +* Primary bridge is the EVAL_BRIDGE, which tells the WebView to execute JS directly. This is more stable than the ONLINE_EVENT bridge +* Full Support for Android Nougat (API 24) +* Ice Cream Sandwich Support has been deprecated. Minimum Supported Android Version is Jellybean (API 16/ Android 4.1) +* Plugin Installation now CLEANS the build directory, this speeds up gradle build times and allows for CLI develoment to be more predictable + +Changes For Third-Party WebView Developers: +* executeJavascript method added and is an abstract method that must be implemented +* the EVAL_BRIDGE must be added to the WebView + + +#### Curated Changes from the Git Commit Logs #### +* Updating the gradle build for test to use the latest +* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Fixing syncronous file check and future-proofing the JS for Travis +* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Reading files to check for CordovaLib dependency, if so, we exclude CordovaLib to be safe +* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Plugin build script for dependencies without a gradle file +* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) The GradleBuidler can tell the difference between a Cordova Plugin Framework and a regular framework based on the name +* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Fix to deal with custom frameworks with their own Gradle configuration +* [CB-12003](https://issues.apache.org/jira/browse/CB-12003) updated node_modules +* [CB-11771](https://issues.apache.org/jira/browse/CB-11771) Deep symlink directories to target project instead of linking the directory itself +* [CB-11880](https://issues.apache.org/jira/browse/CB-11880) android: Fail-safe for cordova.exec() +* [CB-11999](https://issues.apache.org/jira/browse/CB-11999) add message, catch exception if require fails +* fix issue with app_name containing apostrophes +* [CB-8722](https://issues.apache.org/jira/browse/CB-8722) - Move icons from drawable to mipmap +* [CB-11964](https://issues.apache.org/jira/browse/CB-11964) Call clean after plugin install and mock it in tests +* Did a try/catch to deal with the unit tests vs actual project environment, code duplication is needed because of builderEnv +* [CB-11964](https://issues.apache.org/jira/browse/CB-11964) Do a clean when installing a plugin to et around the bug +* [CB-11921](https://issues.apache.org/jira/browse/CB-11921) - Add github pull request template +* [CB-11935](https://issues.apache.org/jira/browse/CB-11935) Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. +* [CB-11640](https://issues.apache.org/jira/browse/CB-11640) Fixing check_reqs.js so it actually works +* [CB-11640](https://issues.apache.org/jira/browse/CB-11640) Changing requirements check to ask for Java 8 +* [CB-11869](https://issues.apache.org/jira/browse/CB-11869) Fix cordova-js android exec tests +* [CB-11907](https://issues.apache.org/jira/browse/CB-11907) Bumping Gradle to work with Android Studio 2.2 and the Android Gradle Plugin +* Enable background start of Cordova Android apps +* fixing jshint issues +* replace Integer.parseInt with BigInteger so that you can use longer Android version codes +* [CB-11828](https://issues.apache.org/jira/browse/CB-11828) Adding dirty userAgent checking to see if we're running Jellybean or not for bridge modes +* [CB-11828](https://issues.apache.org/jira/browse/CB-11828) Switching default bridge back to ONLINE_BRIDGE +* Add gradle build flag to enable dex in process for large projects +* added ability for cordova activity to be viewed in a real full screen regardless of android version (as was the case in previous cordova versions) +* Updating travis +* Adding Static Method to CoreAndroid Plugin so we can get the BuildConfig data from other plugins +* Bump Target and Min API levels +* Make evaluateJavaScript brige default +* Creating an evaluateJavascript branch +* [CB-11727](https://issues.apache.org/jira/browse/CB-11727) - travis ci setup is still using 0.10.32 node +* [CB-11726](https://issues.apache.org/jira/browse/CB-11726) - Update appveyor node versions to 4 and 6, so they will always use the latest versions +* Close invalid PRs +* [CB-11683](https://issues.apache.org/jira/browse/CB-11683) Fixed linking to directories during plugin installation. +* fixed [CB-11078](https://issues.apache.org/jira/browse/CB-11078) Empty string for BackgroundColor preference crashes application This closes #316 +* Update JS snapshot to version 5.3.0-dev (via coho) +* Set VERSION to 5.3.0-dev (via coho) +* [CB-11626](https://issues.apache.org/jira/browse/CB-11626) Updated RELEASENOTES and Version for release 5.2.2 +* updated cordoova-common to 1.4.0 +* This closes #195 +* Updaing the gradle for the tests to the latest +* [CB-11550](https://issues.apache.org/jira/browse/CB-11550) Updated RELEASENOTES for release 5.2.1 +* [CB-9489](https://issues.apache.org/jira/browse/CB-9489) Fixed "endless waiting for emulator" issue +* Update JS snapshot to version 5.3.0-dev (via coho) +* Set VERSION to 5.3.0-dev (via coho) +* [CB-11444](https://issues.apache.org/jira/browse/CB-11444) Updated RELEASENOTES and Version for release 5.2.0 +* [CB-11481](https://issues.apache.org/jira/browse/CB-11481) android-library is deprecated use com.android.library instead + +### 5.2.2 (Jul 26, 2016) +* [CB-11615](https://issues.apache.org/jira/browse/CB-11615) updated `cordoova-common` to `1.4.0` + +### 5.2.1 (Jul 11, 2016) +* [CB-9489](https://issues.apache.org/jira/browse/CB-9489) Fixed "endless waiting for emulator" issue +* [CB-11481](https://issues.apache.org/jira/browse/CB-11481) android-library is deprecated use com.android.library instead + +### 5.2.0 (Jun 29, 2016) +* [CB-11383](https://issues.apache.org/jira/browse/CB-11383) Update to gradle for using `jcenter` and correct Application plugin +* [CB-11365](https://issues.apache.org/jira/browse/CB-11365) fixed plugin rm issue with emit being `undefined` +* [CB-11117](https://issues.apache.org/jira/browse/CB-11117) Use `FileUpdater` to optimize prepare for **android** platform +* [CB-10096](https://issues.apache.org/jira/browse/CB-10096) Upgrade test project to `Gradle Plugin 2.1.0` +* [CB-11292](https://issues.apache.org/jira/browse/CB-11292) fix broken `MessageChannel` after plugins are recreated +* [CB-11259](https://issues.apache.org/jira/browse/CB-11259) Improving build output +* [CB-10096](https://issues.apache.org/jira/browse/CB-10096) Upgrading to `Gradle Plugin 2.1.0` +* [CB-11198](https://issues.apache.org/jira/browse/CB-11198) Skip **android** target sdk check. This closes #303. +* [CB-11138](https://issues.apache.org/jira/browse/CB-11138) Reuse `PluginManager` from `common` to add/rm plugins +* [CB-11133](https://issues.apache.org/jira/browse/CB-11133) Handle **android** emulator start failure +* [CB-11132](https://issues.apache.org/jira/browse/CB-11132) Fix Error: Cannot read property `match` of undefined in `cordova-android` `emulator.js` +* Add simple log for package name being deployed +* [CB-11015](https://issues.apache.org/jira/browse/CB-11015) Error adding plugin with gradle extras +* [CB-11095](https://issues.apache.org/jira/browse/CB-11095) Fix plugin add/removal when running on `Node v.010` +* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Duplicate www files to both destinations on plugin operations +* [CB-10964](https://issues.apache.org/jira/browse/CB-10964) Handle `build.json` file starting with a BOM. +* [CB-10963](https://issues.apache.org/jira/browse/CB-10963) Handle overlapping permission requests from plugins +* [CB-8582](https://issues.apache.org/jira/browse/CB-8582) Obscure `INSTALL_FAILED_VERSION_DOWNGRADE` error when installing app +* [CB-10862](https://issues.apache.org/jira/browse/CB-10862) Cannot set `minsdkversion` +* [CB-10896](https://issues.apache.org/jira/browse/CB-10896) We never enabled cookies on the `WebView` proper +* [CB-10837](https://issues.apache.org/jira/browse/CB-10837) Support platform-specific orientation on **Android** +* [CB-10600](https://issues.apache.org/jira/browse/CB-10600) `cordova run android --release` does not use signed and zip-aligned version of `APK` +* [CB-9710](https://issues.apache.org/jira/browse/CB-9710) Fixing issues parsing `android avd list` output for certain AVDs which resulted in them not being included in the selection process even if they are the best match. +* [CB-10888](https://issues.apache.org/jira/browse/CB-10888) Enable coverage reports collection via codecov +* [CB-10846](https://issues.apache.org/jira/browse/CB-10846) Add Travis and AppVeyor badges to readme +* [CB-10846](https://issues.apache.org/jira/browse/CB-10846) Add AppVeyor configuration +* [CB-10749](https://issues.apache.org/jira/browse/CB-10749) Use `cordova-common.CordovaLogger` in `cordova-android` +* [CB-10673](https://issues.apache.org/jira/browse/CB-10673) fixed conflicting plugin install issue with overlapped `` tag. Add `--force` flag. +* [CB-8976](https://issues.apache.org/jira/browse/CB-8976) Removing the auto-version for non-Crosswalk applications +* [CB-10768](https://issues.apache.org/jira/browse/CB-10768) Use `cordova-common.superspawn` in `GradleBuilder` +* [CB-10729](https://issues.apache.org/jira/browse/CB-10729) Move plugin handlers tests for into platform's repo +* [CB-10669](https://issues.apache.org/jira/browse/CB-10669) `cordova run --list` cannot find `adb` +* [CB-10660](https://issues.apache.org/jira/browse/CB-10660) fixed the exception when removing a non-existing directory. + +### 5.1.1 (Feb 24, 2016) +* updated `cordova-common` dependnecy to `1.1.0` +* [CB-10628](https://issues.apache.org/jira/browse/CB-10628) Fix `emulate android --target` +* [CB-10618](https://issues.apache.org/jira/browse/CB-10618) Handle gradle frameworks on plugin installation/uninstallation +* [CB-10510](https://issues.apache.org/jira/browse/CB-10510) Add an optional timeout to `emu` start script +* [CB-10498](https://issues.apache.org/jira/browse/CB-10498) Resume event should be sticky if it has a plugin result +* fix `HtmlNotFoundTest` so that it passes when file not found is handled correctly +* [CB-10472](https://issues.apache.org/jira/browse/CB-10472) `NullPointerException`: `org.apache.cordova.PluginManager.onSaveInstanceState` check if `pluginManager` is `null` before using it +* [CB-10138](https://issues.apache.org/jira/browse/CB-10138) Adds missing plugin metadata to `plugin_list` module. +* [CB-10443](https://issues.apache.org/jira/browse/CB-10443) Pass original options instead of remaining +* [CB-10443](https://issues.apache.org/jira/browse/CB-10443) Fix `this.root` null reference +* [CB-10421](https://issues.apache.org/jira/browse/CB-10421) Fixes exception when calling run script with `--help` option +* updated `.gitignore` +* [CB-10406](https://issues.apache.org/jira/browse/CB-10406) Fixes an exception, thrown when building using Ant. +* [CB-10157](https://issues.apache.org/jira/browse/CB-10157) Uninstall app from device/emulator only when signed apk is already installed + +### 5.1.0 (Jan 19, 2016) +* [CB-10386](https://issues.apache.org/jira/browse/CB-10386) Add `android.useDeprecatedNdk=true` to support `NDK` in `gradle` +* [CB-8864](https://issues.apache.org/jira/browse/CB-8864) Fixing this to mitigate [CB-8685](https://issues.apache.org/jira/browse/CB-8685) and [CB-10104](https://issues.apache.org/jira/browse/CB-10104) +* [CB-10105](https://issues.apache.org/jira/browse/CB-10105) Spot fix for tilde errors on paths. +* Update theme to `Theme.DeviceDefault.NoActionBar` +* [CB-10014](https://issues.apache.org/jira/browse/CB-10014) Set gradle `applicationId` to `package name`. +* [CB-9949](https://issues.apache.org/jira/browse/CB-9949) Fixing menu button event not fired in **Android** +* [CB-9479](https://issues.apache.org/jira/browse/CB-9479) Fixing the conditionals again, we should +* [CB-8917](https://issues.apache.org/jira/browse/CB-8917) New Plugin API for passing results on resume after Activity destruction +* [CB-9971](https://issues.apache.org/jira/browse/CB-9971) Suppress `gradlew _JAVA_OPTIONS` output during build +* [CB-9836](https://issues.apache.org/jira/browse/CB-9836) Add `.gitattributes` to prevent `CRLF` line endings in repos +* added node_modules back into `.gitignore` + +### 5.0.0 (Nov 01, 2015) +* Update CordovaWebViewEngine.java +* [CB-9909](https://issues.apache.org/jira/browse/CB-9909) Shouldn't escape spaces in paths on Windows. +* [CB-9870](https://issues.apache.org/jira/browse/CB-9870) updated hello world template +* [CB-9880](https://issues.apache.org/jira/browse/CB-9880) Fixes platform update failure when upgrading from android@<4.1.0 +* [CB-9844](https://issues.apache.org/jira/browse/CB-9844) Remove old .java after renaming activity +* [CB-9800](https://issues.apache.org/jira/browse/CB-9800) Fixing contribute link. +* [CB-9782](https://issues.apache.org/jira/browse/CB-9782) Check in `cordova-common` dependency +* Adds licence header to Adb to pass rat audit +* [CB-9835](https://issues.apache.org/jira/browse/CB-9835) Downgrade `properties-parser` to prevent failures in Node < 4.x +* [CB-9782](https://issues.apache.org/jira/browse/CB-9782) Implements PlatformApi contract for Android platform. +* [CB-9826](https://issues.apache.org/jira/browse/CB-9826) Fixed `test-build` script on windows. +* Refactor of the Cordova Plugin/Permissions API +* Manually updating version to 5.0.0-dev for engine tags +* Bump up to API level 23 +* Commiting code to handle permissions, and the special case of the Geolocation Plugin +* [CB-9608](https://issues.apache.org/jira/browse/CB-9608) cordova-android no longer builds on Node 0.10 or below +* [CB-9080](https://issues.apache.org/jira/browse/CB-9080) Cordova CLI run for Android versions 4.1.1 and lower throws error +* [CB-9557](https://issues.apache.org/jira/browse/CB-9557) Fixes apk install failure when switching from debug to release build +* [CB-9496](https://issues.apache.org/jira/browse/CB-9496) removed permissions added for crosswalk +* [CB-9402](https://issues.apache.org/jira/browse/CB-9402) Allow to set gradle distubutionUrl via env variable CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL +* [CB-9428](https://issues.apache.org/jira/browse/CB-9428) update script now bumps up minSdkVersion to 14 if it is less than that. +* [CB-9430](https://issues.apache.org/jira/browse/CB-9430) Fixes check_reqs failure when javac returns an extra line +* [CB-9172](https://issues.apache.org/jira/browse/CB-9172) Improved emulator deploy stability. This closes #188. +* [CB-9404](https://issues.apache.org/jira/browse/CB-9404) Fixed an exception when path contained -debug or -release +* [CB-8320](https://issues.apache.org/jira/browse/CB-8320) Setting up gradle so we can use CordovaLib as a standard Android Library +* [CB-9185](https://issues.apache.org/jira/browse/CB-9185) Fixed an issue when unsigned apks couldn't be found. +* [CB-9397](https://issues.apache.org/jira/browse/CB-9397) Fixes minor issues with `cordova requirements android` +* [CB-9389](https://issues.apache.org/jira/browse/CB-9389) Fixes build/check_reqs hang + +### Release 4.1.1 (Aug 2015) ### + +* [CB-9428](https://issues.apache.org/jira/browse/CB-9428) update script now bumps up minSdkVersion to 14 if it is less than that +* [CB-9430](https://issues.apache.org/jira/browse/CB-9430) Fixes check_reqs failure when javac returns an extra line + +### Release 4.1.0 (Jul 2015) ### +* [CB-9392](https://issues.apache.org/jira/browse/CB-9392) Fixed printing flavored versions. This closes #184. +* [CB-9382](https://issues.apache.org/jira/browse/CB-9382) [Android] Fix KeepRunning setting when Plugin activity is showed. This closes #200 +* [CB-9391](https://issues.apache.org/jira/browse/CB-9391) Fixes cdvBuildMultipleApks option casting +* [CB-9343](https://issues.apache.org/jira/browse/CB-9343) Split the Content-Type to obtain a clean mimetype +* [CB-9255](https://issues.apache.org/jira/browse/CB-9255) Make getUriType case insensitive. +* [CB-9149](https://issues.apache.org/jira/browse/CB-9149) Fixes JSHint issue introduced by 899daa9 +* [CB-9372](https://issues.apache.org/jira/browse/CB-9372) Remove unused files: 'main.js' & 'master.css'. This closes #198 +* [CB-9149](https://issues.apache.org/jira/browse/CB-9149) Make gradle alias subprojects in order to handle libs that depend on libs. This closes #182 +* Update min SDK version to 14 +* Update licenses. This closes #190 +* [CB-9185](https://issues.apache.org/jira/browse/CB-9185) Fix signed release build exception. This closes #193. +* [CB-9286](https://issues.apache.org/jira/browse/CB-9286) Fixes build failure when ANDROID_HOME is not set. +* [CB-9284](https://issues.apache.org/jira/browse/CB-9284) Fix for handling absolute path for keystore in build.json +* [CB-9260](https://issues.apache.org/jira/browse/CB-9260) Install Android-22 on Travis-CI +* Adding .ratignore file. +* [CB-9119](https://issues.apache.org/jira/browse/CB-9119) Adding lib/retry.js for retrying promise-returning functions. Retrying 'adb install' in emulator.js because it sometimes hangs. +* [CB-9115](https://issues.apache.org/jira/browse/CB-9115) android: Grant Lollipop permission req +* Remove extra console message +* [CB-8898](https://issues.apache.org/jira/browse/CB-8898) Report expected gradle location properly +* [CB-8898](https://issues.apache.org/jira/browse/CB-8898) Fixes gradle check failure due to missing quotes +* [CB-9080](https://issues.apache.org/jira/browse/CB-9080) -d option is not supported on Android 4.1.1 and lower, removing +* [CB-8954](https://issues.apache.org/jira/browse/CB-8954) Adds `requirements` command support to check_reqs module +* Update JS snapshot to version 4.1.0-dev (via coho) +* [CB-8417](https://issues.apache.org/jira/browse/CB-8417) updated platform specific files from cordova.js repo +* Adding tests to confirm that preferences aren't changed by Intents +* Forgot to remove the method that copied over the intent data +* Getting around to removing this old Intent code +* Update JS snapshot to version 4.1.0-dev (via coho) +* Fix CordovaPluginTest on KitKat (start-up events seem to change) +* [CB-3360](https://issues.apache.org/jira/browse/CB-3360) Allow setting a custom User-Agent (close #162) +* [CB-8902](https://issues.apache.org/jira/browse/CB-8902) Use immersive mode when available when going fullscreen (close #175) +* Make BridgeMode methods public (they were always supposed to be) +* Simplify: EncodingUtils.getBytes(str) -> str.getBytes() +* Don't show warning when gradlew file is read-only +* Don't show warning when prepEnv copies gradlew and it's read-only +* Make gradle wrapper prepEnv code work even when android-sdk is read-only +* [CB-8897](https://issues.apache.org/jira/browse/CB-8897) Delete drawable/icon.png since it duplicates drawable-mdpi/icon.png +* Updating the template to target mininumSdkTarget=14 +* [CB-8894](https://issues.apache.org/jira/browse/CB-8894) Updating the template to target mininumSdkTarget=14 +* [CB-8891](https://issues.apache.org/jira/browse/CB-8891) Add a note about when the gradle helpers were added +* [CB-8891](https://issues.apache.org/jira/browse/CB-8891) Add a gradle helper for retrieving config.xml preference values +* [CB-8884](https://issues.apache.org/jira/browse/CB-8884) Delete Eclipse tweaks from create script +* [CB-8834](https://issues.apache.org/jira/browse/CB-8834) Don't fail to install on VERSION_DOWNGRADE +* Automated tools fail, and you have to remember all four places where this is set. +* Update the package.json +* [CB-9042](https://issues.apache.org/jira/browse/CB-9042) coho failed to update version, so here we are +* CB9042 - Updating Release Notes +* Adding tests to confirm that preferences aren't changed by Intents +* updating existing test code +* Forgot to remove the method that copied over the intent data +* Getting around to removing this old Intent code +* [CB-8834](https://issues.apache.org/jira/browse/CB-8834) Don't fail to install on VERSION_DOWNGRADE + +### Release 4.0.2 (May 2015) ### + +* Removed Intent Functionality from Preferences - Preferences can no longer be set by intents + +### Release 4.0.1 (April 2015) ### + +* Bug fixed where platform failed to install on a version downgrade + +### Release 4.0.0 (March 2015) ### + +This release adds significant functionality, and also introduces a number +of breaking changes. Some of the changes to the code base will be of +particular interest to plugin developers. + +#### Major Changes #### +* Support for pluggable WebViews + * The system WebView can be replaced in your app, via a plugin + * Core WebView functionality is encapsulated, with extension points exposed + via interfaces +* Support for Crosswalk to bring the modern Chromium WebView to older devices + * Uses the pluggable WebView framework + * You will need to add the new [cordova-crosswalk-engine](https://github.com/MobileChromeApps/cordova-crosswalk-engine) plugin +* Splash screen functionality is now provided via plugin + * You will need to add the new [cordova-plugin-splashscreen](https://github.com/apache/cordova-plugin-splashscreen) plugin to continue using a splash screen +* Whitelist functionality is now provided via plugin (CB-7747) + * The whitelist has been enhanced to be more secure and configurable + * Setting of Content-Security-Policy is now supported by the framework (see details in plugin readme) + * You will need to add the new [cordova-plugin-whitelist](https://github.com/apache/cordova-plugin-whitelist) plugin + * Legacy whitelist behaviour is still available via plugin (although not recommended). + +Changes For Plugin Developers: + +* Develop in Android Studio + * Android Studio is now fully supported, and recommended over Eclipse +* Build using Gradle + * All builds [use Gradle by default](Android%20Shell%20Tool%20Guide_building_with_gradle), instead of Ant + * Plugins can add their own gradle build steps! + * Plugins can depend on Maven libraries using `` tags +* New APIs: `onStart`, `onStop`, `onConfigurationChanged` +* `"onScrollChanged"` message removed. Use `view.getViewTreeObserver().addOnScrollChangedListener(...)` instead +* [CB-8702](https://issues.apache.org/jira/browse/CB-8702) New API for plugins to override `shouldInterceptRequest` with a stream + +#### Other Changes #### +* [CB-8378](https://issues.apache.org/jira/browse/CB-8378) Removed `hidekeyboard` and `showkeyboard` events (apps should use a plugin instead) +* [CB-8735](https://issues.apache.org/jira/browse/CB-8735) `bin/create` regex relaxed / better support for numbers +* [CB-8699](https://issues.apache.org/jira/browse/CB-8699) Fix CordovaResourceApi `copyResource` creating zero-length files when src=uncompressed asset +* [CB-8693](https://issues.apache.org/jira/browse/CB-8693) CordovaLib should not contain icons / splashscreens +* [CB-8592](https://issues.apache.org/jira/browse/CB-8592) Fix NPE if lifecycle events reach CordovaWebView before `init()` has been called +* [CB-8588](https://issues.apache.org/jira/browse/CB-8588) Add CATEGORY_BROWSABLE to intents from showWebPage openExternal=true +* [CB-8587](https://issues.apache.org/jira/browse/CB-8587) Don't allow WebView navigations within showWebPage that are not whitelisted +* [CB-7827](https://issues.apache.org/jira/browse/CB-7827) Add `--activity-name` for `bin/create` +* [CB-8548](https://issues.apache.org/jira/browse/CB-8548) Use debug-signing.properties and release-signing.properties when they exist +* [CB-8545](https://issues.apache.org/jira/browse/CB-8545) Don't add a layout as a parent of the WebView +* [CB-7159](https://issues.apache.org/jira/browse/CB-7159) BackgroundColor not used when ``, nor during screen rotation +* [CB-6630](https://issues.apache.org/jira/browse/CB-6630) Removed OkHttp from core library. It's now available as a plugin: [cordova-plugin-okhttp](https://www.npmjs.com/package/cordova-plugin-okhttp) + +### Release 3.7.1 (January 2015) ### +* [CB-8411](https://issues.apache.org/jira/browse/CB-8411) Initialize plugins only after `createViews()` is called (regression in 3.7.0) + +### Release 3.7.0 (January 2015) ### + +* [CB-8328](https://issues.apache.org/jira/browse/CB-8328) Allow plugins to handle certificate challenges (close #150) +* [CB-8201](https://issues.apache.org/jira/browse/CB-8201) Add support for auth dialogs into Cordova Android +* [CB-8017](https://issues.apache.org/jira/browse/CB-8017) Add support for `` for Lollipop +* [CB-8143](https://issues.apache.org/jira/browse/CB-8143) Loads of gradle improvements (try it with cordova/build --gradle) +* [CB-8329](https://issues.apache.org/jira/browse/CB-8329) Cancel outstanding ActivityResult requests when a new startActivityForResult occurs +* [CB-8026](https://issues.apache.org/jira/browse/CB-8026) Bumping up Android Version and setting it up to allow third-party cookies. This might change later. +* [CB-8210](https://issues.apache.org/jira/browse/CB-8210) Use PluginResult for various events from native so that content-security-policy can be used +* [CB-8168](https://issues.apache.org/jira/browse/CB-8168) Add support for `cordova/run --list` (closes #139) +* [CB-8176](https://issues.apache.org/jira/browse/CB-8176) Vastly better auto-detection of SDK & JDK locations +* [CB-8079](https://issues.apache.org/jira/browse/CB-8079) Use activity class package name, but fallback to application package name when looking for splash screen drawable +* [CB-8147](https://issues.apache.org/jira/browse/CB-8147) Have corodva/build warn about unrecognized flags rather than fail +* [CB-7881](https://issues.apache.org/jira/browse/CB-7881) Android tooling shouldn't lock application directory +* [CB-8112](https://issues.apache.org/jira/browse/CB-8112) Turn off mediaPlaybackRequiresUserGesture +* [CB-6153](https://issues.apache.org/jira/browse/CB-6153) Add a preference for controlling hardware button audio stream (DefaultVolumeStream) +* [CB-8031](https://issues.apache.org/jira/browse/CB-8031) Fix race condition that shows as ConcurrentModificationException +* [CB-7974](https://issues.apache.org/jira/browse/CB-7974) Cancel timeout timer if view is destroyed +* [CB-7940](https://issues.apache.org/jira/browse/CB-7940) Disable exec bridge if bridgeSecret is wrong +* [CB-7758](https://issues.apache.org/jira/browse/CB-7758) Allow content-url-hosted pages to access the bridge +* [CB-6511](https://issues.apache.org/jira/browse/CB-6511) Fixes build for android when app name contains unicode characters. +* [CB-7707](https://issues.apache.org/jira/browse/CB-7707) Added multipart PluginResult +* [CB-6837](https://issues.apache.org/jira/browse/CB-6837) Fix leaked window when hitting back button while alert being rendered +* [CB-7674](https://issues.apache.org/jira/browse/CB-7674) Move preference activation back into onCreate() +* [CB-7499](https://issues.apache.org/jira/browse/CB-7499) Support RTL text direction +* [CB-7330](https://issues.apache.org/jira/browse/CB-7330) Don't run check_reqs for bin/create. + +### 3.6.4 (Sept 30, 2014) ### + +* Set VERSION to 3.6.4 (via coho) +* Update JS snapshot to version 3.6.4 (via coho) +* [CB-7634](https://issues.apache.org/jira/browse/CB-7634) Detect JAVA_HOME properly on Ubuntu +* [CB-7579](https://issues.apache.org/jira/browse/CB-7579) Fix run script's ability to use non-arch-specific APKs +* [CB-6511](https://issues.apache.org/jira/browse/CB-6511) Fixes build for android when app name contains unicode characters. +* [CB-7463](https://issues.apache.org/jira/browse/CB-7463) Adding licences. I don't know what the gradle syntax is for comments, that still needs to be done. +* [CB-7463](https://issues.apache.org/jira/browse/CB-7463) Looked at the Apache BigTop git, gradle uses C-style comments +* [CB-7460](https://issues.apache.org/jira/browse/CB-7460) Fixing bug with KitKat where the background colour would override the CSS colours on the application + +### 3.6.0 (Sept 2014) ### + +* Set VERSION to 3.6.0 (via coho) +* [CB-7410](https://issues.apache.org/jira/browse/CB-7410) fix the menu test +* [CB-7410](https://issues.apache.org/jira/browse/CB-7410) Fix the errorUrl test +* [CB-7410](https://issues.apache.org/jira/browse/CB-7410) Fix Basic Authentication test +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Allow build and run scripts to select APK by architecture +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add environment variable 'BUILD_MULTIPLE_APKS' for splitting APKs based on architecture +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Ensure that JAR files in libs directory are included +* [CB-7267](https://issues.apache.org/jira/browse/CB-7267) update RELEASENOTES for 3.5.1 +* [CB-7410](https://issues.apache.org/jira/browse/CB-7410) clarify the title +* [CB-7385](https://issues.apache.org/jira/browse/CB-7385) update cordova.js for testing prior to branch/tag +* [CB-7410](https://issues.apache.org/jira/browse/CB-7410) add whitelist entries to get iframe/GoogleMaps working +* [CB-7291](https://issues.apache.org/jira/browse/CB-7291) propogate change in method signature to the native tests +* [CB-7291](https://issues.apache.org/jira/browse/CB-7291) Restrict meaning of "\*" in internal whitelist to just http and https +* [CB-7291](https://issues.apache.org/jira/browse/CB-7291) Only add file, content and data URLs to internal whitelist +* [CB-7291](https://issues.apache.org/jira/browse/CB-7291) Add defaults to external whitelist +* [CB-7291](https://issues.apache.org/jira/browse/CB-7291) Add external-launch-whitelist and use it for filtering intent launches +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Read project.properties to configure gradle libraries +* [CB-7325](https://issues.apache.org/jira/browse/CB-7325) Fix error message in android_sdk_version.js when missing SDK on windows +* [CB-7335](https://issues.apache.org/jira/browse/CB-7335) Add a .gitignore to android project template +* [CB-7330](https://issues.apache.org/jira/browse/CB-7330) Fix dangling function call in last commit (broke gradle builds) +* [CB-7330](https://issues.apache.org/jira/browse/CB-7330) Don't run "android update" during creation +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add gradle support clean command (plus some code cleanup) +* [CB-7044](https://issues.apache.org/jira/browse/CB-7044) Fix typo in prev commit causing check_reqs to always fail. +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Copy gradle wrapper in build instead of create +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add .gradle template files for "update" as well as "create" +* [CB-7044](https://issues.apache.org/jira/browse/CB-7044) Add JAVA_HOME when not set. Be stricter about ANDROID_HOME +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Speed up gradle building (incremental builds go from 10s -> 1.5s for me) +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) android: Copy Gradle wrapper from Android SDK rather than bundling a JAR +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add which to checked-in node_modules +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add option to build and install with gradle +* [CB-3445](https://issues.apache.org/jira/browse/CB-3445) Add an initial set of Gradle build scripts +* [CB-7321](https://issues.apache.org/jira/browse/CB-7321) Don't require ant for create script +* CB-7044, [CB-7299](https://issues.apache.org/jira/browse/CB-7299) Fix up PATH problems when possible. +* Change in test's AndroidManifest.xml needed for the test to run properly. Forgot the manifest. +* Change in test's AndroidManifest.xml needed for the test to run properly +* Adding tests related to 3.5.1 +* [CB-7261](https://issues.apache.org/jira/browse/CB-7261) Fix setNativeToJsBridgeMode sometimes crashing when switching to ONLINE_EVENT +* [CB-7265](https://issues.apache.org/jira/browse/CB-7265) Fix crash when navigating to custom protocol (introduced in 3.5.1) +* Filter out non-launchable intents +* Handle unsupported protocol errors in webview better +* [CB-7238](https://issues.apache.org/jira/browse/CB-7238) I should have collapsed this, but Config.init() must go before the creation of CordovaWebView +* [CB-7238](https://issues.apache.org/jira/browse/CB-7238) Minor band-aid to get tests running again, this has to go away before 3.6.0 is released, since this is an API change. +* Extend whitelist to handle URLs without // chars +* [CB-7172](https://issues.apache.org/jira/browse/CB-7172) Force window to have focus after resume +* [CB-7159](https://issues.apache.org/jira/browse/CB-7159) Set background color of webView as well as its parent +* [CB-7018](https://issues.apache.org/jira/browse/CB-7018) Fix setButtonPlumbedToJs never un-listening +* Undeprecate some just-deprecated symbols in PluginManager. +* @Deprecate methods of PluginManager that were never meant to be public +* Move plugin instantiation and instance storing logic PluginEntry->PluginManager +* Fix broken unit test due to missing Config.init() call +* Update to check for Google Glass APIs +* Fix for `android` not being in PATH check on Windows +* Displaying error when regex does not match. +* Fix broken compile due to previous commit :( +* Tweak CordovaPlugin.initialize method to be less deprecated. +* Un-deprecate CordovaActivity.init() - it's needed to tweak prefs in onCreate +* Tweak log messages in CordovaBridge with bridgeSecret is wrong +* Backport CordovaBridge from 4.0.x -> master +* Update unit tests to not use most deprecated things (e.g. DroidGap) +* Add non-String overloades for CordovaPreferences.set() +* Make CordovaWebview resilient to init() not being called (for backwards-compatibility) +* Add node_module licenses to LICENSE +* Update cordova.js snapshot to work with bridge changes +* Provide CordovaPlugin with CordovaPreferences. Add new Plugin.initialize() +* Convert usages of Config.\* to use the non-static versions +* Change getProperty -> prefs.get\* within CordovaActivity +* Make CordovaUriHelper class package-private +* Fix PluginManager.setPluginEntries not removing old entries +* Move registration of App plugin from config.xml -> code +* Make setWebViewClient an override instead of an overload. Delete Location-change JS->Native bridge mode (missed some of it). +* [CB-4404](https://issues.apache.org/jira/browse/CB-4404) Revert setting android:windowSoftInputMode to "adjustPan" +* Refactor: Use ConfigXmlParser in activity. Adds CordovaWebView.init() +* Deprecate some convenience methods on CordovaActivity +* Fix CordovaPreferences not correctly parsing hex values (valueOf->decode) +* Refactor: Move url-filter information into PluginEntry. +* Don't re-parse config.xml in onResume. +* Move handling of Fullscreen preference to CordovaActivity +* Delete dead code from CordovaActivity +* Update .classpath to make Eclipse happy (just re-orders one line) +* Delete "CB-3064: The errorUrl is..." Log message left over from debugging presumably +* Refactor Config into ConfigXmlParser, CordovaPreferences +* Delete Location-change JS->Native bridge mode +* [CB-5988](https://issues.apache.org/jira/browse/CB-5988) Allow exec() only from file: or start-up URL's domain +* [CB-6761](https://issues.apache.org/jira/browse/CB-6761) Fix native->JS bridge ceasing to fire when page changes and online is set to false and the JS loads quickly +* Update the errorurl to no longer use intents +* This breaks running the JUnit tests, we'll bring it back soon +* Refactoring the URI handling on Cordova, removing dead code +* [CB-7018](https://issues.apache.org/jira/browse/CB-7018) Clean up and deprecation of some button-related functions +* [CB-7017](https://issues.apache.org/jira/browse/CB-7017) Fix onload=true being set on all subsequent plugins +* [CB-5971](https://issues.apache.org/jira/browse/CB-5971) Fix package / project validation +* [CB-5971](https://issues.apache.org/jira/browse/CB-5971) Add unit tests to cordova-android +* [CB-5971](https://issues.apache.org/jira/browse/CB-5971) Factor out package/project name validation logic +* Delete explicit activity.finish() in back button handling. No change in behaviour. +* [CB-5971](https://issues.apache.org/jira/browse/CB-5971) This would have been a good first bug, too bad +* [CB-4404](https://issues.apache.org/jira/browse/CB-4404) Changing where android:windowSoftInputMode is in the manifest so it works +* Add documentation referencing other implementation. +* [CB-6851](https://issues.apache.org/jira/browse/CB-6851) Deprecate WebView.sendJavascript() +* [CB-6876](https://issues.apache.org/jira/browse/CB-6876) Show the correct executable name +* [CB-6876](https://issues.apache.org/jira/browse/CB-6876) Fix the "print usage" +* Trivial spelling fix in comments when reading CordovaResourceApi +* [CB-6818](https://issues.apache.org/jira/browse/CB-6818) I want to remove this code, because Square didn't do their headers properly +* [CB-6860](https://issues.apache.org/jira/browse/CB-6860) Add activity_name and launcher_name to AndroidManifest.xml & strings.xml +* Add a comment to custom_rules.xml saying why we move AndroidManifest.xml +* Remove +x from README.md +* [CB-6784](https://issues.apache.org/jira/browse/CB-6784) Add missing licenses +* [CB-6784](https://issues.apache.org/jira/browse/CB-6784) Add license to CONTRIBUTING.md +* Revert "defaults.xml: Add AndroidLaunchMode preference" +* updated RELEASENOTES +* [CB-6315](https://issues.apache.org/jira/browse/CB-6315) Wrapping this so it runs on the UI thread +* [CB-6723](https://issues.apache.org/jira/browse/CB-6723) Update package name for Robotium +* [CB-6707](https://issues.apache.org/jira/browse/CB-6707) Update minSdkVersion to 10 consistently +* [CB-5652](https://issues.apache.org/jira/browse/CB-5652) make visible cordova version +* Update JS snapshot to version 3.6.0-dev (via coho) +* Update JS snapshot to version 3.6.0-dev (via coho) +* Set VERSION to 3.6.0-dev (via coho) + +### 3.5.1 (August 2014) ### + +This was a security update to address CVE-2014-3500, CVE-2014-3501, +and CVE-2014-3502. For more information, see +http://cordova.apache.org/announcements/2014/08/04/android-351.html + +* Filter out non-launchable intents +* Handle unsupported protocol errors in webview better +* Update the errorurl to no longer use intents +* Refactoring the URI handling on Cordova, removing dead code + +### 3.5.0 (May 2014) ### + +* OkHttp has broken headers. Updating for ASF compliance. +* Revert accidentally removed lines from NOTICE +* [CB-6552](https://issues.apache.org/jira/browse/CB-6552) added top level package.json +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md +* [CB-6543](https://issues.apache.org/jira/browse/CB-6543) Fix cordova/run failure when no custom_rules.xml available +* defaults.xml: Add AndroidLaunchMode preference +* Add JavaDoc for CordovaResourceApi +* [CB-6388](https://issues.apache.org/jira/browse/CB-6388) Handle binary data correctly in LOAD_URL bridge +* Fix [CB-6048](https://issues.apache.org/jira/browse/CB-6048) Set launchMode=singleTop so tapping app icon does not always restart app +* Remove incorrect usage of AlertDialog.Builder.create +* Catch uncaught exceptions in from plugins and turn them into error responses. +* Add NOTICE file +* [CB-6047](https://issues.apache.org/jira/browse/CB-6047) Fix online sometimes getting in a bad state on page transitions. +* Add another convenience overload for CordovaResourceApi.copyResource +* Update framework's .classpath to what Eclipse wants it to be. +* README.md: `android update` to `android-19`. +* Fix NPE when POLLING bridge mode is used. +* Updating NOTICE to include Square for OkHttp +* [CB-5398](https://issues.apache.org/jira/browse/CB-5398) Apply KitKat content URI fix to all content URIs +* [CB-5398](https://issues.apache.org/jira/browse/CB-5398) Work-around for KitKat content: URLs not rendering in tags +* [CB-5908](https://issues.apache.org/jira/browse/CB-5908) add splascreen images to template +* [CB-5395](https://issues.apache.org/jira/browse/CB-5395) Make scheme and host (but not path) case-insensitive in whitelist +* Ignore multiple onPageFinished() callbacks & onReceivedError due to stopLoading() +* Removing addJavascriptInterface support from all Android versions lower than 4.2 due to security vu +* [CB-4984](https://issues.apache.org/jira/browse/CB-4984) Don't create on CordovaActivity name +* [CB-5917](https://issues.apache.org/jira/browse/CB-5917) Add a loadUrlIntoView overload that doesn't recreate plugins. +* Use thread pool for load timeout. +* [CB-5715](https://issues.apache.org/jira/browse/CB-5715) For CLI, hide assets/www and res/xml/config.xml by default +* [CB-5793](https://issues.apache.org/jira/browse/CB-5793) ant builds: Rename AndroidManifest during -post-build to avoid Eclipse detecting ant-build/ +* [CB-5889](https://issues.apache.org/jira/browse/CB-5889) Make update script find project name instead of using "null" for CordovaLib +* [CB-5889](https://issues.apache.org/jira/browse/CB-5889) Add a message in the update script about needing to import CordovaLib when using an IDE. + +### 3.4.0 (Feb 2014) ### + +43 commits from 10 authors. Highlights include: + +* Removing addJavascriptInterface support from all Android versions lower than 4.2 due to security vulnerability +* [CB-5917](https://issues.apache.org/jira/browse/CB-5917) Add a loadUrlIntoView overload that doesn't recreate plugins. +* [CB-5889](https://issues.apache.org/jira/browse/CB-5889) Make update script find project name instead of using "null" for CordovaLib +* [CB-5889](https://issues.apache.org/jira/browse/CB-5889) Add a message in the update script about needing to import CordovaLib when using an IDE. +* [CB-5793](https://issues.apache.org/jira/browse/CB-5793) Don't clean before build and change output directory to ant-build to avoid conflicts with Eclipse. +* [CB-5803](https://issues.apache.org/jira/browse/CB-5803) Fix cordova/emulate on windows. +* [CB-5801](https://issues.apache.org/jira/browse/CB-5801) exec->spawn in build to make sure compile errors are shown. +* [CB-5799](https://issues.apache.org/jira/browse/CB-5799) Update version of OkHTTP to 1.3 +* [CB-4910](https://issues.apache.org/jira/browse/CB-4910) Update CLI project template to point to config.xml at the root now that it's not in www/ by default. +* [CB-5504](https://issues.apache.org/jira/browse/CB-5504) Adding onDestroy to app plugin to deregister telephonyReceiver +* [CB-5715](https://issues.apache.org/jira/browse/CB-5715) Add Eclipse .project file to create template. For CLI projects, it adds refs for root www/ & config.xml and hides platform versions +* [CB-5447](https://issues.apache.org/jira/browse/CB-5447) Removed android:debuggable=“true” from project template. +* [CB-5714](https://issues.apache.org/jira/browse/CB-5714) Fix of android build when too big output stops build with error due to buffer overflow. +* [CB-5592](https://issues.apache.org/jira/browse/CB-5592) Set MIME type for openExternal when scheme is file: + +### 3.3.0 (Dec 2013) ### + +41 commits from 11 authors. Highlights include: + +* [CB-5481](https://issues.apache.org/jira/browse/CB-5481) Fix for Cordova trying to get config.xml from the wrong namespace +* [CB-5487](https://issues.apache.org/jira/browse/CB-5487) Enable Remote Debugging when your Android app is debuggable. +* [CB-5445](https://issues.apache.org/jira/browse/CB-5445) Adding onScrollChanged and the ScrollEvent object +* [CB-5422](https://issues.apache.org/jira/browse/CB-5422) Don't require JAVA_HOME to be defined +* [CB-5490](https://issues.apache.org/jira/browse/CB-5490) Add javadoc target to ant script +* [CB-5471](https://issues.apache.org/jira/browse/CB-5471) Deprecated DroidGap class +* [CB-5255](https://issues.apache.org/jira/browse/CB-5255) Prefer Google API targets over android-## targets when building. +* [CB-5232](https://issues.apache.org/jira/browse/CB-5232) Change create script to use Cordova as a Library Project instead of a .jar +* [CB-5302](https://issues.apache.org/jira/browse/CB-5302) Massive movement to get tests working again +* [CB-4996](https://issues.apache.org/jira/browse/CB-4996) Fix paths with spaces while launching on emulator and device +* [CB-5209](https://issues.apache.org/jira/browse/CB-5209) Cannot build Android app if project path contains spaces + + +### 3.2.0 (Nov 2013) ### + +27 commits from 7 authors. Highlights include: + +* [CB-5193](https://issues.apache.org/jira/browse/CB-5193) Fix Android WebSQL sometime throwing SECURITY_ERR. +* [CB-5191](https://issues.apache.org/jira/browse/CB-5191) Deprecate +* Updating shelljs to 0.2.6. Copy now preserves mode bits. +* [CB-4872](https://issues.apache.org/jira/browse/CB-4872) Added android version scripts (android_sdk_version, etc) +* [CB-5117](https://issues.apache.org/jira/browse/CB-5117) Output confirmation message if check_reqs passes. +* [CB-5080](https://issues.apache.org/jira/browse/CB-5080) Find resources in a way that works with aapt's --rename-manifest-package +* [CB-4527](https://issues.apache.org/jira/browse/CB-4527) Don't delete .bat files even when on non-windows platform +* [CB-4892](https://issues.apache.org/jira/browse/CB-4892) Fix create script only escaping the first space instead of all spaces. + +### 3.1.0 (Sept 2013) ### + +55 commits from 9 authors. Highlights include: + +* [CB-4817](https://issues.apache.org/jira/browse/CB-4817) Remove unused assets in project template. +* Fail fast in create script if package name is not com.foo.bar. +* [CB-4782](https://issues.apache.org/jira/browse/CB-4782) Convert ApplicationInfo.java -> appinfo.js +* [CB-4766](https://issues.apache.org/jira/browse/CB-4766) Deprecated JSONUtils.java (moved into plugins) +* [CB-4765](https://issues.apache.org/jira/browse/CB-4765) Deprecated ExifHelper.java (moved into plugins) +* [CB-4764](https://issues.apache.org/jira/browse/CB-4764) Deprecated DirectoryManager.java (moved into plugins) +* [CB-4763](https://issues.apache.org/jira/browse/CB-4763) Deprecated FileHelper.java (moved into plugins), Move getMimeType() into CordovaResourceApi. +* [CB-4725](https://issues.apache.org/jira/browse/CB-4725) Add CordovaWebView.CORDOVA_VERSION constant +* Incrementing version check for Android 4.3 API Level 18 +* [CB-3542](https://issues.apache.org/jira/browse/CB-3542) rewrote cli tooling scripts in node +* Allow CordovaChromeClient subclasses access to CordovaInterface and CordovaWebView members +* Refactor CordovaActivity.init so that subclasses can easily override factory methods for webview objects +* [CB-4652](https://issues.apache.org/jira/browse/CB-4652) Allow default project template to be overridden on create +* Tweak the online bridge to not send excess online events. +* [CB-4495](https://issues.apache.org/jira/browse/CB-4495) Modify start-emulator script to exit immediately on a fatal emulator error. +* Log WebView IOExceptions only when they are not 404s +* Use a higher threshold for slow exec() warnings when debugger is attached. +* Fix data URI decoding in CordovaResourceApi +* [CB-3819](https://issues.apache.org/jira/browse/CB-3819) Made it easier to set SplashScreen delay. +* [CB-4013](https://issues.apache.org/jira/browse/CB-4013) Fixed loadUrlTimeoutValue preference. +* Upgrading project to Android 4.3 +* [CB-4198](https://issues.apache.org/jira/browse/CB-4198) bin/create script should be better at handling non-word characters in activity name. Patched windows script as well. +* [CB-4198](https://issues.apache.org/jira/browse/CB-4198) bin/create should handle spaces in activity better. +* [CB-4096](https://issues.apache.org/jira/browse/CB-4096) Implemented new unified whitelist for android +* [CB-3384](https://issues.apache.org/jira/browse/CB-3384) Fix thread assertion when plugins remap URIs + diff --git a/node_modules/cordova-android/VERSION b/node_modules/cordova-android/VERSION new file mode 100644 index 0000000..21c8c7b --- /dev/null +++ b/node_modules/cordova-android/VERSION @@ -0,0 +1 @@ +7.1.1 diff --git a/node_modules/cordova-android/appveyor.yml b/node_modules/cordova-android/appveyor.yml new file mode 100644 index 0000000..92b5ad9 --- /dev/null +++ b/node_modules/cordova-android/appveyor.yml @@ -0,0 +1,38 @@ +image: + - Previous Visual Studio 2015 + +environment: + ANDROID_HOME: "C:\\android" + matrix: + - nodejs_version: "4" + - nodejs_version: "6" + - nodejs_version: "8" + +init: + - mkdir "%ANDROID_HOME% + - cd "%ANDROID_HOME%" + - appveyor DownloadFile "https://dl.google.com/android/repository/tools_r25.2.3-windows.zip" + - 7z x "tools_r25.2.3-windows.zip" > nul + - cd "C:\projects\cordova-android" + +install: + - choco install gradle -version 3.4.1 + - gradle -version + - echo y | "%ANDROID_HOME%\tools\android.bat" --silent update sdk --no-ui --all --filter platform-tools,tools,build-tools-26.0.2,android-26,android-25,extra-google-m2repository,extra-android-m2repository + # on windows we need to accept sublicenses for the new tooling, wee. 30 is an arbitrary number, + # but should be the maximum number of licenses we explicitly need to type "Y ENTER" for. + # also, the sdkmanager in all its glory leaks a bit of output to stderr, and powershell + # and appveyor interpret that as errors, and blows up. so, when piping in our "Y ENTER" + # responses, we invoke cmd so we can redirect stderr to stdout, and tell it to --update itself. + - ps: for($i=0;$i -lt 30;$i++) { $response += "y`n"}; $response | cmd /c 'C:\android\tools\bin\sdkmanager.bat 2>&1' --update + - ps: Install-Product node $env:nodejs_version + - npm install + # below is a workaround on using gradle installed via choco on appveyor + - set path=C:\ProgramData\chocolatey\lib\gradle\tools\gradle-3.4.1\bin;%path% + +build: off + +test_script: + - node --version + - npm --version + - npm test diff --git a/node_modules/cordova-android/bin/android_sdk_version b/node_modules/cordova-android/bin/android_sdk_version new file mode 100755 index 0000000..e0ce1ec --- /dev/null +++ b/node_modules/cordova-android/bin/android_sdk_version @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var android_sdk = require('./templates/cordova/lib/android_sdk'); + +android_sdk.print_newest_available_sdk_target().done(null, function(err) { + console.error(err); + process.exit(2); +}); + + diff --git a/node_modules/cordova-android/bin/android_sdk_version.bat b/node_modules/cordova-android/bin/android_sdk_version.bat new file mode 100644 index 0000000..a6bc104 --- /dev/null +++ b/node_modules/cordova-android/bin/android_sdk_version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0android_sdk_version" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'android_sdk_version' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/node_modules/cordova-android/bin/check_reqs b/node_modules/cordova-android/bin/check_reqs new file mode 100755 index 0000000..628628f --- /dev/null +++ b/node_modules/cordova-android/bin/check_reqs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var check_reqs = require('./templates/cordova/lib/check_reqs'); + +check_reqs.run().done( + function success() { + console.log('Looks like your environment fully supports cordova-android development!'); + }, function fail(err) { + console.log(err); + process.exit(2); + } +); diff --git a/node_modules/cordova-android/bin/check_reqs.bat b/node_modules/cordova-android/bin/check_reqs.bat new file mode 100644 index 0000000..846dfa1 --- /dev/null +++ b/node_modules/cordova-android/bin/check_reqs.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0check_reqs" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'check_reqs' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/node_modules/cordova-android/bin/create b/node_modules/cordova-android/bin/create new file mode 100755 index 0000000..b1e4d5a --- /dev/null +++ b/node_modules/cordova-android/bin/create @@ -0,0 +1,58 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +var path = require('path'); +var ConfigParser = require('cordova-common').ConfigParser; +var Api = require('./templates/cordova/Api'); + +var argv = require('nopt')({ + 'help' : Boolean, + 'cli' : Boolean, + 'shared' : Boolean, + 'link' : Boolean, + 'activity-name' : [String, undefined] +}, { 'd' : '--verbose' }); + +if (argv.help || argv.argv.remain.length === 0) { + console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'create')) + ' [] [--activity-name ] [--link]'); + console.log(' : Path to your new Cordova Android project'); + console.log(' : Package name, following reverse-domain style convention'); + console.log(' : Project name'); + console.log(' : Path to a custom application template to use'); + console.log(' --activity-name : Activity name'); + console.log(' --link will use the CordovaLib project directly instead of making a copy.'); + process.exit(1); +} + +var config = new ConfigParser(path.resolve(__dirname, 'templates/project/res/xml/config.xml')); + +if (argv.argv.remain[1]) config.setPackageName(argv.argv.remain[1]); +if (argv.argv.remain[2]) config.setName(argv.argv.remain[2]); +if (argv['activity-name']) config.setName(argv['activity-name']); + +var options = { + link: argv.link || argv.shared, + customTemplate: argv.argv.remain[3], + activityName: argv['activity-name'] +}; + +require('./templates/cordova/loggingHelper').adjustLoggerLevel(argv); + +Api.createPlatform(argv.argv.remain[0], config, options).done(); diff --git a/node_modules/cordova-android/bin/create.bat b/node_modules/cordova-android/bin/create.bat new file mode 100644 index 0000000..4b475a2 --- /dev/null +++ b/node_modules/cordova-android/bin/create.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0create" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'create' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/lib/create.js b/node_modules/cordova-android/bin/lib/create.js new file mode 100755 index 0000000..83ab5fb --- /dev/null +++ b/node_modules/cordova-android/bin/lib/create.js @@ -0,0 +1,360 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var shell = require('shelljs'); +var Q = require('q'); +var path = require('path'); +var fs = require('fs'); +var check_reqs = require('./../templates/cordova/lib/check_reqs'); +var ROOT = path.join(__dirname, '..', '..'); + +var CordovaError = require('cordova-common').CordovaError; +var AndroidManifest = require('../templates/cordova/lib/AndroidManifest'); + +// Export all helper functions, and make sure internally within this module, we +// reference these methods via the `exports` object - this helps with testing +// (since we can then mock and control behaviour of all of these functions) +exports.validatePackageName = validatePackageName; +exports.validateProjectName = validateProjectName; +exports.setShellFatal = setShellFatal; +exports.copyJsAndLibrary = copyJsAndLibrary; +exports.copyScripts = copyScripts; +exports.copyBuildRules = copyBuildRules; +exports.writeProjectProperties = writeProjectProperties; +exports.prepBuildFiles = prepBuildFiles; + +function setShellFatal (value, func) { + var oldVal = shell.config.fatal; + shell.config.fatal = value; + func(); + shell.config.fatal = oldVal; +} + +function getFrameworkDir (projectPath, shared) { + return shared ? path.join(ROOT, 'framework') : path.join(projectPath, 'CordovaLib'); +} + +function copyJsAndLibrary (projectPath, shared, projectName, isLegacy) { + var nestedCordovaLibPath = getFrameworkDir(projectPath, false); + var srcCordovaJsPath = path.join(ROOT, 'bin', 'templates', 'project', 'assets', 'www', 'cordova.js'); + var app_path = path.join(projectPath, 'app', 'src', 'main'); + + if (isLegacy) { + app_path = projectPath; + } + + shell.cp('-f', srcCordovaJsPath, path.join(app_path, 'assets', 'www', 'cordova.js')); + + // Copy the cordova.js file to platforms//platform_www/ + // The www dir is nuked on each prepare so we keep cordova.js in platform_www + shell.mkdir('-p', path.join(projectPath, 'platform_www')); + shell.cp('-f', srcCordovaJsPath, path.join(projectPath, 'platform_www')); + + // Copy cordova-js-src directory into platform_www directory. + // We need these files to build cordova.js if using browserify method. + shell.cp('-rf', path.join(ROOT, 'cordova-js-src'), path.join(projectPath, 'platform_www')); + + // Don't fail if there are no old jars. + exports.setShellFatal(false, function () { + shell.ls(path.join(app_path, 'libs', 'cordova-*.jar')).forEach(function (oldJar) { + console.log('Deleting ' + oldJar); + shell.rm('-f', oldJar); + }); + var wasSymlink = true; + try { + // Delete the symlink if it was one. + fs.unlinkSync(nestedCordovaLibPath); + } catch (e) { + wasSymlink = false; + } + // Delete old library project if it existed. + if (shared) { + shell.rm('-rf', nestedCordovaLibPath); + } else if (!wasSymlink) { + // Delete only the src, since Eclipse / Android Studio can't handle their project files being deleted. + shell.rm('-rf', path.join(nestedCordovaLibPath, 'src')); + } + }); + if (shared) { + var relativeFrameworkPath = path.relative(projectPath, getFrameworkDir(projectPath, true)); + fs.symlinkSync(relativeFrameworkPath, nestedCordovaLibPath, 'dir'); + } else { + shell.mkdir('-p', nestedCordovaLibPath); + shell.cp('-f', path.join(ROOT, 'framework', 'AndroidManifest.xml'), nestedCordovaLibPath); + shell.cp('-f', path.join(ROOT, 'framework', 'project.properties'), nestedCordovaLibPath); + shell.cp('-f', path.join(ROOT, 'framework', 'build.gradle'), nestedCordovaLibPath); + shell.cp('-f', path.join(ROOT, 'framework', 'cordova.gradle'), nestedCordovaLibPath); + shell.cp('-r', path.join(ROOT, 'framework', 'src'), nestedCordovaLibPath); + } +} + +function extractSubProjectPaths (data) { + var ret = {}; + var r = /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg; + var m; + while ((m = r.exec(data))) { + ret[m[1]] = 1; + } + return Object.keys(ret); +} + +function writeProjectProperties (projectPath, target_api) { + var dstPath = path.join(projectPath, 'project.properties'); + var templatePath = path.join(ROOT, 'bin', 'templates', 'project', 'project.properties'); + var srcPath = fs.existsSync(dstPath) ? dstPath : templatePath; + + var data = fs.readFileSync(srcPath, 'utf8'); + data = data.replace(/^target=.*/m, 'target=' + target_api); + var subProjects = extractSubProjectPaths(data); + subProjects = subProjects.filter(function (p) { + return !(/^CordovaLib$/m.exec(p) || + /[\\/]cordova-android[\\/]framework$/m.exec(p) || + /^(\.\.[\\/])+framework$/m.exec(p)); + }); + subProjects.unshift('CordovaLib'); + data = data.replace(/^\s*android\.library\.reference\.\d+=.*\n/mg, ''); + if (!/\n$/.exec(data)) { + data += '\n'; + } + for (var i = 0; i < subProjects.length; ++i) { + data += 'android.library.reference.' + (i + 1) + '=' + subProjects[i] + '\n'; + } + fs.writeFileSync(dstPath, data); +} + +// This makes no sense, what if you're building with a different build system? +function prepBuildFiles (projectPath, builder) { + var buildModule = require(path.resolve(projectPath, 'cordova/lib/builders/builders')); + buildModule.getBuilder(builder).prepBuildFiles(); +} + +function copyBuildRules (projectPath, isLegacy) { + var srcDir = path.join(ROOT, 'bin', 'templates', 'project'); + + if (isLegacy) { + // The project's build.gradle is identical to the earlier build.gradle, so it should still work + shell.cp('-f', path.join(srcDir, 'legacy', 'build.gradle'), projectPath); + shell.cp('-f', path.join(srcDir, 'wrapper.gradle'), projectPath); + } else { + shell.cp('-f', path.join(srcDir, 'build.gradle'), projectPath); + shell.cp('-f', path.join(srcDir, 'app', 'build.gradle'), path.join(projectPath, 'app')); + shell.cp('-f', path.join(srcDir, 'wrapper.gradle'), projectPath); + } +} + +function copyScripts (projectPath) { + var bin = path.join(ROOT, 'bin'); + var srcScriptsDir = path.join(bin, 'templates', 'cordova'); + var destScriptsDir = path.join(projectPath, 'cordova'); + // Delete old scripts directory if this is an update. + shell.rm('-rf', destScriptsDir); + // Copy in the new ones. + shell.cp('-r', srcScriptsDir, projectPath); + shell.cp('-r', path.join(ROOT, 'node_modules'), destScriptsDir); + shell.cp(path.join(bin, 'check_reqs*'), destScriptsDir); + shell.cp(path.join(bin, 'android_sdk_version*'), destScriptsDir); + var check_reqs = path.join(destScriptsDir, 'check_reqs'); + var android_sdk_version = path.join(destScriptsDir, 'android_sdk_version'); + // TODO: the two files being edited on-the-fly here are shared between + // platform and project-level commands. the below `sed` is updating the + // `require` path for the two libraries. if there's a better way to share + // modules across both the repo and generated projects, we should make sure + // to remove/update this. + shell.sed('-i', /templates\/cordova\//, '', android_sdk_version); + shell.sed('-i', /templates\/cordova\//, '', check_reqs); +} + +/** + * Test whether a package name is acceptable for use as an android project. + * Returns a promise, fulfilled if the package name is acceptable; rejected + * otherwise. + */ +function validatePackageName (package_name) { + // Make the package conform to Java package types + // http://developer.android.com/guide/topics/manifest/manifest-element.html#package + // Enforce underscore limitation + var msg = 'Error validating package name. '; + + if (!/^[a-zA-Z][a-zA-Z0-9_]+(\.[a-zA-Z][a-zA-Z0-9_]*)+$/.test(package_name)) { + return Q.reject(new CordovaError(msg + 'Package name must look like: com.company.Name')); + } + + // Class is a reserved word + if (/\b[Cc]lass\b/.test(package_name)) { + return Q.reject(new CordovaError(msg + '"class" is a reserved word')); + } + + return Q.resolve(); +} + +/** + * Test whether a project name is acceptable for use as an android class. + * Returns a promise, fulfilled if the project name is acceptable; rejected + * otherwise. + */ +function validateProjectName (project_name) { + var msg = 'Error validating project name. '; + // Make sure there's something there + if (project_name === '') { + return Q.reject(new CordovaError(msg + 'Project name cannot be empty')); + } + + // Enforce stupid name error + if (project_name === 'CordovaActivity') { + return Q.reject(new CordovaError(msg + 'Project name cannot be CordovaActivity')); + } + + // Classes in Java don't begin with numbers + if (/^[0-9]/.test(project_name)) { + return Q.reject(new CordovaError(msg + 'Project name must not begin with a number')); + } + + return Q.resolve(); +} + +/** + * Creates an android application with the given options. + * + * @param {String} project_path Path to the new Cordova android project. + * @param {ConfigParser} config Instance of ConfigParser to retrieve basic + * project properties. + * @param {Object} [options={}] Various options + * @param {String} [options.activityName='MainActivity'] Name for the + * activity + * @param {Boolean} [options.link=false] Specifies whether javascript files + * and CordovaLib framework will be symlinked to created application. + * @param {String} [options.customTemplate] Path to project template + * (override) + * @param {EventEmitter} [events] An EventEmitter instance for logging + * events + * + * @return {Promise} Directory where application has been created + */ +exports.create = function (project_path, config, options, events) { + + options = options || {}; + + // Set default values for path, package and name + project_path = path.relative(process.cwd(), (project_path || 'CordovaExample')); + // Check if project already exists + if (fs.existsSync(project_path)) { + return Q.reject(new CordovaError('Project already exists! Delete and recreate')); + } + + var package_name = config.android_packageName() || config.packageName() || 'my.cordova.project'; + var project_name = config.name() ? + config.name().replace(/[^\w.]/g, '_') : 'CordovaExample'; + + var safe_activity_name = config.android_activityName() || options.activityName || 'MainActivity'; + var target_api = check_reqs.get_target(); + + // Make the package conform to Java package types + return exports.validatePackageName(package_name) + .then(function () { + exports.validateProjectName(project_name); + }).then(function () { + // Log the given values for the project + events.emit('log', 'Creating Cordova project for the Android platform:'); + events.emit('log', '\tPath: ' + project_path); + events.emit('log', '\tPackage: ' + package_name); + events.emit('log', '\tName: ' + project_name); + events.emit('log', '\tActivity: ' + safe_activity_name); + events.emit('log', '\tAndroid target: ' + target_api); + + events.emit('verbose', 'Copying android template project to ' + project_path); + + exports.setShellFatal(true, function () { + var project_template_dir = options.customTemplate || path.join(ROOT, 'bin', 'templates', 'project'); + var app_path = path.join(project_path, 'app', 'src', 'main'); + + // copy project template + shell.mkdir('-p', app_path); + shell.cp('-r', path.join(project_template_dir, 'assets'), app_path); + shell.cp('-r', path.join(project_template_dir, 'res'), app_path); + shell.cp(path.join(project_template_dir, 'gitignore'), path.join(project_path, '.gitignore')); + + // Manually create directories that would be empty within the template (since git doesn't track directories). + shell.mkdir(path.join(app_path, 'libs')); + + // copy cordova.js, cordova.jar + exports.copyJsAndLibrary(project_path, options.link, safe_activity_name); + + // Set up ther Android Studio paths + var java_path = path.join(app_path, 'java'); + var assets_path = path.join(app_path, 'assets'); + var resource_path = path.join(app_path, 'res'); + shell.mkdir('-p', java_path); + shell.mkdir('-p', assets_path); + shell.mkdir('-p', resource_path); + + // interpolate the activity name and package + var packagePath = package_name.replace(/\./g, path.sep); + var activity_dir = path.join(java_path, packagePath); + var activity_path = path.join(activity_dir, safe_activity_name + '.java'); + + shell.mkdir('-p', activity_dir); + shell.cp('-f', path.join(project_template_dir, 'Activity.java'), activity_path); + shell.sed('-i', /__ACTIVITY__/, safe_activity_name, activity_path); + shell.sed('-i', /__NAME__/, project_name, path.join(app_path, 'res', 'values', 'strings.xml')); + shell.sed('-i', /__ID__/, package_name, activity_path); + + var manifest = new AndroidManifest(path.join(project_template_dir, 'AndroidManifest.xml')); + manifest.setPackageId(package_name) + .setTargetSdkVersion(target_api.split('-')[1]) + .getActivity().setName(safe_activity_name); + + var manifest_path = path.join(app_path, 'AndroidManifest.xml'); + manifest.write(manifest_path); + + exports.copyScripts(project_path); + exports.copyBuildRules(project_path); + }); + // Link it to local android install. + exports.writeProjectProperties(project_path, target_api); + exports.prepBuildFiles(project_path, 'studio'); + events.emit('log', generateDoneMessage('create', options.link)); + }).thenResolve(project_path); +}; + +function generateDoneMessage (type, link) { + var pkg = require('../../package'); + var msg = 'Android project ' + (type === 'update' ? 'updated ' : 'created ') + 'with ' + pkg.name + '@' + pkg.version; + if (link) { + msg += ' and has a linked CordovaLib'; + } + return msg; +} + +// Returns a promise. +exports.update = function (projectPath, options, events) { + + var errorString = + 'An in-place platform update is not supported. \n' + + 'The `platforms` folder is always treated as a build artifact in the CLI workflow.\n' + + 'To update your platform, you have to remove, then add your android platform again.\n' + + 'Make sure you save your plugins beforehand using `cordova plugin save`, and save \n' + 'a copy of the platform first if you had manual changes in it.\n' + + '\tcordova plugin save\n' + + '\tcordova platform rm android\n' + + '\tcordova platform add android\n' + ; + + return Q.reject(errorString); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/Api.js b/node_modules/cordova-android/bin/templates/cordova/Api.js new file mode 100644 index 0000000..e97f538 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/Api.js @@ -0,0 +1,411 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var Q = require('q'); + +var AndroidProject = require('./lib/AndroidProject'); +var AndroidStudio = require('./lib/AndroidStudio'); +var PluginManager = require('cordova-common').PluginManager; + +var CordovaLogger = require('cordova-common').CordovaLogger; +var selfEvents = require('cordova-common').events; + +var PLATFORM = 'android'; + +function setupEvents (externalEventEmitter) { + if (externalEventEmitter) { + // This will make the platform internal events visible outside + selfEvents.forwardEventsTo(externalEventEmitter); + return externalEventEmitter; + } + + // There is no logger if external emitter is not present, + // so attach a console logger + CordovaLogger.get().subscribe(selfEvents); + return selfEvents; +} + +/** + * Class, that acts as abstraction over particular platform. Encapsulates the + * platform's properties and methods. + * + * Platform that implements own PlatformApi instance _should implement all + * prototype methods_ of this class to be fully compatible with cordova-lib. + * + * The PlatformApi instance also should define the following field: + * + * * platform: String that defines a platform name. + */ +function Api (platform, platformRootDir, events) { + this.platform = PLATFORM; + this.root = path.resolve(__dirname, '..'); + this.builder = 'gradle'; + + setupEvents(events); + + var self = this; + + this.locations = { + root: self.root, + www: path.join(self.root, 'assets/www'), + res: path.join(self.root, 'res'), + platformWww: path.join(self.root, 'platform_www'), + configXml: path.join(self.root, 'res/xml/config.xml'), + defaultConfigXml: path.join(self.root, 'cordova/defaults.xml'), + strings: path.join(self.root, 'res/values/strings.xml'), + manifest: path.join(self.root, 'AndroidManifest.xml'), + build: path.join(self.root, 'build'), + javaSrc: path.join(self.root, 'src'), + // NOTE: Due to platformApi spec we need to return relative paths here + cordovaJs: 'bin/templates/project/assets/www/cordova.js', + cordovaJsSrc: 'cordova-js-src' + }; + + // XXX Override some locations for Android Studio projects + if (AndroidStudio.isAndroidStudioProject(self.root) === true) { + selfEvents.emit('log', 'Android Studio project detected'); + this.builder = 'studio'; + this.android_studio = true; + this.locations.configXml = path.join(self.root, 'app/src/main/res/xml/config.xml'); + this.locations.strings = path.join(self.root, 'app/src/main/res/values/strings.xml'); + this.locations.manifest = path.join(self.root, 'app/src/main/AndroidManifest.xml'); + // We could have Java Source, we could have other languages + this.locations.javaSrc = path.join(self.root, 'app/src/main/java/'); + this.locations.www = path.join(self.root, 'app/src/main/assets/www'); + this.locations.res = path.join(self.root, 'app/src/main/res'); + } +} + +/** + * Installs platform to specified directory and creates a platform project. + * + * @param {String} destination Destination directory, where insatll platform to + * @param {ConfigParser} [config] ConfgiParser instance, used to retrieve + * project creation options, such as package id and project name. + * @param {Object} [options] An options object. The most common options are: + * @param {String} [options.customTemplate] A path to custom template, that + * should override the default one from platform. + * @param {Boolean} [options.link] Flag that indicates that platform's + * sources will be linked to installed platform instead of copying. + * @param {EventEmitter} [events] An EventEmitter instance that will be used for + * logging purposes. If no EventEmitter provided, all events will be logged to + * console + * + * @return {Promise} Promise either fulfilled with PlatformApi + * instance or rejected with CordovaError. + */ +Api.createPlatform = function (destination, config, options, events) { + events = setupEvents(events); + var result; + try { + result = require('../../lib/create').create(destination, config, options, events).then(function (destination) { + var PlatformApi = require(path.resolve(destination, 'cordova/Api')); + return new PlatformApi(PLATFORM, destination, events); + }); + } catch (e) { + events.emit('error', 'createPlatform is not callable from the android project API.'); + throw (e); + } + return result; +}; + +/** + * Updates already installed platform. + * + * @param {String} destination Destination directory, where platform installed + * @param {Object} [options] An options object. The most common options are: + * @param {String} [options.customTemplate] A path to custom template, that + * should override the default one from platform. + * @param {Boolean} [options.link] Flag that indicates that platform's + * sources will be linked to installed platform instead of copying. + * @param {EventEmitter} [events] An EventEmitter instance that will be used for + * logging purposes. If no EventEmitter provided, all events will be logged to + * console + * + * @return {Promise} Promise either fulfilled with PlatformApi + * instance or rejected with CordovaError. + */ +Api.updatePlatform = function (destination, options, events) { + events = setupEvents(events); + var result; + try { + result = require('../../lib/create').update(destination, options, events).then(function (destination) { + var PlatformApi = require(path.resolve(destination, 'cordova/Api')); + return new PlatformApi('android', destination, events); + }); + } catch (e) { + events.emit('error', 'updatePlatform is not callable from the android project API, you will need to do this manually.'); + throw (e); + } + return result; +}; + +/** + * Gets a CordovaPlatform object, that represents the platform structure. + * + * @return {CordovaPlatform} A structure that contains the description of + * platform's file structure and other properties of platform. + */ +Api.prototype.getPlatformInfo = function () { + var result = {}; + result.locations = this.locations; + result.root = this.root; + result.name = this.platform; + result.version = require('./version'); + result.projectConfig = this._config; + + return result; +}; + +/** + * Updates installed platform with provided www assets and new app + * configuration. This method is required for CLI workflow and will be called + * each time before build, so the changes, made to app configuration and www + * code, will be applied to platform. + * + * @param {CordovaProject} cordovaProject A CordovaProject instance, that defines a + * project structure and configuration, that should be applied to platform + * (contains project's www location and ConfigParser instance for project's + * config). + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.prepare = function (cordovaProject, prepareOptions) { + return require('./lib/prepare').prepare.call(this, cordovaProject, prepareOptions); +}; + +/** + * Installs a new plugin into platform. This method only copies non-www files + * (sources, libs, etc.) to platform. It also doesn't resolves the + * dependencies of plugin. Both of handling of www files, such as assets and + * js-files and resolving dependencies are the responsibility of caller. + * + * @param {PluginInfo} plugin A PluginInfo instance that represents plugin + * that will be installed. + * @param {Object} installOptions An options object. Possible options below: + * @param {Boolean} installOptions.link: Flag that specifies that plugin + * sources will be symlinked to app's directory instead of copying (if + * possible). + * @param {Object} installOptions.variables An object that represents + * variables that will be used to install plugin. See more details on plugin + * variables in documentation: + * https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.addPlugin = function (plugin, installOptions) { + var project = AndroidProject.getProjectFile(this.root); + var self = this; + + installOptions = installOptions || {}; + installOptions.variables = installOptions.variables || {}; + // Add PACKAGE_NAME variable into vars + if (!installOptions.variables.PACKAGE_NAME) { + installOptions.variables.PACKAGE_NAME = project.getPackageName(); + } + + if (this.android_studio === true) { + installOptions.android_studio = true; + } + + return Q().then(function () { + // CB-11964: Do a clean when installing the plugin code to get around + // the Gradle bug introduced by the Android Gradle Plugin Version 2.2 + // TODO: Delete when the next version of Android Gradle plugin comes out + // Since clean doesn't just clean the build, it also wipes out www, we need + // to pass additional options. + + // Do some basic argument parsing + var opts = {}; + + // Skip cleaning prepared files when not invoking via cordova CLI. + opts.noPrepare = true; + + if (!AndroidStudio.isAndroidStudioProject(self.root) && !project.isClean()) { + return self.clean(opts); + } + }).then(function () { + return PluginManager.get(self.platform, self.locations, project).addPlugin(plugin, installOptions); + }).then(function () { + if (plugin.getFrameworks(this.platform).length === 0) return; + selfEvents.emit('verbose', 'Updating build files since android plugin contained '); + // This should pick the correct builder, not just get gradle + require('./lib/builders/builders').getBuilder(this.builder).prepBuildFiles(); + }.bind(this)) + // CB-11022 Return truthy value to prevent running prepare after + .thenResolve(true); +}; + +/** + * Removes an installed plugin from platform. + * + * Since method accepts PluginInfo instance as input parameter instead of plugin + * id, caller shoud take care of managing/storing PluginInfo instances for + * future uninstalls. + * + * @param {PluginInfo} plugin A PluginInfo instance that represents plugin + * that will be installed. + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.removePlugin = function (plugin, uninstallOptions) { + var project = AndroidProject.getProjectFile(this.root); + + if (uninstallOptions && uninstallOptions.usePlatformWww === true && this.android_studio === true) { + uninstallOptions.usePlatformWww = false; + uninstallOptions.android_studio = true; + } + + return PluginManager.get(this.platform, this.locations, project) + .removePlugin(plugin, uninstallOptions) + .then(function () { + if (plugin.getFrameworks(this.platform).length === 0) return; + + selfEvents.emit('verbose', 'Updating build files since android plugin contained '); + require('./lib/builders/builders').getBuilder(this.builder).prepBuildFiles(); + }.bind(this)) + // CB-11022 Return truthy value to prevent running prepare after + .thenResolve(true); +}; + +/** + * Builds an application package for current platform. + * + * @param {Object} buildOptions A build options. This object's structure is + * highly depends on platform's specific. The most common options are: + * @param {Boolean} buildOptions.debug Indicates that packages should be + * built with debug configuration. This is set to true by default unless the + * 'release' option is not specified. + * @param {Boolean} buildOptions.release Indicates that packages should be + * built with release configuration. If not set to true, debug configuration + * will be used. + * @param {Boolean} buildOptions.device Specifies that built app is intended + * to run on device + * @param {Boolean} buildOptions.emulator: Specifies that built app is + * intended to run on emulator + * @param {String} buildOptions.target Specifies the device id that will be + * used to run built application. + * @param {Boolean} buildOptions.nobuild Indicates that this should be a + * dry-run call, so no build artifacts will be produced. + * @param {String[]} buildOptions.archs Specifies chip architectures which + * app packages should be built for. List of valid architectures is depends on + * platform. + * @param {String} buildOptions.buildConfig The path to build configuration + * file. The format of this file is depends on platform. + * @param {String[]} buildOptions.argv Raw array of command-line arguments, + * passed to `build` command. The purpose of this property is to pass a + * platform-specific arguments, and eventually let platform define own + * arguments processing logic. + * + * @return {Promise} A promise either fulfilled with an array of build + * artifacts (application packages) if package was built successfully, + * or rejected with CordovaError. The resultant build artifact objects is not + * strictly typed and may conatin arbitrary set of fields as in sample below. + * + * { + * architecture: 'x86', + * buildType: 'debug', + * path: '/path/to/build', + * type: 'app' + * } + * + * The return value in most cases will contain only one item but in some cases + * there could be multiple items in output array, e.g. when multiple + * arhcitectures is specified. + */ +Api.prototype.build = function (buildOptions) { + var self = this; + if (this.android_studio) { + buildOptions.studio = true; + } + return require('./lib/check_reqs').run().then(function () { + return require('./lib/build').run.call(self, buildOptions); + }).then(function (buildResults) { + // Cast build result to array of build artifacts + return buildResults.apkPaths.map(function (apkPath) { + return { + buildType: buildResults.buildType, + buildMethod: buildResults.buildMethod, + path: apkPath, + type: 'apk' + }; + }); + }); +}; + +/** + * Builds an application package for current platform and runs it on + * specified/default device. If no 'device'/'emulator'/'target' options are + * specified, then tries to run app on default device if connected, otherwise + * runs the app on emulator. + * + * @param {Object} runOptions An options object. The structure is the same + * as for build options. + * + * @return {Promise} A promise either fulfilled if package was built and ran + * successfully, or rejected with CordovaError. + */ +Api.prototype.run = function (runOptions) { + var self = this; + return require('./lib/check_reqs').run().then(function () { + return require('./lib/run').run.call(self, runOptions); + }); +}; + +/** + * Cleans out the build artifacts from platform's directory, and also + * cleans out the platform www directory if called without options specified. + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError. + */ +Api.prototype.clean = function (cleanOptions) { + var self = this; + if (this.android_studio) { + // This will lint, checking for null won't + if (typeof cleanOptions === 'undefined') { + cleanOptions = {}; + } + cleanOptions.studio = true; + } + + return require('./lib/check_reqs').run().then(function () { + return require('./lib/build').runClean.call(self, cleanOptions); + }).then(function () { + return require('./lib/prepare').clean.call(self, cleanOptions); + }); +}; + +/** + * Performs a requirements check for current platform. Each platform defines its + * own set of requirements, which should be resolved before platform can be + * built successfully. + * + * @return {Promise} Promise, resolved with set of Requirement + * objects for current platform. + */ +Api.prototype.requirements = function () { + return require('./lib/check_reqs').check_all(); +}; + +module.exports = Api; diff --git a/node_modules/cordova-android/bin/templates/cordova/build b/node_modules/cordova-android/bin/templates/cordova/build new file mode 100755 index 0000000..222e84a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/build @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var args = process.argv; +var Api = require('./Api'); +var nopt = require('nopt'); +var path = require('path'); + +// Support basic help commands +if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) + require('./lib/build').help(); + +// Do some basic argument parsing +var buildOpts = nopt({ + 'verbose' : Boolean, + 'silent' : Boolean, + 'debug' : Boolean, + 'release' : Boolean, + 'nobuild': Boolean, + 'buildConfig' : path +}, { 'd' : '--verbose' }); + +// Make buildOptions compatible with PlatformApi build method spec +buildOpts.argv = buildOpts.argv.original; + +require('./loggingHelper').adjustLoggerLevel(buildOpts); + +new Api().build(buildOpts) +.catch(function(err) { + console.error(err.stack); + process.exit(2); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/build.bat b/node_modules/cordova-android/bin/templates/cordova/build.bat new file mode 100644 index 0000000..46e966a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/build.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0build" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'build' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/clean b/node_modules/cordova-android/bin/templates/cordova/clean new file mode 100755 index 0000000..22065cc --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/clean @@ -0,0 +1,51 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Api = require('./Api'); +var path = require('path'); +var nopt = require('nopt'); + +// Support basic help commands +if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) { + console.log('Usage: ' + path.relative(process.cwd(), process.argv[1])); + console.log('Cleans the project directory.'); + process.exit(0); +} + +// Do some basic argument parsing +var opts = nopt({ + 'verbose' : Boolean, + 'silent' : Boolean +}, { 'd' : '--verbose' }); + +// Make buildOptions compatible with PlatformApi clean method spec +opts.argv = opts.argv.original; + +// Skip cleaning prepared files when not invoking via cordova CLI. +opts.noPrepare = true; + +require('./loggingHelper').adjustLoggerLevel(opts); + +new Api().clean(opts) +.catch(function(err) { + console.error(err.stack); + process.exit(2); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/clean.bat b/node_modules/cordova-android/bin/templates/cordova/clean.bat new file mode 100644 index 0000000..445ef6e --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/clean.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0clean" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'clean' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/defaults.xml b/node_modules/cordova-android/bin/templates/cordova/defaults.xml new file mode 100644 index 0000000..5286ab9 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/defaults.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/Adb.js b/node_modules/cordova-android/bin/templates/cordova/lib/Adb.js new file mode 100644 index 0000000..038c67c --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/Adb.js @@ -0,0 +1,101 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var os = require('os'); +var events = require('cordova-common').events; +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; + +var Adb = {}; + +function isDevice (line) { + return line.match(/\w+\tdevice/) && !line.match(/emulator/); +} + +function isEmulator (line) { + return line.match(/device/) && line.match(/emulator/); +} + +/** + * Lists available/connected devices and emulators + * + * @param {Object} opts Various options + * @param {Boolean} opts.emulators Specifies whether this method returns + * emulators only + * + * @return {Promise} list of available/connected + * devices/emulators + */ +Adb.devices = function (opts) { + return spawn('adb', ['devices'], {cwd: os.tmpdir()}).then(function (output) { + return output.split('\n').filter(function (line) { + // Filter out either real devices or emulators, depending on options + return (line && opts && opts.emulators) ? isEmulator(line) : isDevice(line); + }).map(function (line) { + return line.replace(/\tdevice/, '').replace('\r', ''); + }); + }); +}; + +Adb.install = function (target, packagePath, opts) { + events.emit('verbose', 'Installing apk ' + packagePath + ' on target ' + target + '...'); + var args = ['-s', target, 'install']; + if (opts && opts.replace) args.push('-r'); + return spawn('adb', args.concat(packagePath), {cwd: os.tmpdir()}).then(function (output) { + // 'adb install' seems to always returns no error, even if installation fails + // so we catching output to detect installation failure + if (output.match(/Failure/)) { + if (output.match(/INSTALL_PARSE_FAILED_NO_CERTIFICATES/)) { + output += '\n\n' + 'Sign the build using \'-- --keystore\' or \'--buildConfig\'' + + ' or sign and deploy the unsigned apk manually using Android tools.'; + } else if (output.match(/INSTALL_FAILED_VERSION_DOWNGRADE/)) { + output += '\n\n' + 'You\'re trying to install apk with a lower versionCode that is already installed.' + + '\nEither uninstall an app or increment the versionCode.'; + } + + return Q.reject(new CordovaError('Failed to install apk to device: ' + output)); + } + }); +}; + +Adb.uninstall = function (target, packageId) { + events.emit('verbose', 'Uninstalling package ' + packageId + ' from target ' + target + '...'); + return spawn('adb', ['-s', target, 'uninstall', packageId], {cwd: os.tmpdir()}); +}; + +Adb.shell = function (target, shellCommand) { + events.emit('verbose', 'Running adb shell command "' + shellCommand + '" on target ' + target + '...'); + var args = ['-s', target, 'shell']; + shellCommand = shellCommand.split(/\s+/); + return spawn('adb', args.concat(shellCommand), {cwd: os.tmpdir()}).catch(function (output) { + return Q.reject(new CordovaError('Failed to execute shell command "' + + shellCommand + '"" on device: ' + output)); + }); +}; + +Adb.start = function (target, activityName) { + events.emit('verbose', 'Starting application "' + activityName + '" on target ' + target + '...'); + return Adb.shell(target, 'am start -W -a android.intent.action.MAIN -n' + activityName).catch(function (output) { + return Q.reject(new CordovaError('Failed to start application "' + + activityName + '"" on device: ' + output)); + }); +}; + +module.exports = Adb; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/AndroidManifest.js b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidManifest.js new file mode 100644 index 0000000..5b7077a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidManifest.js @@ -0,0 +1,160 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var fs = require('fs'); +var et = require('elementtree'); +var xml = require('cordova-common').xmlHelpers; + +var DEFAULT_ORIENTATION = 'default'; + +/** Wraps an AndroidManifest file */ +function AndroidManifest (path) { + this.path = path; + this.doc = xml.parseElementtreeSync(path); + if (this.doc.getroot().tag !== 'manifest') { + throw new Error('AndroidManifest at ' + path + ' has incorrect root node name (expected "manifest")'); + } +} + +AndroidManifest.prototype.getVersionName = function () { + return this.doc.getroot().attrib['android:versionName']; +}; + +AndroidManifest.prototype.setVersionName = function (versionName) { + this.doc.getroot().attrib['android:versionName'] = versionName; + return this; +}; + +AndroidManifest.prototype.getVersionCode = function () { + return this.doc.getroot().attrib['android:versionCode']; +}; + +AndroidManifest.prototype.setVersionCode = function (versionCode) { + this.doc.getroot().attrib['android:versionCode'] = versionCode; + return this; +}; + +AndroidManifest.prototype.getPackageId = function () { + /* jshint -W069 */ + return this.doc.getroot().attrib['package']; + /* jshint +W069 */ +}; + +AndroidManifest.prototype.setPackageId = function (pkgId) { + /* jshint -W069 */ + this.doc.getroot().attrib['package'] = pkgId; + /* jshint +W069 */ + return this; +}; + +AndroidManifest.prototype.getActivity = function () { + var activity = this.doc.getroot().find('./application/activity'); + return { + getName: function () { + return activity.attrib['android:name']; + }, + setName: function (name) { + if (!name) { + delete activity.attrib['android:name']; + } else { + activity.attrib['android:name'] = name; + } + return this; + }, + getOrientation: function () { + return activity.attrib['android:screenOrientation']; + }, + setOrientation: function (orientation) { + if (!orientation || orientation.toLowerCase() === DEFAULT_ORIENTATION) { + delete activity.attrib['android:screenOrientation']; + } else { + activity.attrib['android:screenOrientation'] = orientation; + } + return this; + }, + getLaunchMode: function () { + return activity.attrib['android:launchMode']; + }, + setLaunchMode: function (launchMode) { + if (!launchMode) { + delete activity.attrib['android:launchMode']; + } else { + activity.attrib['android:launchMode'] = launchMode; + } + return this; + } + }; +}; + +['minSdkVersion', 'maxSdkVersion', 'targetSdkVersion'].forEach(function (sdkPrefName) { + // Copy variable reference to avoid closure issues + var prefName = sdkPrefName; + + AndroidManifest.prototype['get' + capitalize(prefName)] = function () { + var usesSdk = this.doc.getroot().find('./uses-sdk'); + return usesSdk && usesSdk.attrib['android:' + prefName]; + }; + + AndroidManifest.prototype['set' + capitalize(prefName)] = function (prefValue) { + var usesSdk = this.doc.getroot().find('./uses-sdk'); + + if (!usesSdk && prefValue) { // if there is no required uses-sdk element, we should create it first + usesSdk = new et.Element('uses-sdk'); + this.doc.getroot().append(usesSdk); + } + + if (prefValue) { + usesSdk.attrib['android:' + prefName] = prefValue; + } + + return this; + }; +}); + +AndroidManifest.prototype.getDebuggable = function () { + return this.doc.getroot().find('./application').attrib['android:debuggable'] === 'true'; +}; + +AndroidManifest.prototype.setDebuggable = function (value) { + var application = this.doc.getroot().find('./application'); + if (value) { + application.attrib['android:debuggable'] = 'true'; + } else { + // The default value is "false", so we can remove attribute at all. + delete application.attrib['android:debuggable']; + } + return this; +}; + +/** + * Writes manifest to disk syncronously. If filename is specified, then manifest + * will be written to that file + * + * @param {String} [destPath] File to write manifest to. If omitted, + * manifest will be written to file it has been read from. + */ +AndroidManifest.prototype.write = function (destPath) { + fs.writeFileSync(destPath || this.path, this.doc.write({indent: 4}), 'utf-8'); +}; + +module.exports = AndroidManifest; + +function capitalize (str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/AndroidProject.js b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidProject.js new file mode 100644 index 0000000..bf55cad --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidProject.js @@ -0,0 +1,209 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var fs = require('fs'); +var path = require('path'); +var properties_parser = require('properties-parser'); +var AndroidManifest = require('./AndroidManifest'); +var AndroidStudio = require('./AndroidStudio'); +var pluginHandlers = require('./pluginHandlers'); + +var projectFileCache = {}; + +function addToPropertyList (projectProperties, key, value) { + var i = 1; + while (projectProperties.get(key + '.' + i)) { i++; } + + projectProperties.set(key + '.' + i, value); + projectProperties.dirty = true; +} + +function removeFromPropertyList (projectProperties, key, value) { + var i = 1; + var currentValue; + while ((currentValue = projectProperties.get(key + '.' + i))) { + if (currentValue === value) { + while ((currentValue = projectProperties.get(key + '.' + (i + 1)))) { + projectProperties.set(key + '.' + i, currentValue); + i++; + } + projectProperties.set(key + '.' + i); + break; + } + i++; + } + projectProperties.dirty = true; +} + +function getRelativeLibraryPath (parentDir, subDir) { + var libraryPath = path.relative(parentDir, subDir); + return (path.sep === '\\') ? libraryPath.replace(/\\/g, '/') : libraryPath; +} + +function AndroidProject (projectDir) { + this._propertiesEditors = {}; + this._subProjectDirs = {}; + this._dirty = false; + this.projectDir = projectDir; + this.platformWww = path.join(this.projectDir, 'platform_www'); + this.www = path.join(this.projectDir, 'assets/www'); + if (AndroidStudio.isAndroidStudioProject(projectDir) === true) { + this.www = path.join(this.projectDir, 'app/src/main/assets/www'); + } +} + +AndroidProject.getProjectFile = function (projectDir) { + if (!projectFileCache[projectDir]) { + projectFileCache[projectDir] = new AndroidProject(projectDir); + } + + return projectFileCache[projectDir]; +}; + +AndroidProject.purgeCache = function (projectDir) { + if (projectDir) { + delete projectFileCache[projectDir]; + } else { + projectFileCache = {}; + } +}; + +/** + * Reads the package name out of the Android Manifest file + * + * @param {String} projectDir The absolute path to the directory containing the project + * + * @return {String} The name of the package + */ +AndroidProject.prototype.getPackageName = function () { + var manifestPath = path.join(this.projectDir, 'AndroidManifest.xml'); + if (AndroidStudio.isAndroidStudioProject(this.projectDir) === true) { + manifestPath = path.join(this.projectDir, 'app/src/main/AndroidManifest.xml'); + } + return new AndroidManifest(manifestPath).getPackageId(); +}; + +AndroidProject.prototype.getCustomSubprojectRelativeDir = function (plugin_id, src) { + // All custom subprojects are prefixed with the last portion of the package id. + // This is to avoid collisions when opening multiple projects in Eclipse that have subprojects with the same name. + var packageName = this.getPackageName(); + var lastDotIndex = packageName.lastIndexOf('.'); + var prefix = packageName.substring(lastDotIndex + 1); + var subRelativeDir = path.join(plugin_id, prefix + '-' + path.basename(src)); + return subRelativeDir; +}; + +AndroidProject.prototype.addSubProject = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var subProjectFile = path.resolve(subDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + // TODO: Setting the target needs to happen only for pre-3.7.0 projects + if (fs.existsSync(subProjectFile)) { + var subProperties = this._getPropertiesFile(subProjectFile); + subProperties.set('target', parentProperties.get('target')); + subProperties.dirty = true; + this._subProjectDirs[subDir] = true; + } + addToPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir)); + + this._dirty = true; +}; + +AndroidProject.prototype.removeSubProject = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir)); + delete this._subProjectDirs[subDir]; + this._dirty = true; +}; + +AndroidProject.prototype.addGradleReference = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + addToPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir)); + this._dirty = true; +}; + +AndroidProject.prototype.removeGradleReference = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir)); + this._dirty = true; +}; + +AndroidProject.prototype.addSystemLibrary = function (parentDir, value) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + addToPropertyList(parentProperties, 'cordova.system.library', value); + this._dirty = true; +}; + +AndroidProject.prototype.removeSystemLibrary = function (parentDir, value) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'cordova.system.library', value); + this._dirty = true; +}; + +AndroidProject.prototype.write = function () { + if (!this._dirty) { + return; + } + this._dirty = false; + + for (var filename in this._propertiesEditors) { + var editor = this._propertiesEditors[filename]; + if (editor.dirty) { + fs.writeFileSync(filename, editor.toString()); + editor.dirty = false; + } + } +}; + +AndroidProject.prototype._getPropertiesFile = function (filename) { + if (!this._propertiesEditors[filename]) { + if (fs.existsSync(filename)) { + this._propertiesEditors[filename] = properties_parser.createEditor(filename); + } else { + this._propertiesEditors[filename] = properties_parser.createEditor(); + } + } + + return this._propertiesEditors[filename]; +}; + +AndroidProject.prototype.getInstaller = function (type) { + return pluginHandlers.getInstaller(type); +}; + +AndroidProject.prototype.getUninstaller = function (type) { + return pluginHandlers.getUninstaller(type); +}; + +/* + * This checks if an Android project is clean or has old build artifacts + */ + +AndroidProject.prototype.isClean = function () { + var build_path = path.join(this.projectDir, 'build'); + // If the build directory doesn't exist, it's clean + return !(fs.existsSync(build_path)); +}; + +module.exports = AndroidProject; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/AndroidStudio.js b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidStudio.js new file mode 100644 index 0000000..fbcb926 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/AndroidStudio.js @@ -0,0 +1,42 @@ +/* + * This is a simple routine that checks if project is an Android Studio Project + * + * @param {String} root Root folder of the project + */ + +/* jshint esnext: false */ + +var path = require('path'); +var fs = require('fs'); +var CordovaError = require('cordova-common').CordovaError; + +module.exports.isAndroidStudioProject = function isAndroidStudioProject (root) { + var eclipseFiles = ['AndroidManifest.xml', 'libs', 'res']; + var androidStudioFiles = ['app', 'app/src/main']; + + // assume it is an AS project and not an Eclipse project + var isEclipse = false; + var isAS = true; + + if (!fs.existsSync(root)) { + throw new CordovaError('AndroidStudio.js:inAndroidStudioProject root does not exist: ' + root); + } + + // if any of the following exists, then we are not an ASProj + eclipseFiles.forEach(function (file) { + if (fs.existsSync(path.join(root, file))) { + isEclipse = true; + } + }); + + // if it is NOT an eclipse project, check that all required files exist + if (!isEclipse) { + androidStudioFiles.forEach(function (file) { + if (!fs.existsSync(path.join(root, file))) { + console.log('missing file :: ' + file); + isAS = false; + } + }); + } + return (!isEclipse && isAS); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/android_sdk.js b/node_modules/cordova-android/bin/templates/cordova/lib/android_sdk.js new file mode 100755 index 0000000..148f9f3 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/android_sdk.js @@ -0,0 +1,102 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var superspawn = require('cordova-common').superspawn; + +var suffix_number_regex = /(\d+)$/; +// Used for sorting Android targets, example strings to sort: +// android-19 +// android-L +// Google Inc.:Google APIs:20 +// Google Inc.:Glass Development Kit Preview:20 +// The idea is to sort based on largest "suffix" number - meaning the bigger +// the number at the end, the more recent the target, the closer to the +// start of the array. +function sort_by_largest_numerical_suffix (a, b) { + var suffix_a = a.match(suffix_number_regex); + var suffix_b = b.match(suffix_number_regex); + if (suffix_a && suffix_b) { + // If the two targets being compared have suffixes, return less than + // zero, or greater than zero, based on which suffix is larger. + return (parseInt(suffix_a[1]) > parseInt(suffix_b[1]) ? -1 : 1); + } else { + // If no suffix numbers were detected, leave the order as-is between + // elements a and b. + return 0; + } +} + +module.exports.print_newest_available_sdk_target = function () { + return module.exports.list_targets().then(function (targets) { + targets.sort(sort_by_largest_numerical_suffix); + console.log(targets[0]); + }); +}; + +module.exports.version_string_to_api_level = { + '4.0': 14, + '4.0.3': 15, + '4.1': 16, + '4.2': 17, + '4.3': 18, + '4.4': 19, + '4.4W': 20, + '5.0': 21, + '5.1': 22, + '6.0': 23, + '7.0': 24, + '7.1.1': 25, + '8.0': 26 +}; + +function parse_targets (output) { + var target_out = output.split('\n'); + var targets = []; + for (var i = target_out.length - 1; i >= 0; i--) { + if (target_out[i].match(/id:/)) { // if "id:" is in the line... + targets.push(target_out[i].match(/"(.+)"/)[1]); // .. match whatever is in quotes. + } + } + return targets; +} + +module.exports.list_targets_with_android = function () { + return superspawn.spawn('android', ['list', 'target']).then(parse_targets); +}; + +module.exports.list_targets_with_avdmanager = function () { + return superspawn.spawn('avdmanager', ['list', 'target']).then(parse_targets); +}; + +module.exports.list_targets = function () { + return module.exports.list_targets_with_avdmanager().catch(function (err) { + // If there's an error, like avdmanager could not be found, we can try + // as a last resort, to run `android`, in case this is a super old + // SDK installation. + if (err && (err.code === 'ENOENT' || (err.stderr && err.stderr.match(/not recognized/)))) { + return module.exports.list_targets_with_android(); + } else throw err; + }).then(function (targets) { + if (targets.length === 0) { + return Q.reject(new Error('No android targets (SDKs) installed!')); + } + return targets; + }); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/build.js b/node_modules/cordova-android/bin/templates/cordova/lib/build.js new file mode 100644 index 0000000..e33cfae --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/build.js @@ -0,0 +1,294 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var path = require('path'); +var fs = require('fs'); +var nopt = require('nopt'); + +var Adb = require('./Adb'); + +var builders = require('./builders/builders'); +var events = require('cordova-common').events; +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; + +function parseOpts (options, resolvedTarget, projectRoot) { + options = options || {}; + options.argv = nopt({ + gradle: Boolean, + studio: Boolean, + prepenv: Boolean, + versionCode: String, + minSdkVersion: String, + gradleArg: [String, Array], + keystore: path, + alias: String, + storePassword: String, + password: String, + keystoreType: String + }, {}, options.argv, 0); + + // Android Studio Build method is the default + var ret = { + buildType: options.release ? 'release' : 'debug', + buildMethod: process.env.ANDROID_BUILD || 'studio', + prepEnv: options.argv.prepenv, + arch: resolvedTarget && resolvedTarget.arch, + extraArgs: [] + }; + + if (options.argv.gradle || options.argv.studio) { + ret.buildMethod = options.argv.studio ? 'studio' : 'gradle'; + } + + // This comes from cordova/run + if (options.studio) ret.buildMethod = 'studio'; + if (options.gradle) ret.buildMethod = 'gradle'; + + if (options.nobuild) ret.buildMethod = 'none'; + + if (options.argv.versionCode) { ret.extraArgs.push('-PcdvVersionCode=' + options.argv.versionCode); } + + if (options.argv.minSdkVersion) { ret.extraArgs.push('-PcdvMinSdkVersion=' + options.argv.minSdkVersion); } + + if (options.argv.gradleArg) { + ret.extraArgs = ret.extraArgs.concat(options.argv.gradleArg); + } + + var packageArgs = {}; + + if (options.argv.keystore) { packageArgs.keystore = path.relative(projectRoot, path.resolve(options.argv.keystore)); } + + ['alias', 'storePassword', 'password', 'keystoreType'].forEach(function (flagName) { + if (options.argv[flagName]) { packageArgs[flagName] = options.argv[flagName]; } + }); + + var buildConfig = options.buildConfig; + + // If some values are not specified as command line arguments - use build config to supplement them. + // Command line arguemnts have precedence over build config. + if (buildConfig) { + if (!fs.existsSync(buildConfig)) { + throw new Error('Specified build config file does not exist: ' + buildConfig); + } + events.emit('log', 'Reading build config file: ' + path.resolve(buildConfig)); + var buildjson = fs.readFileSync(buildConfig, 'utf8'); + var config = JSON.parse(buildjson.replace(/^\ufeff/, '')); // Remove BOM + if (config.android && config.android[ret.buildType]) { + var androidInfo = config.android[ret.buildType]; + if (androidInfo.keystore && !packageArgs.keystore) { + if (androidInfo.keystore.substr(0, 1) === '~') { + androidInfo.keystore = process.env.HOME + androidInfo.keystore.substr(1); + } + packageArgs.keystore = path.resolve(path.dirname(buildConfig), androidInfo.keystore); + events.emit('log', 'Reading the keystore from: ' + packageArgs.keystore); + } + + ['alias', 'storePassword', 'password', 'keystoreType'].forEach(function (key) { + packageArgs[key] = packageArgs[key] || androidInfo[key]; + }); + } + } + + if (packageArgs.keystore && packageArgs.alias) { + ret.packageInfo = new PackageInfo(packageArgs.keystore, packageArgs.alias, packageArgs.storePassword, + packageArgs.password, packageArgs.keystoreType); + } + + if (!ret.packageInfo) { + if (Object.keys(packageArgs).length > 0) { + events.emit('warn', '\'keystore\' and \'alias\' need to be specified to generate a signed archive.'); + } + } + + return ret; +} + +/* + * Builds the project with the specifed options + * Returns a promise. + */ +module.exports.runClean = function (options) { + var opts = parseOpts(options, null, this.root); + var builder = builders.getBuilder(opts.buildMethod); + return builder.prepEnv(opts).then(function () { + return builder.clean(opts); + }); +}; + +/** + * Builds the project with the specifed options. + * + * @param {BuildOptions} options A set of options. See PlatformApi.build + * method documentation for reference. + * @param {Object} optResolvedTarget A deployment target. Used to pass + * target architecture from upstream 'run' call. TODO: remove this option in + * favor of setting buildOptions.archs field. + * + * @return {Promise} Promise, resolved with built packages + * information. + */ +module.exports.run = function (options, optResolvedTarget) { + var opts = parseOpts(options, optResolvedTarget, this.root); + console.log(opts.buildMethod); + var builder = builders.getBuilder(opts.buildMethod); + return builder.prepEnv(opts).then(function () { + if (opts.prepEnv) { + events.emit('verbose', 'Build file successfully prepared.'); + return; + } + return builder.build(opts).then(function () { + var apkPaths = builder.findOutputApks(opts.buildType, opts.arch); + events.emit('log', 'Built the following apk(s): \n\t' + apkPaths.join('\n\t')); + return { + apkPaths: apkPaths, + buildType: opts.buildType, + buildMethod: opts.buildMethod + }; + }); + }); +}; + +/* + * Detects the architecture of a device/emulator + * Returns "arm" or "x86". + */ +module.exports.detectArchitecture = function (target) { + function helper () { + return Adb.shell(target, 'cat /proc/cpuinfo').then(function (output) { + return /intel/i.exec(output) ? 'x86' : 'arm'; + }); + } + // It sometimes happens (at least on OS X), that this command will hang forever. + // To fix it, either unplug & replug device, or restart adb server. + return helper().timeout(1000, new CordovaError('Device communication timed out. Try unplugging & replugging the device.')).then(null, function (err) { + if (/timed out/.exec('' + err)) { + // adb kill-server doesn't seem to do the trick. + // Could probably find a x-platform version of killall, but I'm not actually + // sure that this scenario even happens on non-OSX machines. + events.emit('verbose', 'adb timed out while detecting device/emulator architecture. Killing adb and trying again.'); + return spawn('killall', ['adb']).then(function () { + return helper().then(null, function () { + // The double kill is sadly often necessary, at least on mac. + events.emit('warn', 'adb timed out a second time while detecting device/emulator architecture. Killing adb and trying again.'); + return spawn('killall', ['adb']).then(function () { + return helper().then(null, function () { + return Q.reject(new CordovaError('adb timed out a third time while detecting device/emulator architecture. Try unplugging & replugging the device.')); + }); + }); + }); + }, function () { + // For non-killall OS's. + return Q.reject(err); + }); + } + throw err; + }); +}; + +module.exports.findBestApkForArchitecture = function (buildResults, arch) { + var paths = buildResults.apkPaths.filter(function (p) { + var apkName = path.basename(p); + if (buildResults.buildType === 'debug') { + return /-debug/.exec(apkName); + } + return !/-debug/.exec(apkName); + }); + var archPattern = new RegExp('-' + arch); + var hasArchPattern = /-x86|-arm/; + for (var i = 0; i < paths.length; ++i) { + var apkName = path.basename(paths[i]); + if (hasArchPattern.exec(apkName)) { + if (archPattern.exec(apkName)) { + return paths[i]; + } + } else { + return paths[i]; + } + } + throw new Error('Could not find apk architecture: ' + arch + ' build-type: ' + buildResults.buildType); +}; + +function PackageInfo (keystore, alias, storePassword, password, keystoreType) { + this.keystore = { + 'name': 'key.store', + 'value': keystore + }; + this.alias = { + 'name': 'key.alias', + 'value': alias + }; + if (storePassword) { + this.storePassword = { + 'name': 'key.store.password', + 'value': storePassword + }; + } + if (password) { + this.password = { + 'name': 'key.alias.password', + 'value': password + }; + } + if (keystoreType) { + this.keystoreType = { + 'name': 'key.store.type', + 'value': keystoreType + }; + } +} + +PackageInfo.prototype = { + toProperties: function () { + var self = this; + var result = ''; + Object.keys(self).forEach(function (key) { + result += self[key].name; + result += '='; + result += self[key].value.replace(/\\/g, '\\\\'); + result += '\n'; + }); + return result; + } +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), path.join('../build')) + ' [flags] [Signed APK flags]'); + console.log('Flags:'); + console.log(' \'--debug\': will build project in debug mode (default)'); + console.log(' \'--release\': will build project for release'); + console.log(' \'--ant\': will build project with ant'); + console.log(' \'--gradle\': will build project with gradle (default)'); + console.log(' \'--nobuild\': will skip build process (useful when using run command)'); + console.log(' \'--prepenv\': don\'t build, but copy in build scripts where necessary'); + console.log(' \'--versionCode=#\': Override versionCode for this build. Useful for uploading multiple APKs. Requires --gradle.'); + console.log(' \'--minSdkVersion=#\': Override minSdkVersion for this build. Useful for uploading multiple APKs. Requires --gradle.'); + console.log(' \'--gradleArg=\': Extra args to pass to the gradle command. Use one flag per arg. Ex. --gradleArg=-PcdvBuildMultipleApks=true'); + console.log(''); + console.log('Signed APK flags (overwrites debug/release-signing.proprties) :'); + console.log(' \'--keystore=\': Key store used to build a signed archive. (Required)'); + console.log(' \'--alias=\': Alias for the key store. (Required)'); + console.log(' \'--storePassword=\': Password for the key store. (Optional - prompted)'); + console.log(' \'--password=\': Password for the key. (Optional - prompted)'); + console.log(' \'--keystoreType\': Type of the keystore. (Optional)'); + process.exit(0); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/builders/GenericBuilder.js b/node_modules/cordova-android/bin/templates/cordova/lib/builders/GenericBuilder.js new file mode 100644 index 0000000..892aa38 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/builders/GenericBuilder.js @@ -0,0 +1,124 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +/* eslint no-self-assign: 0 */ +/* eslint no-unused-vars: 0 */ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; + +function GenericBuilder (projectDir) { + this.root = projectDir || path.resolve(__dirname, '../../..'); + this.binDirs = { + studio: path.join(this.root, 'app', 'build', 'outputs', 'apk'), + gradle: path.join(this.root, 'build', 'outputs', 'apk') + }; +} + +GenericBuilder.prototype.prepEnv = function () { + return Q(); +}; + +GenericBuilder.prototype.build = function () { + events.emit('log', 'Skipping build...'); + return Q(null); +}; + +GenericBuilder.prototype.clean = function () { + return Q(); +}; + +GenericBuilder.prototype.findOutputApks = function (build_type, arch) { + var self = this; + return Object.keys(this.binDirs).reduce(function (result, builderName) { + var binDir = self.binDirs[builderName]; + return result.concat(findOutputApksHelper(binDir, build_type, builderName === 'ant' ? null : arch)); + }, []).sort(apkSorter); +}; + +module.exports = GenericBuilder; + +function apkSorter (fileA, fileB) { + // De-prioritize arch specific builds + var archSpecificRE = /-x86|-arm/; + if (archSpecificRE.exec(fileA)) { + return 1; + } else if (archSpecificRE.exec(fileB)) { + return -1; + } + + // De-prioritize unsigned builds + var unsignedRE = /-unsigned/; + if (unsignedRE.exec(fileA)) { + return 1; + } else if (unsignedRE.exec(fileB)) { + return -1; + } + + var timeDiff = fs.statSync(fileB).mtime - fs.statSync(fileA).mtime; + return timeDiff === 0 ? fileA.length - fileB.length : timeDiff; +} + +function findOutputApksHelper (dir, build_type, arch) { + var shellSilent = shell.config.silent; + shell.config.silent = true; + + // list directory recursively + var ret = shell.ls('-R', dir).map(function (file) { + // ls does not include base directory + return path.join(dir, file); + }).filter(function (file) { + // find all APKs + return file.match(/\.apk?$/i); + }).filter(function (candidate) { + var apkName = path.basename(candidate); + // Need to choose between release and debug .apk. + if (build_type === 'debug') { + return /-debug/.exec(apkName) && !/-unaligned|-unsigned/.exec(apkName); + } + if (build_type === 'release') { + return /-release/.exec(apkName) && !/-unaligned/.exec(apkName); + } + return true; + }).sort(apkSorter); + + shellSilent = shellSilent; + + if (ret.length === 0) { + return ret; + } + // Assume arch-specific build if newest apk has -x86 or -arm. + var archSpecific = !!/-x86|-arm/.exec(path.basename(ret[0])); + // And show only arch-specific ones (or non-arch-specific) + ret = ret.filter(function (p) { + /* jshint -W018 */ + return !!/-x86|-arm/.exec(path.basename(p)) === archSpecific; + /* jshint +W018 */ + }); + + if (archSpecific && ret.length > 1 && arch) { + ret = ret.filter(function (p) { + return path.basename(p).indexOf('-' + arch) !== -1; + }); + } + + return ret; +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/builders/GradleBuilder.js b/node_modules/cordova-android/bin/templates/cordova/lib/builders/GradleBuilder.js new file mode 100644 index 0000000..b955db1 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/builders/GradleBuilder.js @@ -0,0 +1,331 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var fs = require('fs'); +var util = require('util'); +var path = require('path'); +var shell = require('shelljs'); +var superspawn = require('cordova-common').superspawn; +var CordovaError = require('cordova-common').CordovaError; +var events = require('cordova-common').events; +var check_reqs = require('../check_reqs'); + +var GenericBuilder = require('./GenericBuilder'); + +var MARKER = 'YOUR CHANGES WILL BE ERASED!'; +var SIGNING_PROPERTIES = '-signing.properties'; +var TEMPLATE = + '# This file is automatically generated.\n' + + '# Do not modify this file -- ' + MARKER + '\n'; + +function GradleBuilder (projectRoot) { + GenericBuilder.call(this, projectRoot); + + this.binDirs = { gradle: this.binDirs.gradle }; +} + +util.inherits(GradleBuilder, GenericBuilder); + +GradleBuilder.prototype.getArgs = function (cmd, opts) { + if (cmd === 'release') { + cmd = 'cdvBuildRelease'; + } else if (cmd === 'debug') { + cmd = 'cdvBuildDebug'; + } + var args = [cmd, '-b', path.join(this.root, 'build.gradle')]; + if (opts.arch) { + args.push('-PcdvBuildArch=' + opts.arch); + } + + // 10 seconds -> 6 seconds + args.push('-Dorg.gradle.daemon=true'); + // to allow dex in process + args.push('-Dorg.gradle.jvmargs=-Xmx2048m'); + // allow NDK to be used - required by Gradle 1.5 plugin + args.push('-Pandroid.useDeprecatedNdk=true'); + args.push.apply(args, opts.extraArgs); + // Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet): + // args.push('-Dorg.gradle.parallel=true'); + return args; +}; + +/* + * This returns a promise + */ + +GradleBuilder.prototype.runGradleWrapper = function (gradle_cmd, gradle_file) { + var gradlePath = path.join(this.root, 'gradlew'); + gradle_file = path.join(this.root, (gradle_file || 'wrapper.gradle')); + if (fs.existsSync(gradlePath)) { + // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + } else { + return superspawn.spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', gradle_file], { stdio: 'pipe' }) + .progress(function (stdio) { + suppressJavaOptionsInfo(stdio); + }); + } +}; + +/* + * We need to kill this in a fire. + */ + +GradleBuilder.prototype.readProjectProperties = function () { + function findAllUniq (data, r) { + var s = {}; + var m; + while ((m = r.exec(data))) { + s[m[1]] = 1; + } + return Object.keys(s); + } + + var data = fs.readFileSync(path.join(this.root, 'project.properties'), 'utf8'); + return { + libs: findAllUniq(data, /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg), + gradleIncludes: findAllUniq(data, /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg), + systemLibs: findAllUniq(data, /^\s*cordova\.system\.library\.\d+=(.*)(?:\s|$)/mg) + }; +}; + +GradleBuilder.prototype.extractRealProjectNameFromManifest = function () { + var manifestPath = path.join(this.root, 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, 'utf8'); + var m = /= 0) { + return check_reqs.check_android_target(error).then(function () { + // If due to some odd reason - check_android_target succeeds + // we should still fail here. + return Q.reject(error); + }); + } + return Q.reject(error); + }); +}; + +GradleBuilder.prototype.clean = function (opts) { + var builder = this; + var wrapper = path.join(this.root, 'gradlew'); + var args = builder.getArgs('clean', opts); + return Q().then(function () { + return superspawn.spawn(wrapper, args, { stdio: 'inherit' }); + }).then(function () { + shell.rm('-rf', path.join(builder.root, 'out')); + + ['debug', 'release'].forEach(function (config) { + var propertiesFilePath = path.join(builder.root, config + SIGNING_PROPERTIES); + if (isAutoGenerated(propertiesFilePath)) { + shell.rm('-f', propertiesFilePath); + } + }); + }); +}; + +module.exports = GradleBuilder; + +function suppressJavaOptionsInfo (stdio) { + if (stdio.stderr) { + /* + * Workaround for the issue with Java printing some unwanted information to + * stderr instead of stdout. + * This function suppresses 'Picked up _JAVA_OPTIONS' message from being + * printed to stderr. See https://issues.apache.org/jira/browse/CB-9971 for + * explanation. + */ + var suppressThisLine = /^Picked up _JAVA_OPTIONS: /i.test(stdio.stderr.toString()); + if (suppressThisLine) { + return; + } + process.stderr.write(stdio.stderr); + } else { + process.stdout.write(stdio.stdout); + } +} + +function isAutoGenerated (file) { + return fs.existsSync(file) && fs.readFileSync(file, 'utf8').indexOf(MARKER) > 0; +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/builders/StudioBuilder.js b/node_modules/cordova-android/bin/templates/cordova/lib/builders/StudioBuilder.js new file mode 100644 index 0000000..262c1e3 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/builders/StudioBuilder.js @@ -0,0 +1,303 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var fs = require('fs'); +var util = require('util'); +var path = require('path'); +var shell = require('shelljs'); +var spawn = require('cordova-common').superspawn.spawn; +var events = require('cordova-common').events; +var CordovaError = require('cordova-common').CordovaError; +var check_reqs = require('../check_reqs'); + +var GenericBuilder = require('./GenericBuilder'); + +var MARKER = 'YOUR CHANGES WILL BE ERASED!'; +var SIGNING_PROPERTIES = '-signing.properties'; +var TEMPLATE = + '# This file is automatically generated.\n' + + '# Do not modify this file -- ' + MARKER + '\n'; + +function StudioBuilder (projectRoot) { + GenericBuilder.call(this, projectRoot); + + this.binDirs = {gradle: this.binDirs.studio}; +} + +util.inherits(StudioBuilder, GenericBuilder); + +StudioBuilder.prototype.getArgs = function (cmd, opts) { + if (cmd === 'release') { + cmd = 'cdvBuildRelease'; + } else if (cmd === 'debug') { + cmd = 'cdvBuildDebug'; + } + var args = [cmd, '-b', path.join(this.root, 'build.gradle')]; + if (opts.arch) { + args.push('-PcdvBuildArch=' + opts.arch); + } + + // 10 seconds -> 6 seconds + args.push('-Dorg.gradle.daemon=true'); + // to allow dex in process + args.push('-Dorg.gradle.jvmargs=-Xmx2048m'); + // allow NDK to be used - required by Gradle 1.5 plugin + // args.push('-Pandroid.useDeprecatedNdk=true'); + args.push.apply(args, opts.extraArgs); + // Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet): + // args.push('-Dorg.gradle.parallel=true'); + return args; +}; + +/* + * This returns a promise + */ + +StudioBuilder.prototype.runGradleWrapper = function (gradle_cmd) { + var gradlePath = path.join(this.root, 'gradlew'); + var wrapperGradle = path.join(this.root, 'wrapper.gradle'); + if (fs.existsSync(gradlePath)) { + // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + } else { + return spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], {stdio: 'inherit'}); + } +}; + +StudioBuilder.prototype.readProjectProperties = function () { + + function findAllUniq (data, r) { + var s = {}; + var m; + while ((m = r.exec(data))) { + s[m[1]] = 1; + } + return Object.keys(s); + } + + var data = fs.readFileSync(path.join(this.root, 'project.properties'), 'utf8'); + return { + libs: findAllUniq(data, /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg), + gradleIncludes: findAllUniq(data, /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg), + systemLibs: findAllUniq(data, /^\s*cordova\.system\.library\.\d+=(.*)(?:\s|$)/mg) + }; +}; + +StudioBuilder.prototype.extractRealProjectNameFromManifest = function () { + var manifestPath = path.join(this.root, 'app', 'src', 'main', 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, 'utf8'); + var m = /= 0) { + return check_reqs.check_android_target(error).then(function () { + // If due to some odd reason - check_android_target succeeds + // we should still fail here. + return Q.reject(error); + }); + } + return Q.reject(error); + }); +}; + +StudioBuilder.prototype.clean = function (opts) { + var builder = this; + var wrapper = path.join(this.root, 'gradlew'); + var args = builder.getArgs('clean', opts); + return Q().then(function () { + return spawn(wrapper, args, {stdio: 'inherit'}); + }) + .then(function () { + shell.rm('-rf', path.join(builder.root, 'out')); + + ['debug', 'release'].forEach(function (config) { + var propertiesFilePath = path.join(builder.root, config + SIGNING_PROPERTIES); + if (isAutoGenerated(propertiesFilePath)) { + shell.rm('-f', propertiesFilePath); + } + }); + }); +}; + +module.exports = StudioBuilder; + +function isAutoGenerated (file) { + return fs.existsSync(file) && fs.readFileSync(file, 'utf8').indexOf(MARKER) > 0; +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/builders/builders.js b/node_modules/cordova-android/bin/templates/cordova/lib/builders/builders.js new file mode 100644 index 0000000..aedf9be --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/builders/builders.js @@ -0,0 +1,46 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var CordovaError = require('cordova-common').CordovaError; + +var knownBuilders = { + gradle: 'GradleBuilder', + studio: 'StudioBuilder', + none: 'GenericBuilder' +}; + +/** + * Helper method that instantiates and returns a builder for specified build + * type. + * + * @param {String} builderType Builder name to construct and return. Must + * be one of 'ant', 'gradle' or 'none' + * + * @return {Builder} A builder instance for specified build type. + */ +module.exports.getBuilder = function (builderType, projectRoot) { + if (!knownBuilders[builderType]) { throw new CordovaError('Builder ' + builderType + ' is not supported.'); } + + try { + var Builder = require('./' + knownBuilders[builderType]); + return new Builder(projectRoot); + } catch (err) { + throw new CordovaError('Failed to instantiate ' + knownBuilders[builderType] + ' builder: ' + err); + } +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/check_reqs.js b/node_modules/cordova-android/bin/templates/cordova/lib/check_reqs.js new file mode 100644 index 0000000..d9c5f99 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/check_reqs.js @@ -0,0 +1,424 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint sub:true */ + +var shelljs = require('shelljs'); +var child_process = require('child_process'); +var Q = require('q'); +var path = require('path'); +var fs = require('fs'); +var os = require('os'); +var REPO_ROOT = path.join(__dirname, '..', '..', '..', '..'); +var PROJECT_ROOT = path.join(__dirname, '..', '..'); +var CordovaError = require('cordova-common').CordovaError; +var superspawn = require('cordova-common').superspawn; +var android_sdk = require('./android_sdk'); + +function forgivingWhichSync (cmd) { + try { + return fs.realpathSync(shelljs.which(cmd)); + } catch (e) { + return ''; + } +} + +module.exports.isWindows = function () { + return (os.platform() === 'win32'); +}; + +module.exports.isDarwin = function () { + return (os.platform() === 'darwin'); +}; + +// Get valid target from framework/project.properties if run from this repo +// Otherwise get target from project.properties file within a generated cordova-android project +module.exports.get_target = function () { + function extractFromFile (filePath) { + var target = shelljs.grep(/\btarget=/, filePath); + if (!target) { + throw new Error('Could not find android target within: ' + filePath); + } + return target.split('=')[1].trim(); + } + var repo_file = path.join(REPO_ROOT, 'framework', 'project.properties'); + if (fs.existsSync(repo_file)) { + return extractFromFile(repo_file); + } + var project_file = path.join(PROJECT_ROOT, 'project.properties'); + if (fs.existsSync(project_file)) { + // if no target found, we're probably in a project and project.properties is in PROJECT_ROOT. + return extractFromFile(project_file); + } + throw new Error('Could not find android target in either ' + repo_file + ' nor ' + project_file); +}; + +// Returns a promise. Called only by build and clean commands. +module.exports.check_ant = function () { + return superspawn.spawn('ant', ['-version']).then(function (output) { + // Parse Ant version from command output + return /version ((?:\d+\.)+(?:\d+))/i.exec(output)[1]; + }).catch(function (err) { + if (err) { + throw new CordovaError('Failed to run `ant -version`. Make sure you have `ant` on your $PATH.'); + } + }); +}; + +module.exports.get_gradle_wrapper = function () { + var androidStudioPath; + var i = 0; + var foundStudio = false; + var program_dir; + // OK, This hack only works on Windows, not on Mac OS or Linux. We will be deleting this eventually! + if (module.exports.isWindows()) { + + var result = child_process.spawnSync(path.join(__dirname, 'getASPath.bat')); + // console.log('result.stdout =' + result.stdout.toString()); + // console.log('result.stderr =' + result.stderr.toString()); + + if (result.stderr.toString().length > 0) { + var androidPath = path.join(process.env['ProgramFiles'], 'Android') + '/'; + if (fs.existsSync(androidPath)) { + program_dir = fs.readdirSync(androidPath); + while (i < program_dir.length && !foundStudio) { + if (program_dir[i].startsWith('Android Studio')) { + foundStudio = true; + androidStudioPath = path.join(process.env['ProgramFiles'], 'Android', program_dir[i], 'gradle'); + } else { ++i; } + } + } + } else { + // console.log('got android studio path from registry'); + // remove the (os independent) new line char at the end of stdout + // add gradle to match the above. + androidStudioPath = path.join(result.stdout.toString().split('\r\n')[0], 'gradle'); + } + } + + if (androidStudioPath !== null && fs.existsSync(androidStudioPath)) { + var dirs = fs.readdirSync(androidStudioPath); + if (dirs[0].split('-')[0] === 'gradle') { + return path.join(androidStudioPath, dirs[0], 'bin', 'gradle'); + } + } else { + // OK, let's try to check for Gradle! + return forgivingWhichSync('gradle'); + } +}; + +// Returns a promise. Called only by build and clean commands. +module.exports.check_gradle = function () { + var sdkDir = process.env['ANDROID_HOME']; + var d = Q.defer(); + if (!sdkDir) { + return Q.reject(new CordovaError('Could not find gradle wrapper within Android SDK. Could not find Android SDK directory.\n' + + 'Might need to install Android SDK or set up \'ANDROID_HOME\' env variable.')); + } + + var gradlePath = module.exports.get_gradle_wrapper(); + if (gradlePath.length !== 0) { d.resolve(gradlePath); } else { + d.reject(new CordovaError('Could not find an installed version of Gradle either in Android Studio,\n' + + 'or on your system to install the gradle wrapper. Please include gradle \n' + + 'in your path, or install Android Studio')); + } + return d.promise; +}; + +// Returns a promise. +module.exports.check_java = function () { + var javacPath = forgivingWhichSync('javac'); + var hasJavaHome = !!process.env['JAVA_HOME']; + return Q().then(function () { + if (hasJavaHome) { + // Windows java installer doesn't add javac to PATH, nor set JAVA_HOME (ugh). + if (!javacPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['JAVA_HOME'], 'bin'); + } + } else { + if (javacPath) { + // OS X has a command for finding JAVA_HOME. + var find_java = '/usr/libexec/java_home'; + var default_java_error_msg = 'Failed to find \'JAVA_HOME\' environment variable. Try setting it manually.'; + if (fs.existsSync(find_java)) { + return superspawn.spawn(find_java).then(function (stdout) { + process.env['JAVA_HOME'] = stdout.trim(); + }).catch(function (err) { + if (err) { + throw new CordovaError(default_java_error_msg); + } + }); + } else { + // See if we can derive it from javac's location. + // fs.realpathSync is require on Ubuntu, which symplinks from /usr/bin -> JDK + var maybeJavaHome = path.dirname(path.dirname(javacPath)); + if (fs.existsSync(path.join(maybeJavaHome, 'lib', 'tools.jar'))) { + process.env['JAVA_HOME'] = maybeJavaHome; + } else { + throw new CordovaError(default_java_error_msg); + } + } + } else if (module.exports.isWindows()) { + // Try to auto-detect java in the default install paths. + var oldSilent = shelljs.config.silent; + shelljs.config.silent = true; + var firstJdkDir = + shelljs.ls(process.env['ProgramFiles'] + '\\java\\jdk*')[0] || + shelljs.ls('C:\\Program Files\\java\\jdk*')[0] || + shelljs.ls('C:\\Program Files (x86)\\java\\jdk*')[0]; + shelljs.config.silent = oldSilent; + if (firstJdkDir) { + // shelljs always uses / in paths. + firstJdkDir = firstJdkDir.replace(/\//g, path.sep); + if (!javacPath) { + process.env['PATH'] += path.delimiter + path.join(firstJdkDir, 'bin'); + } + process.env['JAVA_HOME'] = firstJdkDir; + } + } + } + }).then(function () { + return Q.denodeify(child_process.exec)('javac -version') + .then(outputs => { + // outputs contains two entries: stdout and stderr + // Java <= 8 writes version info to stderr, Java >= 9 to stdout + const output = outputs.join('').trim(); + const match = /javac\s+([\d.]+)/i.exec(output); + return match && match[1]; + }, () => { + var msg = + 'Failed to run "javac -version", make sure that you have a JDK installed.\n' + + 'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n'; + if (process.env['JAVA_HOME']) { + msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n'; + } + throw new CordovaError(msg); + }); + }); +}; + +// Returns a promise. +module.exports.check_android = function () { + return Q().then(function () { + var androidCmdPath = forgivingWhichSync('android'); + var adbInPath = forgivingWhichSync('adb'); + var avdmanagerInPath = forgivingWhichSync('avdmanager'); + var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']); + function maybeSetAndroidHome (value) { + if (!hasAndroidHome && fs.existsSync(value)) { + hasAndroidHome = true; + process.env['ANDROID_HOME'] = value; + } + } + // First ensure ANDROID_HOME is set + // If we have no hints (nothing in PATH), try a few default locations + if (!hasAndroidHome && !androidCmdPath && !adbInPath && !avdmanagerInPath) { + if (module.exports.isWindows()) { + // Android Studio 1.0 installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'sdk')); + // Android Studio pre-1.0 installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-studio', 'sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-studio', 'sdk')); + // Stand-alone installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-sdk')); + } else if (module.exports.isDarwin()) { + // Android Studio 1.0 installer + maybeSetAndroidHome(path.join(process.env['HOME'], 'Library', 'Android', 'sdk')); + // Android Studio pre-1.0 installer + maybeSetAndroidHome('/Applications/Android Studio.app/sdk'); + // Stand-alone zip file that user might think to put under /Applications + maybeSetAndroidHome('/Applications/android-sdk-macosx'); + maybeSetAndroidHome('/Applications/android-sdk'); + } + if (process.env['HOME']) { + // Stand-alone zip file that user might think to put under their home directory + maybeSetAndroidHome(path.join(process.env['HOME'], 'android-sdk-macosx')); + maybeSetAndroidHome(path.join(process.env['HOME'], 'android-sdk')); + } + } + if (!hasAndroidHome) { + // If we dont have ANDROID_HOME, but we do have some tools on the PATH, try to infer from the tooling PATH. + var parentDir, grandParentDir; + if (androidCmdPath) { + parentDir = path.dirname(androidCmdPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'tools' || fs.existsSync(path.join(grandParentDir, 'tools', 'android'))) { + maybeSetAndroidHome(grandParentDir); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'android\' command at ' + parentDir + ' but no \'tools\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools directory.'); + } + } + if (adbInPath) { + parentDir = path.dirname(adbInPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'platform-tools') { + maybeSetAndroidHome(grandParentDir); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'adb\' command at ' + parentDir + ' but no \'platform-tools\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'platform-tools directory.'); + } + } + if (avdmanagerInPath) { + parentDir = path.dirname(avdmanagerInPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'bin' && path.basename(grandParentDir) === 'tools') { + maybeSetAndroidHome(path.dirname(grandParentDir)); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'avdmanager\' command at ' + parentDir + ' but no \'tools' + path.sep + 'bin\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools' + path.sep + 'bin directory.'); + } + } + } + if (!process.env['ANDROID_HOME']) { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Failed to find \'android\' command in your \'PATH\'. Try update your \'PATH\' to include path to valid SDK directory.'); + } + if (!fs.existsSync(process.env['ANDROID_HOME'])) { + throw new CordovaError('\'ANDROID_HOME\' environment variable is set to non-existent path: ' + process.env['ANDROID_HOME'] + + '\nTry update it manually to point to valid SDK directory.'); + } + // Next let's make sure relevant parts of the SDK tooling is in our PATH + if (hasAndroidHome && !androidCmdPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools'); + } + if (hasAndroidHome && !adbInPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'platform-tools'); + } + if (hasAndroidHome && !avdmanagerInPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools', 'bin'); + } + return hasAndroidHome; + }); +}; + +// TODO: is this actually needed? +module.exports.getAbsoluteAndroidCmd = function () { + var cmd = forgivingWhichSync('android'); + if (cmd.length === 0) { + cmd = forgivingWhichSync('sdkmanager'); + } + if (module.exports.isWindows()) { + return '"' + cmd + '"'; + } + return cmd.replace(/(\s)/g, '\\$1'); +}; + +module.exports.check_android_target = function (originalError) { + // valid_target can look like: + // android-19 + // android-L + // Google Inc.:Google APIs:20 + // Google Inc.:Glass Development Kit Preview:20 + var desired_api_level = module.exports.get_target(); + return android_sdk.list_targets().then(function (targets) { + if (targets.indexOf(desired_api_level) >= 0) { + return targets; + } + var androidCmd = module.exports.getAbsoluteAndroidCmd(); + var msg = 'Please install Android target / API level: "' + desired_api_level + '".\n\n' + + 'Hint: Open the SDK manager by running: ' + androidCmd + '\n' + + 'You will require:\n' + + '1. "SDK Platform" for API level ' + desired_api_level + '\n' + + '2. "Android SDK Platform-tools (latest)\n' + + '3. "Android SDK Build-tools" (latest)'; + if (originalError) { + msg = originalError + '\n' + msg; + } + throw new CordovaError(msg); + }); +}; + +// Returns a promise. +module.exports.run = function () { + return Q.all([this.check_java(), this.check_android()]).then(function (values) { + console.log('ANDROID_HOME=' + process.env['ANDROID_HOME']); + console.log('JAVA_HOME=' + process.env['JAVA_HOME']); + + if (!String(values[0]).startsWith('1.8.')) { + throw new CordovaError('Requirements check failed for JDK 1.8'); + } + + if (!values[1]) { + throw new CordovaError('Requirements check failed for Android SDK'); + } + }); +}; + +/** + * Object thar represents one of requirements for current platform. + * @param {String} id The unique identifier for this requirements. + * @param {String} name The name of requirements. Human-readable field. + * @param {String} version The version of requirement installed. In some cases could be an array of strings + * (for example, check_android_target returns an array of android targets installed) + * @param {Boolean} installed Indicates whether the requirement is installed or not + */ +var Requirement = function (id, name, version, installed) { + this.id = id; + this.name = name; + this.installed = installed || false; + this.metadata = { + version: version + }; +}; + +/** + * Methods that runs all checks one by one and returns a result of checks + * as an array of Requirement objects. This method intended to be used by cordova-lib check_reqs method + * + * @return Promise Array of requirements. Due to implementation, promise is always fulfilled. + */ +module.exports.check_all = function () { + + var requirements = [ + new Requirement('java', 'Java JDK'), + new Requirement('androidSdk', 'Android SDK'), + new Requirement('androidTarget', 'Android target'), + new Requirement('gradle', 'Gradle') + ]; + + var checkFns = [ + this.check_java, + this.check_android, + this.check_android_target, + this.check_gradle + ]; + + // Then execute requirement checks one-by-one + return checkFns.reduce(function (promise, checkFn, idx) { + // Update each requirement with results + var requirement = requirements[idx]; + return promise.then(checkFn).then(function (version) { + requirement.installed = true; + requirement.metadata.version = version; + }, function (err) { + requirement.metadata.reason = err instanceof Error ? err.message : err; + }); + }, Q()).then(function () { + // When chain is completed, return requirements array to upstream API + return requirements; + }); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/device.js b/node_modules/cordova-android/bin/templates/cordova/lib/device.js new file mode 100644 index 0000000..84b5094 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/device.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var build = require('./build'); +var path = require('path'); +var Adb = require('./Adb'); +var AndroidManifest = require('./AndroidManifest'); +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; +var events = require('cordova-common').events; + +/** + * Returns a promise for the list of the device ID's found + * @param lookHarder When true, try restarting adb if no devices are found. + */ +module.exports.list = function (lookHarder) { + return Adb.devices().then(function (list) { + if (list.length === 0 && lookHarder) { + // adb kill-server doesn't seem to do the trick. + // Could probably find a x-platform version of killall, but I'm not actually + // sure that this scenario even happens on non-OSX machines. + return spawn('killall', ['adb']).then(function () { + events.emit('verbose', 'Restarting adb to see if more devices are detected.'); + return Adb.devices(); + }, function () { + // For non-killall OS's. + return list; + }); + } + return list; + }); +}; + +module.exports.resolveTarget = function (target) { + return this.list(true).then(function (device_list) { + if (!device_list || !device_list.length) { + return Q.reject(new CordovaError('Failed to deploy to device, no devices found.')); + } + // default device + target = target || device_list[0]; + + if (device_list.indexOf(target) < 0) { + return Q.reject('ERROR: Unable to find target \'' + target + '\'.'); + } + + return build.detectArchitecture(target).then(function (arch) { + return { target: target, arch: arch, isEmulator: false }; + }); + }); +}; + +/* + * Installs a previously built application on the device + * and launches it. + * Returns a promise. + */ +module.exports.install = function (target, buildResults) { + return Q().then(function () { + if (target && typeof target === 'object') { + return target; + } + return module.exports.resolveTarget(target); + }).then(function (resolvedTarget) { + var apk_path = build.findBestApkForArchitecture(buildResults, resolvedTarget.arch); + var manifest = new AndroidManifest(path.join(__dirname, '../../app/src/main/AndroidManifest.xml')); + var pkgName = manifest.getPackageId(); + var launchName = pkgName + '/.' + manifest.getActivity().getName(); + events.emit('log', 'Using apk: ' + apk_path); + events.emit('log', 'Package name: ' + pkgName); + + return Adb.install(resolvedTarget.target, apk_path, {replace: true}).catch(function (error) { + // CB-9557 CB-10157 only uninstall and reinstall app if the one that + // is already installed on device was signed w/different certificate + if (!/INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES/.test(error.toString())) { throw error; } + + events.emit('warn', 'Uninstalling app from device and reinstalling it again because the ' + + 'installed app already signed with different key'); + + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Adb.uninstall(resolvedTarget.target, pkgName).then(function () { + return Adb.install(resolvedTarget.target, apk_path, {replace: true}); + }); + }).then(function () { + // unlock screen + return Adb.shell(resolvedTarget.target, 'input keyevent 82'); + }).then(function () { + return Adb.start(resolvedTarget.target, launchName); + }).then(function () { + events.emit('log', 'LAUNCH SUCCESS'); + }); + }); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/emulator.js b/node_modules/cordova-android/bin/templates/cordova/lib/emulator.js new file mode 100644 index 0000000..305e2e3 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/emulator.js @@ -0,0 +1,533 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint sub:true */ + +var android_versions = require('android-versions'); +var retry = require('./retry'); +var build = require('./build'); +var path = require('path'); +var Adb = require('./Adb'); +var AndroidManifest = require('./AndroidManifest'); +var events = require('cordova-common').events; +var superspawn = require('cordova-common').superspawn; +var CordovaError = require('cordova-common').CordovaError; +var shelljs = require('shelljs'); +var android_sdk = require('./android_sdk'); +var check_reqs = require('./check_reqs'); + +var Q = require('q'); +var os = require('os'); +var fs = require('fs'); +var child_process = require('child_process'); + +// constants +var ONE_SECOND = 1000; // in milliseconds +var ONE_MINUTE = 60 * ONE_SECOND; // in milliseconds +var INSTALL_COMMAND_TIMEOUT = 5 * ONE_MINUTE; // in milliseconds +var NUM_INSTALL_RETRIES = 3; +var CHECK_BOOTED_INTERVAL = 3 * ONE_SECOND; // in milliseconds +var EXEC_KILL_SIGNAL = 'SIGKILL'; + +function forgivingWhichSync (cmd) { + try { + return fs.realpathSync(shelljs.which(cmd)); + } catch (e) { + return ''; + } +} + +module.exports.list_images_using_avdmanager = function () { + return superspawn.spawn('avdmanager', ['list', 'avd']).then(function (output) { + var response = output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Device:\s/)) { + i++; + img_obj['device'] = response[i].split('Device: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Target:\s/)) { + i++; + if (response[i + 1].match(/ABI:\s/)) { + img_obj['abi'] = response[i + 1].split('ABI: ')[1].replace('\r', ''); + } + // This next conditional just aims to match the old output of `android list avd` + // We do so so that we don't have to change the logic when parsing for the + // best emulator target to spawn (see below in `best_image`) + // This allows us to transitionally support both `android` and `avdmanager` binaries, + // depending on what SDK version the user has + if (response[i + 1].match(/Based\son:\s/)) { + img_obj['target'] = response[i + 1].split('Based on:')[1]; + if (img_obj['target'].match(/Tag\/ABI:\s/)) { + img_obj['target'] = img_obj['target'].split('Tag/ABI:')[0].replace('\r', '').trim(); + if (img_obj['target'].indexOf('(') > -1) { + img_obj['target'] = img_obj['target'].substr(0, img_obj['target'].indexOf('(') - 1).trim(); + } + } + var version_string = img_obj['target'].replace(/Android\s+/, ''); + + var api_level = android_sdk.version_string_to_api_level[version_string]; + if (api_level) { + img_obj['target'] += ' (API level ' + api_level + ')'; + } + } + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + } */ + + } + return emulator_list; + }); +}; + +module.exports.list_images_using_android = function () { + return superspawn.spawn('android', ['list', 'avd']).then(function (output) { + var response = output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Device:\s/)) { + i++; + img_obj['device'] = response[i].split('Device: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/) || (response[i + 2] && response[i + 2].match(/\(API\slevel\s/))) { + i++; + var secondLine = response[i + 1].match(/\(API\slevel\s/) ? response[i + 1] : ''; + img_obj['target'] = (response[i] + secondLine).split('Target: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + } */ + + } + return emulator_list; + }); +}; + +/** + * Returns a Promise for a list of emulator images in the form of objects + * { + name : , + device : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function () { + return Q.fcall(function () { + if (forgivingWhichSync('avdmanager')) { + return module.exports.list_images_using_avdmanager(); + } else if (forgivingWhichSync('android')) { + return module.exports.list_images_using_android(); + } else { + return Q().then(function () { + throw new CordovaError('Could not find either `android` or `avdmanager` on your $PATH! Are you sure the Android SDK is installed and available?'); + }); + } + }).then(function (avds) { + // In case we're missing the Android OS version string from the target description, add it. + return avds.map(function (avd) { + if (avd.target && avd.target.indexOf('Android API') > -1 && avd.target.indexOf('API level') < 0) { + var api_level = avd.target.match(/\d+/); + if (api_level) { + var level = android_versions.get(api_level); + if (level) { + avd.target = 'Android ' + level.semver + ' (API level ' + api_level + ')'; + } + } + } + return avd; + }); + }); +}; + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + * Returns a promise. + */ +module.exports.best_image = function () { + return this.list_images().then(function (images) { + // Just return undefined if there is no images + if (images.length === 0) return; + + var closest = 9999; + var best = images[0]; + var project_target = parseInt(check_reqs.get_target().replace('android-', '')); + for (var i in images) { + var target = images[i].target; + if (target && target.indexOf('API level') > -1) { + var num = parseInt(target.split('(API level ')[1].replace(')', '')); + if (num === project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + closest = project_target - num; + best = images[i]; + } + } + } + return best; + }); +}; + +// Returns a promise. +module.exports.list_started = function () { + return Adb.devices({emulators: true}); +}; + +// Returns a promise. +// TODO: we should remove this, there's a more robust method under android_sdk.js +module.exports.list_targets = function () { + return superspawn.spawn('android', ['list', 'targets'], {cwd: os.tmpdir()}).then(function (output) { + var target_out = output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if (target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; + }); +}; + +/* + * Gets unused port for android emulator, between 5554 and 5584 + * Returns a promise. + */ +module.exports.get_available_port = function () { + var self = this; + + return self.list_started().then(function (emulators) { + for (var p = 5584; p >= 5554; p -= 2) { + if (emulators.indexOf('emulator-' + p) === -1) { + events.emit('verbose', 'Found available port: ' + p); + return p; + } + } + throw new CordovaError('Could not find an available avd port'); + }); +}; + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will use the first image available, + * if no image is available it will error out (maybe create one?). + * If no boot timeout is given or the value is negative it will wait forever for + * the emulator to boot + * + * Returns a promise. + */ +module.exports.start = function (emulator_ID, boot_timeout) { + var self = this; + + return Q().then(function () { + if (emulator_ID) return Q(emulator_ID); + + return self.best_image().then(function (best) { + if (best && best.name) { + events.emit('warn', 'No emulator specified, defaulting to ' + best.name); + return best.name; + } + + var androidCmd = check_reqs.getAbsoluteAndroidCmd(); + return Q.reject(new CordovaError('No emulator images (avds) found.\n' + + '1. Download desired System Image by running: ' + androidCmd + ' sdk\n' + + '2. Create an AVD by running: ' + androidCmd + ' avd\n' + + 'HINT: For a faster emulator, use an Intel System Image and install the HAXM device driver\n')); + }); + }).then(function (emulatorId) { + return self.get_available_port().then(function (port) { + // Figure out the directory the emulator binary runs in, and set the cwd to that directory. + // Workaround for https://code.google.com/p/android/issues/detail?id=235461 + var emulator_dir = path.dirname(shelljs.which('emulator')); + var args = ['-avd', emulatorId, '-port', port]; + // Don't wait for it to finish, since the emulator will probably keep running for a long time. + child_process + .spawn('emulator', args, { stdio: 'inherit', detached: true, cwd: emulator_dir }) + .unref(); + + // wait for emulator to start + events.emit('log', 'Waiting for emulator to start...'); + return self.wait_for_emulator(port); + }); + }).then(function (emulatorId) { + if (!emulatorId) { return Q.reject(new CordovaError('Failed to start emulator')); } + + // wait for emulator to boot up + process.stdout.write('Waiting for emulator to boot (this may take a while)...'); + return self.wait_for_boot(emulatorId, boot_timeout).then(function (success) { + if (success) { + events.emit('log', 'BOOT COMPLETE'); + // unlock screen + return Adb.shell(emulatorId, 'input keyevent 82').then(function () { + // return the new emulator id for the started emulators + return emulatorId; + }); + } else { + // We timed out waiting for the boot to happen + return null; + } + }); + }); +}; + +/* + * Waits for an emulator to boot on a given port. + * Returns this emulator's ID in a promise. + */ +module.exports.wait_for_emulator = function (port) { + var self = this; + return Q().then(function () { + var emulator_id = 'emulator-' + port; + return Adb.shell(emulator_id, 'getprop dev.bootcomplete').then(function (output) { + if (output.indexOf('1') >= 0) { + return emulator_id; + } + return self.wait_for_emulator(port); + }, function (error) { + if ((error && error.message && + (error.message.indexOf('not found') > -1)) || + (error.message.indexOf('device offline') > -1)) { + // emulator not yet started, continue waiting + return self.wait_for_emulator(port); + } else { + // something unexpected has happened + throw error; + } + }); + }); +}; + +/* + * Waits for the core android process of the emulator to start. Returns a + * promise that resolves to a boolean indicating success. Not specifying a + * time_remaining or passing a negative value will cause it to wait forever + */ +module.exports.wait_for_boot = function (emulator_id, time_remaining) { + var self = this; + return Adb.shell(emulator_id, 'ps').then(function (output) { + if (output.match(/android\.process\.acore/)) { + return true; + } else if (time_remaining === 0) { + return false; + } else { + process.stdout.write('.'); + + // Check at regular intervals + return Q.delay(time_remaining < CHECK_BOOTED_INTERVAL ? time_remaining : CHECK_BOOTED_INTERVAL).then(function () { + var updated_time = time_remaining >= 0 ? Math.max(time_remaining - CHECK_BOOTED_INTERVAL, 0) : time_remaining; + return self.wait_for_boot(emulator_id, updated_time); + }); + } + }); +}; + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + * Returns a promise. + */ +module.exports.create_image = function (name, target) { + console.log('Creating new avd named ' + name); + if (target) { + return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', target]).then(null, function (error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(error); + }); + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + // TODO: there's a more robust method for finding targets in android_sdk.js + return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', this.list_targets()[0]]).then(function () { + // TODO: This seems like another error case, even though it always happens. + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Ensure you have targets available by running the "android" command'); + return Q.reject(); + }, function (error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(error); + }); + } +}; + +module.exports.resolveTarget = function (target) { + return this.list_started().then(function (emulator_list) { + if (emulator_list.length < 1) { + return Q.reject('No running Android emulators found, please start an emulator before deploying your project.'); + } + + // default emulator + target = target || emulator_list[0]; + if (emulator_list.indexOf(target) < 0) { + return Q.reject('Unable to find target \'' + target + '\'. Failed to deploy to emulator.'); + } + + return build.detectArchitecture(target).then(function (arch) { + return {target: target, arch: arch, isEmulator: true}; + }); + }); +}; + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + * Returns a promise. + */ +module.exports.install = function (givenTarget, buildResults) { + + var target; + // We need to find the proper path to the Android Manifest + var manifestPath = path.join(__dirname, '..', '..', 'app', 'src', 'main', 'AndroidManifest.xml'); + if (buildResults.buildMethod === 'gradle') { + manifestPath = path.join(__dirname, '../../AndroidManifest.xml'); + } + var manifest = new AndroidManifest(manifestPath); + var pkgName = manifest.getPackageId(); + + // resolve the target emulator + return Q().then(function () { + if (givenTarget && typeof givenTarget === 'object') { + return givenTarget; + } else { + return module.exports.resolveTarget(givenTarget); + } + + // set the resolved target + }).then(function (resolvedTarget) { + target = resolvedTarget; + + // install the app + }).then(function () { + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Q.when().then(function () { + + var apk_path = build.findBestApkForArchitecture(buildResults, target.arch); + var execOptions = { + cwd: os.tmpdir(), + timeout: INSTALL_COMMAND_TIMEOUT, // in milliseconds + killSignal: EXEC_KILL_SIGNAL + }; + + events.emit('log', 'Using apk: ' + apk_path); + events.emit('log', 'Package name: ' + pkgName); + events.emit('verbose', 'Installing app on emulator...'); + + // A special function to call adb install in specific environment w/ specific options. + // Introduced as a part of fix for http://issues.apache.org/jira/browse/CB-9119 + // to workaround sporadic emulator hangs + function adbInstallWithOptions (target, apk, opts) { + events.emit('verbose', 'Installing apk ' + apk + ' on ' + target + '...'); + + var command = 'adb -s ' + target + ' install -r "' + apk + '"'; + return Q.promise(function (resolve, reject) { + child_process.exec(command, opts, function (err, stdout, stderr) { + if (err) reject(new CordovaError('Error executing "' + command + '": ' + stderr)); + // adb does not return an error code even if installation fails. Instead it puts a specific + // message to stdout, so we have to use RegExp matching to detect installation failure. + else if (/Failure/.test(stdout)) { + if (stdout.match(/INSTALL_PARSE_FAILED_NO_CERTIFICATES/)) { + stdout += 'Sign the build using \'-- --keystore\' or \'--buildConfig\'' + + ' or sign and deploy the unsigned apk manually using Android tools.'; + } else if (stdout.match(/INSTALL_FAILED_VERSION_DOWNGRADE/)) { + stdout += 'You\'re trying to install apk with a lower versionCode that is already installed.' + + '\nEither uninstall an app or increment the versionCode.'; + } + + reject(new CordovaError('Failed to install apk to emulator: ' + stdout)); + } else resolve(stdout); + }); + }); + } + + function installPromise () { + return adbInstallWithOptions(target.target, apk_path, execOptions).catch(function (error) { + // CB-9557 CB-10157 only uninstall and reinstall app if the one that + // is already installed on device was signed w/different certificate + if (!/INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES/.test(error.toString())) { throw error; } + + events.emit('warn', 'Uninstalling app from device and reinstalling it because the ' + + 'currently installed app was signed with different key'); + + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Adb.uninstall(target.target, pkgName).then(function () { + return adbInstallWithOptions(target.target, apk_path, execOptions); + }); + }); + } + + return retry.retryPromise(NUM_INSTALL_RETRIES, installPromise).then(function (output) { + events.emit('log', 'INSTALL SUCCESS'); + }); + }); + // unlock screen + }).then(function () { + + events.emit('verbose', 'Unlocking screen...'); + return Adb.shell(target.target, 'input keyevent 82'); + }).then(function () { + Adb.start(target.target, pkgName + '/.' + manifest.getActivity().getName()); + // report success or failure + }).then(function (output) { + events.emit('log', 'LAUNCH SUCCESS'); + }); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/getASPath.bat b/node_modules/cordova-android/bin/templates/cordova/lib/getASPath.bat new file mode 100644 index 0000000..14dad43 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/getASPath.bat @@ -0,0 +1,3 @@ +@ECHO OFF +for /f "tokens=2*" %%a in ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Android Studio" /v Path') do set "ASPath=%%~b" +ECHO %ASPath% \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/install-device b/node_modules/cordova-android/bin/templates/cordova/lib/install-device new file mode 100755 index 0000000..fc4b784 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/install-device @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install().done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/install-device.bat b/node_modules/cordova-android/bin/templates/cordova/lib/install-device.bat new file mode 100644 index 0000000..109b470 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/install-device.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0install-device" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'install-device' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator b/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator new file mode 100755 index 0000000..aa2a34f --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +var install_target; +if(args.length > 2) { + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} + +emulator.install(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator.bat b/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator.bat new file mode 100644 index 0000000..a28c23a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/install-emulator.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0install-emulator" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'install-emulator' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-devices b/node_modules/cordova-android/bin/templates/cordova/lib/list-devices new file mode 100755 index 0000000..8e22c7f --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-devices @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var devices = require('./device'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + devices.list().done(function(device_list) { + device_list && device_list.forEach(function(dev) { + console.log(dev); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-devices.bat b/node_modules/cordova-android/bin/templates/cordova/lib/list-devices.bat new file mode 100644 index 0000000..ad5f03e --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-devices.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0list-devices" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-devices' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images b/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images new file mode 100755 index 0000000..25e5c81 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + emulators.list_images().done(function(emulator_list) { + emulator_list && emulator_list.forEach(function(emu) { + console.log(emu.name); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat b/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat new file mode 100644 index 0000000..616ffb7 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0list-emulator-images" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-emulator-images' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators b/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators new file mode 100755 index 0000000..43ebda2 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + emulators.list_started().done(function(emulator_list) { + emulator_list && emulator_list.forEach(function(emu) { + console.log(emu); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat b/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat new file mode 100644 index 0000000..eed02a5 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0list-started-emulators" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-started-emulators' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/log.js b/node_modules/cordova-android/bin/templates/cordova/lib/log.js new file mode 100644 index 0000000..ef2dd5c --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/log.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var os = require('os'); +var Q = require('q'); +var child_process = require('child_process'); +var ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + * Returns a promise. + */ +module.exports.run = function () { + var d = Q.defer(); + var adb = child_process.spawn('adb', ['logcat'], {cwd: os.tmpdir()}); + + adb.stdout.on('data', function (data) { + var lines = data ? data.toString().split('\n') : []; + var out = lines.filter(function (x) { return x.indexOf('nativeGetEnabledTags') < 0; }); + console.log(out.join('\n')); + }); + + adb.stderr.on('data', console.error); + adb.on('close', function (code) { + if (code > 0) { + d.reject('Failed to run logcat command.'); + } else d.resolve(); + }); + + return d.promise; +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/plugin-build.gradle b/node_modules/cordova-android/bin/templates/cordova/lib/plugin-build.gradle new file mode 100644 index 0000000..fdef1f7 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/plugin-build.gradle @@ -0,0 +1,72 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// GENERATED FILE! DO NOT EDIT! + +buildscript { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + + // Switch the Android Gradle plugin version requirement depending on the + // installed version of Gradle. This dependency is documented at + // http://tools.android.com/tech-docs/new-build-system/version-compatibility + // and https://issues.apache.org/jira/browse/CB-8143 + dependencies { + classpath 'com.android.tools.build:gradle:1.0.0+' + } +} + +apply plugin: 'com.android.library' + +dependencies { + compile fileTree(dir: 'libs', include: '*.jar') + debugCompile project(path: ":CordovaLib", configuration: "debug") + releaseCompile project(path: ":CordovaLib", configuration: "release") +} + +android { + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + publishNonDefault true + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_6 + targetCompatibility JavaVersion.VERSION_1_6 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } +} + +if (file('build-extras.gradle').exists()) { + apply from: 'build-extras.gradle' +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/pluginHandlers.js b/node_modules/cordova-android/bin/templates/cordova/lib/pluginHandlers.js new file mode 100644 index 0000000..842489a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/pluginHandlers.js @@ -0,0 +1,320 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* jshint unused: vars */ + +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; +var CordovaError = require('cordova-common').CordovaError; + +var handlers = { + 'source-file': { + install: function (obj, plugin, project, options) { + if (!obj.src) throw new CordovaError(generateAttributeError('src', 'source-file', plugin.id)); + if (!obj.targetDir) throw new CordovaError(generateAttributeError('target-dir', 'source-file', plugin.id)); + + var dest = path.join(obj.targetDir, path.basename(obj.src)); + + // TODO: This code needs to be replaced, since the core plugins need to be re-mapped to a different location in + // a later plugins release. This is for legacy plugins to work with Cordova. + + if (options && options.android_studio === true) { + // If a Java file is using the new directory structure, don't penalize it + if (!obj.targetDir.includes('app/src/main')) { + if (obj.src.endsWith('.java')) { + dest = path.join('app/src/main/java', obj.targetDir.substring(4), path.basename(obj.src)); + } else if (obj.src.endsWith('.xml')) { + // We are making a huge assumption here that XML files will be going to res/xml or values/xml + dest = path.join('app/src/main', obj.targetDir, path.basename(obj.src)); + } + } + } + + if (options && options.force) { + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + } else { + copyNewFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + } + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.join(obj.targetDir, path.basename(obj.src)); + + if (options && options.android_studio === true) { + dest = path.join('app/src/main/java', obj.targetDir.substring(4), path.basename(obj.src)); + } + + deleteJava(project.projectDir, dest); + } + }, + 'lib-file': { + install: function (obj, plugin, project, options) { + var dest = path.join('libs', path.basename(obj.src)); + if (options && options.android_studio === true) { + dest = path.join('app/libs', path.basename(obj.src)); + } + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.join('libs', path.basename(obj.src)); + if (options && options.android_studio === true) { + dest = path.join('app/libs', path.basename(obj.src)); + } + removeFile(project.projectDir, dest); + } + }, + 'resource-file': { + install: function (obj, plugin, project, options) { + var dest = path.normalize(obj.target); + if (options && options.android_studio === true) { + dest = path.join('app/src/main', dest); + } + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.normalize(obj.target); + if (options && options.android_studio === true) { + dest = path.join('app/src/main', dest); + } + removeFile(project.projectDir, dest); + } + }, + 'framework': { + install: function (obj, plugin, project, options) { + var src = obj.src; + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); + + events.emit('verbose', 'Installing Android library: ' + src); + var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; + var subDir; + + if (obj.custom) { + var subRelativeDir = project.getCustomSubprojectRelativeDir(plugin.id, src); + copyNewFile(plugin.dir, src, project.projectDir, subRelativeDir, !!(options && options.link)); + subDir = path.resolve(project.projectDir, subRelativeDir); + } else { + obj.type = 'sys'; + subDir = src; + } + + if (obj.type === 'gradleReference') { + project.addGradleReference(parentDir, subDir); + } else if (obj.type === 'sys') { + project.addSystemLibrary(parentDir, subDir); + } else { + project.addSubProject(parentDir, subDir); + } + }, + uninstall: function (obj, plugin, project, options) { + var src = obj.src; + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); + + events.emit('verbose', 'Uninstalling Android library: ' + src); + var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; + var subDir; + + if (obj.custom) { + var subRelativeDir = project.getCustomSubprojectRelativeDir(plugin.id, src); + removeFile(project.projectDir, subRelativeDir); + subDir = path.resolve(project.projectDir, subRelativeDir); + // If it's the last framework in the plugin, remove the parent directory. + var parDir = path.dirname(subDir); + if (fs.existsSync(parDir) && fs.readdirSync(parDir).length === 0) { + fs.rmdirSync(parDir); + } + } else { + obj.type = 'sys'; + subDir = src; + } + + if (obj.type === 'gradleReference') { + project.removeGradleReference(parentDir, subDir); + } else if (obj.type === 'sys') { + project.removeSystemLibrary(parentDir, subDir); + } else { + project.removeSubProject(parentDir, subDir); + } + } + }, + asset: { + install: function (obj, plugin, project, options) { + if (!obj.src) { + throw new CordovaError(generateAttributeError('src', 'asset', plugin.id)); + } + if (!obj.target) { + throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); + } + + copyFile(plugin.dir, obj.src, project.www, obj.target); + if (options && options.usePlatformWww) { + // CB-11022 copy file to both directories if usePlatformWww is specified + copyFile(plugin.dir, obj.src, project.platformWww, obj.target); + } + }, + uninstall: function (obj, plugin, project, options) { + var target = obj.target || obj.src; + + if (!target) throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); + + removeFileF(path.resolve(project.www, target)); + removeFileF(path.resolve(project.www, 'plugins', plugin.id)); + if (options && options.usePlatformWww) { + // CB-11022 remove file from both directories if usePlatformWww is specified + removeFileF(path.resolve(project.platformWww, target)); + removeFileF(path.resolve(project.platformWww, 'plugins', plugin.id)); + } + } + }, + 'js-module': { + install: function (obj, plugin, project, options) { + // Copy the plugin's files into the www directory. + var moduleSource = path.resolve(plugin.dir, obj.src); + var moduleName = plugin.id + '.' + (obj.name || path.basename(obj.src, path.extname(obj.src))); + + // Read in the file, prepend the cordova.define, and write it back out. + var scriptContent = fs.readFileSync(moduleSource, 'utf-8').replace(/^\ufeff/, ''); // Window BOM + if (moduleSource.match(/.*\.json$/)) { + scriptContent = 'module.exports = ' + scriptContent; + } + scriptContent = 'cordova.define("' + moduleName + '", function(require, exports, module) {\n' + scriptContent + '\n});\n'; + + var wwwDest = path.resolve(project.www, 'plugins', plugin.id, obj.src); + shell.mkdir('-p', path.dirname(wwwDest)); + fs.writeFileSync(wwwDest, scriptContent, 'utf-8'); + + if (options && options.usePlatformWww) { + // CB-11022 copy file to both directories if usePlatformWww is specified + var platformWwwDest = path.resolve(project.platformWww, 'plugins', plugin.id, obj.src); + shell.mkdir('-p', path.dirname(platformWwwDest)); + fs.writeFileSync(platformWwwDest, scriptContent, 'utf-8'); + } + }, + uninstall: function (obj, plugin, project, options) { + var pluginRelativePath = path.join('plugins', plugin.id, obj.src); + removeFileAndParents(project.www, pluginRelativePath); + if (options && options.usePlatformWww) { + // CB-11022 remove file from both directories if usePlatformWww is specified + removeFileAndParents(project.platformWww, pluginRelativePath); + } + } + } +}; + +module.exports.getInstaller = function (type) { + if (handlers[type] && handlers[type].install) { + return handlers[type].install; + } + + events.emit('verbose', '<' + type + '> is not supported for android plugins'); +}; + +module.exports.getUninstaller = function (type) { + if (handlers[type] && handlers[type].uninstall) { + return handlers[type].uninstall; + } + + events.emit('verbose', '<' + type + '> is not supported for android plugins'); +}; + +function copyFile (plugin_dir, src, project_dir, dest, link) { + src = path.resolve(plugin_dir, src); + if (!fs.existsSync(src)) throw new CordovaError('"' + src + '" not found!'); + + // check that src path is inside plugin directory + var real_path = fs.realpathSync(src); + var real_plugin_path = fs.realpathSync(plugin_dir); + if (real_path.indexOf(real_plugin_path) !== 0) { throw new CordovaError('File "' + src + '" is located outside the plugin directory "' + plugin_dir + '"'); } + + dest = path.resolve(project_dir, dest); + + // check that dest path is located in project directory + if (dest.indexOf(project_dir) !== 0) { throw new CordovaError('Destination "' + dest + '" for source file "' + src + '" is located outside the project'); } + + shell.mkdir('-p', path.dirname(dest)); + if (link) { + symlinkFileOrDirTree(src, dest); + } else if (fs.statSync(src).isDirectory()) { + // XXX shelljs decides to create a directory when -R|-r is used which sucks. http://goo.gl/nbsjq + shell.cp('-Rf', src + '/*', dest); + } else { + shell.cp('-f', src, dest); + } +} + +// Same as copy file but throws error if target exists +function copyNewFile (plugin_dir, src, project_dir, dest, link) { + var target_path = path.resolve(project_dir, dest); + if (fs.existsSync(target_path)) { throw new CordovaError('"' + target_path + '" already exists!'); } + + copyFile(plugin_dir, src, project_dir, dest, !!link); +} + +function symlinkFileOrDirTree (src, dest) { + if (fs.existsSync(dest)) { + shell.rm('-Rf', dest); + } + + if (fs.statSync(src).isDirectory()) { + shell.mkdir('-p', dest); + fs.readdirSync(src).forEach(function (entry) { + symlinkFileOrDirTree(path.join(src, entry), path.join(dest, entry)); + }); + } else { + fs.symlinkSync(path.relative(fs.realpathSync(path.dirname(dest)), src), dest); + } +} + +// checks if file exists and then deletes. Error if doesn't exist +function removeFile (project_dir, src) { + var file = path.resolve(project_dir, src); + shell.rm('-Rf', file); +} + +// deletes file/directory without checking +function removeFileF (file) { + shell.rm('-Rf', file); +} + +// Sometimes we want to remove some java, and prune any unnecessary empty directories +function deleteJava (project_dir, destFile) { + removeFileAndParents(project_dir, destFile, 'src'); +} + +function removeFileAndParents (baseDir, destFile, stopper) { + stopper = stopper || '.'; + var file = path.resolve(baseDir, destFile); + if (!fs.existsSync(file)) return; + + removeFileF(file); + + // check if directory is empty + var curDir = path.dirname(file); + + while (curDir !== path.resolve(baseDir, stopper)) { + if (fs.existsSync(curDir) && fs.readdirSync(curDir).length === 0) { + fs.rmdirSync(curDir); + curDir = path.resolve(curDir, '..'); + } else { + // directory not empty...do nothing + break; + } + } +} + +function generateAttributeError (attribute, element, id) { + return 'Required attribute "' + attribute + '" not specified in <' + element + '> element from plugin: ' + id; +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/prepare.js b/node_modules/cordova-android/bin/templates/cordova/lib/prepare.js new file mode 100644 index 0000000..ac63f8a --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/prepare.js @@ -0,0 +1,480 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +/* eslint no-useless-escape: 0 */ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; +var AndroidManifest = require('./AndroidManifest'); +var checkReqs = require('./check_reqs'); +var xmlHelpers = require('cordova-common').xmlHelpers; +var CordovaError = require('cordova-common').CordovaError; +var ConfigParser = require('cordova-common').ConfigParser; +var FileUpdater = require('cordova-common').FileUpdater; +var PlatformJson = require('cordova-common').PlatformJson; +var PlatformMunger = require('cordova-common').ConfigChanges.PlatformMunger; +var PluginInfoProvider = require('cordova-common').PluginInfoProvider; + +module.exports.prepare = function (cordovaProject, options) { + var self = this; + + var platformJson = PlatformJson.load(this.locations.root, this.platform); + var munger = new PlatformMunger(this.platform, this.locations.root, platformJson, new PluginInfoProvider()); + + this._config = updateConfigFilesFrom(cordovaProject.projectConfig, munger, this.locations); + + // Update own www dir with project's www assets and plugins' assets and js-files + return Q.when(updateWww(cordovaProject, this.locations)).then(function () { + // update project according to config.xml changes. + return updateProjectAccordingTo(self._config, self.locations); + }).then(function () { + updateIcons(cordovaProject, path.relative(cordovaProject.root, self.locations.res)); + updateSplashes(cordovaProject, path.relative(cordovaProject.root, self.locations.res)); + updateFileResources(cordovaProject, path.relative(cordovaProject.root, self.locations.root)); + }).then(function () { + events.emit('verbose', 'Prepared android project successfully'); + }); +}; + +module.exports.clean = function (options) { + // A cordovaProject isn't passed into the clean() function, because it might have + // been called from the platform shell script rather than the CLI. Check for the + // noPrepare option passed in by the non-CLI clean script. If that's present, or if + // there's no config.xml found at the project root, then don't clean prepared files. + var projectRoot = path.resolve(this.root, '../..'); + if ((options && options.noPrepare) || !fs.existsSync(this.locations.configXml) || + !fs.existsSync(this.locations.configXml)) { + return Q(); + } + + var projectConfig = new ConfigParser(this.locations.configXml); + + var self = this; + return Q().then(function () { + cleanWww(projectRoot, self.locations); + cleanIcons(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res)); + cleanSplashes(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res)); + cleanFileResources(projectRoot, projectConfig, path.relative(projectRoot, self.locations.root)); + }); +}; + +/** + * Updates config files in project based on app's config.xml and config munge, + * generated by plugins. + * + * @param {ConfigParser} sourceConfig A project's configuration that will + * be merged into platform's config.xml + * @param {ConfigChanges} configMunger An initialized ConfigChanges instance + * for this platform. + * @param {Object} locations A map of locations for this platform + * + * @return {ConfigParser} An instance of ConfigParser, that + * represents current project's configuration. When returned, the + * configuration is already dumped to appropriate config.xml file. + */ +function updateConfigFilesFrom (sourceConfig, configMunger, locations) { + events.emit('verbose', 'Generating platform-specific config.xml from defaults for android at ' + locations.configXml); + + // First cleanup current config and merge project's one into own + // Overwrite platform config.xml with defaults.xml. + shell.cp('-f', locations.defaultConfigXml, locations.configXml); + + // Then apply config changes from global munge to all config files + // in project (including project's config) + configMunger.reapply_global_munge().save_all(); + + events.emit('verbose', 'Merging project\'s config.xml into platform-specific android config.xml'); + // Merge changes from app's config.xml into platform's one + var config = new ConfigParser(locations.configXml); + xmlHelpers.mergeXml(sourceConfig.doc.getroot(), + config.doc.getroot(), 'android', /* clobber= */true); + + config.write(); + return config; +} + +/** + * Logs all file operations via the verbose event stream, indented. + */ +function logFileOp (message) { + events.emit('verbose', ' ' + message); +} + +/** + * Updates platform 'www' directory by replacing it with contents of + * 'platform_www' and app www. Also copies project's overrides' folder into + * the platform 'www' folder + * + * @param {Object} cordovaProject An object which describes cordova project. + * @param {Object} destinations An object that contains destination + * paths for www files. + */ +function updateWww (cordovaProject, destinations) { + var sourceDirs = [ + path.relative(cordovaProject.root, cordovaProject.locations.www), + path.relative(cordovaProject.root, destinations.platformWww) + ]; + + // If project contains 'merges' for our platform, use them as another overrides + var merges_path = path.join(cordovaProject.root, 'merges', 'android'); + if (fs.existsSync(merges_path)) { + events.emit('verbose', 'Found "merges/android" folder. Copying its contents into the android project.'); + sourceDirs.push(path.join('merges', 'android')); + } + + var targetDir = path.relative(cordovaProject.root, destinations.www); + events.emit( + 'verbose', 'Merging and updating files from [' + sourceDirs.join(', ') + '] to ' + targetDir); + FileUpdater.mergeAndUpdateDir( + sourceDirs, targetDir, { rootDir: cordovaProject.root }, logFileOp); +} + +/** + * Cleans all files from the platform 'www' directory. + */ +function cleanWww (projectRoot, locations) { + var targetDir = path.relative(projectRoot, locations.www); + events.emit('verbose', 'Cleaning ' + targetDir); + + // No source paths are specified, so mergeAndUpdateDir() will clear the target directory. + FileUpdater.mergeAndUpdateDir( + [], targetDir, { rootDir: projectRoot, all: true }, logFileOp); +} + +/** + * Updates project structure and AndroidManifest according to project's configuration. + * + * @param {ConfigParser} platformConfig A project's configuration that will + * be used to update project + * @param {Object} locations A map of locations for this platform + */ +function updateProjectAccordingTo (platformConfig, locations) { + // Update app name by editing res/values/strings.xml + var strings = xmlHelpers.parseElementtreeSync(locations.strings); + + var name = platformConfig.name(); + strings.find('string[@name="app_name"]').text = name.replace(/\'/g, '\\\''); + + var shortName = platformConfig.shortName && platformConfig.shortName(); + if (shortName && shortName !== name) { + strings.find('string[@name="launcher_name"]').text = shortName.replace(/\'/g, '\\\''); + } + + fs.writeFileSync(locations.strings, strings.write({indent: 4}), 'utf-8'); + events.emit('verbose', 'Wrote out android application name "' + name + '" to ' + locations.strings); + + // Java packages cannot support dashes + var androidPkgName = (platformConfig.android_packageName() || platformConfig.packageName()).replace(/-/g, '_'); + + var manifest = new AndroidManifest(locations.manifest); + var manifestId = manifest.getPackageId(); + + manifest.getActivity() + .setOrientation(platformConfig.getPreference('orientation')) + .setLaunchMode(findAndroidLaunchModePreference(platformConfig)); + + manifest.setVersionName(platformConfig.version()) + .setVersionCode(platformConfig.android_versionCode() || default_versionCode(platformConfig.version())) + .setPackageId(androidPkgName) + .setMinSdkVersion(platformConfig.getPreference('android-minSdkVersion', 'android')) + .setMaxSdkVersion(platformConfig.getPreference('android-maxSdkVersion', 'android')) + .setTargetSdkVersion(platformConfig.getPreference('android-targetSdkVersion', 'android')) + .write(); + + // Java file paths shouldn't be hard coded + var javaPattern = path.join(locations.javaSrc, manifestId.replace(/\./g, '/'), '*.java'); + var java_files = shell.ls(javaPattern).filter(function (f) { + return shell.grep(/extends\s+CordovaActivity/g, f); + }); + + if (java_files.length === 0) { + throw new CordovaError('No Java files found that extend CordovaActivity.'); + } else if (java_files.length > 1) { + events.emit('log', 'Multiple candidate Java files that extend CordovaActivity found. Guessing at the first one, ' + java_files[0]); + } + + var destFile = path.join(locations.root, 'app', 'src', 'main', 'java', androidPkgName.replace(/\./g, '/'), path.basename(java_files[0])); + shell.mkdir('-p', path.dirname(destFile)); + shell.sed(/package [\w\.]*;/, 'package ' + androidPkgName + ';', java_files[0]).to(destFile); + events.emit('verbose', 'Wrote out Android package name "' + androidPkgName + '" to ' + destFile); + + var removeOrigPkg = checkReqs.isWindows() || checkReqs.isDarwin() ? + manifestId.toUpperCase() !== androidPkgName.toUpperCase() : + manifestId !== androidPkgName; + + if (removeOrigPkg) { + // If package was name changed we need to remove old java with main activity + shell.rm('-Rf', java_files[0]); + // remove any empty directories + var currentDir = path.dirname(java_files[0]); + var sourcesRoot = path.resolve(locations.root, 'src'); + while (currentDir !== sourcesRoot) { + if (fs.existsSync(currentDir) && fs.readdirSync(currentDir).length === 0) { + fs.rmdirSync(currentDir); + currentDir = path.resolve(currentDir, '..'); + } else { + break; + } + } + } +} + +// Consturct the default value for versionCode as +// PATCH + MINOR * 100 + MAJOR * 10000 +// see http://developer.android.com/tools/publishing/versioning.html +function default_versionCode (version) { + var nums = version.split('-')[0].split('.'); + var versionCode = 0; + if (+nums[0]) { + versionCode += +nums[0] * 10000; + } + if (+nums[1]) { + versionCode += +nums[1] * 100; + } + if (+nums[2]) { + versionCode += +nums[2]; + } + + events.emit('verbose', 'android-versionCode not found in config.xml. Generating a code based on version in config.xml (' + version + '): ' + versionCode); + return versionCode; +} + +function getImageResourcePath (resourcesDir, type, density, name, sourceName) { + if (/\.9\.png$/.test(sourceName)) { + name = name.replace(/\.png$/, '.9.png'); + } + var resourcePath = path.join(resourcesDir, (density ? type + '-' + density : type), name); + return resourcePath; +} + +function updateSplashes (cordovaProject, platformResourcesDir) { + var resources = cordovaProject.projectConfig.getSplashScreens('android'); + + // if there are "splash" elements in config.xml + if (resources.length === 0) { + events.emit('verbose', 'This app does not have splash screens defined'); + return; + } + + var resourceMap = mapImageResources(cordovaProject.root, platformResourcesDir, 'drawable', 'screen.png'); + + var hadMdpi = false; + resources.forEach(function (resource) { + if (!resource.density) { + return; + } + if (resource.density === 'mdpi') { + hadMdpi = true; + } + var targetPath = getImageResourcePath( + platformResourcesDir, 'drawable', resource.density, 'screen.png', path.basename(resource.src)); + resourceMap[targetPath] = resource.src; + }); + + // There's no "default" drawable, so assume default == mdpi. + if (!hadMdpi && resources.defaultResource) { + var targetPath = getImageResourcePath( + platformResourcesDir, 'drawable', 'mdpi', 'screen.png', path.basename(resources.defaultResource.src)); + resourceMap[targetPath] = resources.defaultResource.src; + } + + events.emit('verbose', 'Updating splash screens at ' + platformResourcesDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanSplashes (projectRoot, projectConfig, platformResourcesDir) { + var resources = projectConfig.getSplashScreens('android'); + if (resources.length > 0) { + var resourceMap = mapImageResources(projectRoot, platformResourcesDir, 'drawable', 'screen.png'); + events.emit('verbose', 'Cleaning splash screens at ' + platformResourcesDir); + + // No source paths are specified in the map, so updatePaths() will delete the target files. + FileUpdater.updatePaths( + resourceMap, { rootDir: projectRoot, all: true }, logFileOp); + } +} + +function updateIcons (cordovaProject, platformResourcesDir) { + var icons = cordovaProject.projectConfig.getIcons('android'); + + // if there are icon elements in config.xml + if (icons.length === 0) { + events.emit('verbose', 'This app does not have launcher icons defined'); + return; + } + + var resourceMap = mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'icon.png'); + + var android_icons = {}; + var default_icon; + // http://developer.android.com/design/style/iconography.html + var sizeToDensityMap = { + 36: 'ldpi', + 48: 'mdpi', + 72: 'hdpi', + 96: 'xhdpi', + 144: 'xxhdpi', + 192: 'xxxhdpi' + }; + // find the best matching icon for a given density or size + // @output android_icons + var parseIcon = function (icon, icon_size) { + // do I have a platform icon for that density already + var density = icon.density || sizeToDensityMap[icon_size]; + if (!density) { + // invalid icon defition ( or unsupported size) + return; + } + var previous = android_icons[density]; + if (previous && previous.platform) { + return; + } + android_icons[density] = icon; + }; + + // iterate over all icon elements to find the default icon and call parseIcon + for (var i = 0; i < icons.length; i++) { + var icon = icons[i]; + var size = icon.width; + if (!size) { + size = icon.height; + } + if (!size && !icon.density) { + if (default_icon) { + events.emit('verbose', 'Found extra default icon: ' + icon.src + ' (ignoring in favor of ' + default_icon.src + ')'); + } else { + default_icon = icon; + } + } else { + parseIcon(icon, size); + } + } + + // The source paths for icons and splashes are relative to + // project's config.xml location, so we use it as base path. + for (var density in android_icons) { + var targetPath = getImageResourcePath( + platformResourcesDir, 'mipmap', density, 'icon.png', path.basename(android_icons[density].src)); + resourceMap[targetPath] = android_icons[density].src; + } + + // There's no "default" drawable, so assume default == mdpi. + if (default_icon && !android_icons.mdpi) { + var defaultTargetPath = getImageResourcePath( + platformResourcesDir, 'mipmap', 'mdpi', 'icon.png', path.basename(default_icon.src)); + resourceMap[defaultTargetPath] = default_icon.src; + } + + events.emit('verbose', 'Updating icons at ' + platformResourcesDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanIcons (projectRoot, projectConfig, platformResourcesDir) { + var icons = projectConfig.getIcons('android'); + if (icons.length > 0) { + var resourceMap = mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'icon.png'); + events.emit('verbose', 'Cleaning icons at ' + platformResourcesDir); + + // No source paths are specified in the map, so updatePaths() will delete the target files. + FileUpdater.updatePaths( + resourceMap, { rootDir: projectRoot, all: true }, logFileOp); + } +} + +/** + * Gets a map containing resources of a specified name from all drawable folders in a directory. + */ +function mapImageResources (rootDir, subDir, type, resourceName) { + var pathMap = {}; + shell.ls(path.join(rootDir, subDir, type + '-*')).forEach(function (drawableFolder) { + var imagePath = path.join(subDir, path.basename(drawableFolder), resourceName); + pathMap[imagePath] = null; + }); + return pathMap; +} + +function updateFileResources (cordovaProject, platformDir) { + var files = cordovaProject.projectConfig.getFileResources('android'); + + // if there are resource-file elements in config.xml + if (files.length === 0) { + events.emit('verbose', 'This app does not have additional resource files defined'); + return; + } + + var resourceMap = {}; + files.forEach(function (res) { + var targetPath = path.join(platformDir, res.target); + resourceMap[targetPath] = res.src; + }); + + events.emit('verbose', 'Updating resource files at ' + platformDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanFileResources (projectRoot, projectConfig, platformDir) { + var files = projectConfig.getFileResources('android', true); + if (files.length > 0) { + events.emit('verbose', 'Cleaning resource files at ' + platformDir); + + var resourceMap = {}; + files.forEach(function (res) { + var filePath = path.join(platformDir, res.target); + resourceMap[filePath] = null; + }); + + FileUpdater.updatePaths( + resourceMap, { + rootDir: projectRoot, all: true}, logFileOp); + } +} + +/** + * Gets and validates 'AndroidLaunchMode' prepference from config.xml. Returns + * preference value and warns if it doesn't seems to be valid + * + * @param {ConfigParser} platformConfig A configParser instance for + * platform. + * + * @return {String} Preference's value from config.xml or + * default value, if there is no such preference. The default value is + * 'singleTop' + */ +function findAndroidLaunchModePreference (platformConfig) { + var launchMode = platformConfig.getPreference('AndroidLaunchMode'); + if (!launchMode) { + // Return a default value + return 'singleTop'; + } + + var expectedValues = ['standard', 'singleTop', 'singleTask', 'singleInstance']; + var valid = expectedValues.indexOf(launchMode) >= 0; + if (!valid) { + // Note: warn, but leave the launch mode as developer wanted, in case the list of options changes in the future + events.emit('warn', 'Unrecognized value for AndroidLaunchMode preference: ' + + launchMode + '. Expected values are: ' + expectedValues.join(', ')); + } + + return launchMode; +} diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/retry.js b/node_modules/cordova-android/bin/templates/cordova/lib/retry.js new file mode 100644 index 0000000..c464b9d --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/retry.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint node: true */ + +'use strict'; + +var events = require('cordova-common').events; + +/* + * Retry a promise-returning function a number of times, propagating its + * results on success or throwing its error on a failed final attempt. + * + * @arg {Number} attemts_left - The number of times to retry the passed call. + * @arg {Function} promiseFunction - A function that returns a promise. + * @arg {...} - Arguments to pass to promiseFunction. + * + * @returns {Promise} + */ +module.exports.retryPromise = function (attemts_left, promiseFunction) { + + // NOTE: + // get all trailing arguments, by skipping the first two (attemts_left and + // promiseFunction) because they shouldn't get passed to promiseFunction + var promiseFunctionArguments = Array.prototype.slice.call(arguments, 2); + + return promiseFunction.apply(undefined, promiseFunctionArguments).then( + + // on success pass results through + function onFulfilled (value) { + return value; + }, + + // on rejection either retry, or throw the error + function onRejected (error) { + + attemts_left -= 1; + + if (attemts_left < 1) { + throw error; + } + + events.emit('verbose', 'A retried call failed. Retrying ' + attemts_left + ' more time(s).'); + + // retry call self again with the same arguments, except attemts_left is now lower + var fullArguments = [attemts_left, promiseFunction].concat(promiseFunctionArguments); + return module.exports.retryPromise.apply(undefined, fullArguments); + } + ); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/run.js b/node_modules/cordova-android/bin/templates/cordova/lib/run.js new file mode 100644 index 0000000..4d7927c --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/run.js @@ -0,0 +1,132 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint loopfunc:true */ + +var path = require('path'); +var build = require('./build'); +var emulator = require('./emulator'); +var device = require('./device'); +var Q = require('q'); +var events = require('cordova-common').events; + +function getInstallTarget (runOptions) { + var install_target; + if (runOptions.target) { + install_target = runOptions.target; + } else if (runOptions.device) { + install_target = '--device'; + } else if (runOptions.emulator) { + install_target = '--emulator'; + } + + return install_target; +} + +/** + * Runs the application on a device if available. If no device is found, it will + * use a started emulator. If no started emulators are found it will attempt + * to start an avd. If no avds are found it will error out. + * + * @param {Object} runOptions various run/build options. See Api.js build/run + * methods for reference. + * + * @return {Promise} + */ +module.exports.run = function (runOptions) { + + var self = this; + var install_target = getInstallTarget(runOptions); + + return Q().then(function () { + if (!install_target) { + // no target given, deploy to device if available, otherwise use the emulator. + return device.list().then(function (device_list) { + if (device_list.length > 0) { + events.emit('warn', 'No target specified, deploying to device \'' + device_list[0] + '\'.'); + install_target = device_list[0]; + } else { + events.emit('warn', 'No target specified and no devices found, deploying to emulator'); + install_target = '--emulator'; + } + }); + } + }).then(function () { + if (install_target === '--device') { + return device.resolveTarget(null); + } else if (install_target === '--emulator') { + // Give preference to any already started emulators. Else, start one. + return emulator.list_started().then(function (started) { + return started && started.length > 0 ? started[0] : emulator.start(); + }).then(function (emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + // They specified a specific device/emulator ID. + return device.list().then(function (devices) { + if (devices.indexOf(install_target) > -1) { + return device.resolveTarget(install_target); + } + return emulator.list_started().then(function (started_emulators) { + if (started_emulators.indexOf(install_target) > -1) { + return emulator.resolveTarget(install_target); + } + return emulator.list_images().then(function (avds) { + // if target emulator isn't started, then start it. + for (var avd in avds) { + if (avds[avd].name === install_target) { + return emulator.start(install_target).then(function (emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + } + return Q.reject('Target \'' + install_target + '\' not found, unable to run project'); + }); + }); + }); + }).then(function (resolvedTarget) { + // Better just call self.build, but we're doing some processing of + // build results (according to platformApi spec) so they are in different + // format than emulator.install expects. + // TODO: Update emulator/device.install to handle this change + return build.run.call(self, runOptions, resolvedTarget).then(function (buildResults) { + if (resolvedTarget && resolvedTarget.isEmulator) { + return emulator.wait_for_boot(resolvedTarget.target).then(function () { + return emulator.install(resolvedTarget, buildResults); + }); + } + return device.install(resolvedTarget, buildResults); + }); + }); +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), process.argv[1]) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator b/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator new file mode 100755 index 0000000..f96bdc3 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +var install_target; +if(args.length > 2) { + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} + +emulator.start(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); +}); + diff --git a/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator.bat b/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator.bat new file mode 100644 index 0000000..6c237ea --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/lib/start-emulator.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0start-emulator" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'start-emulator' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/log b/node_modules/cordova-android/bin/templates/cordova/log new file mode 100755 index 0000000..47f0605 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/log @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else { + reqs.run().done(function() { + return log.run(); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +} diff --git a/node_modules/cordova-android/bin/templates/cordova/log.bat b/node_modules/cordova-android/bin/templates/cordova/log.bat new file mode 100644 index 0000000..4b2b434 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/log.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0log" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'log' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/loggingHelper.js b/node_modules/cordova-android/bin/templates/cordova/loggingHelper.js new file mode 100644 index 0000000..32b2ee0 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/loggingHelper.js @@ -0,0 +1,18 @@ +var CordovaLogger = require('cordova-common').CordovaLogger; + +module.exports = { + adjustLoggerLevel: function (opts) { + if (opts instanceof Array) { + opts.silent = opts.indexOf('--silent') !== -1; + opts.verbose = opts.indexOf('--verbose') !== -1; + } + + if (opts.silent) { + CordovaLogger.get().setLevel('error'); + } + + if (opts.verbose) { + CordovaLogger.get().setLevel('verbose'); + } + } +}; diff --git a/node_modules/cordova-android/bin/templates/cordova/run b/node_modules/cordova-android/bin/templates/cordova/run new file mode 100755 index 0000000..9544c1d --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/run @@ -0,0 +1,53 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Api = require('./Api'); +var nopt = require('nopt'); +var path = require('path'); + +// Support basic help commands +if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) + require('./lib/run').help(); + +// Do some basic argument parsing +var runOpts = nopt({ + 'verbose' : Boolean, + 'silent' : Boolean, + 'debug' : Boolean, + 'release' : Boolean, + 'nobuild': Boolean, + 'buildConfig' : path, + 'archs' : String, + 'device' : Boolean, + 'emulator': Boolean, + 'target' : String +}, { 'd' : '--verbose' }); + +// Make runOptions compatible with PlatformApi run method spec +runOpts.argv = runOpts.argv.remain; + +require('./loggingHelper').adjustLoggerLevel(runOpts); + +new Api().run(runOpts) +.catch(function(err) { + console.error(err, err.stack); + process.exit(2); +}); diff --git a/node_modules/cordova-android/bin/templates/cordova/run.bat b/node_modules/cordova-android/bin/templates/cordova/run.bat new file mode 100644 index 0000000..b0bc28b --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/run.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0run" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'run' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/node_modules/cordova-android/bin/templates/cordova/version b/node_modules/cordova-android/bin/templates/cordova/version new file mode 100755 index 0000000..b20d5ae --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/version @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// Coho updates this line: +var VERSION = "7.1.1"; + +module.exports.version = VERSION; + +if (!module.parent) { + console.log(VERSION); +} diff --git a/node_modules/cordova-android/bin/templates/cordova/version.bat b/node_modules/cordova-android/bin/templates/cordova/version.bat new file mode 100644 index 0000000..3610c17 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/cordova/version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0version" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'version' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/node_modules/cordova-android/bin/templates/project/Activity.java b/node_modules/cordova-android/bin/templates/project/Activity.java new file mode 100644 index 0000000..567b6c7 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/Activity.java @@ -0,0 +1,41 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +package __ID__; + +import android.os.Bundle; +import org.apache.cordova.*; + +public class __ACTIVITY__ extends CordovaActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // enable Cordova apps to be started in the background + Bundle extras = getIntent().getExtras(); + if (extras != null && extras.getBoolean("cdvStartInBackground", false)) { + moveTaskToBack(true); + } + + // Set by in config.xml + loadUrl(launchUrl); + } +} diff --git a/node_modules/cordova-android/bin/templates/project/AndroidManifest.xml b/node_modules/cordova-android/bin/templates/project/AndroidManifest.xml new file mode 100644 index 0000000..e0c53aa --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/AndroidManifest.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/bin/templates/project/app/build.gradle b/node_modules/cordova-android/bin/templates/project/app/build.gradle new file mode 100644 index 0000000..b47fdf9 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/app/build.gradle @@ -0,0 +1,324 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +apply plugin: 'com.android.application' + +buildscript { + repositories { + mavenCentral() + maven { + url "https://maven.google.com" + } + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + } +} + +// Allow plugins to declare Maven dependencies via build-extras.gradle. +allprojects { + repositories { + mavenCentral(); + jcenter() + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '4.1.0' +} + +// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties. +// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html +ext { + apply from: '../CordovaLib/cordova.gradle' + // The value for android.compileSdkVersion. + if (!project.hasProperty('cdvCompileSdkVersion')) { + cdvCompileSdkVersion = null; + } + // The value for android.buildToolsVersion. + if (!project.hasProperty('cdvBuildToolsVersion')) { + cdvBuildToolsVersion = null; + } + // Sets the versionCode to the given value. + if (!project.hasProperty('cdvVersionCode')) { + cdvVersionCode = null + } + // Sets the minSdkVersion to the given value. + if (!project.hasProperty('cdvMinSdkVersion')) { + cdvMinSdkVersion = null + } + // Whether to build architecture-specific APKs. + if (!project.hasProperty('cdvBuildMultipleApks')) { + cdvBuildMultipleApks = null + } + // Whether to append a 0 "abi digit" to versionCode when only a single APK is build + if (!project.hasProperty('cdvVersionCodeForceAbiDigit')) { + cdvVersionCodeForceAbiDigit = null + } + // .properties files to use for release signing. + if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) { + cdvReleaseSigningPropertiesFile = null + } + // .properties files to use for debug signing. + if (!project.hasProperty('cdvDebugSigningPropertiesFile')) { + cdvDebugSigningPropertiesFile = null + } + // Set by build.js script. + if (!project.hasProperty('cdvBuildArch')) { + cdvBuildArch = null + } + + // Plugin gradle extensions can append to this to have code run at the end. + cdvPluginPostBuildExtras = [] +} + +// PLUGIN GRADLE EXTENSIONS START +// PLUGIN GRADLE EXTENSIONS END + +def hasBuildExtras = file('build-extras.gradle').exists() +if (hasBuildExtras) { + apply from: 'build-extras.gradle' +} + +// Set property defaults after extension .gradle files. +if (ext.cdvCompileSdkVersion == null) { + ext.cdvCompileSdkVersion = privateHelpers.getProjectTarget() + //ext.cdvCompileSdkVersion = project.ext.defaultCompileSdkVersion +} +if (ext.cdvBuildToolsVersion == null) { + ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools() + //ext.cdvBuildToolsVersion = project.ext.defaultBuildToolsVersion +} +if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists()) { + ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties' +} +if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists()) { + ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties' +} + +// Cast to appropriate types. +ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean(); +ext.cdvVersionCodeForceAbiDigit = cdvVersionCodeForceAbiDigit == null ? false : cdvVersionCodeForceAbiDigit.toBoolean(); +ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : defaultMinSdkVersion +ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode) + +def computeBuildTargetName(debugBuild) { + def ret = 'assemble' + if (cdvBuildMultipleApks && cdvBuildArch) { + def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch + ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1); + } + return ret + (debugBuild ? 'Debug' : 'Release') +} + +// Make cdvBuild a task that depends on the debug/arch-sepecific task. +task cdvBuildDebug +cdvBuildDebug.dependsOn { + return computeBuildTargetName(true) +} + +task cdvBuildRelease +cdvBuildRelease.dependsOn { + return computeBuildTargetName(false) +} + +task cdvPrintProps << { + println('cdvCompileSdkVersion=' + cdvCompileSdkVersion) + println('cdvBuildToolsVersion=' + cdvBuildToolsVersion) + println('cdvVersionCode=' + cdvVersionCode) + println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit) + println('cdvMinSdkVersion=' + cdvMinSdkVersion) + println('cdvBuildMultipleApks=' + cdvBuildMultipleApks) + println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile) + println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile) + println('cdvBuildArch=' + cdvBuildArch) + println('computedVersionCode=' + android.defaultConfig.versionCode) + android.productFlavors.each { flavor -> + println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode) + } +} + +android { + + defaultConfig { + versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode")) + applicationId privateHelpers.extractStringFromManifest("package") + + if (cdvMinSdkVersion != null) { + minSdkVersion cdvMinSdkVersion + } + } + + lintOptions { + abortOnError false; + } + + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + + //This code exists for Crosswalk and other Native APIs. + //By default, we multiply the existing version code in the Android Manifest by 10 and + //add a number for each architecture. If you are not using Crosswalk or SQLite, you can + //ignore this chunk of code, and your version codes will be respected. + + if (Boolean.valueOf(cdvBuildMultipleApks)) { + flavorDimensions "default" + + productFlavors { + armeabi { + versionCode defaultConfig.versionCode*10 + 1 + ndk { + abiFilters = ["armeabi"] + } + } + armv7 { + versionCode defaultConfig.versionCode*10 + 2 + ndk { + abiFilters = ["armeabi-v7a"] + } + } + arm64 { + versionCode defaultConfig.versionCode*10 + 3 + ndk { + abiFilters = ["arm64-v8a"] + } + } + x86 { + versionCode defaultConfig.versionCode*10 + 4 + ndk { + abiFilters = ["x86"] + } + } + x86_64 { + versionCode defaultConfig.versionCode*10 + 5 + ndk { + abiFilters = ["x86_64"] + } + } + } + } else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit)) { + // This provides compatibility to the default logic for versionCode before cordova-android 5.2.0 + defaultConfig { + versionCode defaultConfig.versionCode*10 + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + if (cdvReleaseSigningPropertiesFile) { + signingConfigs { + release { + // These must be set or Gradle will complain (even if they are overridden). + keyAlias = "" + keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph. + storeFile = null + storePassword = "__unset" + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } + addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release) + } + if (cdvDebugSigningPropertiesFile) { + addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug) + } +} + +/* + * WARNING: Cordova Lib and platform scripts do management inside of this code here, + * if you are adding the dependencies manually, do so outside the comments, otherwise + * the Cordova tools will overwrite them + */ + + +dependencies { + implementation fileTree(dir: 'libs', include: '*.jar') + // SUB-PROJECT DEPENDENCIES START + debugCompile(project(path: ":CordovaLib", configuration: "debug")) + releaseCompile(project(path: ":CordovaLib", configuration: "release")) + // SUB-PROJECT DEPENDENCIES END +} + +def promptForReleaseKeyPassword() { + if (!cdvReleaseSigningPropertiesFile) { + return; + } + if ('__unset'.equals(android.signingConfigs.release.storePassword)) { + android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ') + } + if ('__unset'.equals(android.signingConfigs.release.keyPassword)) { + android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: '); + } +} + +gradle.taskGraph.whenReady { taskGraph -> + taskGraph.getAllTasks().each() { task -> + if(['validateReleaseSigning', 'validateSigningRelease', 'validateSigningArmv7Release', 'validateSigningX76Release'].contains(task.name)) { + promptForReleaseKeyPassword() + } + } +} + +def addSigningProps(propsFilePath, signingConfig) { + def propsFile = file(propsFilePath) + def props = new Properties() + propsFile.withReader { reader -> + props.load(reader) + } + + def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile')) + if (!storeFile.isAbsolute()) { + storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile()) + } + if (!storeFile.exists()) { + throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath()) + } + signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias') + signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword)) + signingConfig.storeFile = storeFile + signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword)) + def storeType = props.get('storeType', props.get('key.store.type', '')) + if (!storeType) { + def filename = storeFile.getName().toLowerCase(); + if (filename.endsWith('.p12') || filename.endsWith('.pfx')) { + storeType = 'pkcs12' + } else { + storeType = signingConfig.storeType // "jks" + } + } + signingConfig.storeType = storeType +} + +for (def func : cdvPluginPostBuildExtras) { + func() +} + +// This can be defined within build-extras.gradle as: +// ext.postBuildExtras = { ... code here ... } +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/node_modules/cordova-android/bin/templates/project/assets/www/cordova.js b/node_modules/cordova-android/bin/templates/project/assets/www/cordova.js new file mode 100644 index 0000000..d7b144e --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/assets/www/cordova.js @@ -0,0 +1,2189 @@ +// Platform: android +// 9e8e1b716252c4a08abcd31a13013b868d6f4141 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var PLATFORM_VERSION_BUILD_LABEL = '7.1.1'; +// file: src/scripts/require.js + +/* jshint -W079 */ +/* jshint -W020 */ + +var require; +var define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + var SEPARATOR = '.'; + + function build (module) { + var factory = module.factory; + var localRequire = function (id) { + var resultantId = id; + // Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === '.') { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw 'module ' + id + ' not found'; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw 'Cycle in require graph: ' + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw 'module ' + id + ' already defined'; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +// Export for use in node +if (typeof module === 'object' && typeof require === 'function') { + module.exports.require = require; + module.exports.define = define; +} + +// file: src/cordova.js +define("cordova", function(require, exports, module) { + +// Workaround for Windows 10 in hosted environment case +// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object +if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef + throw new Error('cordova already defined'); +} + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}; +var windowEventHandlers = {}; + +document.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent (type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +/* eslint-disable no-undef */ +var cordova = { + define: define, + require: require, + version: PLATFORM_VERSION_BUILD_LABEL, + platformVersion: PLATFORM_VERSION_BUILD_LABEL, + platformId: platform.id, + + /* eslint-enable no-undef */ + + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler: function (event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler: function (event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler: function (event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function () { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function (type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] !== 'undefined') { + if (bNoDetach) { + documentEventHandlers[type].fire(evt); + } else { + setTimeout(function () { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type === 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function (type, data) { + var evt = createEvent(type, data); + if (typeof windowEventHandlers[type] !== 'undefined') { + setTimeout(function () { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function (callbackId, args) { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function (callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) { + try { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (isSuccess && status === cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!isSuccess) { + callback.fail && callback.fail.apply(null, args); + } + /* + else + Note, this case is intentionally not caught. + this can happen if isSuccess is true, but callbackStatus is NO_RESULT + which is used to remove a callback from the list without calling the callbacks + typically keepCallback is false in this case + */ + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + } catch (err) { + var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err; + console && console.log && console.log(msg); + console && console.log && err.stack && console.log(err.stack); + cordova.fireWindowEvent('cordovacallbackerror', { 'message': msg }); + throw err; + } + }, + addConstructor: function (func) { + channel.onCordovaReady.subscribe(function () { + try { + func(); + } catch (e) { + console.log('Failed to run constructor: ' + e); + } + }); + } +}; + +module.exports = cordova; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used pre-JellyBean, where addJavascriptInterface() is disabled. + */ + +module.exports = { + exec: function(bridgeSecret, service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(bridgeSecret, value) { + prompt(value, 'gap_bridge_mode:' + bridgeSecret); + }, + retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret); + } +}; + +}); + +// file: src/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName (callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs (spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i); + var cUpper = c.toUpperCase(); + var arg = args[i]; + // Asterix means allow anything. + if (c === '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c === cUpper) { + continue; + } + if (typeName !== typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine === 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue (value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + +}); + +// file: src/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function (arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +base64.toArrayBuffer = function (str) { + var decodedStr = typeof atob !== 'undefined' ? atob(str) : Buffer.from(str, 'base64').toString('binary'); // eslint-disable-line no-undef + var arrayBuffer = new ArrayBuffer(decodedStr.length); + var array = new Uint8Array(arrayBuffer); + for (var i = 0, len = decodedStr.length; i < len; i++) { + array[i] = decodedStr.charCodeAt(i); + } + return arrayBuffer; +}; + +// ------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +var b64_12bit; + +var b64_12bitTable = function () { + b64_12bit = []; + for (var i = 0; i < 64; i++) { + for (var j = 0; j < 64; j++) { + b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function () { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64 (rawData) { + var numBytes = rawData.byteLength; + var output = ''; + var segment; + var table = b64_12bitTable(); + for (var i = 0; i < numBytes - 2; i += 3) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2]; + output += table[segment >> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i === 2) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i === 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: src/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each (objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber (obj, key, value) { + exports.replaceHookForTesting(obj, key); + var needsProperty = false; + try { + obj[key] = value; + } catch (e) { + needsProperty = true; + } + // Getters can only be overridden by getters. + if (needsProperty || obj[key] !== value) { + utils.defineGetter(obj, key, function () { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter (obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function () { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include (parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch (e) { + utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge (target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function (objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function (objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function (objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function () {}; + +}); + +// file: src/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'); +var nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function (type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}; +var channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function (h, c) { + var len = c.length; + var i = len; + var f = function () { + if (!(--i)) h(); + }; + for (var j = 0; j < len; j++) { + if (c[j].state === 0) { + throw Error('Can only use join with sticky channels.'); + } + c[j].subscribe(f); + } + if (!len) h(); + }, + /* eslint-disable no-return-assign */ + create: function (type) { + return channel[type] = new Channel(type, false); + }, + createSticky: function (type) { + return channel[type] = new Channel(type, true); + }, + /* eslint-enable no-return-assign */ + /** + * cordova Channels that must fire before "deviceready" is fired. + */ + deviceReadyChannelsArray: [], + deviceReadyChannelsMap: {}, + + /** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up Cordova's "deviceready" event until the feature has been initialized + * and Cordova.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ + waitForInitialization: function (feature) { + if (feature) { + var c = channel[feature] || this.createSticky(feature); + this.deviceReadyChannelsMap[feature] = c; + this.deviceReadyChannelsArray.push(c); + } + }, + + /** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ + initializationComplete: function (feature) { + var c = this.deviceReadyChannelsMap[feature]; + if (c) { + c.fire(); + } + } +}; + +function checkSubscriptionArgument (argument) { + if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') { + throw new Error( + 'Must provide a function or an EventListener object ' + + 'implementing the handleEvent interface.' + ); + } +} + +/** + * Subscribes the given function to the channel. Any time that + * Channel.fire is called so too will the function. + * Optionally specify an execution context for the function + * and a guid that can be used to stop subscribing to the channel. + * Returns the guid. + */ +Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + eventListener = eventListenerOrFunction; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + if (this.state === 2) { + handleEvent.apply(eventListener || this, this.fireArgs); + return; + } + + guid = eventListenerOrFunction.observer_guid; + if (typeof eventListener === 'object') { + handleEvent = utils.close(eventListener, handleEvent); + } + + if (!guid) { + // First time any channel has seen this subscriber + guid = '' + nextGuid++; + } + handleEvent.observer_guid = guid; + eventListenerOrFunction.observer_guid = guid; + + // Don't add the same handler more than once. + if (!this.handlers[guid]) { + this.handlers[guid] = handleEvent; + this.numHandlers++; + if (this.numHandlers === 1) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Unsubscribes the function with the given guid from the channel. + */ +Channel.prototype.unsubscribe = function (eventListenerOrFunction) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid, handler; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + guid = handleEvent.observer_guid; + handler = this.handlers[guid]; + if (handler) { + delete this.handlers[guid]; + this.numHandlers--; + if (this.numHandlers === 0) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Calls all functions subscribed to this channel. + */ +Channel.prototype.fire = function (e) { + var fail = false; // eslint-disable-line no-unused-vars + var fireArgs = Array.prototype.slice.call(arguments); + // Apply stickiness. + if (this.state === 1) { + this.state = 2; + this.fireArgs = fireArgs; + } + if (this.numHandlers) { + // Copy the values first so that it is safe to modify it from within + // callbacks. + var toCall = []; + for (var item in this.handlers) { + toCall.push(this.handlers[item]); + } + for (var i = 0; i < toCall.length; ++i) { + toCall[i].apply(this, fireArgs); + } + if (this.state === 2 && this.numHandlers) { + this.numHandlers = 0; + this.handlers = {}; + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +// defining them here so they are ready super fast! +// DOM event that is received when the web page is loaded and parsed. +channel.createSticky('onDOMContentLoaded'); + +// Event to indicate the Cordova native side is ready. +channel.createSticky('onNativeReady'); + +// Event to indicate that all Cordova JavaScript objects have been created +// and it's time to run plugin constructors. +channel.createSticky('onCordovaReady'); + +// Event to indicate that all automatically loaded JS plugins are loaded and ready. +// FIXME remove this +channel.createSticky('onPluginsReady'); + +// Event to indicate that Cordova is ready +channel.createSticky('onDeviceReady'); + +// Event to indicate a resume lifecycle event +channel.create('onResume'); + +// Event to indicate a pause lifecycle event +channel.create('onPause'); + +// Channels that must fire before "deviceready" is fired. +channel.waitForInitialization('onCordovaReady'); +channel.waitForInitialization('onDOMContentLoaded'); + +module.exports = channel; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/exec.js +define("cordova/exec", function(require, exports, module) { + +/** + * Execute a cordova command. It is up to the native side whether this action + * is synchronous or asynchronous. The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchronous: Empty string "" + * If async, the native side will cordova.callbackSuccess or cordova.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in cordova + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +var cordova = require('cordova'), + nativeApiProvider = require('cordova/android/nativeapiprovider'), + utils = require('cordova/utils'), + base64 = require('cordova/base64'), + channel = require('cordova/channel'), + jsToNativeModes = { + PROMPT: 0, + JS_OBJECT: 1 + }, + nativeToJsModes = { + // Polls for messages using the JS->Native bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, + pollEnabled = false, + bridgeSecret = -1; + +var messagesFromNative = []; +var isProcessing = false; +var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); +var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; + +function androidExec(success, fail, service, action, args) { + if (bridgeSecret < 0) { + // If we ever catch this firing, we'll need to queue up exec()s + // and fire them once we get a secret. For now, I don't think + // it's possible for exec() to be called since plugins are parsed but + // not run until until after onNativeReady. + throw new Error('exec() called without bridgeSecret'); + } + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // If args is not provided, default to an empty array + args = args || []; + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } else if (msgs) { + messagesFromNative.push(msgs); + // Always process async to avoid exceptions messing up stack. + nextTick(processMessages); + } +} + +androidExec.init = function() { + //CB-11828 + //This failsafe checks the version of Android and if it's Jellybean, it switches it to + //using the Online Event bridge for communicating from Native to JS + // + //It's ugly, but it's necessary. + var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/); + var version_code = check && check[0].match(/4.[0-3].*/); + if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) { + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT; + } + + bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); + channel.onNativeReady.fire(); +}; + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + if (bridgeSecret < 0) { + // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. + // We know there's nothing to retrieve, so no need to poll. + return; + } + var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); + if (msgs) { + messagesFromNative.push(msgs); + // Process sync since we know we're already top-of-stack. + processMessages(); + } +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + // Otherwise, it will be set by androidExec.init() + if (bridgeSecret >= 0) { + nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); + } + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +function buildPayload(payload, message) { + var payloadKind = message.charAt(0); + if (payloadKind == 's') { + payload.push(message.slice(1)); + } else if (payloadKind == 't') { + payload.push(true); + } else if (payloadKind == 'f') { + payload.push(false); + } else if (payloadKind == 'N') { + payload.push(null); + } else if (payloadKind == 'n') { + payload.push(+message.slice(1)); + } else if (payloadKind == 'A') { + var data = message.slice(1); + payload.push(base64.toArrayBuffer(data)); + } else if (payloadKind == 'S') { + payload.push(window.atob(message.slice(1))); + } else if (payloadKind == 'M') { + var multipartMessages = message.slice(1); + while (multipartMessages !== "") { + var spaceIdx = multipartMessages.indexOf(' '); + var msgLen = +multipartMessages.slice(0, spaceIdx); + var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); + multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); + buildPayload(payload, multipartMessage); + } + } else { + payload.push(JSON.parse(message)); + } +} + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + // This is deprecated on the .java side. It doesn't work with CSP enabled. + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadMessage = message.slice(nextSpaceIdx + 1); + var payload = []; + buildPayload(payload, payloadMessage); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + } else { + console.log("processMessage failed: invalid message: " + JSON.stringify(message)); + } +} + +function processMessages() { + // Check for the reentrant case. + if (isProcessing) { + return; + } + if (messagesFromNative.length === 0) { + return; + } + isProcessing = true; + try { + var msg = popMessageFromQueue(); + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (msg == '*' && messagesFromNative.length === 0) { + nextTick(pollOnce); + return; + } + processMessage(msg); + } finally { + isProcessing = false; + if (messagesFromNative.length > 0) { + nextTick(processMessages); + } + } +} + +function popMessageFromQueue() { + var messageBatch = messagesFromNative.shift(); + if (messageBatch == '*') { + return '*'; + } + + var spaceIdx = messageBatch.indexOf(' '); + var msgLen = +messageBatch.slice(0, spaceIdx); + var message = messageBatch.substr(spaceIdx + 1, msgLen); + messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); + if (messageBatch) { + messagesFromNative.unshift(messageBatch); + } + return message; +} + +module.exports = androidExec; + +}); + +// file: src/common/exec/proxy.js +define("cordova/exec/proxy", function(require, exports, module) { + +// internal map of proxy function +var CommandProxyMap = {}; + +module.exports = { + + // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...); + add: function (id, proxyObj) { + console.log('adding proxy for ' + id); + CommandProxyMap[id] = proxyObj; + return proxyObj; + }, + + // cordova.commandProxy.remove("Accelerometer"); + remove: function (id) { + var proxy = CommandProxyMap[id]; + delete CommandProxyMap[id]; + CommandProxyMap[id] = null; + return proxy; + }, + + get: function (service, action) { + return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null); + } +}; + +}); + +// file: src/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels (arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state !== 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function () { + if (channel.onDeviceReady.state !== 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator (origNavigator) { + var CordovaNavigator = function () {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] === 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } else { + (function (k) { + utils.defineGetterSetter(newNavigator, key, function () { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} + +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function () {} + }; +} +if (!window.console.warn) { + window.console.warn = function (msg) { + this.log('warn: ' + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState === 'complete' || document.readyState === 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function () { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function () { + pluginloader.load(function () { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function () { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function () { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + +}); + +// file: src/common/init_b.js +define("cordova/init_b", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady]; + +// setting exec +cordova.exec = require('cordova/exec'); + +function logUnfiredChannels (arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state !== 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function () { + if (channel.onDeviceReady.state !== 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator (origNavigator) { + var CordovaNavigator = function () {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] === 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } else { + (function (k) { + utils.defineGetterSetter(newNavigator, key, function () { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function () {} + }; +} +if (!window.console.warn) { + window.console.warn = function (msg) { + this.log('warn: ' + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState === 'complete' || document.readyState === 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function () { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function () { + pluginloader.load(function () { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function () { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function () { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + +}); + +// file: src/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'); +var moduleMap = define.moduleMap; // eslint-disable-line no-undef +var symbolList; +var deprecationMap; + +exports.reset = function () { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function (moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace (symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function (context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy === 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy === 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function (context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + +}); + +// file: src/common/modulemapper_b.js +define("cordova/modulemapper_b", function(require, exports, module) { + +var builder = require('cordova/builder'); +var symbolList = []; +var deprecationMap; + +exports.reset = function () { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function (moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace (symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function (context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy === 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy === 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function (context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/platform.js +define("cordova/platform", function(require, exports, module) { + +// The last resume event that was received that had the result of a plugin call. +var lastResumeEvent = null; + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Get the shared secret needed to use the bridge. + exec.init(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + function bindButtonChannel(buttonName) { + // generic button bind used for volumeup/volumedown buttons + var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); + volumeButtonChannel.onHasSubscribersChange = function() { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); + }; + } + // Inject a listener for the volume buttons on the document. + bindButtonChannel('volumeup'); + bindButtonChannel('volumedown'); + + // The resume event is not "sticky", but it is possible that the event + // will contain the result of a plugin call. We need to ensure that the + // plugin result is delivered even after the event is fired (CB-10498) + var cordovaAddEventListener = document.addEventListener; + + document.addEventListener = function(evt, handler, capture) { + cordovaAddEventListener(evt, handler, capture); + + if (evt === 'resume' && lastResumeEvent) { + handler(lastResumeEvent); + } + }; + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); + exec(null, null, APP_PLUGIN_NAME, "show", []); + }); + } +}; + +function onMessageFromNative(msg) { + var cordova = require('cordova'); + var action = msg.action; + + switch (action) + { + // Button events + case 'backbutton': + case 'menubutton': + case 'searchbutton': + // App life cycle events + case 'pause': + // Volume events + case 'volumedownbutton': + case 'volumeupbutton': + cordova.fireDocumentEvent(action); + break; + case 'resume': + if(arguments.length > 1 && msg.pendingResult) { + if(arguments.length === 2) { + msg.pendingResult.result = arguments[1]; + } else { + // The plugin returned a multipart message + var res = []; + for(var i = 1; i < arguments.length; i++) { + res.push(arguments[i]); + } + msg.pendingResult.result = res; + } + + // Save the plugin result so that it can be delivered to the js + // even if they miss the initial firing of the event + lastResumeEvent = msg; + } + cordova.fireDocumentEvent(action, msg); + break; + default: + throw new Error('Unknown event action ' + action); + } +} + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); +var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, APP_PLUGIN_NAME, "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]); + }, + + /** + * Override the default behavior of the Android volume button. + * If overridden, when the volume button is pressed, the "volume[up|down]button" + * JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "volume[up|down]button" event, this is automatically done. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + overrideButton:function(button, override) { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, APP_PLUGIN_NAME, "exitApp", []); + } +}; + +}); + +// file: src/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a + + + diff --git a/node_modules/cordova-android/bin/templates/project/assets/www/js/index.js b/node_modules/cordova-android/bin/templates/project/assets/www/js/index.js new file mode 100644 index 0000000..f6d6793 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/assets/www/js/index.js @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var app = { + // Application Constructor + initialize: function () { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function () { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicitly call 'app.receivedEvent(...);' + onDeviceReady: function () { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function (id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; + +app.initialize(); diff --git a/node_modules/cordova-android/bin/templates/project/build.gradle b/node_modules/cordova-android/bin/templates/project/build.gradle new file mode 100644 index 0000000..569004f --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/build.gradle @@ -0,0 +1,54 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + dependencies { + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:3.0.1' + } +} + +allprojects { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + //This replaces project.properties w.r.t. build settings + project.ext { + defaultBuildToolsVersion="27.0.1" //String + defaultMinSdkVersion=19 //Integer - Minimum requirement is Android 4.4 + defaultTargetSdkVersion=27 //Integer - We ALWAYS target the latest by default + defaultCompileSdkVersion=27 //Integer - We ALWAYS compile with the latest by default + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/node_modules/cordova-android/bin/templates/project/gitignore b/node_modules/cordova-android/bin/templates/project/gitignore new file mode 100644 index 0000000..6e52445 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/gitignore @@ -0,0 +1,14 @@ +# Non-project-specific build files: +build.xml +local.properties +/gradlew +/gradlew.bat +/gradle +# Ant builds +ant-build +ant-gen +# Eclipse builds +gen +out +# Gradle builds +/build diff --git a/node_modules/cordova-android/bin/templates/project/legacy/build.gradle b/node_modules/cordova-android/bin/templates/project/legacy/build.gradle new file mode 100644 index 0000000..ef22971 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/legacy/build.gradle @@ -0,0 +1,311 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +apply plugin: 'com.android.application' + +buildscript { + repositories { + mavenCentral() + jcenter() + } + + // Switch the Android Gradle plugin version requirement depending on the + // installed version of Gradle. This dependency is documented at + // http://tools.android.com/tech-docs/new-build-system/version-compatibility + // and https://issues.apache.org/jira/browse/CB-8143 + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + } +} + +// Allow plugins to declare Maven dependencies via build-extras.gradle. +allprojects { + repositories { + mavenCentral(); + jcenter() + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.14.1' +} + +// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties. +// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html +ext { + apply from: 'CordovaLib/cordova.gradle' + // The value for android.compileSdkVersion. + if (!project.hasProperty('cdvCompileSdkVersion')) { + cdvCompileSdkVersion = null; + } + // The value for android.buildToolsVersion. + if (!project.hasProperty('cdvBuildToolsVersion')) { + cdvBuildToolsVersion = null; + } + // Sets the versionCode to the given value. + if (!project.hasProperty('cdvVersionCode')) { + cdvVersionCode = null + } + // Sets the minSdkVersion to the given value. + if (!project.hasProperty('cdvMinSdkVersion')) { + cdvMinSdkVersion = null + } + // Whether to build architecture-specific APKs. + if (!project.hasProperty('cdvBuildMultipleApks')) { + cdvBuildMultipleApks = null + } + // .properties files to use for release signing. + if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) { + cdvReleaseSigningPropertiesFile = null + } + // .properties files to use for debug signing. + if (!project.hasProperty('cdvDebugSigningPropertiesFile')) { + cdvDebugSigningPropertiesFile = null + } + // Set by build.js script. + if (!project.hasProperty('cdvBuildArch')) { + cdvBuildArch = null + } + + // Plugin gradle extensions can append to this to have code run at the end. + cdvPluginPostBuildExtras = [] +} + +// PLUGIN GRADLE EXTENSIONS START +// PLUGIN GRADLE EXTENSIONS END + +def hasBuildExtras = file('build-extras.gradle').exists() +if (hasBuildExtras) { + apply from: 'build-extras.gradle' +} + +// Set property defaults after extension .gradle files. +if (ext.cdvCompileSdkVersion == null) { + ext.cdvCompileSdkVersion = privateHelpers.getProjectTarget() +} +if (ext.cdvBuildToolsVersion == null) { + ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools() +} +if (ext.cdvDebugSigningPropertiesFile == null && file('debug-signing.properties').exists()) { + ext.cdvDebugSigningPropertiesFile = 'debug-signing.properties' +} +if (ext.cdvReleaseSigningPropertiesFile == null && file('release-signing.properties').exists()) { + ext.cdvReleaseSigningPropertiesFile = 'release-signing.properties' +} + +// Cast to appropriate types. +ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean(); +ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : Integer.parseInt('' + cdvMinSdkVersion) +ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode) + +def computeBuildTargetName(debugBuild) { + def ret = 'assemble' + if (cdvBuildMultipleApks && cdvBuildArch) { + def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch + ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1); + } + return ret + (debugBuild ? 'Debug' : 'Release') +} + +// Make cdvBuild a task that depends on the debug/arch-sepecific task. +task cdvBuildDebug +cdvBuildDebug.dependsOn { + return computeBuildTargetName(true) +} + +task cdvBuildRelease +cdvBuildRelease.dependsOn { + return computeBuildTargetName(false) +} + +task cdvPrintProps << { + println('cdvCompileSdkVersion=' + cdvCompileSdkVersion) + println('cdvBuildToolsVersion=' + cdvBuildToolsVersion) + println('cdvVersionCode=' + cdvVersionCode) + println('cdvMinSdkVersion=' + cdvMinSdkVersion) + println('cdvBuildMultipleApks=' + cdvBuildMultipleApks) + println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile) + println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile) + println('cdvBuildArch=' + cdvBuildArch) + println('computedVersionCode=' + android.defaultConfig.versionCode) + android.productFlavors.each { flavor -> + println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode) + } +} + +android { + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + defaultConfig { + versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode")) + applicationId privateHelpers.extractStringFromManifest("package") + + if (cdvMinSdkVersion != null) { + minSdkVersion cdvMinSdkVersion + } + } + + lintOptions { + abortOnError false; + } + + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + + if (Boolean.valueOf(cdvBuildMultipleApks)) { + productFlavors { + armv7 { + versionCode defaultConfig.versionCode*10 + 2 + ndk { + abiFilters "armeabi-v7a", "" + } + } + x86 { + versionCode defaultConfig.versionCode*10 + 4 + ndk { + abiFilters "x86", "" + } + } + all { + ndk { + abiFilters "all", "" + } + } + } + } + /* + + ELSE NOTHING! DON'T MESS WITH THE VERSION CODE IF YOU DON'T HAVE TO! + + else if (!cdvVersionCode) { + def minSdkVersion = cdvMinSdkVersion ?: privateHelpers.extractIntFromManifest("minSdkVersion") + // Vary versionCode by the two most common API levels: + // 14 is ICS, which is the lowest API level for many apps. + // 20 is Lollipop, which is the lowest API level for the updatable system webview. + if (minSdkVersion >= 20) { + defaultConfig.versionCode += 9 + } else if (minSdkVersion >= 14) { + defaultConfig.versionCode += 8 + } + } + */ + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_6 + targetCompatibility JavaVersion.VERSION_1_6 + } + + if (cdvReleaseSigningPropertiesFile) { + signingConfigs { + release { + // These must be set or Gradle will complain (even if they are overridden). + keyAlias = "" + keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph. + storeFile = null + storePassword = "__unset" + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } + addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release) + } + if (cdvDebugSigningPropertiesFile) { + addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug) + } +} + +dependencies { + compile fileTree(dir: 'libs', include: '*.jar') + // SUB-PROJECT DEPENDENCIES START + // SUB-PROJECT DEPENDENCIES END +} + +def promptForReleaseKeyPassword() { + if (!cdvReleaseSigningPropertiesFile) { + return; + } + if ('__unset'.equals(android.signingConfigs.release.storePassword)) { + android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ') + } + if ('__unset'.equals(android.signingConfigs.release.keyPassword)) { + android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: '); + } +} + +gradle.taskGraph.whenReady { taskGraph -> + taskGraph.getAllTasks().each() { task -> + if (task.name == 'validateReleaseSigning' || task.name == 'validateSigningRelease') { + promptForReleaseKeyPassword() + } + } +} + +def addSigningProps(propsFilePath, signingConfig) { + def propsFile = file(propsFilePath) + def props = new Properties() + propsFile.withReader { reader -> + props.load(reader) + } + + def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile')) + if (!storeFile.isAbsolute()) { + storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile()) + } + if (!storeFile.exists()) { + throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath()) + } + signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias') + signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword)) + signingConfig.storeFile = storeFile + signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword)) + def storeType = props.get('storeType', props.get('key.store.type', '')) + if (!storeType) { + def filename = storeFile.getName().toLowerCase(); + if (filename.endsWith('.p12') || filename.endsWith('.pfx')) { + storeType = 'pkcs12' + } else { + storeType = signingConfig.storeType // "jks" + } + } + signingConfig.storeType = storeType +} + +for (def func : cdvPluginPostBuildExtras) { + func() +} + +// This can be defined within build-extras.gradle as: +// ext.postBuildExtras = { ... code here ... } +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/node_modules/cordova-android/bin/templates/project/project.properties b/node_modules/cordova-android/bin/templates/project/project.properties new file mode 100644 index 0000000..6ea5ac2 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/project.properties @@ -0,0 +1,13 @@ +# This file was originally created by the Android Tools, but is now +# used by cordova-android to manage the state of the various third party +# libraries used in your application + +# This is the Library Module that contains the Cordova Library, this is not +# required when using an AAR +android.library.reference.1=CordovaLib + +# This is the application project. This is only required for Android Studio Gradle projects +android.library.reference.2=app + +# Project target. +target=This_gets_replaced diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-land-hdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-land-hdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2d564f49c90572edb628bb3b81284900ca3b52f5 GIT binary patch literal 64368 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
hCBf)Dr&$DVb}3l)58S$$;mV4&Yz7f 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 RGuZ$D002ovPDHLkV1k)#T3-MF literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-land-ldpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-land-ldpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..c7eae7edea4f154bc7caeb903fe2502a0f69851f GIT binary patch literal 15341 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 LNkvXXu0mjfO|L?x literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-land-mdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-land-mdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1ec2e90e9b315d1afcd2385eb93c8eef640a4 GIT binary patch literal 31136 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-land-xhdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-land-xhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..987a92462cb24a451657ab5f228db8b033f7b861 GIT binary patch literal 142334 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%0D-_Hx}cffxf0z{WdwuA<0Ba* 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-land-xxhdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-land-xxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9fc74003955699bbdd4c3846f9d8e78b0bc4d5 GIT binary patch literal 227190 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⪻ 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 i_#Pni?;qcV^M3&jQ^Tj{F9o&$0000zt~d={nt2 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-port-xxhdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-port-xxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6bfe4a89abaad079c0d631fcf4c399ebb3f49c GIT binary patch literal 211817 zcmb4~b8{xl^X{XKy|Imr?POz{8{4*R+qq-gwr$+8Z9C`r{@%g)bYERH^G8qB)KtyX zRCk1eoHzn34lD==2!f=9h!O}0cpnG|p;|7HUGH&#GEz+x3-R76WlOUuei|If<) zqx?Vq3l;yf|ETJl-of+RZ=0$vec(J;2i0Cov;W$IL-V*IfRek)*1= zh@!TDjJk%A&GO1heN$^#T$+iUhrX3dOiB)LeLXY3lubmDS5l2jT!m9qkyS{J>8~sU zpA;RB1PzxcHM^^FZ=O0Myp{7If!UHSUi{rWlo z{(1cQ2@MT3OUzX(Yz_zr(Dsk^_4O?(D)R8~aB*?5x3?Ex*q4dQva+%=H8s`M)s2XV zFf=q&RaI3~RMgbe%+Jr4kdTm-mEGUl2d)9vf$Q5_+k3lvhX;oZ-x9|l;GC(FB7!RJ zpqHBwu^SQ#?3M`yotGcIdroL}{C|o3A&7t8*NvRXOK6$W#@0A2-|zgmdq!Vg33d*= zyyI@}`2If!c%!`@8*h^Ovv$}%zTS;rUYlBXFRvHydz%th8~tCsy5BbS|CjpY!Hw_c zj#%B}(~Or2@a^&TO}x!J+e`H4hmYwjeYQ70e0KG<3v3G@z|Zja}dfAjF} z^ZE8Y{OkDejc*Up^A-H)&ZChZy+)q!hUfUf2Jg-u>EJX;T*v)zee#md@T9xuOOZT_ zh+H>Uh9&OdH}KNq*lwTy8G!i(WVy(W#oy{ZOO$8+Aq-bLeMdr6v75TnAK?)H_EjtR zoGrrfBf=?sDareAM|EiGoPB>xuARjlJvQ)%7n*%(oPv4mS~XwY1oQnSq@kIb2`x|I z8z>kE8+mvb2@QJDszej8y~ECAe%8GAPTHPI8P}qB5@_L>xpt)_<=0lu{fPq;&^-Xc zz`nJ2Z8STLD1b%bdOGd6aKXH8zGVk;Ub^RE%56I)_JP50@~+Gvi6tHI-K^jb&zEO&yEyV1X(Ox@Ir;9)f_#1)V0}@(&SuHK^ctk{ zzQzP>fpXro;`LkNv^}*vvBmBB9;@m3?m)-6@f>veLKT+S%~}mgplz)YEO%YYaq~+Q zZ1w=?5O*Mu>q2E8eV%8k?%B4YZ}Jq(Vj`?bKU4P(-s!McV-ISe4#XG-8M^K!aEot- zta*WW&1OlcT6R0UWvKUOL{hTXSZ?!F>hixX8GU>#`aA#`6B$OE4ztAK{_edHzS~rN z9yiDo@--U+!#%rx_+A|ylKcWc0O1%8l%C$mHcAeGkAd$`!k_WoySo7xI$XAHgOUfY zL%=G*-`><!)G*fS?QA{>Esfyt z{?-HfO0Qb39e=KM18B&3uEGzEY+s5LA(SNwxv%K6(2(egZ~>;>vgEr8p15v^xCnJW zPL^#2M|1FHcg9exvU$(KlG#Sl5Shb|5u6(G>^p+n2_sui_OH5=j@h&NpZ0cvNuzm} z(FeA=zSZ$Ti_xB35F3QgV8V777j|}qv`UTSLVNg;m;hH!mC@vPp28ILhlU*| z@i(l@kSon69n(4mgAZ4KPgYq`cU-@aTf-to6+5I*vMv`v%IL(eI!C@@UOqUe+)V*> zNS_!=jeCYd7jNUENI~H79$x%r(AftbL(?Sb+0xP!#B_g@;kQQi7DLUlyWHl|a2lfk zqcJz*GrI#Iuc3iq^2zX?TxWQ#o>xK=eY^4`V0c-@h;AIAR<$Uooaq+>A<_rt5|@8P zZm)a9jTlWGLXwJy%%XI1{D6LmKv(BdE_^3v#|8t|dVu<&V~Bmb;aQ5I@5YJyapXfZ zi{5AMhzviQfZiBuXNDEH4zr8f%uCGH%ISzp!kFO02}3aS<$iLb4eEwHzzNVF=!~n* z^u*az8aRSA7(atJHA<1nUoC9lZYtAwkO>OAtX=q4Eg}TXZy)hqs~_D*!o2vtcD{@m z6o$xJI|!O)bRb~~pPzhEySM9Ls*te43Uu89s4IJKpZ?kTB59bJUVWoYUs!!6o@LG~ zjGqXJi9~g)hFM`OUxqVZhihCYDqBI(JSf89h(X@^5~QMTVUHnO%a30bZST-vJ}A6v z-LY{SyJ;?2OB7}_B`qzqxm-Uj)Epkj|Man$>jK*Ff$jrA}#yDJf21^o{ zV5%S z_ziXrGOErGr;5HFIX8+Uq0Ofht;ebRN?e>DuBk?ywp$x_!&ilaY7eHj4}Q1S8)7)G zlqo7=|4ecuhdn$AZZZ4lGH|nm@8e|f*d@2ye$8D@O!hzXmIB|Bj8XH?{hPkWBX0#m z*)s?np|xBg@;jc({`%;etgv%}JMuocpOApn9$ZAz;rY92FQArZbx%`>TwQ(2Y9D-X2STwH3N{r#OjB!v2_ z)a=&%S?QE^7}s`)l<3Xa?eV~pVFb+5nJnwy3++BmEaIFmTj{WWO1OVF8hfOW@8ZSi z$4Z*@(CeyTbDXKDKr#|SMiO#`RT+Ix&5~0&7utcxTl73bpb1f0llZmUd{mlBVaF;u zLP2tHMZclV8@?c3&@B1+z;j2z@Dg{GbuWie>v%?Nn{Y440c4`-cr|qmm|>?u+3MBt5iTwiFR|w{08_y_gz&E_SrutqFH!+Cio!;w~9LKJ70{M z$rFWH`(T!rOn`NbBfpwJL21h??bZEjj8C3<9)==Q9B#nzKq?YBK zJBV((y7{3(9+a|y21Lob6w4tAx;h#>W@gI#&Dr%#xqJxQ*QCg(mdlZ`?!cOzK)723 zW_YC$~Lhw;7O)sdRmnhnuiA3Al?khTI5PI*o)0?*M$M3@1CGpta@fG03p z=t)g?O2v)X1}!(aAeY$-(in5x=RnGy!81x=+Fa4%{)%s zCH^Xjbn@XCJ;q>nzJL)sv8*?)M^mO7r|?hcujj~vdpRPybd&rLwReCMtgqP>MfjQ~ z|AqD6+9J~02wgwLvI|Y7xsTk&e`1gPF9LBVPO`x}X}jij^`x+bA35#%HMg?str{4l z2xh|eOf>srS*DmJ1Wa8gw!e_Xf`2y|?de$JLki3%2r_x?EnRX{O#r?lCD_y4_EU0U zgV&MgOWlL1aF@FSU(rGH#34^&6Q?HoxW#|#a2~HTg|{mB4HdrBq$G-J5ll(j76z<@ zt$IpgbFG~Is&#Yz;6(CD^r8f{fCaJ6b`^0B_Y~v8g&6L{&a=zXkWugPloD<|xE#g2 ztqVfJ=Qg#XIoD%7?wPz)-a6~P<=p;g^huGC`pqM5IJAn&ysbaB46zP@uH%CobXjz+p{<)`+)$DERBW)Q5id)!&^Y zK$0Qz-<~0XkWV#$AOC%JllBsO-?CP;q&9@EA1o1*omZz0+ek|;+M3V6P}>J#Itnxn zr?XAbkosFLcmR0lMMWA(@SjoAK8bRMFKtlM8vWl=xLY=b?MaLM%yu3$7;cJG2A_ zPHJ{{BGvn@Fany23R(b52R9<2kZ^`Ov*&NEY8OPK^K@&;0j12i5>XRxfv@9`2 z5rvK%M!}9tjSes76hv>dR-CBG3;j{gM4ijTNStr0-lny4RQ&lk%5d zBzD20uNUn0l))oK&E~Tbm!#EN(Xd9e5fcNP{5eTl#B4{ZVlOnEPnRR>XzfKhCy1W2 z%y^Qn|N^XCY1ru<8AQS$E)t$tOPU6zy7WW?G1vx6D% z7mb-NHy52O>7;d1j;ah>IF86y%O`TD!`o3xVV&UuuQl@=0qs zkTkk8XgA6@#du17!>)tD`#Y+PMs<@BmT1)l5863fM9Kuak)`~x6>eCvNjA$~RWv;~ z1R>t3tOg|6LQ&#gBa(z@YZ;G2*{<bIMaMP(~B?}u$7|Y%wa0u_P7o_~}z`y+x zc0~`e4Y`eKaCF9g^B!jjz(wGaFYTgs-^25keu*`fh!#881$I2h^U>PLs)3=5;&^eU zCiO^hBo5%KL!jEBq?0pvM?dR1($7VE(56+yiz?%dB9=z2u3LgrSx;q~yB8DOs@GHhCc zCSlo&eweE%en#J~u+2s*kii<4D|ORg>m*xoWv)>0GyulUY^oDZn_nI0vuS9;EJxzX5S_rd2&?72e`|%sDOdd?S83m+;V!A4TnJKxN&qXFB`e2idq zSL(F@;HkTe9DoDr15QQe!pCZs50#3U>CXU=Dx1C{*m8IdyxAROY@-L-U4#r*t6Xt( z{8BGNXWUCSlZlxW^jlY-y0mI2yO)&Y=b2~zTyx0$ciB@> zFzmA?|5T{!Kb(o_s;;NenB__`GuTArmSC6l8^ANbK2i%Y|1 z!cEgDCYX8K65nxSR*%&uqu;GCv|JD`ZBS=sepWN9xq@G8ic_!&pEMl6jw^b5s-h(m zH4qm&WXnbVnXiz!Jtvp_loy(j=3yahjGd}6{*p%OT0GjBB=w|A;!%?+JXb7(xHyw?{Mtaw%iQD%^ei&?5WX%TQYRLRHj|BDLB1rN(*0!m_ zVQtWW^`j1nYL~|L2p6ZlHT3XUy--)l)Zx;ds!_SEP&6KIR(+WKyAP(WsmH{uv%s8e zX8DZiFwcvTnb2aafvZb*9lFCt&a9W&rapH}r}Qw4+*LqjqT1La^2V(=k~0&O+_?*- z)TPl~JjU|!<(c}-tNO?CP?b`Bv>SQJDSqP^@aGCMXSLp3F(Ai6!c;n$XnOS34qI9Z zQNUep&qWnlDwmiY1=x*fOv1Y#P0vR?&-bXUzFfh;Omc&q-gz*l990S{SYgc~SY-K5 zrpmyq_7{5df3L9BI!bmC-^A0xTS*m31mQ!IfISnYxKjG);GQFowiv8y>{4{pi()5$ zw6mFK)RDtPP)~9+)KhB9ZF|jbl9MR5Xa&`tNpo9I!6bTq$&BuZ5_fselsK>andSLx zsdMvD$k8R(Z?JcRiAkc)3ef({Z@43SCV@lMQ+OphPvuoxgerIc>p&v z62cj2k?_CV@>&2BNw?~JC&^06s&GF`Xx3j<0L9sUGnv;>536TlT=67s;{$=*V8N~q zc5&9^it^HMh^ZTShXv=a5f}1hOy~>9JogKG5`vzwYCfez_m|?lKmE?|afgTuGpUyg zqS1**fo(JUPS7v{wRLUDJZ`FxN)Kj_?GpDiV^}V?7FX+-`R5xV-_olbFIB>4@RZn< zaHxAU=|#4P+t^`WleHCJgE2%2F&1Q^DF^q;58{JpP0wUou_SO^t=g*7ZM(1zO}q?*4cPvXeRDvQqtt>8iUiK~nFP8sS}B zs}N1J7$FY6vn*+9QW-e|?hO<=BM2N$i<2 z?e;Tv=!iFLOIV=!S9;j02_%lXNZyem6Yf$aiXo4`Be$KI(|;VBBa9O!(8q^4N;>n3 za|rm=QCKE4CRQiTS;DFS*@B#IAr43GV=dQlU(~FBerb9*Y<|Hqo8;Y5E0Xnw&6s_a z5G%x%1nr5^6Dc#%Tt#TcQ$w>{3S!sP#3j>(#oG3bT-{e4gY`{8eo|xavoAlm7XYXK05t6C$vE4I#;z z+hpSN!8xCdL6G7G4Q$pjEriulLFQL~9EQtkM55Qz--+j0Aka9_Cg0}bsPqz>$Rb>F zhPGEllt z1_h=X(uWpk22DsKCKSYnFGglA_56X6;>1zko~>Fn!wJ1RAEzCNPKh4!zp%Clk}5cj zVXl~tCj_7ARI1(y*QTt2m#{KI?~!zJM$ZspUj3WA{cB&!XPkvPS6yCQy}5Fu$y3n5r0+&O)+KS&$Ng-mbWLOJ)_~HQux$eY1ep#kt&2DY8Zr17-^dTy|ipcnqqVb-a$i zljIUjlNvqzWirQwrh4p#0qU!vMB49vD6|;qi+$t;yGcSNmHWOo7f#YZv!yH$&M=tt zu1=DHAQ{uXX1THwCe%W$N_ z6oLAhIA2Jn3qsOyu-Y>jS1qZC{+kuN)44v}$cpkr68PX^Im^(F52lSL^*AD0Ip7J= zdusD|s?CdD)ddzO6w>Rkueimz%Q?5y4_}~-OjH?A;>aKfFe?x{-;h3OwWJz$ODD9E zG}YD-maSfLZ6=uc#iV=ktBe<&BIPM$k7;a^F!lJz73~wcYq=1Xb)6o9LQfKz_xJNe zUZO>EDJPb1?^eAh^#NM4Gd7kStP21ULHdxFor90*P$5Wv*(819f}D ztcz-HF*UYYSn)~or?+n9;Y1i=Z4nnG7Bv!T>g>u&c!}f6>vxB^8;2T6WjR>)nt4PI z@8^i+zxQGDM~ztX-&v+>!&CdB!P9-L=L<;=df5&QK@xlM_3z~uRx>xpn79@)!Mm6V z4%)*Ec4CI{5k(Q2B*L$wJd{~+c?T_@YHd`|)6#pZKBb4Wu<`RfWBgW9Gf9ZW#H109 zVla_a%zs}A6q%>zQPunnNdNkJq?E+Yp)uga#bwY{!(kTT{1V8-IY9&49|foz_TW6+ z`AcuRh|gSdG-$z)hv>!;o26iJDk&6X!*izyW|luGN0|8Yk$Q;T?Q8EJ87>*Nh323B z>%ap<=;P>%I!UJ>^-e?!(o<5gG|v zOBmE)b5Ql^1(a8c%J z-3`&SA~i>iv6|9)f@oUDN_q5VsT!m|!NRpmpHT4HZizOKG0_OMga>IY$ST?t+k5|< ziChR*&Q`{~;QaK*8ff<|Bay)obJpU`4EV$V@Fb2=wgpI4;5(Im3675nuA_efNmU4G zQFoSCLe$Po^hW@Ii+Jl6XTb;M(q?OB*9dhJ(vCqOhS8JJFLLyWgK4dKg^BpkUt$EV z5-r84$*?S6N+B|^mBoHU+s6AN?GR_nr%1p6(Tv5IR_}HE7Q$ zA4Mv~`7`$0M|BHphsM{cWFLAs9)6}W>zD*F9QQ|C?g@7UYC_F&lp zqbZM58JN8b_GV2?OQ#4`K zY*NINbBytLV~AJ^6k~z zmQD7H?T{dO34sSin{TFEUb>4>Mygso9r79UUvhTvY;E2~iHYZ4?t(Btm7MWqf?r~@ zV>@)sT32`9QgQARErCSx4Lv^+)0)*z!~qyZ@daLq)X`J2+tbC|h@~`!hscK40x>0y zMAsDX5%y>FK^X9HuqHFKIj1yLiSaheRKa9Q47**&JNHC*@aCU};zYAV_JG;Li$}M1 zuVX-7ILlDBm`*88s>VGY$?1Ib{veL*klGNq5Sx1|Pkitx8<0cN$N@=nW>#m`TYo%7 z*ZmyQi1%bvEb{d{0g+q1c-L67gfoFHx=JZ(T2%FasSEg<&`aG;_M5Mi64}DjjywQd zVb^ueXW9%(g^`H-Fe!(>%w1drQ9ldDJ?w3ayJfb%KU@eJYTcS(mJ*!2IPVVKw5mdO z4|P;F4#XtGB7q7RrJ$tsPAlEwnZ}3V=ruv&;~}7CJO84?)lWLU^gh6}3Zy&lmk30X z3(^oDP(Ll~D6nE6W!u>2Fb*O=Fpe@3+~`YQnd)5RxbBR8=C19q8QYG3lsE-=kcTX`CCKW_Xp?@2cWdc$=quV` z*+1q~p#0rsiZbmRmX2RnvCm`|nu%NcQvRYj0gxKhD)Q-0x+mP!IC1AmKxhU@+eDL3 zW51$HDk;!{+7D#q~Zt&IQ__{ zHcHCW4M;SoIVjyD4v~iJnLy{n3C;`TEIAb^)t$xt`etGflKmzfZrn?2Ff!V?_pf}R zvd}1Y@Lx4jX(DJV8}H&i=e>bsJDUIC@qwQW1-B`Uj*-!3g>T#X2{ztg9YMx?VQ=m9 zVP2xhUAVE;r?2NG=OQ`A!W#oX80{Yexd7JOkTM5b4?3_sAae5V2l}4JMdQq)*|=Sg zZ`oR6uRc;QJNWrd@`S!F0K}BA_#3<@UaM&&?JD`=T%{wt7|z0S%GYP^;DbF=} zU2OA7#!l6Xt}G!CzF@L@d;Sy8z}2IZV=Uy_*_9dnc}^FR>6vjj0YPZGgZ|rL;M*KkJ~^J18J%=yiREl_kJue={5R(6|eIG7Il|#}WO|EBrv%m+Pe8=QsX( zXVaH^vZrSUvU705v}>pHP4Vt!4gWgYYW{-@X)ix0@bh_aq02D!^X2%)t6}!Df%57_ z%VMa?|08U#O}`OEj`P8}8<5sMG_xD$g2R)*j6WhG|aTRMw7qi44(z%OweH`<%0 zL*OF^so{nD_`TET8i<1yUep7Pxb3fXR^@QZFbjVWqm5FXpqaX#C= z@xlBxWr}^}v=M`XXta5-6k<;3+GEqHzq@l&c0GDt+Yf#k4}`i0H=`_9#^6AM3hi!f z1#*}O44K(!Iq%@tLi)bF{{0OXZ&Ao|qxfg7tqthDW5!H*;4X~M)cw!3ZNmtb-QybB z(rKfo-c-q=pe1{D>sO1L3G+4n9w5ibB@yR}NHW{lKVY3QKC>v|6+Y1c(=(E(|1kb7=FBHA;l6w*%ojR`(sPj_H3LB zew_zxA0W@($%FfRlUqvK-!(qUU$UC>aGJFx0f~N)1@K9AI`to_PH6WY8+cr~I9Q3s z*f6^a9b3T{P2*{GGl66GN>6xX&*)bixoON=UCNqA?z%YM;4w&jbG+l1L~(S_Xhzkig#gZ$aLD}-h#CV200`je9?jnAyl z_U-bK6JIJMylTVq%OIB^fMcE=glEA?VeDZ3Y6&A1539U!N*Kj|iu0_)0;|v$l|Un`I+GT5ET%s%}a8xbN~jYm(jx=~^0u!l+-R zVV3PoNG6PU+zhIABeE!3_6wsuU@qr9JX;N?XG9{F@!bF}d)#zIEP6HcpA}-@J#ghv zUd6=+F|9t1`%XgJ%Ro%yDmx91-zNGGDjhgzpW0_z9cxo z9z*F4o>8F=jt&H7*IwN^O#&|xwcW8GVe z!|}bXHGaRxKQu&?!7I8FLzVDd6Y5wP83Im3!Kq;i_p)a0W)HET;Ov~1xDk|)jbHh{ zhDo!A;xMrG=GRux5=?LVnC_C`Y^F@J?3^T^tWOlQ0l#(29MTc7WRE*gL@ zmRE#)=;rXZVe`_rOi*Z2mN_6gcP#iogpAOeVgE)nEz!awidD>rwH%a$7!ieFWEz)E zPL=^fJUz1&ZJqw)Aanfp~R)$12FO*nH!=t)0 z-+YSp41BELe0*{F37U3>DcAd55XH&>3OETl$JD}J!-qei|) zwI*vi_xJRtIzk6Vsn0_Bd~o_21@SOjZ)YgoO08vS1wwjX&NR-_K1y+d&gE`d7SOmV z=2y@pU2$ah}7S;>}` zr!nsC=m52*0sx`O5hOj7bSodZ#e|8QHHi?y9`DNh7q~3i-=Y3%CC1xP27W45UlXKv zW-Ll^+~@}jK8(q=0JG@iDjsBT`3|8#IQIHh^P2ia_%Yp+be-EK^An;O+T#RBfRpJn z`@uLRAg>iWjuatItjNpga7ris3^G)hs;E@|B@_Va*O-F{%3#gRQK8=uE6k^Xsw z<>Xi6*&=rj2(AHFoIy@+zAWySghOF!5=WFGbrL>d3NRCY*sae$?q!I~>Ylbvm`*vt z(!=on`U6!FvkqyD1GAPYR%vMhCF|-g2JH?acJaO#Uqka5Llx*kLYERXlAzW}g=Xa{ zYKBEVM1=wfAky4p@tSv?)3q-Rhp_$*94JG)O$HrfMv#SnX28vpTQZ!WE((RPyw@~l zb%%m&ZN>WUpIA&EwVOcP%|9D2d3PYdtVI0l(ybTKB~AEs9bfn1(h%$0PX|x-SRT$~pwrYJlun4M5!asR z5hmNiR%9Cpkyf)AVZe@;ApbwpMZYDz3T%lz^WL{T{=O6%v_z@%$7UZa!dNhQDd4JFi1HD&Mf}y4;b5{ zP}9J}<8D%#ou0W|ONgh%|Lb6qh6;p~rXwgM1@WHX-}T&%V$gOK&S+S47Ycyz7(~Lk zK7JMZyEqa zvy6lt#<;`>3rBWJEF?ex_cy#X2%aQ{C}*=@bqlpQEK5IxzcS+tHMecqL((BZc-Zi` z0PfI|Yh8p5jPB1cmC$+UV`ALa6fh&OgH>{aU}otYqZDoCZu$jz=%O`l z-od%BojUKDXjA!t&(weCOfUwUCg5uyW8dHitl~KqYmqENn`V1#K)1N;L5W^8cVVA$ zE#V2tSd=+PkL%$K`dh(+-iI>4UYTX$2 zolL`Rfgx;a8ci*9afUQHe}cEu>8gs-EK8ITD?TH?gFwhxm(`|85eJe)((042IKBTb zg&r29kEnsPx)Z3d2tW1whYS#tY8o`0^*4V1J`Q5mah_y-b>szGd*WUH-C{3BXg^G{ z;?W#Z37nmWtvo}(3tye%O1H77&t?pqrPWPT&b>*ju1>!+_AtAqzGbc;KW0GTtUnOn z9m#@O?r|PMu5KA-1-s4>*XiBk(2f7O5kG7u9nU%ReGN_4W@}NE_lbh-3d;cWw~g|& zLBAzuI-pTcK3oo$2~T z=ZlZ@J(?)f=u7p_rl$`lLi&{zGbnRI5__n+^OS615i;4GpO{yJOS2g_<25`ZrUq)d zrc-QlqLVc3s6y#KrE`0Xev6VxZDT;;J0!STn4u&g_%35bd-JLa*yLu|9B?lQ^HH;~ z*kh}x2Brdc2`_xbxqla^a(`xrm40HIl;h?j;8IVyBP`D`-nNUdvb$Qe>7!DCwRuPPS3>LKFxes* zZ{*yj%f{53y5Mk*JTdu+QQm_9B?(^x*`vMvAy@zTyRB~~!gfQ9K(Fu$*>+xn%Tqd@ zZr$08wVGijub$$%f>d5&yHqk!Y^+ZaQAF3=Dg*24%CAf0W=2fCd*J2gaBBnXng;_t z)DsbsfLM4ZZ`cVR9$tikKDTqhnVWU2@X#d3OjWp7D*N+P8!)!~F|_qREMjEPqi6jR zi(OC`)4tS^KCa9N8Vr=|WUZ@$hMY}j(KEFF@O0b##aZS_6O zLm}%5xBB)19>5=8@t^n~(#6fFO=NU39J2$gr7*TBDBy4bixSx=f&q0;2|cjM`@eu7J8FicpS?ZuJw7nN@z#qT4|j7_~i!S<7`jQfjy<&#!)dV z-Z%U3vP~s6F4Xc z;?J>BJL{DvZ;Jhr?xXv`Z{ElM0{O|uPY3<+eSSyRCy+t?yR ziB#|m#fUwCSLr8^pF8xk&AhGs=}DOT)jxWpcl`#A^~@sRw{7#4f+XK-3;c5NyW%|o zjPri@?tr}W{r=?h_iB4N@#}`U@nPETdwsG40#07eSbsKNgTQ8jzs8}v>amU;Cb6Nr ztvKyo;i6xM$4zQ9k8bs4u@| z|Jb^HbtDX3W8v|S9U)2Fo$x?@KBa5 z__yBf)Y9p+$d}%JoAr(kpxt&$tvBx2^{;m`?lCOv>~!UVmg3r%v_M8P9s3FtJDG}m zg$WRT1PTkclt96P>2ElWmb@UWt!BZq#SP4Tcsv7Y;nO2!+^;utLcXT*rP6hHT+Zf~L+n1!dhva+xeeZ{@%!K7TX!F@HRofqd)i_nVn8*I zXHss~yZkBknGUqI(Z6PUb1~!e%AMEXqnHnQwcdhoHmFi2_T|26P{+cn=QIc41q$D_vBR%ZQA>5gXL#yNDLz*wz;k5h zxR{@2rJiIM+M=&Uo`6C%{ATCmLj^`%AMa+(Rb||>=4^U{m_bII-YP)AwvJb4XT5*W zNE~+Q57e8sdd-WOb?|qZqY}j@7 zMAP|~6!yt&&Kf3DQik@`v7{TE+S8KkrfFrv?baH?;ci0loU-NrvqKs2zFp^fwg|t9 z^*OK>{?UoCz%CK{oakcjV@ecM{H|i&idkSz%ykAO=8wFxJ^wZ#)RO9OGg+wJOo$Oi zlw3)i?RIgT)xqEeW4gy#|bF&fPUe>ts|DBfm$piGFJt zX!6J<{fBXwc;VU;lz=a&@0qT^Y`=R`Y9aGb_lKNdPCOCMeDRJAYjLPVM(hr$&qpYf zWd-W(L1PRk9nNM;qx4P{UC;6;Ufy%vF(Bab`fe+wOI z&4shgUR(^boapE|I{ei3mtKq&GU(TAlN1AR*aYC+;Rzrsn4cX+LfO|81LUN=$ z9(=e#Q`h(P-MM{)#o@J|S3a=lRIk;tBtyH;dNHT^roAtkLE_S?KGZpDk(8XQL0q@w zAQ6WyVkJ+!&zRMhR>)mAXAn7b)_rDHOtQrsfzZ`X#uszD{2G>};4i#a2ugOyal zQ)R;9MqY@7i$x>n+SA}jUG*U?SpVy&rz&-3&f$|p^tdKn`SzN}3;n~^MN7(HWYLX9 z%oy&A4(n{fgXP_n8MZJTy5{FVxu69Ow+P1HRr$$)o9xbuljro^tT+5!A`-XOqIokTh))TLx zp_j?Oxu9Cf5|+*rG`PY%OoDW?K6E7iXpa?9goEr@pxE<~wO@-Gkg0 zC%cZ2iUW+v8FbDe?UJQOz|@2t$V{c5Mf`)qX?%^I)72oC6Xo_I>!?jW)l2+)^b6`Z z>elJ0S1uJUw`dkeG6T?CO&Z0RDPQg!J_<_dPV3JGOonE^~PTZ`+j0JR%qY|g_Dy)G=zLWuT@g=CAH8d&Ix4o&M#;rQVB?U6} zqrL(aTX98?KYlqpErSfS;9IxIcw+5!h^1gE1zwGcWuBq1=;4OZ5C;0%FEBh#SU@6h;cOJ@~(?Lsw zjZMbD@?GPzjGo@d3*-Vi+hyZrf9Pp6HF0!1c%qOJJJZHD$24KgzU z;qf|{3I5ql!goql3jYFF;Eg9_&HHWJ0IZ`8eCaykcx0dOtvd{dtVeV4hU-hLKC*U4?(~NbIVWG_X|eyd({(=*ll?auz)p%YeVuHSr12nOso=lURe; zo5R^QU&%S`s%4+mG~slXeJY(xD${DSc?fT`0+)&aC>dg9MBSpE=D&2Ms%-- z_-;`+nP40QeZ>OrbfW!g_qrj@D2>6=!=>Z;vhG#+#K@?c=$y;Mo}WgTnJ-?@q&M;F zMfNh_Xth=k{!W9OPT%4W>A(eAXubF?Dc% zwVHg<>3naV&}BXMl%_1oQvgO}IJW$1ON@Y}c-fFH47t&1(OE9D3Z}r1yoxux7)<#3 zd~1aZO89!cRji{TR3g}+hM_UwY=Td26D8V+v_;$mKdF5v%R}guaF_UVGAh{^lqKu~ zi=$ut7BQ#}+<48bI1U3AWQy-UgCK2nP>Mld4l&^63cKdRsrTKph=<{m z3@wHbgJAoS9mR>&=N_K0Zi@QI%zyO;I$8r)cE;ms?=#>~q2yMw6i4cE2Fw?<-&sA- zi(3VAd-q}0&^66Y|=o__KhrN`MX!*c|VaV14xK$5XY zNl5A$^?7^mS!)G6IDlJN6x28CZvH;$Tb6zbi_hnY_B0GX*P~lNc>2>_l zkc8iOWoW;ww$SKwi^{7h!%xV9_*d zSr7~fMuS8Uh=PUrvX!h!WD{{Sq>f=PZZBh!JuMz;yfMQJO|*O!1(Y*5#V*4{2Alnq zh6#%<#mI1pUphTE6yT_$d9?-+_(&~I6@z#C~)nW3!L*=#+qmSnKXbky2OzO zYzVU41#gqPihV&i4b?JK9p>7kO`-6Ij(k72u)@VWx|eHs?&w6RcfIG02XZ!i3ifI= z2I9&u*Vwv3uD!Jjj_dW&5{M8_2{O{1h=5}Rc#}=+NY}a@OA|1(yw-$|;E{Kk@iB=E zWg~2t926D>2XKLHd3V^7NSsW|Zcr21iEcFtJWXLdVCd3&`7Eozla+a{E*#oZO3~Ng zQpb4PIJj(VP7(1n&(qdkU0Pd%kz|Ty6djxl;Xui|S=>MaxvP@CqBOl>Db2^=#FjvT zeq>@ad9_SN{axJmu1v6!2TSWXmK@X==hcG1BXK;Dy>^Q?byoG4e((?N1SXoxO4Np? zK*XMX$gWN&tx5GtLFkB*ITwd!MLjiE5%4ri5WJjZq%}sfpQ4-m<-*b>T|QAB@=?+v zhzltMWfZJpDvvreY^25t3fW`=ymF(oL|o`GDRg4Wm;GJ=QAWACjLd7}G6T@aV;RS? zwZ(Hi=ol>n){e>7oC=0WF8L(vM2VGQsUjmq7n4yOTF_6F(KpD3$Ta*27_?_TL(LmyTSqb-kEv`DqeH4RIh+*`zF0VusFnIKwUjjOI(ynLulhT7 z=NNF!gR_3I1$&WXUiZXq5hJ; zxC=Zaf_5oxxC4)*q$y5AEB9XlT4e*0e5?{Qb|)1r3<5)oKaCBpC>e|QB_s^ijx$ec&cTOO}?u%u{Vg;1Iw}knw;Q&2Ie#%;&2W|1u%E zo7$cMyPNEIoiqtUrho#PT0K&aFnh_`qr35N2?O?vs8&a2UOfXq2uyNLRJzRM;M1To ztFtUBdf{hJ^O`(o{h`xvtneX72S+4`0L{1a!7&=h2q;@m#m#Xh=;6cF;wwB7dOkbT zV;GH%;hWl>rAv*a;35EpWVDixHs6|Gz36~bc*VjPLGNKX?>PA3kc~aX3x5sig#4*B znsC{EhZq+?R9+bpDh2yEBs$|AMT6(HR?_$`?$%qd*Rht!P*#(%Y3jr|_}ODX!R58C zCU>>=T>^#x#-;)+cH9h`ca3U>COYNHM^mf-k&ZUPy~A`-4mTI0St2PD*qlcIqXs*~ zbi<9RDRD`l6I zhgk*3ODChuQo75jbeR%xisUQRiIYSvNlLO*6mlFNPGGqWV>m zRC`MH$GlSG4lEfK`oM7m5bd?LqrUV(>u7A@CL(jHgX!^ZrZNDt0e(xZMBT7^MRRR8 z&Y15QhTIK}-tnA$Krp;YI&W(Sh&|1z#ebB4oDkW6Mm!|lx7xBq&q_DvsGJdsQ?)*v z-x#ntQ*j%FfE*61+xjqItsgMV!4yxE?DDt#eU=0qTI*eU(*971iwxKoSsjcj6{HB! zJ#d9SKmYmB5(RAx$iWa9#E|{UC*~#@q09F3i-1~H zpRAG~8I#r4x-&Fb((f8}4k#7_LH{UkGnqhZ`lLbD3%HVNh8lPdOlvpBH1Nkf?EBnE zerB-f9@vl3@y8gf$RmjwUDf?Dt~uHZ{9(ZEZ9xxMa_iF6gs{(j;DG^lho1%amH137`+2^l?rj85LriQs3?&`n!fcJ<}!d73W|Nv=7&rM zb94+TEJ^p~$87R2^f{0~9Eh>}y=}b=*0W%$UYC;q()+`#GG2&g|r) z$zJ;;8^c+V5QPED8aF-_p+_|yOF)@C^L|iS)HO^E?MyeYE$!W6-LD1J9X{=YLq9Xd zrskh=-0^m1kaKXPeb1DmSGaA>TzK2>18XWBT-84S_pMD2T8iB&4&Rz=9hE{G6zeOW zqr12bus+?(sBIp|_$l6iD5sY`e}r|qhsO-{9uhU8-F}{0oXTi{+dqz zE-Ua2yuCtO8+tKd4tyrP+d&RH2DoYlNhQ^^rN@jAWA7M4c|7l#aZlLJQ!?P`d2a?4 z-rV;E_RcDuYZF`J-7ZM6#~fNF6fNzqA+RYKhQ3paiQdMd`gf1Bw81N%cad+(k=*9? z#)AoqbH$VWHTPm@kVY@%t+8HL-CWGlwupi;Ph zCG;U5EAALO)87y?_lzw*Y)UaPcRppKo_XQ&snk zxWDi(&-=}lg*iTBghoE!!Y5MQ)0J8FZuWIKG9w$t$X;JI$Db;^4BQQS0BfXj_;sh{ zgw*{}@%OP(!6S0M#ol{<*E-tjd|%B+iOP2G#R|DySA=va2HMg^#u@qE{gNo4;l~Ta zq|e&QvA2mU+W+${`!^?(@P_|&KX*e~*87#eZiFUtRlP|jIb<{N-JMd05Vb9z>ymxM zHBR^T*gLnrx!V4;+N1(ckg!s2@)9~F;>TZOxO7IpOx);EiNdkp@rR4{scCQcZX)n@ zG&kT{dJEisp9H~tefgX9C|e;a%O2ESj|a?7spKmHsGtt+FVZ$A`4yG>#I7BT4>6Ts z?-AtsdDM7rHSWgl;~VV!a;H-zzT6EZ8lPWg5>d7f=vLq+UCHe#+$MX?o3_{=w%}}? zbE8WkVC1?o3-eCgu3v(I2aL(wW{hD$UJ@HR`++#nY?YIm6+_|tfDK+s?s{~BY=lnk z6TH`}VS+DPAe+@#cC_S!;ImIeF9zZ144PbxBQaR1@N*D3P-ENf0|no2`lQ3y0P354$o+5;CVG&6v6Rbx{vIt z{n``am3C24yb!~$4Rm$>Y2R}uh&ngX~7Eahqd4-wu+gVmLh zr7%%b+H7O2eQ}8Gx`l!@<8bz212!))SkL@EQj5@i!oPCEn#&SBlE8%>PDv}BShTqm zGsN>dyChN8NuO^JP@L1{RP{RhErnZwo2XDHRvwvnjzNVBa%h7%`mfQQBai!*d=pFa zq_REB7`z=;6{-^U_R_^&3BofW--q7Ne7B)KsJ-4} zG1oTGP9nv|($ycug|U;E4=?zUrS0M6F}SFVd=9pl10Sn}h6%wr|ELrK9$^9EU%px! zbIl?sG#pjA!L^heLlCH=pL^RtPNf;%&^A%LvqO2{@x@>Jc^PHJ{l(=Jqc^RLw9f2- zKhA+Sj}~qMUIdK}vlqY;m?Wh4B&@314c}p26Jm5)>(3ZMKDwmveOFgAVJCte&>*Ls zkZW>;Al7*05wzyQFE()CU2Wzssm1QZ)6Y0Wn+3>Y&U9FbD}fx~Lm!Im4oLj$$0pEi zvp~Eu9vB)G6&8ogGX?-er0w_MBNo|D(6+FTe68#Rf=B2ixn_OaWEPCUq^NT8r z49J`#MPr0teCD!7IU1@UMnYez5r#m1u4Tr4>WjT4LsOdKvs4?)_ryB&O1;`T6VU0# zOv1BbNKrTpKRQ-$SR`v6njd6=NX@Cn1M0@QgH!yfry^m*b2ggL%|U{{%P;XF*^Ak@t!5vm3Z^{k+1FyW$Ugpk&_S#OkdVQ8 zTvY^#rb|?|#?k)JwsE`~We7c_P=mEfuUlRCQA;0KgH*iY_OXXS#Rb8vYxV`Rk^;c< zAJaHjzUE6eQ*&3ZFFFA*ewFLgJjl!dYQMq=&4IdT2!Uin>m0lJb4Xdpfo)af%B}e8Mtp2YEU!^u=GyVPE_zLRiTqo%+w9T@~1XgTw<5 z*2>G6!$8nr4ZblJnW6`RJbVSebU-{YN+Q5c_~q-D^N74e3W>vzVg1Y_9O<1s_ONff zAM;J}wwC{IAT5)p7}3TNR0O}?C2JTK1m&8+;t2R&Nj&}75^^#@0jy0R@Ra~%)!2{0 z1W`%oaXKgMdQmnA17HRi#a6Z^E!yqrym7!9BkvGUFpr54%Q=zoC4fe2Diuha2_rI% z5j#-d%&#o-%wbZmVAbgWh%~0Sd1iJ@NE~=2Zud1d;3hlSTw9_Fo!NV$aZT=P=;Zh| zE3Lk8fC!F%2Yqg#ZEZY)oq)npNgiY<`B@+^%IqK#7S;Tf9s>Y?wGLoB#_)edY=RhD z(GlgQ7pJpZ_xv7G1TlRPM$aE`;0y=TJPofA<=@gKc-DGU_9Tv^GnmPZi^Uz+o5*N0 z(3E~pP~mVK?M1Sk%^DMnW^d&(4&e<<_y)Yaow8p-8@3|A{9>%!H)5Yzz`UN*kKhnR zrDmd-Lo|sBNl0BNPlZ{Vh!s--nG;i>8f366mj@JYDmW}>atwTmZL5k}YmeZA^ShmB zU$89IiA5eb2=AeRa4KWERh9FLNWw9=7~Me)@jMG2ZwZQsHot>4^k)GbkIEX>ziGW3 zXox92W3XklSgqg@d1sx6_9tOb6 zgtT4|#UnB_nILq|xpX9OKo0v{RkiOyMD^sxD)|=I&J)aL?Q9^Bn|1&{vBL`Dn6S{$ zlgUVN7IU-Hnr11`BOdJh=m4m?r`1g)_Pkg_y{yPG`^74%vKdhP3I=@SDUZu7h(Llu zsEdF;13tKjOHv|?`y`6$1Hp57V9f$uoMG&CZEvUxURZgUvr#TUW}_`Nc^V-nLEvmm zBP}FdFYrW3vO79ZE?A>lIj7+sfx#E-i@ZaNZkV)6nKCAljCiIbA+|E|yfG5%+ z57CaUBnD)Oy_p|fkrjam(s%o6TP;H)CSv6wjYIRI0B z+gS0dB(1VA5vV-RNT0p@#bxXya=YPH2y>T-hZsi+cyabBXSb=y>7(57Nkn03g5!6NnbG9vl6mpPM9@{r`AekjFQH@Gq zi_AZk^wxG9hMngJIyhVTB*Kdz?K&$0Kgz3EbSXCC*v14w!m(3OTHA4CHvnD61fT+B zE~vi?9@gvg_|4c@)^`v5v{~X7FaU!X+e(bDpif6ijA1(TC6^H!(!sy>IVltdlyL=D zD7bE9rpJ6}FgkKG6U?Lh4Ezla6lP8`qLTwZF-9Pwv<4UZD!b?~$4bHo)tfOTpbpFC zwlDafVEYw^3|;iG`yVNg6qL%#*3Ns3d1u03J!2rrON%fexJW&-u7T*qnt`Eo*Z`d= zT=wz=4nfI14^hvMFV&BC^kj`d?-;#6Pb#}zocv@#M?iddsK>2-NHQRk_?RvW53vnnpcLVq83Ov!wXS_YO`O@)>Esmg~9APGqQS2Fw8yXJEIB zLT`lOfM4|l8G>QkW(sI{kKA&Akx7`OF|#Z(n=4~kWAnC{URWw`|6W*t^#R8~o3*|- zgYuLUO>F@{hC>x%fXT`5fHAr-pk%6MlHfsM06PD?Dgsr6O(aL6uTTBEeL4$h5f{kO z3f2K*fS_`y!~cRazC?F`@?akQNF0d006Sf+~|Fp_ETK|sg(2$t@p!`OB_ILB57 zYKw$gLlR*A&9UoTqi$%TL)uby>m-r_j5%+n`SEg0gCJY?%d?2Ir7SoteQwFVymwUp z-vx)%>!Sv0N!mHNo>!9qcE!)|)fOEM_IH05W9gIwD8Z7ySm1m74PSj`7r|Hlg$X7Q zNG7b@!LVMD8*Ai2=2MMmo%c3)YniaS`!;q@n~cnlZLIaI)?3O1Rd#kDz9?!YZ7b2s z9F6RrCKEp<^JGw_Nem9<+iSy_(a6%cINw0+O(?pc);z19&i1SkFxTeL4dX117VK$z z3Q#(FvmF_d)Egl94KB|2&sL4Aj`&S`c~dWa1D?Vf|1j`VoF@6{<5>xf$IHV`6W=MgjT9GAbR@vG`@twpC;&9`h_TsB;YHVm9oPK(`e{ z`@yfw-LmU*+Q>-T$&LUb0Nx{!a!`NNMK=MA9Q@-lFm{d^6^veh ziGs={JNtAxOiTMJgp6lyem5br76Pf*Nk zF~zsNf3E|$^sdJCRXJj_{AaR8K3d@50~%p^9;n?&-WecKC$!}cYXS=2Jpwdf7dL3-aH>4{73*J+v8){ zvEq$#%eLDx{{0=^kBtA90>&2~DnGWSjKf)l>C8r>(#+f6n3 z$a81zZ5U{>;z4+1y~3gYiC$@@6k)6kBndbv$@8$17W4;&ripzr89G?G6pa+d%M ziOXH$UXRVulBeqcu3kRvQdcYRz7^UE-P=+G)_Bl%XN=TX=wy}bdS!w1&GRIVMvroC zVyoWwYcJy8t5V_L-&Wk~Z5*x?3hun#{e;tf42L4~J5yzEvw$6C{aZW8bFT|DSbyWR zAdCH`M>7OWH%3%X!NX)7TA^6)`$dGZ08njP>AqC+5)3qykn3CGVKA;VBZF$x(4ZeZJ?J(LC17?OQZZNTdmm`7BCSbao36t`xYyH zBXIB)TZi|)b_!tl_)z=$Y`u$9XB|k83%1SjP?S+6*k!RR71^AW-_+I^J3&x~X7|SM zx+)+ID6?_q7&TY~)%#8>&*tP3+xmSQ{Urbso-5SWajou=v=O*BQ)9SH>Vf#%P~9XA z=&-oRW}dyiXs9a8F6~%zI?DCY6MNSq#_l${&ScclU0j6iPY@l^H8ge|aKmoTty2QH zc1URG8Ge~>beDQ)Cwq22R9(R8y>4}^VZOh<**C1$kM**x`<>}z*M?&k@K}sF>WFT` zw_2twh0Dc*6DfTU;I=D$dDJP*DG*^I>cW!`St=_fiAafC_A?<_fBF?e*rKNjHNs-E zh*I>prcs4s6%RKCSiAvp_OY7B?Fqo&q$eKtcYVrIUm!~3DcOWaG)Sl0MB-zkv0+^B zGbCA~plRE{?o03PM&=DpbY?CFtmt`#ndV|1uI$U?>3+;NqD0#yxSC<_;(^7RJDG0tf||9pW>}^3;HWL#kslHa0=NO|=D1ShFo6EK#S`RAQAAk~O;XAh+Q4*&s?y z3_eore1}Ddv=40MaIz>$_Eyd2>l|@3fbL?0!nB&}Fm2AOGB!5eeq71=a&o`k!05FL zn{&iqq(GpaOky9HCP&7DvXy?4PIKmiwaCcJ?)Dv7Qe;z?QsXl8a8~3y6jWZSdJ;N; zBVSq23fGX*p%q7tl8PV(1cP~(Yxp3_wKXEH&Zn9PxM&E;_9!v*WbUX)K}K2+Eg=kA z&Gio?!YzeP$zs1|+wRl_&Xt$HE^L>RLw}4ZeCu@Gqh-P!hB-7tz$x>jA&?Fnu^wg< zrjan5!@FV14+dGI4X1j+!aYnhwORmrTvH0q2s0{Z%!H1;B7>QcOp|A{`^C-WxFIa_1Dif=IT7 zqla~E&K^Fw)-YjcEW-?l3bVwcqVl4UtZTW^W+mU=d<6MaHPv~?Lf5lUR6u9=VItx%)+y} zX-##?F+|!d=-obZIcNJ_T?^!7RQExO@3C3xZj5bg84~KG;> z2;#Fp#l6W%_UMr6$8VBRtGW< z?vh7otEwizsk0`Vn@P*+4ddKaRy(EhMdXesR@l-rV1(+`^*$;eNVT5`&gP*G9opP zn2ak9bIm3F6O+286^^ShL)z9BFH?OoNZZzSY|2xdlnLaLBpOCaqD?CZ59pp-y zXH=nrp>Rn(5w_1FzkhXg=l-5V6XiM?Y6yX zjWZ-|)eBAEB)uQ-6RWCQo#V{(4lZPC>Q+?32#q<@bBIN73HF9 z46XsC=ZB2S!17LZG{}pd^5?BKEFdasj~|uF9ko&EXITKeSF%EPlutnzk9FAYSFSDj zzBEp9^If`mj-8t*uIbPE(s42|keIHmlOQva?H~D=U?>3vZs5tY8E%h;7*Qu&%zZge z1pWnA+PB`mX0KbFYa-piz9`>}&64tK#;JYV|25!IBJ)X-A=)@}j-_4CbluPvn#VHQ zTcYh#7$teAJ5-o1ZI|@oDVHym-*@a@oUnBZh0Q!XGag2cD>uH~vCvT4Q06rpQ82LH zh_w+Ti+SA}tXXmova8v-6=%0RQGflQk$`i3iR>##ZPvLa@J(^OGFd&bdygO0gs0u; zEq_C=pw4jdRcz#5HUek+bv1f~DP|s}B%284Zgk08c6Ldu@KZo|l91%$0g?_m9IML+p#0LMZ zur*ix+`fm8;hp^%S6i`}dtAd(Tdw<~mX`e8-opJA^>Wp6>@SYWV?UaEJHOrb9ivsJ zoXWKjx~}^*0N+-2bF|p6<@w^;{k#+Vxngd=?qY#s0N~r^q?Cya2xM=s#}&n0&^+W86KR<%Xg2KMIK7$ma3? zt-v1uf5ykHzy8cV0Q?!B@frV%Cg7w@0 z@sF3s=bxq%y}y6Ju+fC9a$)pch2+q{tQ-P_v4HA@xEP9wM)3}c($n%zfJs2fP8T5v8~hgXXpYL zWd1h0lm2HU#9onRlU+gb&UVOQ01usK-4J>pFBsNW=ekmrdVQw3b zERU7G484E`@3mlWSr(&K`kdvu6z}WfiL%&^7Cf$yt7}UslPhcvUhr`t%UmCwFp*)e zS|>`k$DPejmXV`y?6!?A7H-&i=iTI7&5n1OeOMQ}qbAi@D$sTJ8y)0>7Ro#|hzs4| z<36?3?X=vmanzGBSk>*@zO=*m2#38A`=r;;hRv+P#6Dl~$E)F)B3AS;*GQmU+M(+CI0Ya}65=qim1|l+1RAR^GBeYb zZeK-I{L3U54DA8%JU*XPre_W>ff&wAn6P~IyE{g~_}DSTU1wT*#npb%4i58=TAT?g*Kb=);64HT9EYO>Zo#e3uU4Os-HZp2S(^pzi>@>-z_5n^ zD*@N;D+V$*a#|ecd1<1fU-SB0u7KK_IDz^+4y;>f^?X)2T=iPWd?GgfQcmYyr`=DA zP(^`xTNZt;?1Y{K*>iIGYYjA?D zU{lSHX|N|nTfwCRqj6wtz=&_4X#ybFzVx&Pq_Ma0jc+h07b0*W`L`=2NWMFz*X-XYl3mWrk`Zjdah8(saYb-+n zaVIxWeucpoJCL9d1+&YLII)muz5)|Xv$g15M5(LJVBI@4MMLrf6LV~Gid>4XmI zEo&BVhYFpNHwh7em$*lBRpwGr{&B?1Zf4xzL0B; zS^A#kS8_3=R+TfsF73w5uVp5|_JsA=0^AuoCg=9zvyEm7NsQN-n3Yt<&1I5F?VZOL z2g;0clW-@>d3s6nb$A9gs`4iSLJV*|t?QL@(827Sv~rQaKf6RD$WnWNu-A-S+*2f< z#}kldK%BN{HBt~DmFj?0{nUDf(#i#E50^DYB8*OKOqkp05f3bd96m(!jwhyCcG5>V zcVRWMxo{DJWI;9F{|(2@PS7ftRR_$qElZ@4s;BiOPQ>Z z^lbIv45zgf{}yYwM6e%UyC$^9S;KwKMeF^g++TtaBWo3(ICmUWT;>qM>ZGM8@8EMT zE0%a~*8I}fzl~3YX8jGHpMx%6XRV-2hz)AYLszHf8PM*#Mdg3~QW? z4l!W0qAuo-({xt`7lB2|dD88#wE%cpyyuF4Izejg>wukw5yj#16;;S@3i52uvBjIe z*Gubw%hwAZTAU`5j2?^C^H_j=E|2?nWC9bFCjxT@Cmxs1E8gue2`+=o*~N3>lGbbH zr;S3q193^xPXhC?sve7%cV`pU0kHPu*ug+JE1Jbb@&6`|z827E5V)dvzP|p^mT>la zQn}uobq3&ZLYRQ!l82R(HU})Z8=If=>?`i<8KL<+RbTRYaeyR?#`K9}8@gB8urVd( z#<3WFY^~V{$`$Z7C`2^P$sl|lb2-&NAmQ}kH9#f}a(v(ZSFKDd*PcA zfKA#O8K_Pyd!ggn|Fs5e&mM5Y$&T~Wi?NJ`{jIRCgW`toIf6|*h`h1U3!ek{#{sEv zI6*<6E@yL~8d=M{bO(&2kM((x zXZ=Wwcb9#jdHV2u{=gER94A4|A#t!eGLDTw;RF$e9)PW1yh;Hv6@Tp;zO!dA^TnGp z_A!-|>Wy;C=)-fA9Xl@DjZ4tp!{Kx03}}4H+L4oLMaOdB-@mybpOxf#qWc91hxro7 zPH55J#L|LLp9VQ++Z%__wS0?}-iKEkHxrH9#xFjR+Y4<4I zulI_$3`EF`Glr6l#*&}vJ2vEMU=r^7K7nO#V#%2<&6aPOZ*_{ESSNZh$=W)(&FSMg zd38xLmRw+&%0fRoi`U$9${8^_HDi6A3A{Y=vT4y?jMvmuz%l94@3a%AkJ;$ILCCOP z!+zz3!Cn9p9=?WIpE?bM>N>iCdS}Q{Cv%>J?1`+ zN(*L8k&~cL;GNBWTjmg z?OB59W@0JqkLLJ+W%)(F$H6P>*KR+TtxATx<#O#{L) z`T0Qrudx7(M@b;qi=4iSCF{ojD?|nu56(M`LC!JllWoVM1%6-1OX{9u*3cz<=^tkC zQX8ugN-xif<4aqrQDbByrPB$$Xve6`r`&_a#dgrOq%br`R_5#s7GdJYR65oMdb0!@ zowD0PPCcbSkG#ufqmte5;xP{6(hpsb<4cd(Zp;EwYuoC5=Q&% zA4LcbY{Y%Y+9M{HBcB5&k}Lq80aM0$o)07V2*eq1@uhRj|66E0L-k*8V~{1ov<95x zXwPskZTK)4#15O$arN>z8`(HJpN3rLl%=d)?`S?U5HHh;aG?9ziaZ1?;3W9pT2t5| zw#^s#83?f2rfQC^RC`nHQWriiTD0@r&GiV0h#xf|zHzgDr#2jr7XL9N!CzXRs zrn61p&Sqi%>$89OpnzbhgjYb5~47v^~ zwU=2a{i0f93>>_G%#9_L3l;>D35fIO(w(YpKS9F8xog+5Ch`F2Q!>sx0)(gI7_=e} zpqu1_-p_*o!f7Lu;6u*&9S7s8$sy22r>`kUlkf&bld$RJ^qUE4*%h92Nh{DS(W5_7 zI=|#NzX2*c2^^kySZy;2mP~0YhL4#8G|Myq^ZbZ+h7PHaej0kvIQNpYUc@=J=14v? zDO7YB+%rCLG95I&!?qL`3YMojbUcMY0q#B~=IJu|Gt%%{A3%n{7^yJYAeR@eyWd-? z5pebmSTyq4PdLs1rC3aSoOS#)kw^wT4uZ=6yChgUXNN6dqGHnxtj_1f*>!ecZ;})` zarVZToI!}_*)_NHtE2YX{BPIKpUKXim;=b#gQO%aiZ+4D?WN~li_>B?OBqxe8W;RF zz=EcJ#D>cp6Rd=kxA$~9EFVhV^mCk}H6{kgtY-$qUQYsu3q>mFq0HQ-j}fub*)T34 zOdeBsY2DdF@+H~ZA@Pko#09Exe3Y=7Yho&YvuZ5&9v%*)F_ z)cynZoDQE5p9PP>1g~Uj0M6jxW1gT*Wc?z~u>}BwkTKA~xoQMnzh_TRzMQz9zpF5GhICV-#( zoqGx)_ZW02@ERKPx@Zi;vGZbto;J<~$*KNYM6m}Q+_a7dfvCZHcr8A@A>c+q`qAl+ zY{qF)IrRQ_so|qgl=LsZ;Hrb}nCg41BuGa=D7b&(0bKAm?RiwBmE14rvnyvBOmteC!~W^#t&9a@>S6eK;8taG0l-TOU*_ z#*6i~DNN%X&O*pGtr|2&7zP05%mDKx(3kHxJ025cWZD(d{K$&}@pRS`*Z9R28OiW3LmHkb$s=6L{(ay$tE?@oM-ncC^pPz! zcNZk5Ck+bc>xqYSeE4)>gRJYax64sYB|NdQG2px1AB(a3G<^Xu`}v{Zq8mC5f#uLy zVxTPmV+1KNu!mggC^9~+)ieGi;AyiH;_#g$um(Y9bw?&>^EWXt=>nugczzflAEI+} zy5ukoP>HE^7?5|>B&j7n2!uFUL4bgRR{YKHXz$q!XG0%52@-U-4Tp|=r|YR<^q))J zlW!yt_K~nziyR?^X%p>0)drE=X&jLt6PL4^+h8jO=WX6AA2g=assl6_2w`0#Fr_t3 z0ST{h1R+is(i>faG5$gk<3%nm?uOF?p^{C+f!|B0L&gmby`fxYH3o4(Ko$ga`Zx}7 z8;|VCu%(R*Ex)eyk1K$@G^ykWUPWNd86|^843TOLzzORli)6LTMV>>Ro!^^HIwTa8 z(l!=t6SE10rS5N@@WO|Ge$?YljLN~^N~dd7M)!ERDR`j)kgGinLMkqa{{VQ{Aa=*Q z%$0rtlcdP{gSl?w<0Cei&Gx4?7^C3S*)FxzXKhn#{3=8PZ^~R zaRZ}$4hD+cd91@}gP>XVWbHc0G(wl+_Xc$~H|g~Cr~uiXy;(DXt^KWdR0t9q$)!!) zegMw$t>Kz18Lf0XpOYv7`i-HUyeEc?*XU-Rid?yL(}2-N0P{i3j*MPqLnGt*8k(R zm+dHc8NfK8?6Io;-UE0)Xr>yp9d$=W_9cco?DRGO-Uhvfeq^pKQv+x}*ta)9E_`m% zD&4kc`%%Kppw|GpAN9&{QP;}AciXDl#46JkU^`7AI<4e~Mh`^eU*}mKWP(ZK0m-R;h`2M~|e}j_=e*bJM8>#jx z{I7HYk8-MFIOBe1x$cnq`P&=`&CtHfPaEy`HiW9<9?aKlj#jsIbKRzs;N$n6FE6iz zF0`+9WbC*h+sE6VT<%tje?KwhB80_s#pf{eG@3>#M_Vd@1{vN=t(|B7)Xf;94 zMCEg5D-e8kRUW9jiSO~iM%F|*yO7~N{vo)JTovfj7VtVW`gT3fQ7|7uIh%?5+t<{a zRc!?tW148sqPEy?*%uZQFGB2e&4L)Tb8$H%{&lMJB?c`bc3**OmrA*d`*mEc(}AS_59kZ}JhpH;&QYcLd&c zSewQg?U;_2^RN^Df?a!J-vC&F8a9O^a%te^_upqUzVSZGSXsV}Gh_gEuoaFqc5TjH zUVTBIZeq{g?iUkE28=Pm@McQ0X0=aS*7f72A~j0lr|sB)Qier}YnT9s5fd>&liy0xeGS?$QAX#h zQ}_Bk0CTUuJYj3*k-@~S{TXGL>JV0f3RPRR<~N}3 zd(G2aghP082kJs9+lv|fs{7hb6xABNeYTVKXTfpOVQs41F2Ro3&2(G#oRyrb?~6r5 zDVW?SfgsK9P&&|3JSEhB=>!@YDxeM8Fg=)T{)Rx#2WfiSr|FP@i+7&a2w0$|Ea8J( zY2$5?C0c{Hj$de^ro7#aEf}u%b1sHl=lVnn>loUuf$SdD))wxKJ$dFO{z5VV3+d29 z4@e+)tYoP0Ak5moAza#1?bLuaLm3VQ6eHn<4VuBy)Ve)hM||ZhsGVqU+q3e!T^fVh zzhB{N%;VXMJ0vr@DwM4V&Ktg2Acq33LVu0Svw+`08MlaJ>T5jX0qh z*LgiXqhVZq6hsc{&xoy6#JSLBO+gG^Ve7x@$y#an7+IBWIT@1!C}$`n@cs3z#;H3^Y7%ut6De}Jy#!s;7L#?FD52{E zVVpvstDG05%Gtm)(K=E4S%K9tCtP!LBe;t<=n`XJGPDv9_-U&%AyT6 zYc&@(XyUzrH*f*^&*ZI32A zP3)sQg@u-PrJv$l3Bxxnmy$ChS9OeKm~s(zY@5v*CUskLN{}WG-UDC-^4)cKExQm@ zNz|l14a?jqwmr5os?Ln$n%YG6Qg;_CY$uHgd3896ko+_>nqA{mzZ!3`PtUM^>wZ1& z`dnoCANItNZ(qx(x-&$D#@CL}Z~u)cJWYW=BiN@!EtbmSrGf`(VbjHqBm7jn7^xPBbu_Ze2TN`wbd;8z= z(N>JwT(I_plS|d6xa}D{($q%i&6KO7f9SNw=1YrYN`N1+U)uTF4_O{QN1VDfOA5m6 z*aTbZcMavff~{oPbS1VMrvd+NU!Pln!vq~tIWlV9{`#C2C@!h3*xq;5-MdKulxE%4 z%>ieacSZRZ=F++D{}dY0&gCJ297xUZYmu?8|Q-Dob1Et%+UVxjuId zbGy+KOu=-ay6xyv{TyMTF?+Kd`gLI2-j2ec>y)cD-1xFZB6tD7&$2DGMqHFwd>U6xM_#r~Tr+csr?XlPE`dLrL8aepn7mwCINDzu{+dsWj7-OZ@gD>gqJCZtxP zZME81dS7(*Zrg6#&!uy{wkKcl+b{T#xgdDX7d&qR_~(z$_>9l^i2(kL&-jdg{`qDA!{9SM<9{u7{_~$7 zC-+^-kNf2F5!>7s{@*_uMt4<*K;H85?LqgS+oJyGN7( z|8>Fp&yUxrBnCrZKkhkKgjVA8TNc0uG~7jYt}?4vxYz>qLO0kc82@~!gU8jRq|c1 zyroRnLA>|s&VIZ%RTtNgD1AOR0GO+;8z3Ubt?L^12^eOHg(jiRS-igf2k>un(s!fH zJ1>$K$#COH$b*c1vn1b+t?l~(ikrIU9vw#>D*9W`p$tc+a0q@pXH&e0^r_PgkhoOdj+%j z;9^}u^&O~olS}H{BD{1u(j@j%lmgl>XR(+_4)C0*K_C2IC>gqVlsk zDxBMtcYiM9WXSh@!6;_=D21x|k9=Ev+jmsXV&1QDimsT3tjCG9h7wFwR($Li)Z{T| z)GwWBiIu@)f-B#_Z$#5Ycf{X{1qdHAO?=Y{EnA<+n-GN`MjGX3Xmnlfx#nD(!p;E5 z&}VxD9uXwtLQZ0^_NiiSjdjf=!HER^bI!FGvfzZEtG7C@{K@U3zp2v z3TY1vvKvS1pV(ReYbO?Gz(zZ)=rkuWPq5}27JG{m42g`y8^KF_p?U_q;D;}{DMY8y z({rT6#({{3tmwshmJ|0WApBeU;3sS$aUO>Vag7bc%I`0BO#=G&)E^q`CrLimLM9DX zE(BnzvX=`q`4jl!vBEI`8DRL%+QAxKEVZwrwFNH$b#!IPC6{i^7YBtc}FK4 zU7zqzPZA?T6CB12E>UTQ0CYgC zK{_VUx5{PJn&07#E#(bGPd5T%NI-vf;1E=etdL@$6*zuJyQ5hc+wcoh*Xa-UAq%-= zVrfM>u}0rO@*?_3no!0u;*-$CKqvkPGPu_jBgnFMyE+9PH>xK`gWudjD;lFjNzc2# z(FyPL>pYl(iIv{8K);OQ6*rs3?HuM@A`w7Ku)}x8R5YhdTWxy?p84F{U?vl}>^X;D zRKjWaVgq!bLKPHzj~$ne^;Q{y0BuU4hF5Y}0G#V`k0cthXAIoH6dsHMS`|6M%#wn6 z;-cOpPNKH`UlZ=hZ4E5MsQhq>sRIO4#ZZyj$`m$+XEh>WD>Q6G3htg3+H7X#wZA>N z&f`$W3Jj_ot(`U*Fo6#`gSST8jE;;rPLlAllEZW88H4Yw7)~cHSV6xp;4K1%x78oZ zBd4%G6A_7*FNE#62jieLE*WGI=2k)I5IrJMfJaoKMBm$jiV1^&Il=9@k`o&`vp$Id8%;{FDDa(*&Dui+TkrH? zhWh$~j3#$tI~Sbj_aEY8CWaN!0XFD;f#>i*vDXdZ%`)gvUG6AIJTDm&y1RB&4bp{uqINyvB?p$n7!~=;7TJMEGXq+Zt0P?l>ix065ueIEeCFUi$ z27wE4+GYb*l}>jcr>P&;EwS_ycAL;Jk=QIu%&hO=@nJ8d(bpW8H*hi(Q3Qve4BrHi zgFUz#Ua?rG7BhMEYTgQk7fvF|dj8mvbvcgy#`2pMF)ucm!!H(bg3Jrii zdH_kQwuMUo65R6{M`#nkAbAZ;Wn{1E2hffjI8p7XGSH`zQ@mhjw+5hR8|H=9Bm;&~ zt3B2h?B-t@=8=Q&i3IYs`ZPi4TT`8Wp8`YotIg<0$Q9UQ){mp0A#kkxc98hbgzJ<5 z=9oNzM@$nJBt`Cr2uEbrZ9LBzcujdlpdz z2zbxQ@Al;ZWw6cQ9|zNCc^xZisNjSkyCzmyP6I$sWU(J@VI-)y1wu3v-pEF8N>-nN zp2W3nG@p^x&=9<4Ls|)sTQ&eBEP9$52*FC3GK-6b8NrC(#}>B9#ujGfPjq~wkAnlr zkwVBin=JR@z?oZ*6Es8vb{@glhb%zXL}K;fQO%(NoEL}TWL%Fz6fenXM)Ml&5r5mq zZiwOSnYqulU0C6?jPyo8PngL|_hnGp!#w=MSx3e5q6-HX*4P8sk7plS1AxK%R2%d&5CI*s>ulOAvm|Yj)<6Ly z!7L}-NUGdGYG{lHef@`tMs5&H?PQJdlY#B&3JqvW4>7DANSgu}uyOk08zY7!{W5FA zz<&k6DLb+nbSk*asciZL3<|0>shc3f9@Bs#zbXHCZ+&upjk*Tf8OJCC!1yN_FE{k6 zdl<~A6j9|nkJJIp7@mru5dacA$n@_bctHfVJrc*)4grf5X&04;PYm+WObaMvWW*L+ z^aUjIj}P7Ndm}UI&{uox$#<#4Z-SSLL+pic?yY3_-+hbC3q);u~6E|YdjZBWZp`xoS@feG0?P`p9~B{Rb4&h zpBG}L3>rG*AOMsb{pG>mQKAZxgjq^iz!#IK)$r-ZKEp9d1iwhnM1wx(?XvAweQYIA zZ<06mVNfKh4-?yAOO`Qw63YTJ5-@LEv%uJT5JUizLEA-Z*>=X^4K%>unfnD#AqA;M zqnqdw<~xVbpeEmmc>URtcCLnuBi++W9%z{N`EInjrP19ZkFt*(1YG2B*(RXSt7VW$ za9)}PWemVD2K(Yv3vcMC8~-JC5Ck0+g2@=o>SsLbDz?NnDM*a27YFcYY&2dFX#O$L zKC63^8Qp3}j46mw030El^L)0xbE+XDA{7q?C8ZwQfM4iB-YVT_@yryztJQBBjHvIY zm|a?30}e~H&7T)3kqNrW6;i3vZD|28c9wsD0NCjnYljtwFc-^L$&*55S8^N>TS1)Hz*=Gdj}glZ^6Tp({lmv=>K@nMB5C68_bF=3~jSn%pOBL5ySe9oVA_qL&x^Jl66USFP$cn?iU-$ z$a_b32;hB}X24> zpJ=poeUf7WN>_2%p4oqAk|e|`W{+3)WNU|SA!es^FI z_i>mwd*Wly?+@Ssm?oYVjGE_JL`FL2lQ!C0yTRW?|GvI@J_8cPiQXuC&G&g`e$+;< zWH$PJK67@MS2^Pl7`7ZRaF7kveeT%;^72TK(d+qKKNxd9{2zWVMWf_C>F)VLnQ9oh{$c`S7_^RSL5Z4H8;YpP9Yh7rl! z#yr%`CUk6H*rtokU7A~mRe`-CGy&$g34lxgBhEAk_@IQF0ZHsJ*FAM+DBMH-a~cb? zHVyJ{^3;S48z1VOW>DZ3L*hxgT}E&j4CX8q721yJF*F&}6!IjIM3zgoc?Tvsvo+30 z)?m;1VaEN~tsE*MTuUB;<($$+@H+2t&|^L?0A~<(0AsKlKteCo6jQs{7f*0p&tAQ0 zv$`k2Ye#GU?xf2DF*W>0vl$TZ4{4K zIXDCXAEPxZGYxVdt`1`nndu7P;A`B2L`z!*;)UT2b22|-x~w$>f&rlBnsI@8aQxU( z0-`&a_Gr9|kKhoC)`7$w*A3RkGcsN}uQOV`K2L{LeZ{-s{FG!2!Fgpe=jXs;jXn0$ z0c;1Gza_E{?I-`{^kt{r-)Kl8_{0W%MS_W!YfttrMcL~$Yy6D|C6SL^FIy}E0tX%E zVOMXte1A{CzC9!tzbFjD$4)fDcf%t8v0W7VN!+{>w+3+@^~D72R2Ci)QUGPoWmK7~ z9J4uHwIyH&YWT)@f+)1mZGb0XV7*t{I1SGwW)_w+UfDJ(sb=IhaNnF1BM(=~IKAa! zI~>?7FVx^nqy)(}0^Yv+TS;If$uukcUznu8&4vslNM2pJ=E~@J z>%rnXZe0IX9PN&hFcD7zfP=E%U7iYhSQf)CcYfDCr_oG8i@*3U$H-j#1+3?n{MrKp zYv=9m*2*m;kTf%`2fSwr0Rxz!-W0C^?VB-zT?sDJ6pX9^43A2}EATX$?VoxX(DVWm z9=6WOSlKU?b!keq9Oq{@g9zE+7g(2z7OhAwf>GT~Wlm<(;!<89aH?na@`H3MK7NeA zAH26~hu}j`fJx{G@o}Jp9Aa`b&75ba*j&bxZ01gq+2TnRqS(@p%~qaIV`43Q^DYPp z3{L{Q@VCU&nDH621quqOOzuVD(?Yw-sdf98`_x*cm>&YdSKcEwn2bFcEMG&VigvLx zgS;km@gE7y|g7U$n(9 zl-9Ra3!pvKHu>Is*Xlnv(7V(mjR0s?`ar$m&rE(_%Ar2L@^pZVA2> znaB!{oWf17Y2iD##Yd*x0=;xTRBRwBNr|6RI`;OHUtS!cd^NSiGV)3uQ+`r{<4ke4 zVlI5t2n5#BC93O~{=t26{s;qMT0pjY37%r;U|UhZ`a0iQXjckoq*XEz0OoZ?+C^BR-8C2qxYBGoM3s|cCG-B6l-Sf+Kzn3n+9@0mJg~Y4kO3J#sS2`O4rOsZ?N&5t@kuP9gB4wV9 z8ah$a{^-hi6u&u zRrvPez%DO0S4{)1d&dkM` zucZ-t2&@G2#d4W|T?8yFgunhS3CC~z%#9tSkx!snk4Hi?W@8H2j4pll7821+0A(H2 z6W}Wi#sYu>c(JVf!@A~|W8=(ZE=J@}ZHl{G6z!mbM{`nd>k-0Q>g-j;lc!S3%PV?V z&A-q5)q?43;?y-Co7hjCXaEd>R-_QLojBuk+J!(&5U^Z$}eOz9y>>RL9ZLb&Hm9y{@0woLtR}_|j<&?No&$ zmN_QqSK*BNvz--^xe;6UDC_ui&aYgWv<8Q~#7siywVmRosl%WMvZ?!hi+$-nGgegR zt{p*qz?@W@!W8a+3j7LwU>z{Sq6(q)V|}KP37JnH$Ku*k%BgoQUrE~mMzHI4uNuqg zI15`D*^X!{Z))fDQDJ}C%~duA2#u)4)r4V$ZXy6s8ZJhZRkdR$-A}v}G)6q}pmPng zA}T{xK!r5~Tt`C6grFC@9l-Z&6PEgN2G|p2@=zY+XXh61C1@M8*Lk!aC^+YMz_fqx zK@)ePpk{cK#poq0RE!nQ5h31_eE2hzJQTe>nRRUku*iz1KP+YKYV)>SW}s6a z47JqTJ>E(EzOey8O^jU!pNXz+Hw6^XS`mrBR%wE54X*~<_%Uo~pUPhG)mlSG$1%jL zUsyKuSR}%_@@IImyJRvkG5FriCy9psj;NnaYcH7gZ9${J_PLw>xuZ2M_SDrZb$Azq z(TGbB5(Z#Ql`jT%7d;@VATEVWDbo{xvTg~m2g8n1H$QhUTQVhZoO}u5`_qISK%y-} z@*cpOJn1e~pfLt0N^n8ic5&L1ODr7))3DQr%H2O4l7(G~vU{aVBFc6~cQj=4GzG81 zp>WkLz#Rr>13e!wkzx;bWx5O*W3r$1IpHl1RUAgE%PBe^sHuc;6W1+-1l zu@4VG9k`Iuna779YWCEx>;mUR0%9}XoDpR+*c&_6hG)Z}p`}ZavB=gVuxUyUz#0-q z6Qyy?GRn8TCi$%ZCZbs1(7BZb!pw*!!HjO_Ix3OnUs8Ysi);Zbvl@KmfLAKm#v`MV z?Kd-2`3#**zB|UY`0lx3lW9W(e8Yy+P{g`})&OS$LASi_$MD7+*|{|)FN08CMH&Qe z#|^r7!R+1oU2s~C%+Ae@#*Q6Ycr#eXp`SoAiHG>;@AzZvV?eWX)A~?W1#ASsm`qwY z40J$h%54lX#&pO#Wkr3Td3>;`L3SQsji9m53gA;Ib6hp-?sq=Eo11H_Z@&|A%uRz% zwoZG{n~@`4hg!5X0`6(F+c~m3Qc|c4H2V-F4}-tZn!ARoN;R1XJ`C+_4vWbV=l37F z&n}QLojF%ZwxrXvVIJD+O_!!~1B?T)sY{dw$l~E7s8f4aJ=baDXt2@10|`qrsa>)& zElI)XCUE}KssX}J(WU2s&@suJX)BPm_PBg!Ilc+j z*YtIF+X{*mOp0nWFX`28h5C;c(dn;8fxHZPHl+>cu!_bwPv>nXxpy+19QoFG zphI{K{yLcgQ)kcWi-X(b15+dS0V)0}m^bGOW|R+P+Zl1rIM9-<4#5OD-tjwtol*}b zkwXGO`t1;?s=T>FbaV8q9j6~a#>UTgR05};VPi8$Pc#l3?xomoOgbC0hQTv>unCFZ zP6>F|eMFgAK5s+eajo7?5*iHzHk;3=3NcciowHZr9+TTqq&aX$uWS;mv8P8;ZS)=~ z5J;TmemhSp3ri~&zrZ@!h|LeJe*0l=6YLq1ku}GMgnkj(tUmj!foh(jhx;#cNPxx+ zByZ$2D`iYRCx`xJlZ8LI&+8m*lkkC(f)XtY}P>V(2D8~lh&Ah)?si4y!FCdWWCPQhFS|adsN9*H|<-F1bF&@DJY%sX+t37 ztdTo{Is3d1bnBfYIMIyJ49v{#UHHn2li8AH@UM*i)?i?#x9b8_2MgIm=Zal#N;%`f zvY)r6O*nFveemFq%a$JJtnodK@qlhj(yoG~39AnX;Eax?PFrSX&_SWrj`glQyM!6xDxA@Fu-Up{Wsf@fbGeC*)9%cD{TY&7+PNwbNoWEpxCm-a@&|GMwSXd?vH}HXlzB` zVsZW5A-M${evKChXJ>>5UgWua9ZXy2OV7fv>D={k@bZedLG!XD>`68-yY#|q$(66r z7qP3JWK#mgf$Ry`0gQ^7*rV8)y=g#KKrz;qh3rA+GG@|wtBW>(A@`+ zThnopEYH3^;z=*Z+;z}1kLO>_GhA$rQ_xT4keNBSc~!7U0Cllze<~$}e=GW%J?DOq zEmua%U`sbQdN;5I+kS7)z68wvts>0Ot3zB8IdWw065*(d^To{Ld^Z$$eAqTu5#x)W z4se{0=~4+G@&!^I1NKChU_Ca8Jh%8xR)}*WV6#tS79hOA_W~ok3;fVcp&|e@n%w-b zSjiMLDGRGKf^;#BjEU^^BDIAH&ax(DBW?@Nmr+9iOkYahKv+;LkKmUrf=TjHe=d7~ zDBUArVwNqoLKogZ!oKq60;{CN=RodtAxbbLGFVTX-i>6Vz@UYkSF#rMOS22~7xVb5 zKS~%8%snAwrb?#*hKKN%YWVdh>rf7gfEWbBLwEGn?Rc4hge3!b3UGUaNc&=0-s+!ACh?Mb|eW7|QpCEVRw3WxI=dkS_q_d2XpSA_)|EbdZBGGL-xhrq=Z zETI?l_Lse_?I3{2k($uHctL#GNKgpih8BM)?Tnnw%2=d^YhR-Uu;^q{6@w-$9v0yh zn^h;+MbD~O$z53nj3j3u7c6D;oXJV4e--hJrGw;5t0cN$|FV<3 zle-yly4&~4Id3e%AIp{Th0MJaN=vo|94yO}$?tgJU2SjrutFZ;nMNtClE=G@ zKH+rd6&V4aSlVN)`D^s0yIdHZ6e{oTkVF&wm!8WGIS)?(gOl9ZQ7OAFGBFcWg_$VI zzJgrhK}L{M2w!xVCoj^?a37Be^OA*|V3i22AuzXISV<5(5uOHVxGwP4Wt{eFe@x%9*QcNJr%cr^)8aFY)O$>_2j=TzIT@QA-wE^BerJ;0Sq zTts*xOF51FB1aL~_3t3T1HY^xhKD#$3`-y)ceolP*$8m9eN6&kA>p}VAvS<<-%qyI zx~`fkOSkYhO%R6Vvjk$41BeL7I03z+tyQh|Ony%_kJG{JexBpA26QUNr3hSv0vi58 zEOu+Xl&ap_fdy1NlKW>~r4HfZzY>uulXf8&eF&)pl-v;-l7a=ck`!vKe4vd5V|uhx z6>d4pOKcy&lLt?gQlecr2Wp;s8$R5SLWUg)HATW1i56ak@4Z`M z#DFFJ6Re=AX33;^aMczO(5hCSStH3yQ*RV zdj>14^U%k#YlTA^lt2_9+12K?<$bHWbG2|24ZVMz3syFtxhpe}Ynd_ZtLcN>nJ+xS*l zRM;e~IFP9%w>^M$K}1HYlER&btGtqt86_h^*@3%!pW??BVk2LM`PXWf5o?ls2YG$7 ztf0Nb;a_)nGGzcuU&rq0h>)0-A*+M9TR7Li?35@K1x*%`^vuLU{QWT|hQD}@SA1W} zyML|O12|@s9H5ve%NC|2WdPPzDQ6OT7A%N2cZmlc+UTDZ81h>w5xJCcqC5bXC zTFPL&+D3O^Mynr>yM89+!}y^@lEi@rzfK^?b}n8%RfH*RFY|dBTDGnZ{wsdS3lDXHw;<3g7yvDw*4DeWDf5Z&EIyT2&6 z-34m+xz}z2*~{Fp?&C4((B@NPiw7I{T=KU^r0?^$@+ZmIj}V3-gLvc!`}d=*o~%Ym zw+RBHD+0mQ=I+$Nh*^bM_TK2wAOx6zriL)JNr;Wt8YERr`oc=Wc-RcZrf*sE8t~@vo zX@_jPjWNVtG81Fad@0-@yglKO5Mw5)2|3_lho!tU>>h5+Y zw29#75Ws`oCLV^1gE4@?IRQNFg=u@Y0M4HP{)K}A4*-u)w(RdmU&uZ*yL(56Au)iRVuMKM=8ApMY@FIV4Q1z+N8Y;>cmb6kh-6LHyeTC!9KaN`Q2Rebfu@q49uL$0}T%qOdf2)@v_VNPd>fPt|j18;QjlVP6huYJ}bw>8Zv0{ z2`&$G3$rcHAvxMK7%?Ck`Cpn~9<65{Ja1=j0jeCb$IJVC?i}}X#u6Q-pO5eNvmM_l zw5O%PA#)_o)qLVS7w%p=t4lZ&PKikX0 z6bn-0$*S+i*gpqbiGL%|4mJV&E6XVSF~lQ;Na^+I{P+matkdO@p}zX>!;yHR-rfJ{ z$^#^%IrrS>^zbekzq?f)&gf%DGaf#9Ov^)UwwZ-ZJ&rEVv*GuxRgo+0y|Kf$)0OZ$fH7*BP8J?+e4ZU52! zf0M^789kn}3dm0^=SdCVIbH`6CXa20O*&+}_o}t#^2ZHhptuQ)a-5Xn_*v8;!)omr z6Ef#%ZB-ipxj4O=SGc!gSigXv|C=o&b`3p}^W=N>kPZzL-{-qJf>E`$@nPjZ$s%?m z^SR9(?_G7G{|2nFvpKS`vCm)oFB-##K3N*}1TXZX!6L0Uo3sh|ga_q~OhsM+Y?r~e zOFn<(hyTkwLq}b@-OR4dEvW^;#xgo^m?XLr9m`=he3HOz4;;rbi&~y- zkI65EZB3TFx6_q}o#GkR7GD*tqvzS7-}}~7LDNUsqrJA%73s)B{#|_84FT<;;_xm` zsJlrKTjfCV7x&j7HJejX>TNv~Yhq&GMOA=ch`MnB9Gff$_V7wDrb|iIC0=dJJ&7-$ z@NP^YG0TuOV6pnUi?GAd89n&upr4z5F|GLMvTjZ;g6zcT4Y291BWq)aq_}SuljpnF z8e`bB0~k0%h1;5d%wE(06Lk+m z^}R3~!oq_nG%ZsLVEm2Pm@D__B7=aSW&(I4hcD{Gh+)uRv^adgk%t(OK6hcRjF&JD zI9%&ng_%e{1J&#S$J=`$9j~fVD7EIMyiUWodtW38h?%F1Rt5>$D+2C>| zNH|q4f-T9rO-YYS?90w~ljq8qj>RT0TH0#uF{=9p?2+oq)ms#0K5|I;cHAo?twg8N zSgpApmvOHb6<3?oYyw}+#>Fx81eP!9}!CZ zT7PU#G}-5}{tCO?q^e6}>uZ};HBm^)&TwJy#3g3f%MP&^A)~8z*z4%NsL+YY*(oUm zb!}Q$EXex3RfdN@kcM`K6LHs_P)EWx%jkF2gE*0}l7SJ;VlU`O(h`J&7ovx zr?_2o$5~6c=#h?^Er3fbNjewp(BI>wuYf>Y(XWCiLw8Z}=|Ev0KKx1PmJ2{YLc=(8 zCGWfcIwP(9;!Rczu-8Pw4G>xuUu;txVn-s_DF7s?tT>QT*kAGd&|Dh5w#qTG<{iNI zT<$3BX-J5ij|T2cIr>g?&6(f}F9rgvyK~+x6H<>t#_(AMXgx>1$U>i7HsMb|=b1ry zYb7b|ZDdYa5)=@hYh*y2st707L*|z8R_4eb_H-i>yuX{grwg$V)9IKJ6y#q&j$4;| zbX$$#oHOu`OZYYAQ(T$wGQLePR3c~ah;psV zwotc-UIZex^q2g)qFAtzqj9k2=>`b#N}?m-%&BCQ(S(!AS2l^6+dX&ol{B-!=85qz zf%wRZZjySLC^~WIrA87f`R=KVPaB_d>H2|!RA2hXK@A#y>Y`P_7B`qEm+B7X9hk~U z&}Badrn|!*))T)`Ol`}yfHKr|rlMRsbW2vF(*hK=yHr8zJuBVq+W+_+0s?(kP_bFhD)-*UG)wgoXGh_DiP+&fTs((e{afCi5{zQwnPy)N_<9z$c2Ud%PaRrZrMFK zC;z=hXvu{gQ62~y2D+TYktur7zDg>vMpEJA`%ChX-7a$cR&mook+8|5IAp7ZUHZDf zc}!t&NV|RAfq_Zp>kcHK4*)jkN2B#f>jJ7fMV#Q@k`p?am#9^zW;>Y**wKrd|y27z}VJplpX5 zpb~>JIlx8&STCoJI|n89hhfvX+pj`A3x?ofe8U;>0a109jhy#UjyK3gP)CC1oMcj? zLDF{ASF>l5yNhu43Q|3j7IXw(=7m1FaxTRX?Yr!e3ms<#D*NL@Nd_^PIXuGzNVSiS zm#qahlB%5<0p%G6y=z3tqy5WgZm^&5@7v@KF8u+VF}Se`#_08M zKsHdIIZ950Fd&0{j_7%Yt4q69^Dcb7Q^AOGnXMr9D~KK#z`>xLKhfGNE6@ko9nD74 zE`!)NdVmsqoxYQPf}OmC>tKUJVm8n+_COmG-tre*NOYe0+}OxVz+y5LHi<<5lXJ9< zAnpMxd?_H(`L%5fGBFU@h7JO@r^wtv&fs|Z?aIsY*yTC=mfLXZ?2z?VILGWZyJkMQ{rkFGEku zw|PKFa5ql^6oByA{pZM-)(6+^!0r6H$uWc2O#8{)Ou(`qA>e>VbgenlLx(b;6WB;0 z6zmqW#w5P)IF==LybRQD-i82T|bj6&^i4d2-AR7o4!p;F~ zV(tkUaR{s|3Y2pI&y^>prSx2(W*!8bTA=^)(5XM%j`Hz?qcfuCxp+)*H1C^hsAoYq z1gOWeZM*snGLMN?Wa>J4vD-#ZpeOo~HpM-i?zz zMs#$~W_lI?cptOv*SU0=Q%XzQ1$R=z%OWhqKNt?5J%5+j?a^V z_IMqzWS`mFuT0#s?~u9r&HkCEwO`yaevG-Jpg9A<%SW`5Kpr2VfWXZ3)6*dAvjO&b zY;`Tz`DlWc33fs>I|TC>@4MA_?eU!Ep@Zl7W(LeR=rFxK4>1r<9_I>d-lhX5v;6j$ zvIADG{PtX{C{``wcMAPJ@i;P0d_Mg=o`Q~0ool~^{_WL|(}m^Gm00)0fo3S~VM_Q1 zo{MZ}2BC>e)D=;voqk?^;{=-?RhM2J#6Dfpy43vvmr90`)sI0e7;?H!V-aj zB?O*B;WLL#oLdD$zX=79hX|(;_5k2hCzhun)&{egM`+(*f>wQE5_;WrBU2`v zV8f$MYQg74v2}om>CTh=L>k){{1Iv+xaVOq*Imo3gMS6&C#!;Y4mBW~7Qx9{cAM_~ zAJIW(8xjn%CGf{5<}kU*R#|r*g&RtebI*QdBMIizt`B^jz%F$wV@WoZX&Ou#HJ;5Bj^FpX70&>6jr%1FL@r8>*W2 zwOGyxnCT+yB{q!%;nI*+=4z4sW#^KEl1(!SEI>0)B({~r$R>?B_L%??FY-+DP9Q|i z#3g;mw{U#p>5G$%gk$wEVsM~=R{}*5yYu!zDAv37Zyrr6k@yL1*_2@y&}8R*WR9nH zcm=Bjr8Dt3L_3Z~jGqfl9Ba{02|(4gJONHbDt8Mssu7D;P<4*5tA}Ml60&(C!DY|| zgJsh&@kqcqK0GrZ)dxhKKEva=UwtTIzB8QC>T@BJagwuHw)>9VH9omb%5*$4=*Nf& z3VU(LYL+%UgMK;nGXcFE5~g_7;TvZ8L9_FxVExQ3NSYBp*PcuOK60Tc#Uioj%RMX! z+<(WG`%ta8Ngk9rN#JK&UkQ=>EAEqV6(Gf^Lr=%^8Ffck_Vt1{qF1~c>zFM@OfpqH zU&X!6b;~jE42g)sw-K@3l*zU!!dY~hZ>$62BBh|%h{Z0bEI#K74rK-Mn(P2he*>!1 zrvd>i31d~5E4DTSl||(>y%=XHvvZQeoi)MD1>t% z+P&?H6HPnJ=!aqwfbo*VCuz&#vohVZvS{_|Rw<6uO2FD+bAnag>g(Ty$DW}mw zmCX6%>ARrl0Up}%kCH(Qc-jzh%X_2<_bUK7tnOs=j1VqNjId^@8EWb!qU@1;lO5u| zQV4pvqpfJ~K3w!ikT{-*;jxT~j{7IETdw|fZ^{6YZgY|Nkn|(_9mH(Cew|Skkdy%E z$TcN!AyGZsdnh&+t%iU^gZY7xiLw;uo}LW} zI(sB^fvE#Q!;Wk9-{~ z*G8|hr_k)A*zkw)U~4NNl46_%b2s4_1Nj5^OJ3!WFcGyvZhvgA4NPmT;<-+MMT39w3#LK6zEM+S zIWc-v2O>}_XDN>x!WxjZ6Tv{2Kvl4wG(c8;lo?Ts$RYx5y+?#t9r`W;yJN zBej|T1ddb~|K^P9UZ4@X0y2CVlha)vx=j?gi*UaDC(CILulE*YB{a`?D-9LU{cX}5 z8@sF|-$9=OnrMg-b)z>&C5P+)0_Maozp^M2B|#;tj(k)?DQr0sFML)r4@zXvOH^i3 zo%1mwfg56xJwk@#BsQeH)OKQYa-K_2?declb#-!fA0Kax9W(0kM*Swm?k+6egp%sEWsMTu`pA=3Z$8 z@V)&Ls(1T35z4WxmNQJ&83`BerJ9Bd$e0MUqiYhU8TSieke{_LR%Y3(Cls#JcC|k(QVwT*z&C zZA*lPn=1<-M|f$(7bl_1!-!CiZV4|IiA44r5vQvc-$frotVp!$rNUFh*B}Y*%;K*r zXFDhSP>_a1Hb0X?r4df8DvV_pe71YV)a~9 z7WhDKb0gkO#p^X3?nFo|Sq?pqNsj#5ryU@pb$;L%G~vT5+1hN?MwrXPCZ|LWK`FW5 zWMIQo92Y#5dR{z}11+st_yZ&p#r7?8oW6>P==cybH|Y_T&g7FehV2P5fvefj$R~yv z&=5BO1e}6-uZJCECQ-lxNvTkB7zDt#e{GR8*21#}=kg4r7H${)+<#I|=#D4i&ahv5wW@_DG-P}Dx-X&`P$DZS8A?*|C6 zy^liA8Q!?kl6e``Fx1-?WoC08Vvb$SQ>7;NuI@-)%lVoAb47Gsvfi zxR$!37;s|TYF+!YopNLfV0uC=fg3jh)|_`navXW3riLj)+G&zr=;htuYm5y8?UY zV`$SmDA{8kD${^5GGTqN4Qv9>JmxacL$#b`MSgUs@JU-eb})UV5VyTPtBlTV*6GnP zm!(H(4^7W0-YEY_TP#|h)K_5t+VQyY9+X3c|CIxn&!#^Ji;!mr&x-pu`2&w9>_?_S zPVW!kQLY?uQ;_xNmPQaFBJP|M6{|N5aaKAr@A`FH}0bJF{M znSMK60sP-GzRpYk>hU$r{SMy$be>;d2R{FJfXxB?V^@k^->oSAU(AmkIlj*4iGB8w zBaiF$_0TjPcKzZ2{(3fWe#~?8(SA4>`ZS9N|2F-n2ZFQX{T$Rj%jA&P|K9=p_2cmX z7G{R|C&nDW2cP0=pBDqI?+V}_Xa5rOy9?PD6P%-vfCm(Q#e6@0JRZOY&F27qK2;%j z4q!)!c?jSq#QO28w%+hQ%J)Q(h{I<(%=P8X8SlGFGv4xhGG>y}56+Up(5Yzu@@wuK z^khF&EP9S&lIfht(4mv(eXk${?q2xDPK4nY+?zx8Jpsg1bZmY^=STUtr(@qKNzO7@ zo)Q6~ooM;(N9L>{G~4uc8S(4u0>BT1Ddy+gUs(5R=>S~sk;PyE#xfNE8rX(T&ioJr zKaIl)XJGs|fM#48|g?zwcyE)M+Hby6R*k62tz61w8duwiuAVZAeI+#dqHdhS2 zPUk(fqL@xW$JI`8q$5*MI_Z5<@kfI%X8V#5!i;My$C1L}5QhzNM|V-b;2(V7g9_>^HvH;sKtl0%l0t~|yyNPpC3CI672LcUUyv}sG%_T`#TfQE zQ}X}tia}@{`pMn%)yNgZggbZ7)LF|usuud?C+>&0%~-`$zjJNEh7c{du`g}|K|JYg z^pb!i?$9$BGKM^1%m_JO4Zm&?4p^}c)}zsWKP)h9;*nlI32$B5cbw>N+D@)0SNu`m5Kz{hQlsQ5oxEVQzYRjrln5=VkF-AOkk61qKYTfr#B=wQHO58wr; zNc}@*yQ91BTV}RW&mbIY9w8f4jPfuZndY}{Q_*4!0WJVSJJBB)eZlD0B?#NbXL6^b zoQ&^WuVCJUVvBD7N+57$=q0hWjGjTD@-LohK-e|jZiq($nG`Q;Kg`GZQWnMx`NjJ@ z!H7$-IG_ta=9~*3wF5n=GV$V$Y;H>?$>a0b`HsN`QZoh37GaJ z#0wylBQGe2vS2Bzs`EoUAfT~`ZzaEb0;yO@Fs7Nv774yG6=<=A!T}Q*w^dD&@e;fQ zD~-H=ig8gJ))yh6vQm(i!@} zaZ#KUq*v?5E^Nv&oRQ!NWnwKUlH@}wJnT|*zBsS@GPVCY7n?>X0A*M<4;yPyd5zUZ z1egI<{KMfK)-5H8DSA&T9KKf5(#Q14(7s7lA=-im$X0<}sen6^Vgzsers}V}qxBAU zBKS&bx_SN$Ar}=lg^Wzd^a1ImV#4t&hLi;XVA*l8qj>ISg1IwY)^)hC#$}_5DFK{F z42t&xUn#(h*shT4?TWJU`J;p4%8bB9tMJ*on8+AU-h~Y!Y?9;>z+CNejb`N|7rzeR zA6!Bd@mui}{z;hO(4!i81^ofk@4Zc;9UsU+Rl!65#NY3)tckBvPQ30^ zIY9!<`Iuk(-3i_^^)IKp&B(e@Cuq4;PNY;L!N-aHA8Zdk*{EkDu7?{R0850@3;5!L&3Sk| z<)BSyNvHyD3x0_;*t?7?2g(7O&P$}SUhMiMaYdM$jFLi`XPe+r@J4>%(h6KE%l45b zK@o6MO%R!1++bf2CE#OYG=WnZW!Jc!oH5plI6!XW%NP7BHQs4@(tcMT=)Q?304jxS z$euu;`wtM|F8llAV%t4KkEjZ!h;B#)OfF+wlj zKeY5P;Y{KYuK@YBj3oChg9Q4XF4BCPabMPUta$AlNZb-_T)Ek@1Wtv0!B{ z18~!Dm0b9Xs1D+d%Z4dX&;ay&l3rpk?jS76xAo({^h8RM_2xZ&da`O8@%sBBaU9P| znU|+!A?mAWkwcd!5#P_ZhyiNYsE~XIwE1aAN0%5f=Y|APf& z&6TqyH4GaOg2Zdb{q!MdsVI=T_BccBY+gr!^=>0TArZP?Uc|E`9DAfwjJchsB5(+F zLUrPZBpQ}=B-qjUmU7+<_KDm0nNIA|q19D4ElQoyePW|q^rauO?mW|17G)bIa&XW1Vymij+odg_g_NiK zzlQ-*if*Q}$z6s0MC4Wt9S*o76MsrT%iv6dPqswXm7eG!`B#h~XcRO>aoN~o!pc=W z#)XD-f?XvjFH2NxDb6BP`|Z#kz+XcECo3m_S2%Q_HXDZQVUyO;zV0}4C6`2H>z!@` zj<@tRO}>s2%7+ss^X$=3L`=3gRF@)%nDx%2ly7{Hk?eyYMzxe`hy{Fy>qiYo@Uu>X z9(zei4vb0to2S#cH%3&pfu`)lrUWwBL_8n{tY2OIEjVmn;#O?kTOJjD9^|6OoDn4( z5Yvfl_>eqW_uT@z4SV-Jlfbh*<~e$x<(b82 zM*`X`LACHR??F$2@4UK!t3)=OKMzi;^X%X6w#@|QAhT?8*yweZV*pdHl)v!We0k;m zS#EjLRi)O)p`lPywFq|1SV7kE08S+E*Yrj~{p_+y>Gd2xP#~AcT8FS7<-{n>;o(F`V7!P|?^3`$Q+E_E@ z2tUg*J|4$Vz7dcZ&%?&^{7!g2cTVJ1+EQK--L3iXkUZug;~$im2%P0QCxO$cgWOtO zK6ed8;wUs3KNrB}q3-bjp7lC`?o7&_bF!bSp8#g-VUK6b4#i~llkuo$4)&hu!^ZfL zY&eA8(J8lQqU3M}|9{qayj^{`O8o{p({S~8!X_ubo762l?t|^z^Kth3(fav>fB8)S zfB$$~*xzQ`KjZTs%N&jWo$>$J^BWzxa$QZ=jT`CeQ)@b-`u?x*%nH$b}SbW=jpwNJhFZ7Z#4)D zu!+eEUsPvy(Rinbw^diQPB(_z`OKBOocEz8!24&f;>F-EJ6irov0sCdBl>Mi?#r-u zVTnOEYzMGbE{+j;ze&2G&DZ?jw#nD_5qTmXoTR`M@X&4X4N$nqLlZRb_u1A}=74F` zaf{s@#*4-z>e#h>Gbl^fveHdl1f`v`c@HlBEyyMWDgQtYVfQ5HA1_I@y@A2ugj+Gn zZD+QeU_Dz~z~ah24cvYVf|DFIksE^K9{D1U6e8duNIzCYAWbI_<}#holb!_E0#!9K z#|irx%49yaTENA_p?df(n`dN}Y4q_hwNgiF(giL-|p7s ziH)#wV5{-~9Z*l$M%6J{mQxJp{TRL##-8Yz;95f?RMw83BV5RYp6!Xjy1}xm`O|n- zgFS6cox{jJU>b8eTzyx3#BBCf%=`T@dMcAm6HszfrRMvd#jh35!>fR6%d+9{4M&Is zot&YzM5m>aUDKd{&`cKN{HN=`gk1^!qEYQmSUfnPle1LLq`w2Bm|2K8)>+xSL22q!H{PbsJ@Pfo>7 zH&J5yUi27a*rGuYZ>Y&_+d9MOmoSm{*nMYtD3!CWDY)NJ=ns$FPBCm}@E8K1W_2Qa z)Q=6gXV1+`InGF?EesU`4o^UGbr)G;7^ff2zawwQyj@mi*(?Th2?lUzvS$o%oG=1^ z7|BZm-mQOuek$&W)XzB0LHzxkB!D5dP6%e(#Z^y2<$_>OCtBAuop>Dx4BFjLFH>75 z#uRW{pa$2jU)J?V4TmX`;i#RgZh*Q)(0NXrp*W((##Hiw)rw`mfl==2*_&%c)!JRf z)ZY`^JBcPkAbXXebhdl?E%Isp>6=3-R^EhSoxbMWKaYu>R3cJbIU-r(e4j#ON^q+S z(>WnH?TEF~cUGK9%uIVXH{0_a<54?c6B(PeQwh#9T|8qPJqZ{XCST61@X|Y1_uMu1 zDY*|(ZWE5j>&|<9Ql$FdxFjh%?W}6iI|_O|Ae?X@X0c;t zS_FgEo%6vOVcsDDa}B}uOTr5uTuWl0Hr~p@yiOh|Uu7>CqV{$1U@ZSvs%o$giCN8=U&~-9OL`{|L9T;O=HAio^(eZq7)=iG-It zV595IF=|=_ii9Yhi4WiNzK@!5ds>@Qd%7q0#WA0tu756K>to{Rk$xFIt1jj!kD3{) zh3k}#iheuK1%WZ#-qGtRB?+VtnUkDg)iCZK5J|m&?k^ZGXF`G^7$%;(aLj^8Pa~BM zL4NFS7g6>Rk70&9tUep`<%bc)vw~^kL|UArfowX*tKs)H$=1Ha2pq_pY7>b4qldyc z_onfZC+iy+JosnLj|;IH-}<<`_!G*bL?=W8@GFjfQ#%ooOSW@s|IkR97>NiT zHltOea((=8iMP%nzuR+KVY?oS-E8SOlh5e@Xk51!65PI|)Q>k@T`}ek)J_4*=TYg$ zDGUeF3wLn4Hh!;(%r2YpLS{KUqGJw70VONXZlKy*MU8B9_9KCb6o(Yp5g zXce-J-XZ5V>UGj$fr|q?`G5WK(>Xu7@vI3w>e-(bW_ zJY(LOJam3065oZ1Kj>Obfb7-L&1ZX9XmRTB*YX+WMC)~Pp;rLQc4WtRSf5a{OZ@Z^ z5ua5*?vC$%@?Hgh_yo_L3w967tP6=Um~HRwU_8~`C)g`C%OR%$mvFKsnin>!S zkf6{>#D4}_Hp$;a75^Xuw^T7p2SMiAB?0boaFPzmrHQ8r4RXw)O+d10*7Y=V4P@h4 zF$QY;PRkZy69Tk)rW!IJYYNzxiOboXvq0t@(=K3jGKq8YaTu}40n_?{cEClSZ%W-B z*1WU?6}r#<%_NU=`6OpSIJwmXfMp{^)W{f%cN-p8-R(CIc>&?N&(Wsi&hqKT5a4R$ zOyQ=p>V$T7fkHgTi4mYlgTRbQr60}*lYfW;WW z%$>Lj_$bv$Kn>7HBp~AuiZarj=Cb%kTZU-@jiF&q57=6BpcL5%Z7f$}dkUEtg%D$u z!|sZF-fft9Of9|BYp;=DdrumRH71`s7fY5kGzxh4axd!wBCvSL+D%4`?Co=_p#d}} z|2qr`25k0ZEky*CH{2D9RdZM;vmcI2Z4TUkJai|h{eoRN@YW{o8=4}V!Cd| z8TN%ttK+3SJ{s(u=nY;0Q9N!uQD%Riyb@GJUN@j7u-n1VZ#e6Lv?q(cCUBy%iyrTTl~g|;O4Oj=ATOeXScWK(zk%^H3{uh72QFMm7;PK@cS6P3c1{r8l&D~v0dzVuPX1+yW^^UeOfj?kIxiv1-y~jU&;3cqJMt_ zzTV%iU4We)`8^cyfB5*{|NH+|Ti#OkozE|@{|gfNApid&WJ!c%+>>PL?VZq&{ho|3 zi`p-+huAM*{yIHmzD1~jf29HF-iQQ%+>wvy^J*ygC2{EHt*yKv1KFN`s=V-hamQ{Z zv+%Zc@5k2S7gY3)%;QFI>%EtvyEFAfd_PEdYJ2zJFW~ntUEMXgSLTh3T#LUBT5;h0 zNM+I-y#tarSkb<5vkFc4D_{S;7jO-@8yn&jLF9!dqVK0{od0|`)*RkA1slnG!|PfX zJnoh?^s(s@;4rUP>?gSy@qgtgxgHsNiNHJ1@qVsm?0vzNxq;`?g>HhJLhYdwyk3*? z5b4(wYk_uiszv)Lke83~-7hGjx3=23cfjfq_`9Dim`>4|$A){+w|MZH-<#kDOzrj{ zzu@_NvB*VaWS>sTFVa3&&6Qb6{AWvDrUrv#PyOe z5Ytw(M1JBz%eHLi&A1nErSYXI>JPTgi>EXmD4}Ei+Cqx-3W@n5R5G621C+VrxLXWI zG}3oTm*rl-Lfs&&MMYQMMz1mPUXWB>L%c-%Lw~C;7=}OCx0z{DY9~>NsYS{|J;^vD zj9r_7m91XD$ZD9H_%S|2c%iS?=g_m=zWP{nwLVD=qVm@mvQ3n%CGpk98N!y?i!kxC zzspJ|U&K)+2njigLMU`FKu4=6>+rhPJ+{BrOt?Lxu7lI|!nAqVxoKsyske}bDg<`G z5n2)dg|@^l>O2|aHR#dZ40~wVwzw15l-17t>U0KvIZd7dnHD!=(%Of9 zGy7|!p;t_oee9s4Hn-8!Gf(?$Y$w{dLbPn4`_WG5iOatNMj6{I)({I|w2Y#}Seb~0 zrex)A*PD#_cG#P}eHTT>$sKY@@Ylp3r^HP%$z(2iEL7UqidLeM`P2XmNE zcXl>^>y_HZZPORN_1C&Y%}PmJuIB1$Z3mnDdAG7{@fu8Q)Ny&+ zu$Q;%xVHAav-H{sta2W#;@tAR1a_!NO*j*4s~hqmo)=pU%gX(JDD2;mxNI>1C!1mgww0h9n3hcw)y0 zt<(Yu)C{{laEc^0Y^#x_tIxcxdD~`DP9(l+@O72kGnoP|9kacoY1Po1Y~i72|6LUm46!+QCC4+dCb5TA@P)8z%a;y3 ztlvT(gxhICQ#AJW6Gag_Hl?ik147LW(CcJTo7Y54K#dk&PlMHT3Ze$KffoR4E%-pG`ZDY$iSyr+O&`CK-;#3@4MEcO9uPw9wC26z>~){&OrP3m^guo9NrDc$=) zS77uaJB5_0zRdT9_tp1u9Of^#j+vvL?0 zzjrbVoyzi{$9fsol;kCY5(i#wtfqc~?%0I9HsS60So>NeF{*%S4k}}h#O_|dCFvoO z1lAX83dCbEM#f4>p8-n3waha27k?7JR8H$5=HZS_kA}FNI^$AaNki7Nza_v=|9 z@Y(3LFg=N1(+H0`w%vpAPbRjhR^R=mQRg}ukFNidhy<^r(d^b04n_U##?ttBPho{2 z1&pTzC2E{|mfexxvnZd{4n7M7-yK2s0=^6RT;Nk7-Mle=!miJ;R!ZJN+O>S<-$#Yq zX|Fer&y9Z5U1-r=8bm0vnZ3sS6B(@gjY>nDjrf(O{BG_7hOT#@eGB6?>G4J}UBLbc z=F2_*=3M!I>A1_k9%R3AT*~iPo76(R_WfULXqt`rUFLhm*YOKoZ2^D1b>HI)Q}Ug5 z1^=Hqz68P2d>8Qd_#WTm3kvxEcm6s5zCHdVG9!yweq*rPv)fhh{t&M%*ZZCC z?$40bpPRTha`+~HncgS<^Uv^nCjVgxH99nRCb@pkwKrlN!W8hI5%xxLzh5U6a<4(Q zp)vonG~7LJ+{%6xg}1A8v}uu3`FC`!Eq+m9a*M-7Zm2Ea8}4=gBBQjgBE9%?*^AH7 zh2ozy{CV?zu6ywf&^{YuMgP6`6#(-jxrvVRV`kz9t zAu}#ui7YSI{#LWoHzu|m4bU&w0R~w{Pf1zIu7HCEubJm`^6EffZRq5x4XieAo(s5S zu~yR6=+WW5$!Y;F@Wo8xH7%RKSS^(ham+KJkzmh8CG98)XHuq@bGKn5G&>o!E8+_j z9p4s9=`!EhSc>qpYBBZRf~)9l;n-ITw`Qiw`1L23qQzTG%D@pE=jbK8raaC=g;8D& zURn=gP`eqi>7(DfU3e}es#dx5%I_xo=XoGRnQF-rVL6d0F(hmAYd$O3xmIx9Q#q|0 zi2c5M?&Jj5uApq*>2B)k-T<)`Jt9sN!(hJc-cIhb_0Xgu&PlcMLM{Nh%(f4=fKgGl z$mnY-JcP%jVK<8sZ2Ehkz@HR?5#t(KIWD?3rgBADJ@Ap9XGkLtV?=ti;1aHW6nOz; zzs0$9AAETq+u8&W?*SlanT%E}NHNz8JU76^T^vqaTJQScF82D=q%kfx5P#`1^2DIT zK>Z088_7dE`u?1AE~@u1S3hD zAfi9CJ0YX1a&=W`t_>m4Q)?gHM#LhZaLRzsPal$z2+ zlTVSd{y63(@MAKfSHO=&8jp zFnt}sc#YAj!5m%~B^#nf;8F-D6Ne*QOQ3Kie@G$s*iHv<^Ia&8sC=V2UeS_EA0qC| zQLGK7sC+p08oJUVlt-o>0F(O)2|KpbI@of5Jmkk20>v4*+g)WOw+XvU)wu}-F6AmN z{w)>bXDu;jm%vzeWUbrP;GiE+64HFSN)s@Hd-M??n6tY?KlB~OZ#PHB998m)8?kfp zyb;0;G^8yL$Bn^{;n`{NBr$GLe92S?wvG8_=$>yI=9^@$7JODCJ1XQ>cI$? z&D7k3K_^RYccM9Kj)gNlg4$L_vr2X?95QOps%!07GbhC)Q5k{^QJnbctO__Ay7+0^ zV0DD5HlbeyJjDgAQVF22e#BduT5vhwHily_nKHu{=+54sz7qgbdDv_r!>)f}(8=c!uu~OBp_F>$)}aqya{4Di{vT>Lh-7s#FN* zDczrU$Qt_NfjCLUSV-+k5x}^CuTK!N55dMa$XlHorQ`^?ZoHE;p>^qVX<6;rC*Fg# z`O#p=7bxd%axxhm?V=<>=$4`xE;QB->rysR5rH!ljBlBJ&T4=V0Z@O6wP;N+54U^7 zd65rC;{t+!uXvIJyFfY2Dqz-S}2XE z*k1DyMVQDPo#ZPX`^RrXmNiRB2M1lw-=8)Y{^h`n)Exno%sc29<1`Q}TBSIa%gwId zS!2t@LVTSUY@YPbAL)t(9^GzsSBD>QTc2GM9yP?qLnTz|&Hm2{#-v2XufdC$Jga7@*1-&C{_{0ME=gGH23CjaX1cNzl zdjcv;N87rIY$%{onBu6wHCH&)bOhY`;PCj2k6w9x@O6*X8lCHcIT>DFF-))(qi7yo zn^4l%I*Y-?TuNS=l+XIaot$E)f8G`B%!h*r!|CE~CXotWzYskM)P;u_FN~3AYZ!%N zjuFW^@`XUNRw@8LK*Tc+7@9^ZpFnn>n@&kx;`Wu$!9*0fKu%oY|^fGe9+=Tl?- z46@E7H(G*t&x~Eb{qY;-s2Z(-&iZW`&gE=yk>7b-O2PQp4gn`ZQZ^G=K6Lw((KGnz zoPZ2>%|i?%Dm14pH+z8H9{Rm^Umdgs{ZA4x%g zaweEj9-AhT!aF|Fw$7j_eTSmB94oi=4rvMJ#bO_UBSef9ja~7iQ|%7*YT;w+S(Ez(OPA;sf_bc~usV0{Fm3+X=!X7YRmse) zN)tySQ|nuoD4#IA=8P1Mwb6du^Ib>Y&wZgbTx^zn*mO26%rL-#40Y3E6*8l+_lR8= zKLVy$3DY#C(*4tw-wi@5_KQg?kb&lVM)_uCOiEx~5XYX0=2-!+2Qj+{9D6?0YnWt5 zH0!NidA+EmGV>5{4S%43?Un8JjFJ=1KlMR_w@AI`IiV8aFK4YGT{seaV*}IvVKM zoRB%-H31#2Am3%0IuIrLJ+<@wT|9KFan!ces~$&$Xacqnm$74g0GX}B2=8qO27L{# zK!hTr_P;qC1^2OC_L||=vfFhEp*~nsw5{wYO-?e9ilHJXsOwkzWEM58k(+HaWbKAi zy6WGJqVz3{)=n+1Ie6GlUioTc&Fg!MKMk?iG-{7)#vS8>r-v`vSkD0>FGJBYFmh^7 zfZ36C*E>dC%xUslBk9t%%cMx|-J@A)(#lwhs_V!N=Ut)YAP@2%B40Ue1&m7?jI`b_~_ znfIN(UaI_3ItARo)D4q=uoDIrk9Yg!>C`uidA|?Q6kDMcnRRmxabv51kNDa0oy~_6 zuBGB}yLjFA>A#PEaQ3R3{yT#2r&_)h?gjk$BD>p3;x8VbIg8)u8uv>E?57@kN_E)! z^?^!_H++uuY)8hsO*b;S62vIruODw>j92d`o4ogI|AK(H%-);nt(Uz~NLGGz0kh|SdSc1=f>@CEU2CE5 zy3+U`j_=2>=n~%r{ALW1e|>Cg|1XOXQcrItcTrzaz+a!1#~X=4i}>q{r(5QC-|T%I zu-})B@J>Lkr8_yE-|G~k>iwg>JmN8bzpOFdZGK$*(F8+uD-28)-vGe1BFVkWNAn4p zq3P?rk=YZ+?%Z$_Te4XpXzxX8_hR!+*5?6T`;4yDJ$dU9d&yDtbZ#XI^StEPdbY1A zyN_$E9+nHRtIY|n7&O_RFe;P0zSp=HDynv`+qo;m(zP;~^(|zH$zAu(!NtDid-ghl z`b)9hay2Xq3)eC#e|;_O``EaH{(j@%1zrN;(wNr!=WdKOOaX_@$~9>Y76#h1SFOhN z8;6WY4vjU0_tU1P*5rRGq;i303)hRlTtQkTMBkdnRXDnAUSQcsSh;klz#do+dcD3E~B^*uXx2pSZEped39RvM6F;&&|{b=E~S|{;Mizfs47vQRD6untXajEJ7-TnCw-&#NXjlh|5os|y?p4} zu!{*(%tb7z=Hz48aVjnwI?!}ud3{i*#$4+x_0&q-^PBzsS zu^IO6?Y3fj-|B{mst1cVhI&*JMCk2@NR<6;D~rX zV|Ve9Uo4o;Yg^zlJ^ATDxVtL(1RHsiyYaWtXIt5 z71w(TL$b+TFtEKmTDdbZM`bYuoO>>P1af8tn|Kp{V%P$1VhEschkKC|LUv1fzR7J9tsXN#0d>=l)b zJWE{ZWIJ*($?d0TV$CYxT!h3*l6qnq%OPI6!4+v=^+WQ5tGu>&@jYr<1B!z%6e_bCTv5K(3&z zM%L!dZe+`u+$L<1Q*2O*I`%C;?Szi=YsZ{aTYwb0P!Yzo}Y(#=>Ye{?>O5zxyWbMmSs4E9&{V!k4 z=3Q)NYaESG2~u?JJ=krR*&f5`Y7PQMs+#5|c==?sx$qZ16_K0Le5{ilb49OxzS7kQ z82vuQy#zD6idrh_h;_Z&r3kT##WtQzn=XM4&Ku+UNJe3gyh!qIVc1Clo%5tSacXud zCrxqtil5-L#5UNa63LE2@iAMM0&X!&Sqpf}ZJ?;y-{M+v1DH6_;}5%cKD2p(m}$CP z{3CL0OJUQf4Te3eso zh-z5NQGf(t(ATC`0kxwBmG)5~>7Eh#`GNPgl;{Ma0YOFzCyN(7!AVB}&<@mC-5Xnh zl2OA-QM>wQC)wZc&G$WJ_x8+x3B--k00~T_YjZI6!7P=h~>w>$CrYFzRYSvwts~Mw@rb%3HSvu{83qVn@jk1 z=?lQW%4M$--w*wp)$+b5KF!}R^5Ag;79H9_jv- zSRv?gJ#E57jwGbwR>XjnDqQ17mcqdw{1RJ-0my^T!5PG)pwQiv%pqKc4KDskyFy4NYU2Q=&`0xiMoawE2gu1BNoE zp|)(Q;?WZywuWTuqDel`qIm?-7!OO#5|CqqP4wP&wmW(>)Tb6+5CizhzqYVUM@G;t zOk`_~4)m_;)$(n<0ViFKyHQ zidBgZ{m6mQ(JtX`vl(It9Daqy*qg@T7+?R@0><*=01Bvg6n|W=->C?>Z(vsNcHyLz z$~ZYWHBeI~zea07U{RHf*K8x6#Y+|St6Lu;Pn69qxra)Ir$(C1o}oHet5!hZUqQmN zvC~}7$kkfm)2hH7{OAE7+8&aIEutgw=pHC7j-yl?1H^q-bK7z`mV2Q+I&^oS?~t@@ zC7CPQqPLvje}cc#L5{GG89$_?Cv`2dYw=aU#9$}>2d?S4Lby8izM7_<4ynB78o9c? z(nIIql9f~{@E(x|QHZP{SHRG)ic>5&yRBmhYbii8c|UcI9cOy#cO{8!WA6Ah zVotYT6($D4=D;$1(h$xUJf>-ztK^{8++a|z+;gg*rv|$!QTB?aLo2vG33Z-z_0Tio zhv4?cV~CR`-y`{9wro8qJh7JeNzw#ZRP$ZnZ`GBPfJ5x}&Uj*ubg@W~<}QFLT^~J@ zmYtxqPe8Uq=}F1@F5$pYL;)cBgVdFyA&@*Jqfm!dD9;{)8NK2-6zY(C;8pZ13L{(X z{VWvXoq=-D@9|v-JB|uvJaH;)(+vkvZ!&WV_BJGyR4jyB&z?VW54pnIQG*ORcK&=5 zOAR3!&1-p8_vCj7#^#~Z8N~BwJN(3f-smJ}7Ue*}=BYkbzTqBT&kVL6C(#TQFoB?O z99C?wxdSVy`pgk-ms@0ciiM{9nhOU022!EmqeP>3YE<#JBiIpZ|Z ziPpH09}PuP{fL)1k-LKhw?4*?0h;YYu-aDzZB@Y336Iz}pjLzC++*MnjF$tD*>E16 z$nzTJ$iQ!k<^=dSE4V~xc|(ePHyuA3I2HM&lk;(i;DR$emrX#Fcr=IJ9iMgVI{!*0 zp7B<|RHT31igt4x3#0_$Lgf!2Ud6w3P1S)G^>tp8IVQ#o6I-bRw3YuMg(9h8qVsGrp-AcdnRGVotGouF zYNd6jo^wKYh6|g$eKUKoZU0g`f%ax^RPIYTYX#;|pLKDCwiBl_R)ze`uL3>^V~rD9 zY-k>tySFPPdIeX)j72}6ft(%u0tahODiGP${PlJQTayJDhdc+#`YdCR!*BHkka5Bq zaH|P$V!Ou@=-Z{EYYL&u%B;^ez#>{bWl|?Ev*;R6;e=z1)-*P*9VZjt*-sTh=(^e9P zR5Soe7KRTXbqNKmvW8BFMx#|aF?>T(FvRlV6jP!DO8Fg8bf5*z)sQBT`v$=w4N=L$ zipd;cPBdsyM*0gIgkNWY8P^cD>C^lc1B30%kOOnqwkdKQa9zi_$6mc;wIe2Dxbf3Pzyr-CI)X=tB>9Yt>T&B0bGCG@YF09c=!l_a+ zT$6@QIYKsHH5u`6k->8&VzfZH1B-s-u}93=kK8q5udSGi>jDzefjpIJ!hN{8(dyfj zXMOLv+8_`!|LC6k%CMWo`8zVKCLY#T4Ak_Yz~cw3RXD=uAhA!^Stmt|4mqiCEq`ju zpOJ}LTXP3g*M2-+%eE%F{5K>?*H|tne)<_p9zhOod%N?bvYK_W@Gz4kwAjxyg)c#S z=!(@yB!TT60*O~L1UX3oqE#@e!0vd}5b)DJeQqSswYj}30&>^_T7X6YUc2tIZ3xAM zU}-qO7fbus*=WJCosG7t+BbnYwZ*oIjgv1ZstTrf&3z$11oR2Y>fls>!I9DVCV z?jYt*33$INArO9vdzGFUFRN^DMmU{wDc{9wQ{NrMVFIAv>6;{5w~9? z-bU=8Ye(0~Uxaw}oeKQDRruKRBmBJks&uB*JUZN6)9q$&1H2e5OC~YDcPXW^rKho@y8Q*u?_U6HUgAjdf zTmomSqw-y=s(%N#a_VmBohHqB;?f$bnue}=x^eOPR9XEGPwc4f{vOZ_?klkZZWC$_ z2)Q^6=Vm2q;_91`;&Wx4U{t;&8gJxZ#-JQYSxX|1&Z zxRNz4RhYHdda{`bD7BXy$!ZJ9l70^cJhhN+^a_ErQ+VOn|Jb4!2dx5 z63pHc@%f?qeUjxZeZOQ#^6xN&ykU7Kj~@TIgKcl(LIHn#nE%@GeEt%tU!XI3>G=Zx z-!c3`_O6V-ez_;#F@Ie zY{3>%i|-b&aWCMz?_HG7# z5`dH)>zn3T8~^(2gM4|}NDPbhcT&?@|F{&k@x*m_R*@u8DLM@Ny+#xL6-0aGtV|MhxK!5^AKKQv?5IC3<-*62HX zHFoG3xMgbCNA7VPz*g`hYXz1#;0SeA@M{!H&+}u;nU`bBWNo1FTt$&_XrAKsisw(D z9}k6Gd;o;Zj|m=oZns@v?NaHVLO=OAMa7q%kX80?>X$$4_Aji>%FhGA?gx<7cJ_^% z&%gu?Si(SkeYR;e&m@=!Pu8~}L;S@sheGV@=((R}9yu^|F#o{DidUMBkr_5L7x<4;sSfKcKcg8sMoG7zOwyL$9LxMUnztF4_;#dEQLv?_#}+ze^`if` zf6o!#0cBLK3=U#L+jwksqHy};u~Bctdz=_h{dG*UyhC`RcnnyVgBOgSa<>X#W*^TJ zljrk<=mlA(oD9#>$4lkE>3;J6eb<vhDIo3~b#u*+x z^4+w$sdrkAQKMXX*Ex8^zyA3+R8El9)(-t^4DDGxbfR<4u_rD$n?qkx8fLP_)|Wwl z9a7PUkP{3^bN-Jh8-c=nRu7)XjnkZ-NATGJL+-7Hsf-*jW)pA? za?-gASc8_c0rmu z58?BzqsWd0uL?c1z24}w6Tnl9r{qt@90BV`oKf_A4&_Kc2$P=Uw_?R}lB<9}oKXAM z!egJ%J98!PLrI)?9H-7Y(B^tR7@V$kz`-T~^gF=I{E_uM2mJ}(x+1GzSE02rr{=sI z9&yqY+&rdVjpt9O+5?bjb5@UC&wa@}kvKwldq6PjKa=JY;^5%dCs8N9KjV%; zcX`6L91egbMql}Wi&fGeU=rfp)=xX9B8JMmfx zvOX69y2Jz-SWjVpjABVxSG~i092uu3U&w29oyPsHmj(lMp$07LX^6J|3qB%Tg91F-k@?>8pe1#fhKM102 zd|4{-yhx5U%imF?)5^)ZN*;iWyw`j{G;up*uMLfJ9^=2nm_O+m>1;#Ka=-*v`thXq6yP~pHts*>bbn6Oy>`dI$+at;8WTS^v^B)U#zVm=qUT&1PmoTdosRW< zDVjjf-i!WFGWivhsnXo>Bl~)j_yhBi{GW@*ff0b|Dl167T)|NjT7G~9llO39WrM+ z^JDA8^~?|V6ye0~B)~y>%!dDi5htjo^qd?_9zT9U9iKb(#N_oiFdR%CLsw0mo3LBV zYdl8KSl|lgivUlD`RU!cVUAUxqdOmOfX=Bhi9hS}X|8 zbfP)79z93M0qbDV?P@GMPL3~w9npL${<-#y4ZgP2`cx;2kLHsP=kI{Q;V@0%e9RBH z#;J+tDpe=d0gjvS+&pD+#=(}kb8y6p*C68LaeBNy>Fhm4apVrd8GE!X{Z2$@up29I zPWmPnC%i-Tnw>Rwx+w|)I~DfI_2fxoZ~-5T%<(k0fXU*)hyPd_GpD%sZRdeZ@8*u< zN+dPD|0>{f+K!RB_*B&t%ZF>>n4lYtM!)UK=&`_6 z=EUdJj4R+#{hXdWPU~>IRc+JwNB(?co{lyh;qbmTT@|ORjUwEqBqp?T&zZu}ro?ti z*Eiq{clfD~3GL)@Cg@B9eV0nCq#ngn z7E{p^!zrA>zO(OG%kSYh#-DL+2txyB2Yb5y^9fKc>56{*9T?8F%F%zYf8xc`=>XFp z&un?WD*dRHWR2-aJvRE8$Z3V=*!;8h2U2rLTkyuf=k%lpke|Q_@D#|@*H6PB!;N%= zPrE!uxWdsW5$?3WJ&yRbaE^ijCZL%9OE(heLps-WvNh-bzOHM7!*i1B`O|LSP6}?T zc{(BVQdt6O00*)G^5`%J)x)J0hr++U_r+)8<<%8w$CZyiW9hTx)f~w5^lg7U7`g-4 zrGIPFGQ;m*VvLpG=L#BB0{U=j&K)A(jt(|)QSu=C=K8X((p1Ps2|`7xM$y5eeH zXDl~PvssvVSl7W`@&?=)etr>!1>hAd*D3&-nkHh3SI3&}28cd#hu5`Zf{y>SHpL=f z-Zd$S(hpa`&l;vV_|J>P&~=@@%_dFZ|)Ta_&7YD*r*`8IAjA0+uq&3{M@PfiMHo%-abJT z`pZU?@Gl6A{3m)gxnpdUWue2q)Kb9Yv~jw7E8!%Dp<8uJ2SIBN5lEIYlNv z({jD~MaADa+3}wjSofQo)7)@+_*r)MgR$^AKhmwF8-shX*%dwNBx`3}F=$@mNv;#c zTqU@+J&%(r^4Y?oXQyIpGTcn|u`Q4L)Ei(6JMj=SGO$k?T}Pqz{6;rA&fwrWMGe86 z#s|Sq#j}*BLEG>8Q43ddmp@zLt{L-tV5184H7lCL=yO=fw|!qjtC62rE*S3yWr zD-io+cMU)BMQ#0Y^0Q7?zr~(@sEFCZnXL&@T;DWizcH@^$4BJqD}t}fu#1yVcO1=c z9f5vbbaG%^=iyjS^(ozRoE@jxx}v9mhx4p+PvXv|vOd{z;2dA+dd2VXxbAQN6xYIw z;KO$T`0{lXup}~F0qa{&X^9%>eNGe{a)dYuT!aqjUw0!y^i6|ZBQCNp0xE>XuO zh2h@?8STEa(L=ctXHELf?+>n{ie(P*&Kxme11^# zi`1%6_b~fg%PY#G4D6tEwXeDphc($e9Pa@}gjfi9avYOc^7Ma=Bgba)nEIiY?aTM(8- zhDynuYQ+iv%o#oYPXW`4X1zOM{6^+r+El!oMTf-L!2v{Kp0E#8~y z=Eb4*)R+{UX5)Ljc6xe`oZPxBFLH%b{=XOfTx&ff#HF@1SMi=a#%U&rbK@1<`$e0M zhLc3Y8hX-;1^aBuKnEW%SDnS)^C6P9Q$V)jY`R8_3V?i;o0pE9041Zb6VL+5ZstJ} zT{XFlBqO@zhz$WoV%hObtZwQyc^n8)Pk@`6@Q1H)>)~F#l~v+3nwyJlk=#av;x=Hr zQcKmn(v#8O0*vC(Uq>0Yu;#4I^bz5;(Oi4IjdZ!ZRzy+N7v~pOx1pd-wM)*eQ7lSkq{7fy-T}*X~wX>*H>ybVdwX7uvHvDWi2Nk`|8oJi zgM6-lyZCv_t-e>l?~h9XcmBMK=_l;F4dMTFFezX*mbF*krsHXTQIkmv_}0AO!)xA=defNzS;|HH;#|9KX@x&P$`cDSB?wlUuk8kv_O`1+vUb(QoD z_B8iT6!3L?kMHq+{?C`G{vK}>@NbYdHhO*)s7?OogP*g%zVPYl{CzXo_Jw}DSHK(h zHO|J}iSBt8*`3~1y%(sv4r~AD-_>95p}bhvm3M)H=kD9DuU~k&b0hkcQcQPJUVl}I zy{YI@Ymf5~lSS)Yu@@0Hz;GqOMqJ`cZGLP+8+7YwuIQ$? z_C9)xlqQgv@YIHYAU0$)*q27Md@OITe4joSJm}c|+23~1Q`}W<=uEDFq&v3IWxj!k zucxOxB!9t&J!|nTK9GgYOY;%|jZYe5wtG;NV9&bOMqt#w8(ud>`D#F?)mys9PBgPY zOHt%)MCis(-PHTK)=y4#3RQGRP>&yf_0@Nv3%SU%K_axy1}Pb;TX zn@rIJ5=88rwL05_#VB>w2(aNH`(VFrgg+Jcn%uCptdCNq#DYpE*q+!l9^1X)5QqWk#x8+ey_g?RnqGlJA(O2j-AD8=1 z4J=@aNH(vr>n&GWpV|M+Sox92|D+0kS!q$t80Z$i5H~wu>PlD}=cxbN72+>vXC7 z*xz}k{5$k*#j$hzlVx?+-re=Br>dmxN`IB*1?8W6ZupV+<&js5UkmfxGbz+_c_;nL zJ83fq(Z15jai7hb&t~sxBRSZP1{~3pPsjqf;1~* zGr?lBEpvfZeB_0YsC0$VsR_^&Tg=GTTS7aSS_U%ES)bM-#M`KN*Ww@5y@&1ZmZzaz9%{rhw zwWl!jCD4U=0+gRzyB~9tH|ivg#rU(7!K`MXbx?ki;Rgn(x}Kr@l9|dO0Vp?xU$Nk? z6KXA$oqQdn%#>aUAg_YjGp0+mb$h(&2l>j9ovi2EdnWhpOSb>X?ZA`T)TWj^lfMPo zdYhhkq5nLuP}(Y8V>XO3f{gfi+vgY*-4wh4hLTWN<_YkufO3>S{S*|Cxfm%^ih^@M zQyiwvg0@J2@rM?Yr;3QF3n1eVL7&=ismhtr*&$-iXgTeQDjLwHFq>K`3W|*jfoo*a zPH2Z_y)`*0?d-4Pd!{qH@8I4;$@Z?lVEdlfo`Cy}7j0^@S8UUxc}>sE9e$eX${B5$ zHOwXy=z&9N2(tWv8Pbw*yEv8XjRG4CR%MxMIBCJLqI8U?YJ!y(YDdUVy6P6!k zJ+gnVGZ<56=D@j4mu+U<(k5&Yn{M;-^Xb3dBeB6?@ZwR-&}=9L3~Gt`tqt(tRf|kP z;mEJv6nE!W`|_YJdAg8$q={PLy;>dzShJpi64VFl5!G2S1TZ6%<(s9{mcfAxEHKU; zTd4f>7cy6 z?VDr?ifZ-2l67tK04&ouEdy*W;hCj**TQ`9W-}Ni>Ju3(y#+L5JnMEFbTUudkKSFm z9~X->E8p(1gB8CUuUL0YZLKqlEh3!IO)s+qbAGwZ1~!OHP}jD>;>$gB2T_>;l>tlu} zZ3O#>$Lw7~X+B$tnR5@vq!{<<7Z2=J&$*rmV-p~QTvK7Am?G>9&+`>3^8APhUO2wz zX|JH1I*E-FO{_n$*#IjJ=v|7Ozut7R8(MDJmFNHQR3tfjOfxRz%=lR?a^y6 z>_~SkQYNR&-D|T~-^bOLyQrvMeup?rzK%v0!J_a1V2&|EW01HI5xL$j(c+Wh+YA?W z|6!gsa& z-%x;|!89l^j0#M11*Q>P8qocP$H9ZsN86*SLP0mXeqE-N5VR52y*S;_iL&AT0{GW# zJov4*rw>o#dtNCpA(jFcG?*Aufu+F)u@tzZ!RShtMR*G|crbUS^ZfYFY8-$5s%>mb z0N%A~20H66HP}q>(ugii3ak&anX-x8Us{9*XV3LU1lF!?4Zus|f8O@=i~BRc&|vkX zsln(;Lxam-Ct)(06lbFd!z965KM?kr=x4@d?Op!rTH763KPzCn`rCea=AivjQsmM| zE;YDhroe7BC3td+$H9Xax?>Fh-nDHGaNE^e?mMYj1i;G+S%8gTz2cvANP)}KSwcD1 zVA!_M;KBbmKi2&0)=y!#3*D|C47=@iDgF`=jf|1&chQ$Bt9e)j=O_^`tI9jpzp!s_ zCBTMo-CuOL@dsIM(KuN4i;jcmFD|!r?c?jWG)n$d5tOf+*U;t`SEjmA$iR}etIt;Y zpeNIZYnvw&`ODD~P`I`dYa_0O4TZKH0W9~nH5PTQsc$g#oQ3xa+~1>M@4p?M%C{O3 zVb|dLKdY1i?=%h8Omu&YXDq+t`W;j<)da7z^k$k~ugVwF>yww&F7%QrIgRn+MxtHR z3pipMA(FK`6V^=~cN?lA{+$D%YFXriTjH^Mi_q3KPfkoC!y~u&)Wl-VQx#rGOGk~m z9bmh1S{gh0O4eWDTUUcA!akEF9o~5weD>AhO!QK=@OtYa>dJUynp4S@$N}XhU`?{( z*AOh)8}?BOsgolZltpyp{%t*^@q~S1h7(X&|TLK zx1)|x$pZx`M~QnLUV>*|JaBN0-9yba*b&zMou+r3QOle%O`GT}Db8Ayc1}zwtNBF|%DJ*(JhYa`RcXk5taonuwMu~VtFZ>_ z(?-HOO@lQP%^uWJKE-;|3Y8jwl)K8>XR};J5*HR4#NbdLd3!qSmm=w0g$V&akR{D( zJQX8%h5e)~wJfD26cXBtZnXDllJTG=^BNhznO&AdmUi>e=2ldW8;$eOmU1@Wa|mra zhtr7~rkMhBU~jF2x?Vb-oPl+;Fn+-CBwuk~n7GQ}*M~#TPYm`QJR}8fuEF`AEAWog z;FHx%v@Ved)Al+1d^i}IlHw**cF%(ydyQZdOAlB z^-Y3c4XuF5|FQ>by;pomdD=+(RLv{{n{>AY)H-K!)EoyZOj|Qn@*YNnVhcA>xFpA6 zweaqRjx}xN5S)Kn3!#`w3w6Dv+P%@&Pz1J+tlwE1HB!+L$=bp@wL548hcc>2fJDvg zTC(gxms(7n9hH(WFR8_ov)~njikPxTWmqp2`bbMUdpQ!yoA%MAQN_sD6c@hw4fNi% z=U!z6HjZoDUkC+ujQt+}1{%DDKa3tMRx{CUoW~6~INj7XkyEwHd#VL#i&CXdbX!6s zlT)e>xK_EQ<^*iMC`+k8T%yWJT9mNTlS-n^8Oq575~ zmow%{O+KneD&E-9lj$jT*+g!GFNA?EObWcyGoq9bs5U0;TLeUUKPiB@*saXL+%$w^4b@q8AtEIvEDL{rU!U<259~scu9qXilA9g>b&PFdP!J&~UZl%1sPsxs@0$Ss9c zxMBX7_Q}EWe*l})9~iKxH1&f0p>#c&P_y*CCSeeA#FO`UTcv(CGEC3*`e z$f0^b`B*?+`lp;Q$)%L?J0FeCIggt?4qb=gHp;B)s?bYv*C<3Mr+V#~d5sT_bp@`k z!35W>`ERne@*y3XiIzqR6se8sgyug4n3`C0qbfH_pEM%H)wM;>Q$nR0fO#7!fvzcZ z8+BD+NkGx}UD7u}>ZGfz+18{JV|ZeTq!mdWlVK`wSF&oXT8aeACD%bojdj#gGW~!- z2d!^lSn8Zf`jmo8sMu^|2V4cUF1ZYt+{)^vagWl>4yp%gP17H-)-elyQLJ$i6dL-R zlY-LnOsaz9-Snw?@a)9Ao&%i?3j8nC;NV$z*_vxGRk+?bSXSf4!t>9lMyr~tW~ytY zYOLB_?RmFM-fgC!T4sIcN@yq2Gug(Bz0R@C@*T%2`sOil-itMsmYSGS+=zzhn~s8;h_L zEHi?sz@Z2?Ciumbo)kic;ShS1nFx+18CveDT)L#JYXDE_s~)TNEFnet!^Dk9%%21p zf+Yu~D`8<(1egLx;hn{y7(qA{W|&|L@lj%wOqCe}4F%xYR-!2j#ZjR-Apy7{y%>q8 zebcrMNZPBIZ2Q>wCWFGtPvO*t>o}AFdJi~e#l>8rBH>u{gGz;IKXYn&@4>VP0}KjW z)L=t6zn<`Uv-$`%m7AxD<-P|sS5M48J<#=4_#wulV7qj_=)ZGqrK8sG{*2w-(L*+yYo zdb>`X;?o!xm7S<5DTQ$5M@PMA>>7KM&87|DYg|$c%j0!`H332u=NN^?Mn?Ah(X+2r z0xW)IRA8DEm_`MTH5dvUYH2v?X6KmDF0taMYwhDP z5yPIS^5OMX+e>MX5k&9iZlr816cd4JDki19$clICVWOqAL=Z{D>;qva zut6*Zjy1UPWc0%E6JxqI27y%p0wWF)4qM)Tj?;8g!m$PQCXV4_zo>jVQg6T9w`B)~ z-Z{;CE;T4O!zt$nj|~3Uu=w6xXlUN+iHjd6)jKg$@e6uMaM7f|G$=4Eyg@k9V8Sb- z0@GZ9X;k3G8hoTHMXGJyhPscoLIC6X&bn3~(fZM4UZ^mUR{g|(X#>~W(w^-O4&@nW zQk+c+>?litU4!FQ1|8y9gC)eS!4hJc6gbl0MqdbPCi>ZSeZ||(bz^B{b(%ZgBm5Zw z-nFsro7Fc+#x4jhn-rMl3LI;2y!aUum_`MrQGwk|fg2Hg`cl|u_5R=Xx1|xrZUFGE zH4xx51HBgtY#h4=1L6EKgd+_$gkudZKdjPMKO@4i1~>armS&=JC%TsHS_E)!OS8B9 zdOf*q7wdU(ytHoP6DMEWo6NzDH8_4)W%C6{qg5Mb6J^*27t!O#`8{)bf2F_4q`-j&*S|Tbfd-H8fzeXnMjEW=L_gb$ zD@);W`lnr=UQp-i)UT9IAS!`djXH}w^vUBvj1XWyC!R$toPOZ$6-!%>ZjH}-Bk%eF zdo~08ay0`j6R{vT7Gbx>i-2om^goOiwvETZFHDR-K`XDi-Tcy_-Zi+`H4zaS_1dbQ zdlJ;G83Q*z?MMxK^Li!ZgRF z7w)#SAEb&_kU3l<<^uN<~ zv2fhskY;uid?+Y40H^ZFZq`otQmQ#uA`tC{GY)tfRkemPkG4R=~kYlcMibg8lo$=K+oTRzOon{8}(k$F}q>D3JMtJAL?+?!sm!RfvA8eCq;zorCl#p;EF zHzy>)4scmE9c-CvFIxddEhSgzlNr^lR$fx$telhnm3@t1Rz_EKY_@vIn1^H+ypHRfa{3?@uRbc zUK6}9De#tSaN67v8az1p))Ja+>t13563Z*>^C61NE6gfly=T=8r->vIWpvz8VrKBT7v=d_8$k&UtB3@9P38j#a6~I*-tu8_{djPMpWOG?hUUJPd&_EX^1>RZ>p4u@QJot+< z{c)XaRbFeEiKV~>eTZWhmKxx7O7aQBWC*X|-h>c%489=&1|Kw3=3QTT%czD*9^#i2 z7*yieXjEuIY9~vZESRUp(`?YfkTwX1Tzi+F9V=WMeJTMz3KLo7;1`}n^jSH1kFA`{ zGtdW%8cd5dxcTaZ#CWG@@Y&b<|`n%^lC6aWALr z$6$zx84yCR&YEJ3o!*~2&@kH1ufarE3cSrVm@5{Z7_-?2@=4i%HbC=8La82EomMVZ zFUzt6HtcIAu)!kvKwD7|-#V$L`Ed1J6TTK4sNG83RgOjs%I+4$j-#l~>A99XNSyHMO&- zMaiI_*INUHJ8oVH9he$%S{4K@sb_{|8{)ZpeK>ydyMtaC)U5RhGbF zEh9Uj`Q#Ed!ZBZ8PQ$LbaIJyx=vOav1>U|IJea%OjfJvCf2t86@u+VH0lf94+?lqNW}pQxsU^a(29J34 zLK=RPwY^s_TsZ#n`1Y$GqIY{*bAWfP-9I-i0ge^eHFyhFFEj<-wyPIvCOXs7@Ar0X z3jo%M{xdw?IOMVA`9oQN1u+!3t_F{A^+Fk*`M%9pFC3hGYi#SUUvnc5+Xdi$;I>5v z(I07)et1m!te-=FeB#YK109cn%No2Ds~1jVD7?*AFC4shX{#u#5!dU8SEi9t+aEc= z^?kQ_!&#sF(4IX%b+7`M3M>r<$Ds!Au3m`eM7OuLTGWW$91uFkp8XmCH#_#eatku; z*J0P+)5C7O!47z3o>o94x-x4KK9(`t0$gS6o@VlKM83 z)g7B-+HbD&`Y~nwwyL#c&_Fuhl;n=zHem|^qL*ss2trVtQN4U)_3UJGfwNC%7Rk8R8+t-$M z&8)5>N#sla77F1f&J%Wbho0)ilTbJp*ht|NPy6s!$#k>|Mc5J6w{_A?UwPuGz;U03 zpUURMjQEWeIM(2;S-o(22drK=I5JVL*=2#ywo9l}ovS2u!oqp=bho0ID?#vE6dW?- zFp^|(NT-rk;+R{42<1U0Iu>LK8dwTujt!7xN5x3xqb7tn{id2FHvQuB?Jc%9#D1F0 z-Dj}!3^W;*Nr7Vx-pbVrr?&U%g_?;T-}G`?tIJI^^d6DQQlg!~DcS<5@18OshSZ@k zuC&aIjMCY20&}EM|65@{1OdS`RFCwrkV>$Gh6S}u7|1De`Ex6!5jLi7exqJf zz(@~S*m%H1Ni9NlN+0mc04s_iU@F*GQaowAGE{yR%-bUuQba-j#biI5ZLk2|ATd@F z;Pca(fu;g;H`d^-UA=H>C#+sLm^(9}>u%jQC?YNc>yUUcO)$Z*o}Q9me-LTU4yrH^}^}xzIvf%qC4$%UctcHCLE|% zm`~Am-l3pSekiTT18lMk)?oNpoJlJ+8}lMB9T(DL7#~IUk*-8jDYXiY3ak_?Q!wWz zP0n&>D7m@1n#-M z&~Dyuj%>?UFPz>Xs~5ho%&SQi?faJ%a${IJ13fm~J)&=<$r;TyM4oL31qzJ{(quts zJOq>(ip&^{LJqS6QwxzAt2mu}C?N-hMmLsf%__Q5)_j{%*cuPN`)E2 zRTVXnuv1x)q&%ofibP$}n*giqP7Bh3qqYev_R$35Tqu~La$AM;ELcp32Q3lbq;CUE z6LU+<$0BrBRu(Jow0X!t!Ib8 z#Li`a0Hcmkacnq<4WBD2&l`Cf{T8BHIu5S%aiiN*jhUR%SAW2X|nX57-NKm`KfdykYPM4L_ zicR5NKnQ;!jswo^miInEGu^@ibHC86p))gqb-|^-3}NGo;4PI8e##e&2LChzoopl; zyt{g#6Fm2NHvmKKMS+RK$5)q9ZDvC?uV+D7*)c5_mg=hQfHS(ZJRlQ^G7GF8(CTE= zwJ=J9G?=Wur(%_H)uC2jtyQ>$LpA+4@-nkLrEwWzS z+KN!Y9=g!=ZP$7eZ|)VowKaHm^+K~vS1jz*psf)s9))qYoizt|*Pearz(LVlUxQ`M zf0XrWUcGRz_(r$g-?d)=;7P0Kk528Q>UCb9 z0=l&|Si6VzPtBh_e)`2^r%w+*WpBWKTedT6_QvmLD}n=wjuhBllY>`&`{sqWlAWiW zf*qEfI{b&r8}|CTU4HA#@wwTi8myV8j@R%`P|xY-;pr^**otxGRxVRq zmT2GnxXs<2y5dSEPix;|4 zgC`f?KGA#bnQXA9VgC*GUts@P_Fu+UjvQYQz|A!H>;(ecvHB3yANU7eFr|~a;;YWuL#0xq=o&k12k!J>%Kl=C+vrmh5 z?bB;+pRL*T&;Q*Qv$G?aiyoZ5)aivZ#7(+_MkbcPskIidNEjN0`WwfI($YH!*D5jM z=y>EvwG3*WmX3>FcoqySxhmh1)E1n4FFdz))W!04hR=bP)fZtY@WFjki)U`!+yE4C zrq_mjK&ya--MV%A_9u7#azCGk7f(~eFg_N+^Kae#boF{=_mbUTvoF6~9okpf9z1yP zb@jJy-+c4Ux9PQJ-+lkp`%(|Hg?c5L$37m?)gn7_7_NAKc(;aXpVv4Zfv>AAO_x|8tDuS{=#3E!a@XEpvHz0(T}e=sEY z(|@=3P%Q;6Yj6hm?CZDhXMEQPz7Bvh!S_gT23Q2kzI*4yBmu6k!CbMhjZ2IT)^6^2 zz4JO)R%^;`-b$}>g|RvuR4Ap=AzsO>@IEAEwKEJnP79Sce;}v)Pj1Qp9qgPTca^eA ztmyaKVWoH!yg$_7>B-q6AFeC#XGH}b68z0A_z4ZaDGDx64$ zGYs6da3b=CA_y=Xm)rqYX+W97@W|wXbXf=P`i4GRIez@vYvH;Qv>FGr%8qUOV(;ztu8!O@lMQZ@yQN z3kfbMup~H{0i5m8ckf-MRl5ie#vH_Yin@csRa1q#78$1!0%=a#vnLh41%e^=}!ur z{%(DE`@IucfsJ7MH5V1QticBoz=JQYesVn;1SbWq^cMiL53MoqgU=t%O%9r_UZ|Pq zJ)Lz`l}V&j$57MYPwst$)WP+oQDhZ>6_da@59#IgPzhS&K+JL&#vmU`AB_sxXt9WS z8`)5v3o>r3DW*;4L3(x82$U1;X(($ipi<-@W^*w+=55-TJE+@;TAVJ)wsN7l^ue$$W=>Qw-u*m%^`bAlIeZ<$fqkpeSboDud(tgOHfe|s>&ONL#6Wm4dx1}BE6=ij(; z>pm1XBTNO(68t9=_}+tScfXJXH(kAOuvpDRcVu2W(B zj;@;Ol`6ENxDu1k6dZw#AEYEPBk~zw8oH${v(m632BD_vD**^E)5Hn)aL!VWN1Zls zwSzbW6^H7_X@|@%7LN}hdwL2-eS*nx65v-Z{8$O_>|ny5-4PQ}aP2fw7u6ymp7DuXt(SpZ z`c5{F$q7a-@KAUKNY8;btFOV8RU_cR+d~1C0%r*Z#Q(dXz?of{2>$rFnS&dPqQRiR zuuU~MGd%fM6Yo9XG_)&l(%+=OBG{&(zsd?++1Gd9o*#^8^}@lMM_JdbuA8yyxkDLl zR({Wf^~&8@sqIZeHK&J%i;tmCabx_JrGo$pZ0wpr30)L}@a0`26N%BoqXAxKT{`Dc z=5}2OZ}w;(U5T0Ecx8WZ>-Q`r zn_0YY^;_ZV-y?}&8w4A`Uw!@6qkH!rJ-GGU%s`KPZ?bx!eiMzh+u71?%m(AxhR5{! zPi8`^5r`s=N=NgGU+Pt~Oqz-&Jh90h21!#0XDK z+2j8w0h}4OJ~S2h%U}@v)iB&Qcm8@-t2Q)Uy>M{x1oc51R`J_G@TaH3a_P&fIIZygxaX0+%$nG?g_y zzxd{n?JD&y}1N)BFhyx z&0)QNV=@6OD`{|XHKomdRyjG_d+#3k6cH^uhxbfa0q*Vq$?fu^b~?SIXT)zkD+%!8TTfL2{J47YmspfwQ(*L>^-B)j%y9d?J<|sX zaKTJ{EV057?e!qKX&!i-{;p&B)iEdtX==O_Rx0#~@ z9LE{)N$WOC9`U_7{-f3FxUI11>V<>fym7SOyxw%{)UO&zbrGj= zdhX$I;oka}!qbg2>B2(}-DW2YLF)zU#*!SDg)`922-XPrR5b#AoCd%NVRoPeu}x#8 z7YP=_Nr69pcc2vxYin>>g6A*(>jxYI+cb2tFOvv6z}AJ%sQ=Boe_Wi01UI@vcrd4# z=o%dInzAmsb>Zw4*&(e*8NFi@B(>^(3yz@DvaW$!*ZDPX#YI^Sbo+>jkD;zfFs~v* zjpH}awao?i*wKfn`<(tTiRE`BnF4bj`U7^MuTC8lztK3jD8dB|PP14~LxC}ir9trh z{BnT#TdX_+esu5A*Pm?MR@iLS2F*m*Zon1R0gbC}oGdqDA_zi5aS}Hcwk0oqA|?2R zsn<9kY$q7B{^8U!JM-I(A*({tya%H!W`>OdFfp`pNnm_Me>Kg9azz-zv^ zp{PAnPlGj!HRxTt1_ibr^mTrb6m+3;uYj%r z#a#ldu7yFCoDJZvbW=Ff&)Ii?-8T})dJ5WoLd02o4Fn?P)yIjtGtg!b;Oap-OAiyk zKV^PRfo&ez6xazKev5Pf3Tzsj{_1M*)a3lc?Q7!K2;RU~qu}x^Rwcekf~!DZfA&zf z6*gNrNh=oiOi3OyIxf}-GQ{tSv3am$hBry*_0WZ`eUx1zCx_k-d5gc zGAwrvs;aK|Il6L_n<9V^rpQhAS2TJmu`Uo*zKkn(r9xv&1>F1at=^;RS=H92 z@kGu#JPyxuIEkgWUXyilC~@B0c|j4A<@9hWEJcw?5G=GMd4u}7(Hv1>bz*QO{3P>O ztN;qAk1?%8*uXXf_@&;%L~g?OCv~AYk)>H^LwJ)(tlRH&62JvZ_{NjbuECmyp8UJ3 z8DKsb>jy}1QdXOXwmvi;-SN%cFY-)u!_^D5V&Oyvm~tn9p|}uKwZ$$nq6febG7GAd zTq@}WXL+Iput{KTN-5-?9Vxa-i66qgrGrIc?xZ~=ZomRf%6|E5AYnf=Y#H!4AUNnm zSvy=?Z~E-{E03kXyqypd9F2j+uK@n|@#TH_c7Bsve-wwS z?bL?k%5+2F{Hc%fW3d7W#xyhm<|LM$e)r(^bJP45si6j+J-po4l|?tgUi@nfIFGJG`*2En4&eoXoC!@u9R zZymyEnU?9E=E~eN!J47azJ-&AuMl7nECm+8p#m$=qx-9mzP)o%3fxG8wPN9`0C@9u zU%Sq(qk(PP@H#J7r37PLc7IcRDk4qsx)vTx;S-ZttrVWvQukPDc29=JUMhK&DGPLI zRDNq!bj(bPeF%1w6iH_WiQzzqU^XOx^qA(lsIwUTiOW;3jl}Yk>`q)+AO5EAfq%OB zP96pO^WD7%4TkwO@aI?Nr)CBV*%p8Eo5i_xJG*9BDs*FY&}t#j4dZf%)uM-QzkY+y zwJYBeTn&PQI|}m%I5A$mtJ@0yVp0m+T!RO1AMJB!)>W;SBe3y0$XVR3OE(&FuxN6s z&bZQrg0UaZ`pGe%Ol1a<*^Q_v4U}Da4}ocsD6he00)^$(8&E4H?qGw5mW|_l{4rPT zflQ=sV_&p%+R}y$4U&?Sx7sZJ2D-7O+X#QV^f;Tw!5a!p2{r|m1p7R60(kcLOKCk& zUlJ7SfUd9o`FDT(Ddt6XE(AtQ8BF`)b^wk3G3OZ8LE|8kxFI7_>V@?YG21MH>Z*S`i%wtD|jdbrNys5E#mcPbGq-SZ0Qz2h>s zW#ModDMWJ9b^sU!7IjL2V|8ReA_F6rEo8)_<&j#lE@zbgCo~Ss2|ldUbN170hHi_S z7aLJLEoQ+P=!X36oti!J)JHcp0+yKoLxZWng+Z_Y&O~PyEV`2M6~RJS_(F^YFx6OH z=pw=DLk9|+de2#;AEo!|_tk2Jl;DQr;NeWPlNX4s`I?2gS)9BLqmakAD!Q3P*}$vC zfjA^HiXAs)Wkj68FzvWSWju7HvPBmmunfMnpA)Z7jZlCmkH7pd)2m77%8~-xJ;9LR z@)Bo4b!cLm5=;Rmzv-PJrUpC13E;|-0t?^rZ?UAoWd#<#c^>P^{Jd%KWD^a3^QiYj zpZqeLlf{n`DErbWsDCk;RCF3W%M-?}h?9~>Q=`lq^xMq(D_n`N`4sf|r|w9A?R#KO zLz7=3Yziz|_0TLlJKBsr>in`vD_Z9HlTRzVX4BBYZ?XKbI*IS}62FiB=H0(rNB~2G zfpGoR3(p?u#X?$F;(Q}cI}XLbu~%~=!1ZnP1&W)#t>%}{fo=-${>fKXk^onhv=_g` zDtrjl@MNiFkG#05*iGK z>#troSUi(E(YpqKX}i|v40Kc5yMO-l(nH~^5pXh$fiVkhgJ4r&_L2p#4EVYR--7-E zV$hpk3E)pPlVx8c;nA|xUen>ec{KO>Oez*uc`y>KZmXiBVcurIS3ZOB;0>3onKI3%xi((Tk1cjj|6Zc z*c2E9YZSbx0_TTPR(~1;udd$vbS3wpCBk-taNX4l7mmH!-~RQjepzbQ*_H?5_D(s@ ziJIZ<7=1s_Ku?cUfY0>qW`H#arUI9zp=}sUggJ?|_M)F_ururm3<*wup9tXcQ#q=? z`?w*g2ymXp(nNIChhF`*x~)(In*!Hgy^u4}yo&WfRm>fyQ7U(fsmsybVW zJ#B2k8JN(aX(LX)w=%zXlma~W)|ESt?_daAVXQ}T6z?bmy--;6lBvM>p$8Ng^b%g< zH{nZ!^DJ~lunmI!r&t+K12~($2gWQ`HIJ2UE0hFFfkO?}N5S%nh5gOziB)NnC~efP zi%P5v)5yr4h*_cuU|P9~*U{((oCfikcYV~$$Aev-t^Uey4~dVgR)mo6zVy3jTT&Jvszc++X<>%1YU{6&%wU++Vw*Z0HQ3I(u( zTYvS!!Nqf1Ftu4yGGo|%o2T!4QOYf&JV+Ms0H-KA{(Cm?$7xY|`ecWI4WKut?oab@ z1eQm_h`l46fo^E&KK^q<0ltGiv{pA0zlC{dD6st)3lf}%$P{S$8@$z@UWr}xq4_;h z2AB$L)6gQg`YS(H=fP^_nMGJ#=rkLhZ!4UX*$u+AS1(MziC*dOs@LXdB9a6JaBoF% ziDyX|(4)as&at>#Vpi&jR<&sq2Bn5YfO9Lu0v8-VflcpxbP6nEaTP)dhKy^1k#QGv5r4;qNZ_!c0R025!C6d2zl zL4s`(tGGD0# zqsR(dRwRRc!r5S&tfLUbR+&LN*s}Ht07feomRn3u@an`P%=)Ix)p7$&o~%s2h3CaZ z{z{#|XKQl?y14*X%K`sbQHvoke#n7oX!{-s3T*Sxm}ahA?cwi+ux@XF2xA`0y3m>7 zM6b_ck>Kd59QqnbwyM|a>NokeLJ&+1uD^O=dQNl?*U^M95Kt4ClE31!!sSmF3xb}^ z5O6@LQ21niN=9#iY2^~Y3gocKT`8*XPj}0p*vd&@St1@jVku3ODQryH+_B{Oq6*$rB-vo0G%QaYCX#XAw zH}#9(%?80k&qrW*2=IgJ?_Iz=7OB;C-PH@B7tvBWN?Qn+_?YMl zcsQDX!Qc!`q(y=XZXn43Mxq2=k;#Y*hvprBQpk2Gni0^aiXEGaGSXv_!7*DFn75{# zJvIZ~_%_0qtJ?^LaGHP43}=9;z`UU_zoEc@m<(f$w`Lew4%;_y$O)O=6Q z2ZttYN}2W3F>6spA$(M_^*wbX>?lmlln7c9Nhy+N1a=wFUvb3Psa7iLl2AmIxyr5d z5Y#8c6gKg@@>}P(`E7*gL2C#s1x_y^?9aCI-(m?~5b9`~0*hcsFg4f_<}CE5?lS z$NU)pft03FVVx#(=yAhel|KQj;uQMf%nT{w!%hPI^tSFT2emvbIVlZod0GnVxq45S z>FA8W4JXyw!S*O;pmiHz7T`NSWqk29FcjFQp&env6ki0}2-p-DR{S2=N5OhLM>q|A z{Yxy*U<9vb1*Qngu1r#bDZ=$uFO)65v4X~4*H-&hFX--dPXAedyY zDMvhu#an_+f+fFMfYFKmn|CkIP6FWOPwAMuyxcK>pbMy8gbQ92Hm}1XjCIOMFgZ~i z*qKLDe~z(*iQc04(8y4DqCx(ZPGSitK?2HP0TYH>G7Fx^BpkCyY=d zIZj?Gtj|C2LL1T3SozhPiAq}=Hs?|4lB+8KN{9&r3 zI%w!%!+@e*kz!ND{J+(;!v*DXV|zeOv$u9z1WN5k%UzH+iL#P-;rK}p_=0G;0ZkmD_B=&;`(cwqUO$dg+=_1J zMmYnm+X%A)%WyZ6Zf3APv3JV=*N$`VjKYni70dAC6Q{ILEQ-XaA96XidUQvOoi7Wp#H0*C4A0H6j<{CVE?Dfv(qS(C3 z`Oe6zo+H-~U~T=m*(hhAbsOP{B*0Iiz*oHoZ3^sTU@=;4*<D^|rsKElb zsKDfR0*l}K0QmNeg$mP|QEKo@mwxt2yDh08z`NEtG13`m-9|`)`C#`=71+Dc zJ_vRN7QFNbrlGA1?KcD8{#**29`No8%pYTM9@-UHkJDlQIopE=tM6a*^@^Kn@Z1Z3 zo~mO2FBkmbxr2@6cemv=pYF;RdJ4xVZzIh7Qhs$qKNWb>=VJLRmN2CPi|s&x?Xi?L zfmQtz!g&m=Y3R+Ki*=pf0~^4VC3dwe((s4S8(##cQLt_+oEe=4Up&#ceyT1sjJw>d zde&yJ^)s@uJW}|?8;{mAT5izrv@eWu23offW_t{V?WvUU7}(b+^g9PR2By1DL%Ra| z{lK^z7z&I&bVk^JONn`C5WMOgXxW3|`AgZ8YsjWYf2xrGtZtJMfGgC+YZje$Y1ehp0tCcos~58DR{8vjRU@eUKlnGc!UBUOX>?cY-+?+^tDK z%U!tL6rp7=aQ((?xn>bu`B8#6Vt2GN(7KIqO@WQ#JPL*cZ&=~y(Bd~#U?A-G14Di{ zd8{mFp~Y`9uJlcU{kK@zpuiAdXs{6en|Jr<*Bs5q!J3J_+^t(_>+5DIZsgV=Q|1-< zx0rt117)xnOu5$TmIM%6KFi2ELR0>ES08ZKN6O*yC}*H`8zFko_AQbGSPHCZXd49k zJ;5@&n*kmYX36v4LFK*#()>cytdD> z6vn^`$JG8rgV5R2d?iA^jqub{A4z>N2~CDwfkm*bu#yd57Xe{RVr2_vu{4bp-i>4m zEP_pe@lcM+T!Br1eH5G|`0sR2gCPtBt~m~#d!f&3?Tq0KKbXNT7f+`$2brRPh;XY+ z!JsCn+9`-OV}bO#+mZ%B2C>DuE-wVYCfYL;M1Zom^t7`IrsblPX>devK+6`^%g#ep z*p5~r9O-R@fdH>-FcsLJ${~jBmmEF~O%L8{s6jCL(4524-AJT2ccF!_Pec16qj)HX zDX`4?&l2F(?>W~M_>fR=)zYoKUy@NOvubv>B&>4&tX zzL0xUUbbF1bm}+CnYZ9+!`tkv2rlbZ-tM{CQR1uH2sh~EvMTA#yBU)CI{h$BLknI= zuoM_RP-ZBw;Pu6UrNGi(tq%M-rlF%rET4xK!2B(=&q3$ccRxHllO@Beu(^z2Go{QxQoL|<1&Jw(O?NS2R=xw%o z;p{7yyXzXkcAGo-KhdNB$<69JO#Y}#UY})h&*^KMWq`jbstvTs+D6$RWG&^UBlHXa zppxKW72(vIsnTDOAn*pgDX~%~xjyVDbUc`k(xbaZ6t7Q@T!7CkrP~PEg*Jqo`Awa#BKjSe?gauo0=bqw<1s;bn&|={nQkdM8HVR{`Q2NLe z09GWZv8g}O=Lw9osu}2!-$p3I@37E+{)znJo?x4XE-!J$FM{P| z_?iM!f`Kskl>&oc0PK&|kpfrzI>10z{6c`UeOKL92zrHZv(*ddj&#XO`mmldp{2l4 zMWBcXs11XTpP1#LlrkL3gFg8>88-A(`3!QPTmo3e5(*mmX%}wn$`fwNB|Goydp1xv zamQsqUYyGVi{4_oj6G zG#`njL9qRjqwrLn%@sI(<}ZQCuPFYT$H%e)n*=vnz3}*}Yt28XWL5S)Zec*PJoadX3YQGaHzpNAO_cDlIS75HrkpA#g z4l!JqhL!@`Aou|^xO!K&70zl73k)|~z3?C3*uyLB(7F%nlUIL`lU`nzz24#jZm!VQ z#bk7(Aif#Vd#18hxn$)-_HF5+!RrO**@+Y8E_cd}gQrc$I18RSK80h%w-L(xUIs3$ zl8yY9p3C72tl+l6>?&uU#PXkEWp>MV6Y6&0jIb0KkJTy6L)#jK09cQ7C&GFq`+D{L zEYsOykqCrj=W?Q;Exw^d;(FaQY2<*vgNF%wh6~Q2DpBzI*~^Yk8}oFw-J71{0d+E6bt+cUz1?JA;}+X zmnB&E`Xn?FrUFBQDZt`4D{y)X;KXp&UjpodUgp!AM`z5a7N0clZAKxV1mKAnU~co%`wwn$Ja>#+$S`bB*sh+!G0G|E<1b&a zuaL?&15<$^!5joa#A&;g+PN@uVS^B*k_i3xVb`18-JcV(YK zg26CE7~^13e4pmO#lr8gzW(~h1Jj9M(_q-Y;0EEv->!&gYcprh z|9Is}^_TvoSNfFw^Oah5*Y@sWGw=jlo77}=t+|fFy{y$GyZ_bS zTsbf~KY-1y*+TWFO392Elg~-ruB);ir&Om;Z_&Qbsk1zpCr_4?m+s80 zDph{Zl4IDx`>F?AI;)au#0J$rW#uhS<@{-7?XTROO|De1tv_D3DqHJY)$+V7pb z3{!i+ zwG~f44~wSLW%B0!OgQ!HK#=hoh-D>EBiBZOIkMC;`JGzg2kc8}K9*^*F^`}p&RgpT zUZ@)29TVLb+W=U^#Z^1SxL_xAK``?v4T`;GEmTC;mSUsNJYEW$lV=w}Z=T-*TmhW& zOMC(F+Of_Z14r`a>vW+dkKWLQK3w0pGe-etWOM^@~416v1VBj0x$Z=|_Z+xa4zEeKF0pLR(8#UTPPR>9v@lgg6 zh$#x*;VL(Db>lT3VD?b8;$l4)-%xAh-#2Pd>K7C+5xgFV}; z26&{mc6ajz3<*hNH<3rEprlQwGgZWw2m{}Q;=+6*zjNmoU4D(;l;7nhzJXK6euZzb zl>^`X#mLZ1mG)}@_iqJd4vB2#YRo)kvy=lTW#KwYZ@6kWX8VWHBZo>AZuUA4^kRBebY8t`qaRDZA3DsSSchDxbyL zIdk~`ztct!TI>I59tSC;h(oU+btHVXxZc|Y7rG?fJAV4SGkGO~$?pnfjA8~_6ITLP z@P=h|?Vs%Vi=km}>Lp-gvifJP4l%@=kfCQxzDCXOZ548H6j102HAmfos5q&SC;S2~mxd z8OBWtP%H2l7StcaghvNmHZd%Mg1-x>OCq9=KT#-08)Brq*h^wsx72aGj`d+bLuo;v z8nENfRK06Q)zi>@LtPi|RHMkE$aSz3z{OTnyJKD9E4?09{KMP0J5~@J9`k4TF39-F zBV(8RMtWhtkyVRD{|zF&1-DvO7tS?a7@w)od9A^c-|Vlf@HKa&j2}G^u>LHM<|SCxFTA$-6FP z_eWxXoex#1zN@eL7lJ1*w!>&PNl0d10BYK?lkB1k?`_qkV8GIq#l@D%D|h-T(kls5 z1*7=_;p?_)SzW#|+A}muNY4(l)7u!fer06w($T#}Lm^2szLOx8xZN9&vO@ z1+%W;e2+5dvW{3F{W=8zLZP}ug5MV+xWwHl4gzgq#i?5t#c}BUyWZeB8-%3yIvlcI%dr z46YF%PK>zh(&`;laZadps$;JR@AgoAU-babym+2!yPmvz%YwO-;tDeOgIr7}g zViOAvv1EkQ>U!g0A zZ=S!?-FKvy^hTAZ_h?WjdtQ*}6Ld^h(2p@B7D0E?6Qs$~VDic}Ue`tG!2COs_v0jQ%BP`+>USMneSSBFn&fJsxmo}zG5AZ{aHy*t@D;gY zm;9bQztqInpM0iTSv7)NLSi>Q)_1qgZ5bXpGQAaW>YeytelCRR4LT|F$KviIs4?NafzBhzdF@Z6bKV86@Wd#@INFJx%0@KpRpZehV|XUE1TW~M9T*L0{M zt}1V%zA5|h>M6+sT)xEe*OX+i;#zI(u6`PN{NO+TO=7j@+8)0omy9yX1kvjab_uT* zTW6zA{=l!kzAW%7gyp`j{hAnvYY~M7+riqIgChgQ5Sa9q$2V%UuD}1kKhYoaa>u-- zX%oPI)*9Qtulm=KreEZ2GVK;y#WL7x@dvkZSSGc^(^+QQ0$f{Vy;A%)dM8dVY4*zP zJ=@~AuK)$l;x!yd^5eA&|D|uJw=(lJ9X@<`v|g)Je|Q&?ege4e{_GD8R6UEeW1#mr zA5Di;f2bRH6txtmlQAPzFdGDB-ypoAmLj?2xA?ENC(kWu@>%%i-Iw?ZV0D%$oUh)z zJk)n&Izw;U_?kL@cL3M_xB;&JA#nP`Yi#gH<*y^{9e&Qo)g_pV;Kfjv#`-!Ch4>}n z8w_^UTlU}$OW@a37%*Qu;^gzPKluz?NpG>y0sZ*K%G}V-Ba`izZyw)5hZ?n?9JsFC z@07uMr399N>LNww32MPD(ijEKK$GM{yd&F0;Zy_@0L^3Fg+N@HVJUP2YvJQv0v<)nXJ%$P5t%uT8yo3N_l`wfl;?d1pv1XY`rX?etNwm z7JYjh5tP&67UHbGH}; z^M<37Jlu63VE>u&YE?`;WS_T_7$0^>o5x;h+&lSk4dS|n`Esc1No<>{{sV>MjjPdJ zNv}>7Y(|MP$@S)=B-*QD1g) zx?kdQ;`rR<+mTo~Z#;W#>9xhz!Ws^YVRoPsd{=Wvt2$o0d~tklZ&#$Z3iBnv8@nD= zV3y%Am*%xk#!*C_SS#pVhjdrUBY#$V!TO0q0(f0j%BCz%7MAZQA z_)kZ-2wxho=;e-%d(Ssq1YArNf_}_$MQ#f2EWUba{wzMa5cplN<3R2!uf2BuwV;4; zK``;9R##h3<3sG~=*HUo*75P_F2{UJ;4AfaW(HeH-Fs&})kL26*2*|7KVt!%HGq6II}MRY$G| z>vZk-!SUS&a256|jW+7;IEx-t=Xug#bm|PXFyRF@n65$+ev&S$v-hu4Od;kYz&arX zjDc`HaRH%YWpeuc>@RBrE|Ee46~a$CA(dgj{-|RDbL-!#t%JQ)1Kcw)IVONJqV>KW zAtkHA_tp4#5FRG7y6&^2*JF6r7V%4Z>AvE3{=x$IjRtJ|zS)#9tWLCm6qlyR>#7ir zOR+YWTWgp04jh@RWb7;T_m4JeY@4!;#1c$8fwvSAGLR$UO^r@cm?sqv!r_g6g+7#MjjQghnV9X^fdXz z(r%B`L|ri=ts`8p9!HtHf`0>!Ru1sKnV$!MH?~}F3uHpOk+i$-a9tFc8B!Y>rk*Qs=)jpme!_BojJ>$LI z70@euO@ne!{4v)#h@cD8p81d>f8vpi7(+VbR*{l2s0xUJ3*o>zNx&m!C08A|NQeM0 zI-IJaYe6d9yxO8s<@>5xhcVW z32&bg!4HA~7rJAc;KKLrUvgmeUmr@*mGjPe-!%jZ@MT<{xMJs0tP=iPVTeea!c zAb=Bo!zx9`#g2=`Zd|*%V`#d&Dtra7GdYvmS&Sgfn_LoQEo~aEE2XwV>q&UWJwTN+ zu6CxfaUGeC0K<||Yf!LG7;1^knE2B35J$Rkl**uB+<00@LrvIgK^6E1R&n;6S;w@y zy$&@nH)zSGuii9#-}~Uhk3Rh1-6p{VSnvwp>|zdl?q_>;8^BfaJKEVg4@1*yVHbv& z#Nr815QW;I{Sn6^nr25DES4>rE+wOL-++|jr^l|J1NPojC3dBI(S5JJAN0S&5-5If z>H+zUsDfQv66R& zo~~x>D||->J30Fa0E5Ut0%4OR$7?YBW0>XO2)qDHh=%R&1p+g&4sowX2kOXjnshOV zO3IZ`WpV}B(%fDr*%7!!K13j#5?F>YD(KwZQ!&7M_DKmx?W$K z|K~ery4s`naL#;9gN>FpA^{AY30$3|16dNxYYBN1e9-DO%9L0oICuj*U}K`8LLD9` z5Kf$Mm2%+q^ZC?LbX%6MBmRyI;OQODR{jlzTQ&fgePswQ5CsP|Ud?Gy2D+PYfFIlL|DUr(&0a?i$mao-*?{q@S~4D|NQen@CWb7f(>B0 zuaB^+wb`+K!`wY z^T!{5@>!vEf*%A2PI!filhl3HUyeJ-&|TjYI=xJO4d6v}pg#=wS}i^go#=vKS@3Ep zt)1F65df|d-@yQI;&eLJsg!Fze%s5P6D{4+}ak#I#PZa7K3dgPEFkzS34L@;QBg>BAL^V*&=sKBKfxTvmf4RRg?p=IF}-U>{#Ss4t9R zd|=lc*m}^xfJ6T|fMe(sz3AY;MHgE1Y9X~WUf@f9#V|BKclwoxfGpaa0sfWQ3e z>#x5K)zCba0bJIAZ?0YZ4?~j&tHf6T*UC{LPixPq9AEtXs-q14zLQmf_V4jZmN8Me z1J6v|4GiWb$Bio$34S00F31T42Mdk_M}7gS7*5emMdKy9wuChr@H)NrSfT-c_4UJt z55N8j798fGWxs7Z@QXW+bWK%BuK@m2Qms}2z&~khXnUmq_k^z)?H0f}YIWo&OjXH% zjo&~{FuxxxI8HOSHOVYF@Y-s+a&D#N8&eh{!0{!dV89O_J$m%;>tMm*#o#y*Z2*_l zGdqU6H;b=NFYy(?e^&YlU;#W+-3!4zLG~4+1;Akq4{VNMBYcUl-il$t`vt$>1OpEE z267%o3yyv0*%qtS-koHY=_cfg+PJfWlV=yzc}@VfDQK(4x8HvI$ShdXSfv5Jaqaxp zJ-yv+anG#Z+!Cqm)mkvguZARu*tTh z*S2AE?|##OA3h4?Jd_0ofbYwJ1H2JgF-&^r3}0uoJI|%5%eU968%C?T(I?@Ze2Jw9Z_~VbwfFn79-~e#6;K;8)HFUi`vmO*p7djdE zJ+o;1wm5Jc0;>o8?RVdQA1pZZq4j1Cn}#k0@bdiN&H!-9cTBqW`=@8XjS|c$f1}MV zwA~?-m_2W}C_Be~*?b`EXJe`PyAt4C6IB3g^u|p9c=+P0>F07?dij9`yI28nF-k z-g|KnToT}0i^u-k#N#0u@I2omPb{dnM*82M+&P_Qg9y)P+{qI=X)hJ?KYf zeZhj!hYkP(*c4rf>_&W3bhQb(5IzIE!mnJA18WXC{26)tIQ$*aAh=@ZScGa`nS&>_8b)0^FC`bSoJ!m7xEI9ODH3$~K1+$#4 za*TH!UD6A5qrw#Q0u1+v90Gs$I8@`?P>Ys9um@;%30gb<|91^_9cU9@-+ZOE z$9)8u;m!H8M1Y;-HhQjYK7j@S=JmA94FGnYJ$?#0@@Z|zC{t7S@28C(XX!L1I2ZhTR9_P&O|!TAVqoQD>_nxKl?ctCbJ)lBEr zViLk<7MGV{zd;6Y%Mkec$InNAF$gZ#g0S&*Rvfrjd+2_w)Ll#s5xI^$g}j{dCDR0>NX%(^Gje`n+vzz=_z#d;DP*frfb zx5w!vkCdq-{d+&!ite2i&pT+tJZ{=tk;MJSAuJrDmJmAt>!h9v- zrv~W_qX4H)TiUj`0f^v3K^)X{MNon<`GHB{p2ezK<6a7iJ0t_-j^bF*gD+MeuB$Up zr7)0?Vj7FV-2j^)R_&01rK;|NP&vF|3!Wviu>OjLUG3<234lefj(2t*gX?+mf z1o&Dz082Ml=X(db4pfUT8z%wwhnxT*Y49+^G{Nsc$4M+<1|y-nu{{z&_KzXlj3BYJ zc-o-@0jy&(gCez}vI3YCTTEh4AaPYtoj5D&t>;Kb)lTTg@^Fk>!fsJC$Kf1Z>Z!aYPALrsBj86b^4l4|S4PYAtYZl8Km~W{P!W6l6=?xF*%GsqAe&LY= z@IwHMY3SF=0DNod`0#kw{wn!JyJ9z#!!yMllG!UmV`ke@Ph4j(C2=IOTDF3JH06!nJK8y9K0c>MnGOGiUt1ZbT zx73Bj_z~c1l<}KPLIdD;*FTU{2H>@G_lAeMcWr*`JGddf@I;;~5o`k*vL#tyYpuAR~Y3ObOu~tRZXW%CDT9RzbfMf|$6bjtM#Cm&K@) zoymSd_yN@pw*j!x>NzmA$G&3p7^t0fnbncNwGABj69CL<=qFF20}I-?GrtwKKD=aC z@Y-_WeDm!a;x_=iAO|MEkNG-MSqHwdWo9M-e7HJ#>oxUw9XJu7DM18`(0Qe#X2ARM z8agY{U{8|ybwGQkTVrfW2Tp~n5+MXPr+4z%`IkCy)_I6hfVE$c&%8X9xm<=h4z7*% zY;VJS9S2UdW9NAP&kSJCZNV(zg#d6EdkWw%i>23*o&*O@Oc!s>0J~ZMFWD`0`RsB8 z7+?4s9XNiL@PqhS!Y~PK9Ralu*5AdzE`DbQ^r#ACpU()N~i+3ZZ05_*=a?J;6 z09f1!7}AFahMmlY%3*38LVltK$~h?wfF0Kaz{#`E%Y~Zfd4Tgm{i$5n$L|_3=5~b? zu8odtau&;o%{#CF-gWVq2d|dMtPb$bW;=hPSCIlZ4#2+(J?H{p@k(etb|u1V^hSzL zpTE`$aF7Aq{4lUyMT!obyc@cN1OMf&ndt-7@>_FQ)G-opykWa0M6Se9uE(c*896od z`~S`*9T^63h)7T=wk7w8wpX62;3Sl+SABGRGXN9OoCELJv7>LG`ywt`MdJ1K^kRLhz^S4m|&(^UPpa;JWmlzH<6>c$`^U zi2}Z1cTFz?I{?QQg5wytj0692=kOHx-R#GWNH6gn3o-}(vy%Y+3E<8HdjxQH;#o@; zUsL!<|KO_}@Jhe7M_@G48uk%i!5f25q66z?-~`~0fAu6dumKEk6Z6GTR}6z(TTFHk z-UWS4{(IdP6C7CY;}F2k2MXJr#JX{3Ul;;cXTCoH{FC~3W`YTbcPJT-m|Tum_huMkDwCA*?m44+v} zX0IFv7QjJO0DSx9iOKzkE3{t&xba7=&fh7(ot@R!(GN0|zpv8UOzSLL*?m61A~$hh zA728z@5s;Z%qGKJvtGlt*vf7RuPqike*Xyoj^sQqfaSo3ZdhG>MXztX)P-}`1HbZL zs0r{#1;F1|1@O&V7w+ygfI)A0`<3eYooe?-%3^0{r8ny+Q;vS5qr@Ze-#|~sW~vACAkpb zwKZk>W!11lns>W~cz-z~!8}Hgxf%!^Xw{9iC z`OX;+I(g6r_ zYwh0X?t@3$Fkc7XG2$zL%QX%q5$H|3Yv&($Xxve<)XoH8FV@NY48({6%CD&ZllOtt zML1I`LyGDawn+i*-uZ0$mMhPJH|AFW4|G5G>O7{bz%Twyq*f}-VyO%50&EWaG&pe6 zcd0zRgx7R#`MTr3K_R>;fL|-&z<<>}Gj+H+`!&_-8?u)74z?rPBfZUHVF4+yx7OQmn%%c1^EW$VHHvxXB zs74duciMGey$rnNKZaM45_(IFeT6Rp?nLt^gengOE5J6UnAf-N%y&ZpK6v8IEG`_8 z#_JSe{vu31S(y%85OV?|?NlZHZ6JKAysFJ7lI?b&bjK+51Uw*9`dPR1XO`U8x9s}i zam`{yYC&(i<|}~r-#H1_H3?i_@lBE8V52T{1UOpnZ=&m|;8yTLXBVOY(|z**Ki&ku zH?zyFwSPJ?x&P2;d!IM*%~#r1gCnrLdL{%Av;iZ8Nlf5sJrX9E4~!5^T?B0CSFLx} z^=?NWSvp{k#8)A(sE0~cHl4!BwU5v!HMzg22U6sYR03(G=}cL8Evb#Gu3%+NI2he+ z0E=G7fiv)uUIKh|zMvPq<%C!FA4Zx52Y@$n;HPoADn&OjU-gwiE_CMhN&#?!uM4oM zv57A9%?k(h8VC4ow%*IASLNm&k(?)A~;mRtaPsLq8z?-cV;KR*-n110ZeMOZx>$y z+_zwyn&pHt1ly-GMqNQ-n3|h&RwCZt1>i{yYqF1{HC~ z(rK3}1t$#z@n=D4+MtFiz<-JaRfQ_3M-+d*dekNZz{aZMz-9Q|IWcqa<>0@G_5MvX zUYTt;z_%nwbl?oYbY8c=Omao7EkR)ubUtt@ddY9zfgk=>0N=WP=DC5X!`0cZX)AuG zDo9NxZU8X()GcwXvM0oV3hlJfIlJtNHL2p6GArIJ8aG#dk)boP*uiS(B4!jjC?MvA z6ofM)t{)Ephzsb0~StgG8j3U4Xdu;02b>MdK?KAD$-F5f4 z`|oc4MxcUR>goK`O*n8gU>WZfIxl<|@J4*Kgw>{?sZ}3f|D9On0bV&dHXZ;TY!hG7 z3w!}^5ZuL`4@o>p8z7Hv8#pKP&3F{sThhj8c}fNL;DuFh;T;SB1(Rl>ncKwbi3ncC zN^8$7@tiRadgV@w2h%CHC;;^&{EB(?(jn`?zk#&_J6{m2*q1TiJ^{RCR<>Kv8|_yz zjNOm(S||Fc@4ycQ@Y4wJX`)MfZ9{?HxE8wY(o2B(VTP&zUOwJAbl}h?>8<6>R~mC# zE4X9Z)RFvI@DO7nrzp)6Nk9|^v+zCRC@C4HM7p%RmmU3`mVilV7%$Mg!xJ%QUq95o1*%+I^;i%Gz)%u zA_K4-IPyz!9YttCEp&Ei^~d?W{<{Kr?UhqMpV`&l2EAh&(EH3Y1~3{^+N)!XpcP^Q zBBT^J~+&&AGSAB!gx!YuK*tCeesk=xPKEie*@?J+lVXJjr2x@>A(+t2W|p< z!JTSmcbWK--`gvzF23wSyC3M!1Du_O4)27%eRqHF(NP~?(c2cj&pfxS7CC_Rk~`N5 z)FiyNqxv{QMaOJdhN|HJBAAFL=|HCDP}cEb)l>kRKxoFj+&WVVy2i~*{ZjR`7-6k8 z>?$+H@^lkylkR;0xPRIJwxzuNQacBF>sQ_H5nBiLZv(1|ga`g{wC2 zNUk)Gi1Xg>N~2*+kTZ-U;S}}&ZV(Uw5^Od>u!RMQ3OFqS2&@?|`WwwCh6D&haxFuF zke4R7J91~noRe8^#>kHD54wESAF_X)@s@>RVFx&hU)j#e%&P9rUw<#Nx`9GjzWO;i zFu^THFY!Hkc4TbecVB)Xjhd6cR)vRAfq4V?PxL2s;J^m(-^hW@fc=QjsWwI+FiHeB>=v?dFk^@;Vx3yZ#;A4iu9WLyWIC)^6b|aq4z_* z?WZ%%PbcTT_Z8PhfQ#kx%$JuzuM_!htZxlNyML8Z ze^z#N&5D)L=EcFG`K)(m%vS(+&-Lzx?gx963wKpC*azNu&F$U`Sm9FVvST0LA@gkl zJUKS_OHFhmy?-r;Men=bkB2SCu|=edqG#D}4L=yHwpS5WLG0z`v*>z%#Xzx{p*9 zUuklw?_>PCRfcc+)BAVB9Hv)ZdDp&7^`5>8`AXA)|HJ^s@UNj`0Gk7c9xx;1oL+(J zqbqVnZ!qAi>*ALHQv#U(nL&Tp9RRPD2Kd&CgJT1Ya^@>}=9_E0cbD`C;6220ZA7ti zWqt+l(Cib>r+=bZ=4<4_e%}q$Y6{9@=y%M4-_U<%$Q`%^uo>_xxdFeQ&zEw7wRpa( z*;bdE05^xAov~wKW&p2QCpi7rD)C?RYYeL-z_)MTd~R@Tp}u4GYw8rhzkuqf_wIew zKOBG?(?_ZfJh$oenG;VvYxq*hUz&SYVY4mo8oUu;8^tn!`JWjKogCnI@(7y#N_3@5 z#8w3Mq z1GA#N4`B7nAi#@9K3?!^!D91;CeNJs7Lnx?Xvo%)E@xgdcn5JRn@grQhnz?Tu0Bac9{|Dc? zi*$W;z3d?Lh2QP#%X-WG+{iay;oC!icOI7NWY+6!YvoT_cXsO^LI};X$=CO^>I-Kz z3|-lL&zeq;jLp3I!Yf9vP46mj7Q=y3Ma}Oumuo`Ub~K9B4zRw*@p=yMEBB1mmcVYl z(OU4@tf{%Wa&vuK0Gk7c`$%sn63}g60bKSj(rxPkZ@&1+zH_zh|6HNKd~0?^g5sz+iu7pD8SC+!-sq@4|71mDwCjng5eg*JS?RQ@gy+T-FbNUk^ z!}dK}gJ@Zv^W;(yvsy4QvSC-u(00 z>_nrts{NAR!{Y_+s`gjP>9j(5$Zt^v7|F)m)P#V7;;_Vy`?l%AgLPX<&~Di)_;Sdr z@^xF1SJq?I3IKH-*P6L)f98}qa5eiCyaIUispl0rM_tflzANF^L+>>a4k5I4f?vmt z;P1!Vzz)EH(#S6*a8rCk54a4#7=~6yT>sy@To?GZEt{J^{Lg&@jr;a}w;wzU;9^wwf4#tv>P{Qxab!b%IGq;AE6n%!7v|q^d+cp%gaEbciqCF-r5?#teM#n&T3U0F0-8P zh;^8^784kzSPww2gLy((N0foL%MH(U4ajB=Ja$9?7kh6Zy$0~~x$fr@fNc@G`4T+$ zf{YhGyuT1EI3I?#(W7SU`YY{&(DwqsbXU-ugw0}^y0WqzfHzwAk+w#$zF%b!`nJuR zo1YsQoSGB870p)$+&=?2@cxS@0K+zywo2bg>86C81fU6`Hd}ZQM^kVKxC>B=5!+?X zjugTB___ly_sRtWtd}9NT?9jVSe5J{u!LDbm-@A2}_dU`3 zUekMjbb;pkqifgRzjpCQIl=cXSPY#5tWhitLhClLB51IQV47T~x?;12po<-N%`6x{ zDEywq@fHSrdmDq$x1A{rV%`4i`E%J^wSi~S8`LR)6RTq!=lChbMA%7j5X-!X!+~*v zIcp-nQS=l)^rd15t%z3Z^f@tuj>oLFH6cyu=&-^o39M?u+q0VrdM^0M5I> z#_wh6$2q~YT#EQMCmJvTF6ab@4-$2O1@P}^49myYC;Ilvt7j%^b313hLEUq86B`zy zO}4ezw%F9wjsQ5@G-)HZfHH{+X~9^v*ofT3YEW25O<00H$@o0Mh0ARJY9r`_? z&{d;$vSm_vzI>omNqT_twn6=fyOS3QfCB#Jmb~)$#muqBf%D-;a8>&yz_W9|_hNdl z*CvPEh_C6|g?sm`6a0GU1m~kzK^nt)-3-_OZYR^VTykr(Hdj|S$^xuWtncZ2Sm*+y z80Ffp8StgQH#FauuaY2@s-Si1+Yf3;uzNJa^OqRegl&lVb&TF zx|fA-QyhXW2Kcqs-?jVhcfT9Ez=Z%qk`cW5@-IzKG-h_jd`*WA9Ug|wX-j7S6>v_{ zt(~-8lMH2}Wze{^p+#wr5{G~x%!%8OH&DRt0iR6=E|daI`$A|JvBB^FaE7> zvH1$$LkADfkQ=lk_?6OQ9+5=%pkqi(=0iF);>^T8(gdC>F&2KfaFuW@k{|&bD-;i^ z!jCgm9rDIZ+>j6w&CnKklM^Qq1xe-SYFtG!Q-pE7h={akj#bXghCXm<^L6l*PAyIS z+voDXc%wcqxzz^NOI@=V8lB+psSCViz!yQUA)3Mqc5Op`m)Exoa2iAZufVTG(D5$t z+C~|G&6PJlGrYLaTZC`tHqAHJ;WH_BmOfrEk@wJ8U-nnw+#%eLZeheKhB>Yu9 zM$jr$#(`fQ4R?`>_}#YsntBlGnUXtVu?p?qg82GQvb;7IXPa?dw6I&$n-Me`-UrP0TWDf)+W(Dx6qB7B>AQC^M>g=t((9F-=mB-k4W*#fuV)o;jWfS z-Zi56=6bSc*avv$+cKl*s!a6mB*2d(_0|TDed5SY@GF3a`WC)=LEqCrZ}$=qwzyda zd{OwCUNeGa!T;SlpKre%%>bai>P48V$^H4q&T4ofqDW(4i4 zJ#^N3{nEkdsks9CEy1q=JoDjv*6+TG0e+;3BLU#becz}vv!k!Roa6hx;TrW*ZSnJa z8n7{pVXQaadModIS`QcoEO@1)M{ER3uwNN)0l?tbVrUT@?gi)imPW966RF67<7)kt z{-tbYTYcXi$_t(aaR2VJ_OJom!2VvZzmar;1Hfg?chaNRbn4X5;>6#3fwy^E!Ls2i zexdj~K=gt`==$IPyYc&-*WY>Pk7U5aGZ<@FCCplCbEa;rl>%5XGztDz@ZV^__a#{P zQkyrQ>pD@J5xmvRS31z&_z;^+V~+!jf4cnt-;2_yUQurr?jse@>szk`dQE3e%>UbG zV}CaQ8W+)}(XYqsH!&S@Ak>s8IlLeNU?K;dO#X zjvOhAuW!D&&M%$Y|FoH{0%e;e?GRs^AQAkHKl!#gpMR1Y@M{;N0XNA7z>1W^ti%8< zwY+v8fIV%P1z&G^unlEx;VT11PDjEQ+PwN(pC7D`SLpes_&#~CyYWz3>yC!djVfMP zV2llB@z2z7lN;47nP(8d)5nh;-wFE_z|-gYKWBEE8ZKFe_foG#54PCV29MtPqj(F6 z@XBb}+eOUG>Bh=>S%5)sl;K-sz~}^HENk=56BF~j4$9QEt1jKDFyoLrUvt6Xex^RHcQmfkH(HvkO z-ct4}2d@9@@FP>hx1HY~^XEktM4N*1n(qB!9zPqvEqHHyaO3I+H>BldTZN6Z zV)KeAUoWo~Am>}K{#!q^zPhFntg--K8d%JRcgTDN@JvEpLBJ=Dl^tc%bT~E}iuago zsAR)w_jD2Z3hPiNhZ`;25x}xs9n^<}515ij3ZE>1D++5;TP0pfbZI2Hd}(kjKAi?G zPRH7xnd8-?rvY$jdTG9U+|K7>* zHQ8pRN%2Z^TG86k&GlQw(53g0OhR})OtxOL_}S!Chq9gpzdPF37%%#@AmA;+_rU&c z*DD-{bWEh6hv|@!9FKf?xqJ`w(e)onV&2WwL0Vvpv{+bvEU7)m(vZzOP*rK`bEN!q za&{GzkYpjOI*zoMi9r!RnpvFZ?LGC0BRgTg($M1kzkS63{xSNxKZg0*B7&p+!h~P5 zo^UYU+*n-wq9~)Tw1luR9ME00O^}Wh6up%WLa)6r8U~?@?RT5} z8o=Z6y{8|f=F10+#{?Zg#;ms zDS?KNkRMYWnUxER9gfuzc2%XL0-7%{@WuyC#9l}Fa%ig*<&RgbyuD|R9jR`=1o)R; z3;-Lh!F`)ExlQPm?!-NfM+bB-+pPH6oL92AdAXh3zs-QnG0RWl6vJKX;(FZNCSk;aY4JjJi@+q%kBtFEmm~?E(~$DIG|Ik2m9wQGwNmNa&73Gwur1Wz`(q8MNc;3BB z$B*oY`Kk}Rcy8Zw7gJgdXTRsm-xyuF8u!W-$8t~QKkx*iPUJS*t5A9;B*Y@wSDY#%2l-k(LCB zD2LX>9B>^NgmUm9DW$EFE4Ue=M3RD#y(1RF4*LXJBZtF6!fYLvi~0yWYeRfYA1A<; z2X)~zJf426&~TL%*yEfC(0k8~2;hRBEBNM1d`&}3gZ-brrU*FQnLOOEIoRSWKX>?=! zQ~FT*&`PvohVV&7MmbZ{$BrMZ7CZ}HIdJ2bFWd=;n)BLhphkWfI1^s7d&3qvZyc~% z{=o0&=FkSU2;Q34D&U(eCCVla{DZ-XMi=R=WWW0Zz~jB?TMI6b?(g$4TBx7NDUgDl zUpv`+BKOC4ctw@Y#Az;8~E z_I4MV@4@ZSn*%(Ix6*I7MGQho%tj`W$9Hg+BC9?<#iFA#g?>v1hEl66@e(*r>B%cp zc>XjKPlID#c3*y;-o<0b&sL>Z_!_`{3kP2|bOWke5wh%8zH4hIaz@m=e08OHtJh{T z--Kd$tvAPMO#oLRSlbE?{I%(Uxz57Ba|Jo@3SR--i?&bzLqYm|`c}lZs!B5KhT~8N zvzEBZx)vAU5}!Er0#1wF-8Wk1p^8m!rsQXl-M6)CTb8>Q~3I;r<=ucmLsf^=6rhj#r}6-H-r&Bmz8f>f})m z-}3Yd;Lc|+irpO1JIaOesFq&mQI`-{`7@q!}RA@uYM5bJ91yI+iQz{ z*DHQa%YYXX_{=A7)^?8o{QOIU;Vx3~Z+*9guL1mImjiH3t33sAtxR%>3>~%d7xHkc zp7k9Sz!lB6sjjloKR{3C!>zJqrdUs>!&CRE~ z=j&ZX_>x|zon8TaaApsL(6!xSf&kabbE_*aQ^*K~4F05sHs@Eot9zVMy_A7wv zAA4af5c)xw?C)nFc!v9;<9jtM;&++w%6Bz`*ws~e@S5zHYnx=iyWI)i{OadN=Q?|K zfM4nHL%nW0sg<|D;`X%dnrk0sJlnwww*6u%-3zX%T&)l^Z6%(!#^dQeQi~z3l`mUE z3@w1m-Z=8`U0NC&to8i)di(|N%2lun@70hqhpi}53$1a&LryZ_-4Y%6AM`B@_Y2=D z!L$5#-(!dI7Hi7~Y6*p8_+_=PO)==T2k_}yskSaYnYY7|i!LfJ!i+VC)*6oD#X}v; z<6XQ{Wi18T(o}abj5W>9_3`@oo>}En;XcxinD3HlY%rVo!TMFB*9`T8tIm)!evt3p zDi-utI2uDZ-mptX&+?Gx5lDycr3EOkzTfFp50N(sYnlKqJ=4_{^0N zE3E5ZK6Ui$gPZR(@il<^vY8*=%wywaWB4i~XPK`ghAIC(?;0pBo^%gsS7YeSeD$%h zMt9GloiJaiA0Ng(FeW`fQ`VMdq$O6!YEy{Nt|ioAlfyjB$oI1d3e6Ii=&Ped|Ff2C zK(6HM6buU%Ch&~Df!9iOg_B*kP(7PIYXDa;U%@MYr{>IbR)TMly`nm5iEdrJ%+w@`H9)N&K>0U@h8U#aE;w7fe=>k zOE_#qkR_bMhVx3Mv8no$o*KNBgIBi1$1?ij0&|$(c^KRR%MkA zwu!4$<7sf*wuG{#G?rl+ugmSnByak;k&~x)#D2$2v!k`IU(CC|Hp6~lzUIy%m-wdi z#?fZ1Frz2Ttw7ps3*KD6@KoPSf7QM(^w^=9w)O)MV(gr>r=Wv%yji%uniq!fwIuF3 zhy%)3Lk$b(kDrG57SrpSue3N{`+G0ml&P-VknFn}%f;W5l~Fb9~iZ{o>W#0j@0VS`9l;^-O8hfkvk za1!Q{(+DQWrOVT?0Va(Og_MgGvX4v3oM-?(n!F7ZpAMpV$IEf~?0eL*Gbc|Mn=j;; zF91H5{nB%5#%2hKm*bz-2-chaNh`~e=OVsFu=RVxI#6t@L6O{b$Bzpm9aL-xdCSx|_`zk+Xv5WZe0I zw6VVH+K>ZZo0^~Lscyc)HvoKaE-Tl*QjcIPS`=v#KC0NQ%7|t}4E_2VKESdgSB>%@ z7gUz;>tzLA9=F;Qm2+&Hdpt5Rbaccw-?I2FE-uavE;Rn)>WV>V0Gl*$C0)0>M%Tkc ze)H@$Xk}|TaCsR%yFRVo$^pLp-sdNVdkz9#@VmbpzNTM(yr(x)WL40;qj#~1GxTB} z$`3=e>xHb(InSn%fh3)#T)8*fwuhyd?xH68(6MvYkmxU%_5gQMBMe)&c|3WfVdpjQ&T;#YTlE8r`D_lg5w z{=Lsr^Zvnn?;JMl(-521ywO>%x2aiskFQiv;=moyBv$KN}Qy+Wo>U!Y!x`Qr! zSLjmfqPGG)yFN8L!JF4!ovL*n61^47SNQ(&FYmJm`Vqj7LTW zuxzR50wwP@CeBZu+8KULg9ANZy>d$coBh&&S7pF!Hrqu1t!%z~!+|&Q|4i65HP>@s z$N2pZj~#4ePFs;OyvKL_3?HU4ZnM8LfU})_R(G+M9A%(@Ofi20`U3g9O?8(VK$mH|LDoUKD7tpqul|CkR6sI4;c z0ku#@``5lNfN(b`Qw;zkB47X~=5{wz!rfTGRwffqLh`&PnNOK`m1120iN%#(Qkhc* z)#(+-Rp@E?YE1Q=o;(kFOPVj~?d$6sT$p?O;;oIfJane{ngYGHq!OYJi8g`*zq#1x zKDZO+D}eV8H!?M))TQ+P(hb-id?wj6+mI1;B-d%~fY=WTGygL|oWj^p&Z$sL(t*>; zC;=>C4<}3D#2&80){y&9NyPwrmsy5(?)lNv{G6Y&PXwZ%Rrblx;$iUy|3Q?<*}@u&q=<{$Syh04}1p0AB%Id+LQ78-d^J?EPZ!IlXyg(?g|= z%`2}C_6C4KZxww1!+-cU2hnO^1@V(TqnE0kG$nslf?664TVp)YXlMk?$F_((S%Hsc zx>z};Z!&NrTQc%w((~v@tJSlsDeNVXdR}l)5u?($3iKpYXBI)$u3Rq&_L^mId433J zg%44iTi2DD6x!$+o5BG-4^s{^fYpnq(<)7!;GvOI3B6^_R~j4~3;-W`_R6glxUWW@ z^@noA@WV;30KWG3=4TEcDEvED+oRWXIJ?_2(7O_&NwKPSE&otkZ5pkNC~W0$HUoWz zmsUncBOl6wfSmy5^%?=Ky0t}sZhYWFAWyQ&cs)5~+KKEb(Ckp48ON5lz=X}IB3!9z zM12AYv3GpXqE5sr+*b81VW5dYPNp>-I(}}*Wc5gImRRN|mkxzwlM3n?n=;#|h-qr+ z)TyEJ=1X{muK_%f_59wY9AMu1T@$>bmjpk2+I-=cCWZy@6IJmwJ=UM)a3K7OpU&2b z*mmVa^a({~YWp--%TDi7fuw!eBaDRFmhfwkR(X_3`E8C-qD)HH!Yh%npv_u_CU23t ztRr$EfN9_mV&`boN#|570S@-?!cV>v3kS6_(_4WXqveRMGTQ+ISf4qF z{Dq0qjR`5@*oul3f2f2lDx;4cc)wmm`l>34o+$2Ak8In5t&7YY(Q}BZY-+oE2@I5y_Kf3Vdjf*W^3R9dlUAp*w zdjbw6%QjV9K-umy?~pF9yfl_|K3TQz3xE&KZ8dt^5+s{7HiZvq$Nv0O(S9d{&s>QkSxCF~skQofu#{-vWK;pEAaSfsFjRQkU`N1Mypvu97Y zO?iTrKlrs@3o{q!4<>U_zcJ$IH-00`T1HMm(r=s}8k{@4zoPkq-+yzsp1*Huf7**} zO)e!c0GHZsbTw`75*4-|rpqUw#Oli3a}cB&4PTi=Ij>Z{>|IKPT_Vsr&U)^~!y1uXG6xpC z1@uZTy%FG{Up;<|f>My%AD*;1EKrW`QR=Lt)6%2^VXo$XP(5Wc1pp!Zff7f~mrkjn z>9KjciB#2mMQ_l*?nId&_WTr+?(Ps%7b#4SQximKx2e1h!q056RWk~`>QDnz70}XF!yrr%! zbw_nVQva5Epu<}_M796_6#E9{&e^Z&Ka4N9uwe`Y06VVB_nuzOSMO9U9!-C>-&5v>ff5Gn|4rC|H}+Yedv0KnoL_k+KdT-$b4n>}-; z^p`e#`}JX^6OvdL)|AvG1!W3}LCc$V&nKVQ{nl{6Bvdy;wzh zBfhnZZ}~JCGxV0@J0Gp8_+pOU>iE_}FE%G|;%o7(L~nKR#V!+H?2i>+0G?QA)(=B{{i*&oq?G~g_sbfuh|~sCx~YR>(p79A z`&Z16y71JUNP2mDN-IoS$; zOf1^KZ|;-`cnI9`g`u-x7MO;p^cY zcI^weSHc&5N5+@ioo_`0yIe?!ODc&&nx>TQ86nhW_wbg%-&ateGpRHf___?hX=WtK zOY5sIr2(r;AR&$|F)0_$H{NrU_(F;A_rtylap_Yw&XP3E^Ch-8;&d*3>MsiJhcM3F zyy5-)_DB20e+b||Onm*vM3&y0EWVFw5Z}u5!mP!2Gy}L<@=*w#*;ryRxNO)b6*M?t zEmV}#4;3bM7V6U*wg|BhCpJC2Q7b%|zTx)MMo0*2bZ(F+I($OLthFRfxKe^HUbeo2 zGz~qINDr4yri%I&x{xn#pJ$$$2@51D=f#W3D93*p*G%Win_(_^8omV6e)T_odS3Zs zqZgOayIPH2tWJ98{%qn4xTW;U?&UtABSi*+Bpoow6A*d|-7zVrKhDVd0KwMau3!X5 zp)n2l65CM$(6=is5i~N>!(j}e=`<`eC5R=e6sCzx%x;oqMh(uA^23r<1ILUYNU;aa z0(_yI6eV|XDliyVR{xDj;sZVFKmYBQYWTjmq4>^S9p6ZAb$sjcb5$MRk+G>Z0K4fW zn&aMEM-0??l}sXT18=9G9A%a|czq=G`1UyLt^CDZLtxC)2>rRFD)b!nq7Y+ZAXJkC zwPYHS(afsWV~OA;nGRJ>9sh!s-QP}huU}z9+XDQGJSsA;D8c(Q#6p-_? z^c;YH$nPJ|p({pY^s}rV={ofGM}b zKMh?x#s@BFE=feNofOjbL&`)!Dd$3O0m`(IhbjiLk@~(}bA|+|nPgC!)xA_&oCFI1 z=Tve90!M0kO4b}`2E!sGC5*u!woOe9@#2wi8B=u&qIo|VT(a_6_vX11$}9$ngr~3D zz1Khe`~by3I=}3awQmjbTl3o2(TiDnuXXKPKfVAwx!Bg#Vp`0=P5(fZxY2~ju;!$5 z^@T~u5y)h&s$BgDN*0c|?zRLtkxC@-3iZPi9DBo~7+G^cj(QyzKUMN*!8w1lMO#ZNyyFY|MCE#kXkYyiCVi!bor zSn&nmd-FVu&l@ZPlW-Uohf+!=d5D9gR7e@&(uA>-g#0Q)(g(aDdml)`|1e-EBVobR z=jfw~OPB?MOO%e{W(;}A5gLqAhjS5sNuQ;x2;_!YzmXJ1Usq!pZJ0*uocaKq#dA`r z_CpK972|3K13EF6!xzN4fH;y)%6BoGW6sVC9 z%qeI;AD9Arx^^jL2|t;bCwqv}Rp#~~0Eb~ip{f@wb&aB^YRaUU6jNwOWdL9?oN$SN zsk8bM09Sil0eb7l_vVXl{f{e@<2y2P=fMh&m;$3|nv$&+TA)Fr4;d;Wgex<(N_jP{5QR)Hbb`eqJ;bW?z5oubOA1uga81Y6++tRc z=Kq*O(SDJg?_ydBuyoOMJFdO+bHeFPtM@Yi!|&gX{N7}K1He;)H@x~qztAKxSk5fd zM5dNNA-$01sGmY`W>Ry;b0j*bj$TMRu+j@vA@^vQgvi@?03Y5AO#GCuW)7YrZsXD6bl<%F$shs&n9!JKKs!>d(2O{hF^Mvl_S5egH{QS`q$d2IL*( z(;7wb3?6E0am5)JxO_mVCO~v3iz&UvnaL$`?)qnQO z^BXI^!23PK_u=;vUuF#Uo^W1G#p&l_X^+LSNZazt){&fPzCL zhWe>Tr7@F5NHlQJ53x{=~AIv{HVjr3}8!d z{T~|*iEs61eapYKab@wf@Lr?%jzqir-)EB!&gHal?IU%?x)DIbVIGngRK%m%w=-BH zvML9~#;lf^!67mLBpARzg_2oOv#MQW@95PRTd)`#jes^-sxs+7ZdqeX5Gi&y6D~p*_cY}MK$>2 z&0QHi{pFXJ)x@{@(?-b<;@gGZ>iAX{U*N^c=&c{$>f#H)_vdne8EjL%$?DYF(yh5& zl4^1qB{9F#tMI&ppgm9=;weX1z+gnRPZfkQ1?AS2r2&0X`S1X;26zZim~IO}jBS2q zN*6yyateo%frWSkZW*&sg`0dF0x*Z9qZ-Z>fZ26sD`ZNJs_HDlT{?Ityc1QO+$jK) zA7fC0E_o_U*Ps9Vx=em+(a7>+_pCbx%`I@ZY1A1Kdk)l9jh< zbBOZD+jErBIa;rtJ%3rJkLSOVpR4O%`(h)L%Usp(OK^`abajM!^#fd55k0Xg6!qHX zcMxD8Zmqw5{-hr9{o&`Ty7&UG!xy_V^01qH>#(psaoDU5*$`(Q&8X)`l>?Du`y zG>l7X(-GfOVuyD@oSBZ{4kZKb)z7bAtpD(Hbwl_C;JJ4GL46<3YdrAo`vmVXLF~E? zrH(CAP-f+`NiU1$m~<7V>I0O!T#*T4G%BJSoFtW(FVOvo4QwprDKo_qM|vfpjPTkd zu1EUv69+mU50J6#rET?tLeU$dmk>Nt{_^_84?kD6dCD1T?F+xRN4s*Rqwg#lcaO0f z_xxhk-_KDp;@BtJvQA#hhQcXuvsZBrNID0+x-DUb4cZ{27;9ijWj8{s_Gz%T;ti-G z)ZoWSg)||AyaB~fA{A1p;+0!D%sHwJI#5|mOKd(}M8`4ExOOso3JEwjDo|NUrsKkm znRO=I&jDT)z(2&d9(somU+}$i=k|D04~?b9Q7|r<5GaSKS3USsdXR98aZLZQFNJ}Y z(Pz;J;NX-~2p<&Y+ZciMUD~yt!GxZy@^XEnlkNo1clq@2TJjPy?_vtL0P7B%OvXEy9)c*s`ba(~9m{(&b zLJnYyHG#-)FBa+7z$GSx%4ecZ@O-4t3Xi%(Tw6?B%Lq1C$rkU~b1_)yB1rG4Z#X`( z_*s}Fkyo9imjL_+ zOsb*I$|AwNGJIS!bx;O8JB>}1%Sl4K+ChyBRa_0Tm}kq7W)w9RgB&Y=5gS#WEFr(5 zEwdq59EY+^^JtP9$CgmgMUqLJn_A7Kj*f+8f#6o&M|w|RKY3LvzZ?Lvu}Jct#n071 zmOamP@e9CX!Kr(=yzYg9uE`}6|VVH~g$g*hK6* z#Lw0E=qNar@_2WoPJF`>c(EmbTlNt?9yw#K$+{DfN$84p8cWXxcRCZHW*rPC#N{tx zq@3YJNp4w5F7^vrLO%6HG>bIkfCC*_Of!?1HK+(`skAsB@kX}>BF+kThLp@*Os zc(GfPbKzGR?7X?~6%LXJkJhKA7YZE-2LbtX%q;5YYsx3I3UHVK_5j!@eZf9HDmOnEqR)L_74w&_y~u?&Qb<&jef3Lb8kaW_qM%% zaB!I0QLvMLZZ)*l7!qmj*V0^D6y#Rc#+bUcx zwD6LHf8~o)Ejj}Vj2xg$jN)eb#>yCx)uu>3@V2*r@%!e?`d^f*Mw84|A;_q3401mfK2i{5zPT$>8^3K68X*k zw_7g(xE42)D{DJvd*A-s4*Uw=U?*RelZ~6pFE-xTJ63~{V5qfrcB{1z03MoO6!@X& zmEizg4*#XWrdvT2$B9|yLIsvUS~T-TBq3vO)PkDQxrMIsS#HoLm;n}<*+r))T5Qs3 zQ8h9(+;o#-WK2E2k$lOc0g3^F`7;*f(1*GGTs=MPkjLm`Ay%91mdti)y{VF{ky&wl zelW)VqC-m#OT!%c$;%fNywp|u;3xq6Wp|JO=LEp-@yX6?Z=>3GuCC7g?&m54cxV6Q zSgYUyVF3)f`u}!xWqM+y2737vX+Z!N@6kY)ZT6nXpe14K@PsMcA86xvXKiX1n^DWS z@kCyWs-3Z-+!*vGWnI0*8otqNOO4Z@vFzIxF{)I+)|OhS;Y=qme-X+AHi=1@Y{z=&9&-ICZYElolFYggOlUT;yl{Tq5p5d z_|16p(fCMpe4)1t;ECD%VhiB#-weU;s{rurx7$vF!!4`=-#~8w_-t~ux%Peh zTs^3QuK*r>b9j>Tiwqw!hqfa8?p_ywhr$P9)uA0lEZ?*%oPJr`SDEOY7 zY>%!t=VouLpDO@P$Iq1jo_zDI0v}rS4Fn(DUKPMYJZ>cW1N~f0j_e+t zoE*b&uE79oINo`@@o;Qp=(R6)>v6LUz@^@>dVguVUVxYCO1HIj^~wPcySf0kS6;k+ zu~gr)zH9g2eXGDy-#~E2LuRK(jrEna+4}ul)#_yO-pF2Ptq^7%yp5s32k#e_AB+L- z5aJ8KGi?DZg!Saf%|m$UMgbhzxjJ@N%&|1gb=oS4SmG2&Rn9N|l{#SATz~nZzGr>A z%a7je@9nuIaLzCI27r&hylQ6v-%vkSDDd6=lhc!6QG~e<9qphoyLNv}#113A*zLtu z8wsvR@Y0n!)PUq$9)PNhEe>zbC*wi)Z9_rMdd#RgI78FE8xu zUsT|;?Sp`Cj_`@>^mHcxe8c@*P2M>?JuMJE=4RGGl;8g=1-`X5f3JqQGd42YYC~`a zuWVQe-YV(VOSSV>f>QkeZ4$eO+H;FH*w2*!K03|pq_CV|=Frg&M!K^T_3?Xm zVy?9U!4_ceE3KT(63ulo>#~FnS%t*wA)P${t}Lh7|IDsR3h;*4Qn9T%6mfmGTsb~H z`>KP{#3!Qhp}hFCvaA3!LImuYIxGcki!dZ%ey)oDj>OEOpP((^r`37ROs9{ZA=K ztz*}v_){hr)jPF|qrOX*o+V1wpn-}sjdT})c!h-^U5c&n^64EjemzQ?t1t4^n%;8NE4l}ZMa zpk7N?q+io7i_U^TWXD#(eLuB;!v<+$7-r(O)K@*o3=PCG^U!SBR&CgZ$eZcp^68QK80T#a>Kc1h>HkYr#&lPqhda;q64B(FuVKMCQL!Uip zPL19j9$x@n?5>21-V(ubgVg!PNvsaEhT;!Opy{p-%p6YX!YZ+ZNld9OC&Ca`j*um~ zoM5<#3Jbp;;3dHgd)doQ1C&P_ovvqB@GMc1i6Si6mPya0vS}opAr&JH3AndqPMHL5 zs!cPDTGL>r(g3UnBmuaeyXE*bSjK2}w?`fR6=y3HNggUxF5@;xw^JJrMr**AXOWh}{Fyay_Ttlfo~pM_-PKn#U@zJA zWb8n3!YDyeu==Xvb?iiw80M?)K9b$SonE0Wh{{cbri; z>87^S$jDGAC{RfsX&{SO;muWoVI}4g*;cb`(E)WTl7?D%L;8HbxYArSGoFfIIlRQR zgS56C01jlXG&`?e^=c4b03Ll4u#I2C0$}7fP;q|rzS*3$^xh=#1>n7ppFarU(~nVu zbsu`acx3>u-5(hqUT#9)>xOrQ+t9Kw>W1eStg|&en;v?Ari5EP`X5jMYGw$NdUEl{ zDe02oLHlBODXOFTE{bm?1j}|&e>g>Rl!37YQ57F~F1--XxXx|BK;&N`B#PRFTaPIlnfVj}T>Lk*mikaj(e^Q+Dt{RcXBybj6Xp$M~UkDNNvA@R3(IWGTMg z!~8h_+**CLRFPinl3xa09)EX1fe((|^f}o1@lF?jYw(lvuugoj$@lv?z#q*tItTdR zf&zb;p1U_PG`;{lI@Mhfz?lJXm_vtOw(5D8>#Ue;4~I1*gKh*p$Yw7ZG}2F{K6FEF z*06F`0T3vKhh^sR)P|nK)j9@CY7-!VgW<6el0iJ}Vj5uLI1<3l^7I0lsjL-PrrxB3 zQ0>Xo##lc5hJEEUqZUIPljkinJ;qca12BrLuuU9ZMu2%3E&a7{rW5W!3*eRBtJThx z0KV*J_17lfU04Gj@!=8bo7v~{lQ-R!`MUV6S$+Zd%i)L5xde+~5I#P<0Py>T`N@$Q z_{FLFMt;rnw2vlS><=7l13$TaIttYu^a)an@83Z0<&963i4jY|j2=adx~0d~xc&u+c1j z;3B^h-3bH-e#0WT&$1}GtkD1tzjp91jwBn!F+JH%4#{QvHTnx&KusEs$%`ReHk@jt zt=bZcpgIOFu-Kq5v-Y%!eZx7Hnli$W7UO~-vc3SLhQ#|MuFSZwXI-sCdc||3()=%w zV;Yc*pCk9HsX>5qM-Rnw3@d`OodJBgs|^cpsrbs)9(~!iOJF|yjq;measF|y+n%@L z3%oZ#d;xgpB*Rw-XHAc{vX0~DNEyI)XBWnYrWd<4F}u-(;5diwyC)dfhMATH&X_%L zpt|(VdZfZUu;fF$T-ibb@m07h1r9H=|y|L0Zxk^Nql{LqYGod%uFo#Dciwr044E70;8*$!zZt+?0qp3l{IlH7L;FHwJ1&8@k4~)q z<^%_TKOb(i=BMlNlLNhV;+xsTPPSGT!px#irNM^)92EHB-1Hdu4iE7C?A_>^NpzvX z2HUaYv*g$z>#nv17z1E+0P&0dBEZYt)%9eh7WthIc5B-{i6nf{-+)5^_|x%n0Qd&; zJ9_Wk`DYQ#LYQ^%u~p#dwMQfHJG9+?kX>g1%tuKOEHeN@@L+a&rCqB8VDfocC?kQe z%Ke%CSrr2SuB7A@%PyPd{(*M&!h7GE^QYqg-stvLdqb~%!FPW7u2JBF6K-GSrulRB z@9W8OXKuP)KUX#23%vsP>pA=u3*kb8Pxhl%=-v6{ha-3DvXMsstT{9Q_xm`si{i^( zc}E#eoJ`6~i$^!Cy0bG>M+V@(GwYQA>;;$!bjIXHXSLTJT70pMQF9miFc)C-7k&ylW#JBGlb90ELs|Tau5}GcWv!{ZT#LId%Up$!5}OJ?p@-DW9ct! zKLFlx0-U-PaKN&)wA31g-g#rQ%VXv@k&Zr!U*uQ%n*sdsL01aw;Qj96i;a!E%>d4t ziU#XmbT}Ut!9j!H&dpEWt_|SH1rKnWIW+cr0Ix1pHj>t6t5u>_OH!3YHVFCNwpvpe zLkMs>NPq*G?bX!|^bU#d?Cje3?pb^i=_B`_Bfptt0N-6(zAisGSUJ4lYwcgozJ8Jd zqrrSD>-6Yg8-U-;&rZ|_@cr54-$(SW{^VpsL5LxF+3exv*f z@Kw*dIyAtE2e<{m1;5M9rS(od@*4o2cpINYI^p|QfnM}C0Q}+o{Kn1X7kj^*1ALAK z$62(QL+`ztTdWb_2lD}72(Ainua5pXtnjSbfuTmm8ftUNs8FG;G-|cH0Cs73^*Sh* z2#&7aK5T$@K7It6Z$XFW7_0zi)?4rVKE58_lHV3wn|yPI0v`$Ak4}HjKYjhMv#>FJ z?S8H*;ERLy(Ju!ASSl=t`BLTKUU3`iY-es^ygq=Z=9UA&;j`c{$TEpe0hq^AoC}(7 zpy3!ztPFJtd;nAtaLOo)tFFud>9e*_Q=KyfQ@29Vy-%NLBY8T%c=*30**v`?{ zPoGLO_>d{|*_XMQ8UcR194uc2x9y$iG!6H$HudB71KdNFfD$@*Y5%US&zBLm3P+)~ zQqXBjxls@s12FLMhZNy&EZCw|-Vm4<%AAaXFjzImw2RE_ms~TN%3oX8KLOwZ-_PRrJOg-ls=08jey*yEuK<3R z0elX@g$8pc`uKpG(C_O6cw~BcEdbor*Rcu-E*=WL)FHI%8V(-)cO0>$FU1X^!D4`e z1T#g(j9}p*ChihdilhKA=IhWO7Xix-E}}ecr2tdXMSvCH3n-s*ke-w0aDXp#(-TUz|r0kWE3c$^zw=%T+0`S8xXFQ3-9cb3S0ys>e&kygn7H=fK0Q~ke0PL2* ze5dlLP~f+B=N{Jv@ZIs5H36J2g8`V&g7Iai_tt+@g}28W#LSO zr>Nu`OO|_f5WekV1>DUM&9LltmRij+`E~S`%dc#9>iw=1c>5&aYwkd!zX9Om$+H_%Q!rB}Jce?>!F_Tmw2U+_p?wv+>-7vk8OhUDn-(jgAe(v;7D!z;69POAu=TW+m(n!|}Nwy^l< zpLdHT@TvHf07v}|0Dn3e2jFY;b5(_206zO101o!827fr-F95zj_oyy_Z{K~eFgLec z0NiXA0O#(Zf0aYgpuq7a7SD$JRi+aN2X+M53z!8OQHW_sXGDaT@4p;DsMSY5nWw$9 zpVZ`SMA|6WHApEhsw5=>45VNdPpYJ-xKEHdU7{lIm>nIRcw6!*2fPi*xK5Eti4zu1 z{qTj_tRob@u)?#z06e!gJJ()MS2l(dUwp(aKE4wG&II`I^n=&mK(7G)Fbcre=jW=z z)ET=wws-zj1fN?CE}jlP(IbTi?;g)jjnoG4)Z*OS+FAjyZbFAYtb*l8M}{X0oYrlD ztL;@*A>f&v3sDv#v%|i!l`M3r5*W#5(UDO}WREZ>*fPa8BH^ePsi=dh{e<1Eec8Ax zMU({-R>@+K^VcRyt>xPmIB4A+)0#?oThUWf)= z1HjW`8Nk7#`!OFO8Gc1@hQ|3w5&$m0@mx2))y4O2u(AEG0yx+=H?mHT3V^eFc6aLn zcw~BZUI6DeqT|=G3h$Kq6e$tKxNPbbo+E8HL7?dM22$IZt=js9Zm~iFS$KsRw7!PL3|aus&o6e@ljib}^1FadN`Vhf%mUc(D}uk?>CJ=h4dnOk z_`z>qKRF3D->K9b`fz7$@!p-<0A84#%>Z7zcpo}{*K)r)Nv6R9c(d?#ga0@l$%PMk znAyV&kg*q%g&C(gux0rEOm31p9Aeo{b+sh~@y22m08DWaNCN~FTFe~eg!!QWv+Gt1 zrv>t2`J}hU)?%A%nz%Jw(>7cM;ndr>1Lk9-R*tZ2C0p-m2Au&syRh8r1b~6pSoO&> zw)k*&I|rBru=xg7u>#KQw_5;QzpITQ@s$D}{`M7uxfN|CSPHzevM_n4E*s4Np3g2g z0CN*s0HZ6pPCCsJdSxEoOMV)3aY{d~a`>S{fCCs`|6ij$`>2H8?@0>PaCZzqjE3+x}Z_wZsCxIyv0UlPX4rvX61O3U?1 zGmfL^!wv!F4pva$owfPL*X-x20>0Rt#!;rg%|SOfzw-X-w@<;6jLva)&E92kz^mP2Yc z?xwB{aYlrxoTY&bRb)VM~&Bl{$EH|_|qNvfDnTRM_Do_(UNf!<{|a}n-`MQ|rh zp!pg!x3Fdx=9@`-qnh|aFJ|Bk765*8mM?+7{RsFx^84GHnYG9D`pKyQUu@*gm*WiJ zD8c7ESqQ+#2f0`1?xXquzCSaI1oK@EDR8h1UIDx*fO9iWoUJbT4(UM~WWZpv`t(Rl zNjO_SjtpXH5NZ}+(g1L|!7x?=a10~33SpH2u3ko2T+gyA5ia=M>rT>$v#G(H3@V+Nhip?}+bxcvC$@e9DWcTO^Z-Hm7@SaayT>{*6? z>OLB+3*ga*Ghq&$5xmSQxEUq5gHIg@j?U_^(kU`8OHN7JK|qxUmB$ZO@CxkNMAZN` zbM8Nr`PL5bV`Lu)b~9-6C62)3!tAmDt|Gs`_p|ylQ#)Z1d~8?10vLXC1>T$3n4Y?E zYhM7q_2x7H%p4jCHecpA%mCiK-JPlp;IT*94Zt{u-Vng%CmM2sSr&QUQ#~fpB}`sJ zA783J9{~ULt^C0x3vh`5XC%%g09;XgOX!^j;JxF|2r&F2z?wtvk3@hiyx&uNu{(GF zW%nZrT$ukl)=@TvetUQ0VQm19PcJM=f&;)1j0E#Y@Fh?2Un){J+kOCC?wcc#p}!vB zoXLfm*-ocfo!(M>1@M;);DeLTZUu~e&F#0tf9cLl)sOFx^vXqh2JqQO6xd3zc{2F; zAOm=`K7enH&&-Hm0c<}?k_0EYl>-c=e<}L`aKY~&fDz!undyaA4)B#f^tJS2Q}46e z&=;4$pC!QOxdIE|2f)>Az5e9a46yk1058l;&#bhXbCvnM4B*GpQ~&%nIOF){YtY<- z))e~m%gW-^gB!?iu#ta0_#8e5w)dg^H=>U+fbXw8s0-k`_htgY=944=48gy83BJh+ zyk1)Y4IQozS#5b4gjT7ARF%?Qt&DPh^<~O*0KdxtSODH=t-!CPxBA)_AI}-Ux8Lk- zpV|+BWpN1{0RFhsUYxpreQxSTD&QM^V>AxWrNB(0-3LjT9dGaNOs(Co3*Zq4a7J*` zd>t!1k(9`Ac~%R+>(_+qI&@sIjK-yj*DHW}`C;W2u9xoDFpv!JYUJ)+^F}gZKjQ(I=z8nn9z$LiqE^ z{z3lh-v6JyH(iqANVEPE36KEo0*ZYvcKAB~<=wZoSwUtpE5p=nCgTIf?Tlfw4>qk^ z(D&JTn|;w8z0VUTPv)-<-o#XASA%Gs$_S6}@bJjYieDag4-b!D62QkV))%=dL(78I zm*ac83(-%)f>Dy5J&(98BZjANM{3f1Gw_AUtReY$0C*l6NP9cq88ByPn*nhyk+w7B zdkca&U)|W>*Zy%0N&NQX7?$@jbQ4wseD}f57qz;X`ASz${K4P+1ot7qfZ@Ua_6Og) zd-eQ2;kyaF0{9>5J;rq;v|_0e{G-L~JLf+5WdVHY=FNv{#ZqUEdT5mj(ao;_t~`)r-Hh+xbsi+P-Hgv01xwJ1c)6a4S2W<(=pmPI&i{F0|I--UE^?wck0M0$KBM39K4A1 zYy$Xu2Ds!VtOBtB{C`9)0j3KtNtVblNH)w@zM9&g#~ramMOA|T^5$h|?qbrsFH4Oy z@NS-i?jkw}FQ$X>;|Kr6P0%pl7?>gd;d=W`r;Vu z<4%ww?)(q?R$x91N%-!*o8d?2cey8tf?mqOQHeUTTZd8yC2Ap2N51)YcZC+iEyobhqTZ`B*;1B-bho!H-{`#LwfBBcy73pvO=0`vJ(N9W0o%FNTKm5Z# z{9`;$WhvvktORRwNV~i``7NlZk8T`BSO(k(_d`}n(}&jQ?{DHqrN8N0mHzTC>s$J| zRNq;BbzhbGi~Q!B{#F-@L&uIC{jduIC(dl0J$Lcq<*VCm!Cec+z#R4OT3-sTam_TS z-P6|8c{0XM1Qg*3jOTX7A{6ObR-#NkqEzym0Bi6!8e5+1jt3hH(?ewRA|c)v>snBT z7P!TSbz%nza)O_g4IGbq_gs1E6$NjWXgH3SZfX#}B@Ze4%+Ex+Z-7#qhPS5{36=+oVD;sAo#h&^6rG_} zgzmrAKbDL#FfNGet1`oXAcmXZQW1Rc(2*kz@bMF8&YU}c@$%&>*SivY>z*sY(}N02 zYQ=icWhf1cwQR+DIvO4aHpf#9{K8Z_Bn&*QOb|sz16+8P^EEPbD+Lm*l7`A;2H5XB zDwjco;UU2M_}DX~-C0e*u1u6mB$EXLV2n7VMZP(ruK>3C8nB;gR;PhR!)km5@a+Ql z=EJJCUJ=0Mzg28KdPD&K*Z|vp8(^F7kH!d_;q?Q7cZ~?mQnWCB4M6Vq&~HRhM zaYQS0E9tcl!-ZwSg|9qV7A$@jZ&v~Py{>MbI8^|jFMzKWz_$wEZintx=p2|sm0%Gp zVPH1Rqm9`M%2o7DzbQFK*68hmO$(3G_YAKuWj zj?6p_yAO_>9Ob1fmRrN0FQ>t00=k|(UN&O&-DiC(VU?hD3OvvQRdgd#^V*Y1&s>{fA>yD&hBEHem_i zk^t5t`|D$~DD85zi_zmk^r9{J=m!n(i8JTQf(7u+sscB`t0Hs*tkHnG9`sy~=oh~7 z;22(lrAZct4JOG}$XNy4ht7yS;M~1Tq%@Og$jXBYWR~Z3xV8Xhj*?P%Wmgb&WyayV z2=Qmf(tZHkDIum~`G!fgg*z~>@vVir%HRH51UJCG7x;eZ3lTgy@N^aU#02S+k!c)PMB~oWV#G7Ku%>2IT2JX zY9@{0^`H1%8E`zPP!22$9+#m&&?eU4(86zW4tKV2{hu7VKel zo;AUC;I0QZ$}v0)PjQx{C4!5RB*5j_1x~n^f`OxIjgSJ$L8+E4)9Lt5xu8AA(Y2Hu zvnT-EP*&!4g?MxP)Q(FSNuU!V;IcQ5N(ElefqC?gt!a8JaLsmB0RQF^U{!%{m+qAV zZ+8j$@>GI8SqA+6(If93W*b&kfq(xmQ3aL*XB}7w%YxYs-G4w>e<=dRWfD1l4f%z} zD+wEAr`UF^8_$HhW_mFZwwhyi&EdV@?x6%MFM}<}smaZa|1aR})CFqCU^+HwP(_1G5 z@F6uqkE_5@2QICP(7T(l#4ia(RoJ8mn-RmBQ!rg(Ec+F{QG^!0C_=Lp z8UUjen$6IQgG+!d3a17)jfT?)nszhA=11qyN4gJO|`lAfvzO@ONo+zjhhB-MfM zx+8Sefz=3o=G3VZpM3ODm!RJ!z~+~Y(BgO8hy@Fl1M3gfU`wE^ORcX=I=D&&v|n5S zF1^?WEd#Ds<7<9rnxR+i&;@X{Ll?kR2{ynkL{II|OMpeMt|L`5R!c(&4+oQ-KciD) zAAacgZ*wXF^>)T6Ku7!O;3L@N_M)i_oqD z-%(HK?q*f}s#FE8j)xsEhwhF&zl)t951p&Q^cU4~XA_+FQw)fcODU(fm$zkMAk?nKJ5C_#!e2O6t` z3F-JeB}NKaEu9yO>9cq(277M6?hJzau=iZH0Wb!LCcwIzLHrV66`{9ptN@?=vxgt_@y_DW86rk9hyegN;+cLkvlYYt%EOL$dnSPgJp2G&KSVKIhB3f)U{-+x z;B;Ui{4XY$9xMiWMv>xIF29u)%Fg<;{pvP`eyIR02Nu6};L^x}zmf&BD~Fq*yAG^Y zERCxpfQJseBsgv$1i){MW&r;3ONEePHkb0=I6Wih`JDkc9r(_=5!wK|3Ou@s^wqEq zOb3<$vldJbmgHr`my7;;1<>-1WYL-YrU5sW&`}?EMQExIfUFcpC{AI=Q#(k?nZiIfYAsY0NG497ffG633 zvl5K{lq6UT4}Ey=BJzX3J!htga-o6vf?w5u>A*H%-;G3o3*Q$m1ivGIYa9aJkThLK zGQeMWOb!A3Cy#$|fWM4zPE7m?%x)ix&|mf|qGpoKrNsuo-r>y7_`d;P@!R(#>1Kvi zBeVck75I(@wA0Omx|5;Wu%;sP!Vdh+s1D4VkwCCLm;|pGmX?O5`Ac!)i;IY#Rqk(6 z=W`&s<~Q+815O8SehF|kV)=FkHAA0MZ)iF2-O?R2L$3jzM${3&^91h;dmEWw;yU{~ z@hzvIKw^*!w9~x{bzYSffUldMbphA_53VA~fD_;(*Z_ZWe0d$|%H^v!)RRL1S2+m) zw+i4tK`YiP0XVbS=gbx}iLi0wIx1arUp^RDW&jqyx|3lVkb_m=0QiOhK5_E+r*$(h z0cH_;(3MgEqZW+rSi4PFPf8NRv|=w9Wi9N#$gAe$R?93q!+)h+_^J(B0Na3z;GgHf z0QkKRdd#i{xGp2@z7Ra!4-9}yeQWm%0OvWtQ-w>2;j&M0P4i+gF=O`$;C^okH4)38 zZnUhF47qt8`i#%@te0z*0goSV55xBGG3d*i89W@vGqho~raJH)0laGr|$2Sz#-AL*VT{kn70qY5cEJEkN5JN}Nc_vC3EjF~^4N9$amiL`?FCH$p zQ;FlQ+`;RDx%I3+hCzrA_G0D$M`@)Qs zZt;op2_W)}1s2%uFwbM|BW^%o9w!Zu8-df%Bjg-qZ#x3&v&OQVl;@*MZxBFLfi=+b;?zv4HWu!dKW=)l!9=tivW ziuLKI6Ts)XE7p~(H*X5yI|4Wxv3CBX?-2E99CqLwI}+U0Y~Z*$c{GiEB+kcN%0*2{ zZzd=?TP=m{8wBq%(+VAUP~qp9cuXU{E-Kz7d9@7vo|^JBe_;?>7p$I&-^cwwZ-99j zsTjUn23!E&Yk=ERWvN$DT-kjL)pg(&99RHnGZs8p2%{}48J-jH5!?F1 zV*V-E>tFB3gDHaRhL`yEBz)He=rrKwceWAQMQGK5)fMYX0jx$WRf07xW%IiNcoG4o z?fR$OCrO8a49lY6EG>k z>TM|iKS-^t$hj9=S*M74w-*$HZTNtS_oV!^h=Bry@_LBq>E7>0YQ$;@;Hef|CA1~L zT?rPz=*V#(#-z+vELrfV7QDI~EPf3!>cc~dlO?Y2t7Z;lcGG?P^MT&*U-3HzxcSwP z9PUb~Ml1o`b>LeKa5pl3(H`tZtkN?-A{e7WV^s1Lz&^KYCJ`o^N)|vp8GK2Lz;L~P z@C#@I-PjiAek6@;23Qj@$qF`rNs#ypLh=1EZ@d$&<&RaC`3dtB~O_(k$h9RK*y6IoS zb4U2feCfUe|8)u4ZCItk*Y^W!WaxK~9R08XKDh+A2)?CT`fE_E^>w5+U{!*j?=-)C zA45AZhhgPdP;fw=IKVDScmvQp!#U?ribh}@4%7e;p5`q9O8QrE+^$9}LgD>mM;5P{ z6DU_U%uACt0AUG`YK8BfzlO*Uhv&ia3q~Zzve#qI8e#EUe~;>RU;+G~)CK4UxSz`4 zR_I#*r$AW0(|8<3@Z`Y9)e}p7p|ce$E+oN%MX>oD5FEwnBsu=1h|v-j5UU{f(VWSd z2maOzJq^)i&kgdM2J9N}u3_EBMd$;E4%H)8mH?ks9eDfU!<*_$Sp>KL)~g4_`b~@r z?Wd}&O3;Jx*T9dKX+;2dm5e1l?xk0hK9P+?S0^J9*$Eycnpc#t7i>sU&|)3lo3tKz zqYyg=7~tU;;-2d~*lN}5K$?6z6O`JWA=~iTh~aTY3*e_qfZKsx1(pFX>%c33+kpk} z>TaaBVpLgLZ~>10NK? z-4jayYfznuU)6ydU{``QBv!q|Z%_JXV{q|aG{Ecmia3yqnc|!-0VexqCG8G~d!yOF zMw$|qN!zNZE2a7&iMRTxetMl#9Gg6S*jtAq4@T+kOzt3ZY2R+dR+Vp z;0J2M;(#2*uWu*3q%kRve>wqN1Si0}kc4Z&Y>IAv(}iVNh8Q68@AcBI_XfGyij7y2 z@io6{!D0<~*oO7C$CY&}^mHA#iqJCP0+?N~bQ!4&R36dJ|LS~t3K~_Vfn`c;k|F3J zmII?m9ZEJblQBzhF~n+ZffXjrj1rDal!>#hjA%ttSsYH~yB=`LMBFBTIq;a|adjSd z?^)fAWPlrC49KBItV=zjPL-hh!Da?H`eMm~1+WNKHJBEh2-Am&F-2q&Y%M6nl2;-* z9I>UP3v!?FY4(a7%Iiq!@zfcpno zW3Dv7H5)t?VF=VPI!$G$nGL93<2ab7dnt%hKJ#*_MI3P8q9Gb*Y?)bC=D=>u=)C5B z0s%EfFJUW|pU%*Iq5tH$09GS(pA!vmogjAL8|A=PrY93N!5_WfV`3fN)fdYblHy8| z2p%E~h;3T%;%}4m-j@OC1-_y;`Aq{BzU~Rlt4Pi7`7+?XA6Nj(fd#Oy12@8YzPE~3 z;ursaFAfRO0x3#m1CiF|6-C)GQ$j<_j3>6~Sp<0g=%RbZBR7z;*dPgtK!~GQiuR~y z9v2#yf#tyJi3Nbqojbj?x)6ML@nZx0k}FAQiUz?#Sp3$E62=1JwT0Plu4UIHyx`aP z+J4aj&8Lg%X5bb8J`ez3uK$7nmI3$egl>gi6`{+3U4(wB-)d6}4S(z@L?HP<;CKTA zLVOhO=QR&-=Q)4e`SJy$xI8a31zNN3V-=F!09cJ!B|0#R&<1#W3GliVEBa!w44u_r zm7_pf2PNKUsVxW0Qb{H*&EsxoP}r-oaN|bm{y!hl9MMbCH>w3Da0IOEv@CB zXY+&$+}-r{pCoz*{3gJx0{dpdPgYMiyR-!O9syPzxFmpGgl^3PyqUo7E0O?yqcsC? zb=VmKTm-KGZh`~g_l_QND^@819uq8pqaaO&#j*arB@($KdLeyi;R}9;Em-DP9VvA; z@Cx9|DnT3IDnSEaHDYZ5@V8Ch0W1+pjm%>Df|@)hgC>s$69_S;!A!TU-J7>1D*iZcpSPH$yH#rVfp!@T?76O;C;~N z`@7?O+PtT846v>Pw_XJJb`DFq8{m@Lp?yoza%`+17#D<588*iH%M!IhE#sxxuSPs9 zLv0Fj^+$XSFYTB7jtv+k=%ZDFZh(v6>FI>qBY<%)gZLc-%v%OO{|?|c$AMcO6bk@< zW`I2=$0fF6p*Q8wf?0|d!E|9j42nfSzrKAEyVOrc_>TQ|)P$vH6CUjn^u+IZ0o)y- z3Gn!4B=Gy|%CQKh@VLDg_$y$6>X!Cu{APaaU<4gNx`*XHHn_rfoJ)X|_;&%z~|094u z1HfH^-f4gz4;)yoOU;~zpCi=5D=4APGo^6B4SUazDLzN2C9QIO?;kAp<{CeVkKGd# zw=aeRSJ2}KKiU~Pu%E3`4(w+$Ouex_=yvEM2csbx*OIr6><6`32(Y@@@s&@fZwfec-4>cTsyGt2F6vSa9{!49iih! zLXt~>KOddLT;noRFh0+FY>$LEXQ|{PR}xxJbYNzbJJ07iPkDgMNNt!SdL|=m%jEdS zjf>Dt@RLXVXuD?unD-Oj)g8gxQzf_wK7G0YUfq!-fY~D&ZP7*;CcJKu2E!ov+bUo? zrdRla-_;`t(|`@|p(DqRzOP;!Tg7iTVO`l?K3V0i0M-Ngi(domdyzPpT~8^TBnb^+ zqX0)SJL}qr*FKsj(ly*G7-Rzq}FgGsOe9=dRpr$MqFN4U5XaLK$tcRel-KeAzTi->;0u1E1-fqqe&?O#ok*unpE)}Ld|d{-e6m^di=NQW1hDwcHmn>J zlDH7Qj2Z~OHpBMbl>RtQk`>Zy#EQCXn3-HRQ)!9oLMt88F{}%CJ=xWU64T^6nqs`{ z7A-KDpw+4QbU0k3Pm#COau0hR$*4cGv;0r!xyR}?~qEm9KuH{{mn(tAbk(tW=k^XnS0I#CwCdZ^0Q zG$Qont9>v3!}>LCeoH+bmitlGfLMOEck}zS@pVC~#2fbQz=R=T#5s$zEY35Y^W?gN zI1hOqM|OH)XQjn57*`DKumL89o!|wVlf0=G5U0t)Cr2_|Pr^2BVV(-}M+2Xi?wp3r zW`6$MaF|dp$$~XH*3=69r0c=m7v4idyBVtqu3!9zdP1Q9Rw4SMk3RT7w*_}C*taDa zU^HbJ;W~STutbJIv4Rd?e})CD<~;?yQE;~Vj_sEf;4Y<@`UbrD? zZNU$>-JSCMIa#neRAxgKO*qTZjW8jW8w2DJ%-NjK@wl?uv<{tIyZ1WsSZ|WDIIk6< zsU>BgJW}Kq=t`hh__Fq!^6zv6X-kZB)_T#w41XC)S&p zpO!G!wv6Bg7&=Nm-m(f?qtP{SC8;0K&;YwH)`Mj&SODL-b6dT!%7U-erKAS9E%?)q zKb`=7M?ET|Aq(Yb*f1aticzXw0UbJ$Iulg7s7+Ki#_poz|J<(_&ZeU63_Oi>j*?K2 zfI2Fb?KULSA`9lgnMW#kCcr{SckMsbfypH?Qm6={qc}?7W^vjmX?r$YNnS@XGVh`T zOa3@Uz6UPDwqs19R{vKyziFDO1STbPs!g2w6GT<7U@Jan6Jrc+2 zxxiiZ&4CXCkT?y~dbz5tG)u>iQpg9OScrZ1>e)9q-$-#=NsUDR=@7-KQ@)3 zOJTw~KL-f!f;dH{UvG)lo>9aX^on2NYkG102=_4bO$@34>pmm_eCuB6_VOB%D!_iO z*|YlJ)qk*uS6K~a=bm=}*Ltb{%or|>D7{HaOtbjSMaDyjOaIItj|Evp2!O!}{E=Da zvZs6(3h47$%Z?_t$QD_7Hu}b902aBn;C?<*{c;Ond9W!zfW zC%Q{C>cJ#9>%uHc6Jlxrfr8gsUvoJH;|08EyHfW_@yiYzssNv?E5PDcqfssk&}zaG zz$!sEzdO$g-Y1U@u=o|g9EMdQYN-LvC=Digir``(&Bht-%pgsl33MPpY$mjf2!;spFT zz$~6S@T%xmpsDBkPb8Lo+*C#-yQG(8=N9k{en0LWls4dN*LVrZ28<@?RzFfj088`y z?h~H-uK@Us*5&}qf&s7zJ`)5V41&dQpRK_#DDJ;EO+Xj;g5I(HcJUehdt%~OW67!p zoCX{K`>BK*0Q@bK0R9f(mH}3GO4Nc&t6K2-*8Zs!t+r^DqJ4j`5T*-@VQ`$HDStb8 zO=c5a(926lz_&5sljC~5p(3~Gyfk0o>#Ijc3t#hlM*OM^hy2$D9Q-Z; zemo2C=WjH?qWD*j@qgK`UG-T;cSz^(IxIu~$)6;^x~nif_;M3`woB0^6MRT6OoZvf zY}E>uRlNRIBi$cCe-N6S(e6CJ*Zh7ge$Sp;^IN}~EI=o~JJWw{{aEi=2gZ3bdvYn< zjFHXR;-0y>m`TrNuFOSi!^^*jIL@Xd>r2WH`{h7C7vR>jXKsn61uv_?ss}f~mzEw} zL%qv{n_x9&5n(_KiiaSlJB#U>_o~)GiKDcD4ZWP(J5Y!}1=tbkohK4%75k>ort~>S z&Wp0M8?U)B}tvK1aM6a@Sq*5q(XGxm-O(V2ws(8&&q2PTB1vQQFuP| z?y;k8e6HSC(+$97z_Q==--l5F&I0tV8ZiA=Hy?dl8?gpnKL%KlvRN-_&h*@pV9IOt z3UD*bVoAE^n0}Q2WTYfLapb_!D{+G)~EVKTy<=52;c$Y zNofUKLZ@vNavvQ`bHGNb6I!Lkv3Qi(FP3a`LuNi0>8@i|ql@xNQcaJZm&%8i1h1;W zT@U`O2<`#0R1dy>RYUAF!Dr7_sc*U@toCRzyu2>l)0pA@o8?C@t$0;4ucA0U^XfFr zSTUUO#iaV<9w8u`raNZ$?Y9pcJgmC!dlSB&94~E^{g#T~0=WG5`gRW^>jtb=^DBH; zy`ZBTrApAg(18CvItqi$toFq!*0q}$2&TkEI+)_gBG6BfGhxSkD@>Wqg_#KO4X`qy zLmN^P9-lB+)69A0wo;It`Qa@^=6HWh>ck!D0HYD`g>MgWr=eHY&snMV%)S=9yD8e2 zgL|C!QnzF+F9=`My$$WcLbw@zZ{@=aNfal^!E?VflN9BMPJw9e;61#aibNT!5F42* zGxvHP$NTgrNP%3TD|%byz3R77bzikTpFFAB?}ZCf^Hn!LUse0F8n8ZVdNmM-x^Soj z{U_Z83!ONof2fCUFt;&!xv0oerO2ewnIQs{hDJzf>v{!jijE(J5wyrRcG!hS3q|OF zhC$0b@NMy^tGH}g3c_Y;`(Sm6p!U%Vmd`AMdmKgp$3Wg5rlW$a2JcJ{dG{F64Y2!j zXn>vaU>BpCV3(tp4=!BQg2tlRqOMW8@m2G`LBCW7QYxrr}%w7sqwABk@_Zn1MCqf zS&I_Q<3?Gpg4fmDCq5`-$r>0tP9oPzqu6{01eXjdt>^qzK)BF$A1RbEIA|IuVn;r# zFt%wWlJkRc1*MhTXSlbQ%x$RAh&09-a|d&#?fOg zJ9pdF#P8X2r5-`H?e}_LJrcmp?`LYi0>A3QQU9(6xbWpr&?-PTz#N#$CcGlj8k}Uq z(@Ft2#|~+2c?M&Sy`96Hp?L?uZY}xw&cZH4|H&gi>nu7&*JOfkc9)Kc;47CJ;r8Hq z{C6|#t4gh7M_Q8;mliFMta%u7*mUEdmzI{Hn8y~SB~3jkf!2VTg)}|IzBq!HkT!mY z23k;W6}k;?OYj!G4R3vACktQooosxU_y1P&)h&#nv%3LW{<~B49rvO%z`BE9YJhQz zIRMtFQ4{D?{HTr#SXmdAQ0h$sBS?9YdRYQWOc6Y^yvc`Lco*)K6oWBQK{i_e2FV%E zPst)hLt^dav;PQ1mvxTcy+Oz8bx5s{Qr|l*{(3!uRfH zrTEiaiddc`0+@uVZWY%`2^BemPP{&sHO3 z`ALPUR_*Lm8BL{V-5b0jxF5HoZk4yTRTFN6%Y}>JzN&QU)Tsja_@`BpZX^C^YSikN zIX-mg@ZrOU4jee}R!s*FzV()X-Ut17p=D2ND{X!PSCoPo4%cFac|rFj?2kv12(QckUO2T<`;fjXh@; zdDP)(MeV&VMX$=xj~n7A&#P9Yb}ThT|E3A9b4Uc=&T@1Wqo>xa9`;@L`jb)8(C(=@y{9V-pVKPt>!Wu6K=MZO`HD2{LzMYum10 zJggvl1=tk+-@=-(jp2Y?g6=Cx4X`f;S1oww`Ofsf!UEU?>#6+$m;^V%-L+B;(*59u z3+=+Ct*IzoK3tk8{-E{Yhi%8uk+P>_?aGC8sbQ|E<_aWJaac1&WFjq#po53C*%LCV zO-j_W4mDT8Ug#}{CpjN)u0n%WEN4}3yL|RgeTG9v-mSkCv&Wj-0{8t7KYYK)tyg^) zYP1r(r%%g$+kP8g(YyU{)%v{Zz9E2{U-iIx0Dh+yESI1Ga16!TA9Rgt5 z2q=OLD@1cLeFzQ+YmdyKr9=UR@S0HN^cGw1Rlu zH2twTu5-Fh=$b8E`IuO)g<~Cb*weAvpzvr>UYI*Eb*vI-AEi2mEy@h)Je;H!l#08Q zcnD>n;0V@at6Hz+-l}~%X!R$oaz_Q#&@6o{9WQ!y#kXF~?sV7w^z4+zSEc8N?z{nf zqy5)^lGfqX;z#W{GNWd!e7y&X0Sv zz=I3mlIp>@MYz>2+%3}A&2U33Cq8@j-09O>TT|n7>A3YVMWiVicE6}tkEo2z4Ut}; zO~O*7n-_CYAz2c)E;64wwbg3lHN6_MPWXyn(K|hbzgw@&Z_}InKGGFn_-~8;OKF|F z4B!dCBW|9Lc_dkOl1)~rxfKBj&AlN3HE-Z%S z!X>p#cN43t#b&vsbNl2;VqLFqrA}1YSfug;ZJlatSCZ|D-Ak>h*=oXfTlA{q6)L~- zU*U_#sHpz?JopWOH{@5^XMjK7Y*zvNrfZ&H0UQJi-~quv_%0DP!)lanttl>odnN(p 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 q~pAq&Ab0IFU> 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 LNkvXXu0mjfO0X$c literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/drawable-port-xxxhdpi/screen.png b/node_modules/cordova-android/bin/templates/project/res/drawable-port-xxxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..ec655cde16183b834f1cb79bf7b5bdbb4669dbc8 GIT binary patch literal 299018 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

    Ja?fmqW?E1MLTD=hmi~T90eDNsX+;1) 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�Urfjt{DlsAKY@a1X5ybNUNT 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-hdpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53842612476cfe0d35e54ca3db1238f50df14293 GIT binary patch literal 3345 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-ldpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fcaeb648c732c2ca619d032eeb033c0df2ada2 GIT binary patch literal 1821 zcmV+&2jcjNP)>-t%$s!mMPtiK$@7#m;=kT49v_kHkO7hL4nHedu8h5?$Uaf+gV zBuShoiku(_w54;Smx5@bEX!bHFY2zaP24`bukmyc{VD|KqR_KZv!{Y+lBz0!P!wYf zju*PNY_=R=Bzva!#lQsj=ty{O|{lh?#t^r|C=<<~-x_If5P;p7As0$o3r&zCD zyQZY%6s2cmC@n2r2?>e7;2pCrwe);AXn!VJIOO`%U%HIV9c}1!5-LPGgW-rlbDVT zx&J0}jnwWSFT(s_W*J%JjP8{aQp%u*mdx@w(mK}3LLBU z>_24R?L6W>9XfW3G^$FK2CCPvErpE?NRct|x_RxYa&vQ#va+(2nVEUs1IPgwVYx+E zN#_s%7jVdA&X{AQlXEzSLx6nTq%%^rx-Egxd*9Y2jVdlKQh8aa!60R1WE`&usD**p z%FsI<5JcS&42Z{pOD}8ji6G6Ly_i&4=aD+~>o=U>>URFNn(R5H&p!H&d8F4qt*VZF zhU>zG^D4;C2gHV_Qd3h`cmOef0C9_4GyLc#0s}B%{Vrum+MHRaK_ez`&0XNCTdS#_ zY12Z!T7&V1y4~&5*IVnj=NlC*zfS3o&1y@S~M9wMF$8A1#szz?! zr<;;?XBVsUfKhZ8fw%_;a73^68Eepb?u%LgF|mQCehdUDF)ohvc+L5BhUV@?SUHYi`*qJ&eX-Zfk>0#y|;HVXS`E^ab{Cz{skkl(AL2tbJ5kP>^ z0Mrm5ij9p$iiwFi?{!l1w*U}Ct|@G~0vKMV1ZJgJ8&8}^H`%=5-9>7UzWJ`U-Wf4d zA9fkUcYr8r#sd2RqUh*oMMXs^GBPsCD-bU`_g@Ua_(cE_(55dlhIS@JoOi?E5+ZfD z#dqHRKm`T{Dl;SPF-SxN;@l3eK>R5K1PBxLL^sjO1ZJiX#0|j88~wBD6$^KG7H6m# zK*GYp6cQ4Grh5gVxENZ97a?*Wd6QEEOj-gE92tbIe-(&y(^a?wNKjA^!l7VjoCr+A}@`zUr*Ko!SV*1uAkn{OrX=!O9Ajrl$ zP_!#4GzSeBx!+6F2y)LFj!Bh4pn!k?ojG&nk=H+Hz&QF*et!N2cL1BJY;3E|5rSCz zTG!x0czC$g2&)Ik>C>l?PM$oONlaq9feeNVKXbeMNuqeqVh5Yr81Fz6?aenpYldj|0xfN3*k$+^C< zUAuO{e+|T4Bg>X8E#sLsoq9f?j<{|xXy3kl>xfBgO$7BOoZ*>QUVZKGk|j$D{QUfq(e~}zgHXSI{l0fQ1dAK!X9nb~UpcDp zsFS0ijwU;r>uB*4E&n@Z_wy`!uvZuMCI+#HN$iS%p!}ty7oObsiKA~F)o@hz$tI2d zN%3r5_F_-=CI+#HX+`~X+am*mm>bFOv;SuOioJ>9t{pef|CRm>@X8mfi&qH)00000 LNkvXXu0mjfLN8_f literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-mdpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a18167be1a88d3e724a28d4fe6299fc7ed48c71d GIT binary patch literal 2368 zcmaJ?c{tQtA0NvQy=bINa&J+Vn1~vNER7j!h_T;fiKHk?m>ELDSYk$8+f>%E@4^UW zj~RusB$JFRV{Z`QM&|zB_kEuG$NR^7p68tNJ?DHspY#2GzR!8iV=GHz5n(A|5C|k< zYJ$c9^M!x+LwvyK_C<&W0`Y;Y%xw*g{mp@$|I-8n1pYbY<>meM?b|=g{~F)Ff8XBT z2JGbIWHOoD-QB&pxj8>Szqq)_;c))Pxvi~jVq&7Mu5MvrVQy}YPN(nh@7LDW0(MnZ z6@`)s_{YY^!Zo#IWY2QBT!8%G;Gm(QVQFcpy1E)bB_$>G_V)hz^$Wlb3=CkgSb#Gx zFR!Jg1-LXPCkHrMSy=&i*48*BB_)92>FH@@g()s6wsUY~u~-1r)YKF}%Vx9t`udnm zCg4V;QcFuqfgJ{ek&==^B9XGPvI2r}06Zcp7KaU?P$-R!jV>PENF-80K|w@B1P+Jq z?CbzR0)zk%xE%;j8DUsoU;lk$qq4G69*zPc0Z>4`fJCoey#myG`?e1VnEsy>-oJm} z)ZEEaD z368YXGqWEV8KKc=K$)21<5BU+L19FERKjH=jHEpL)2A`k;rR zl!{JJM4Tb!21G{9*~>p5H2OY{;C?4iNnQWlyLU+$*}fr>s=8)3eS--JsWmU^%d2Wr zpXG-{#@o1fo7lONQlA9|g+Wf9Q;=1yu5T_auWD#)rsNjAXlP8&Dkv|6RW$jSOLu`lV4^7+X=_3+O2gWw-j;|Xo1g>= zE5{NJ`>#3CUn~dMKA9aKZ}3Y zM*D4YbHQKdm?zvk-4ob2_gDB!5@0zEA-r%{XD7 zfV%7I)mA<6PaLO01W*fI{FCCQnHJ*8X!saQuAkn~L8*>vj56ps@vmz!c1q`I5k=h; z2Ib+xp+j?p6|WoXjbuBTgw#-YJB_v>&)V`B>Cp;FV^I(FPI}WM+xYHt=j?1t#ZgwZ zh7?;MB3m@kuvJQn)SAO<5qcJJ;2U2ckj9vrcd??`|;?CYiGkPN)6mE z$}qlZ!$j|mtzWRe$>P1KIWzIu83#6fX+Yqwki8cF-oG5ne?rkQYqu2qY`IzwlXR-z z$!c6g&OETWm9P6HaY@adE`lWLBwFr3AiL5~=!Ye8U}?v~gb(q@)2GMeR|f?Y?! zG#dO9cmJ=u4|vS;^D5Zend1t4KdZJ;}Bt+6|2%$H4no&z1826Z(%YT*kcxDX~B#Lm80uv zzbay5(q*ktsOWg6ix45c}F zJs4kqW)Y$G!$>*PRS0)~Mr!KtCCT-2B_>mw55{|#nv%iUEFK)C@a?*9o9C{h?d-zC zi!14apB)k={$Ir;gYit`y7&^ zZZn$K<71cSXZA31Sgde?!Zh`&$EQD0xK?(0`$id>U#cABcUD?gO%p;-Oz=wWbIH-G zAjYlLn0@?XshgnR&&s{})zHvKk%*MHSu7O6g|nJjJ0Wo4;oB-m1lno>%Gt>sQ6? zPcBY%Hf)0BT#cX#xOt0A$5hOx2cg<$KYHz}pa zh7Fk!1+>vUvBS^RW(k)so`Ly>+0GG{&VaRrNRMSkP^f|e1(I1%khkL3**nNWNc3qi zc-Z^kV3tm5*C!u`qN!B1w5!{JZ<(W)0Qg);2Qv$8d{>O I4cwys27c0^*Z=?k literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-xhdpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3eec364b5bcfd360da42c262f410a1a75e3efb GIT binary patch literal 4085 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-xxhdpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-xxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a569289659e332826e030396820e94ffcd1b1dd1 GIT binary patch literal 6421 zcmV+w8S3VVP)gxOZ z`|0WF=;-L@=jZ0;=H=z(W+}hgO($dn?)6>z>($LV* z&(F`!&d#{JzkP;|f{T)XiIIPYk9>rTdV-61fr)m1h;)92aeISkb9|Sap+HSpQd?t9 zRbNU~VMbJ7MN(ZvP+K)aP*Y!NjFg;ne1&g$f^B$#Yj%HTaeJ+;tr;*uK1)|LL{l)08Vr;ImwbHb@m7@Ts zx{&t#CpAN^uC8LAt^fZ1f9CI@`2T|X|06Lz3ne(dzP`f3!Xz_5NtmdAgowPnyikIX zy1Keh(A*y^I8SbVK)uX4#L~F9xV^o-xw*MSU~fNwl0aN(7S!Rkwzk{b+q1K?v9YnR zu&}hWw1$R;000HAudl1CtEi}`tgNh#j*g6sjGUaDqN1Xjnwp!No1dSbl9G~%iHU@S zg_M+(r>CcokdT*`mx6+Vetv#{fPs8`e0h0!c6N58q@;6mb8&HTZ*OmHZEb35YG-F> zVPRohTwG*iWK>jCQBhG(Pfza|I}ZQ=72-)mK~#7F?3M+VEjtKBq1@fuZT?gIROrg* z$#v@aZp+ep)`px803a9;5Mlcwt~1z z!-$CEBuUaV&9W?K3PZV4ZPY0s?DHOKI0(n!5a!eALy5NSx~}i~ff&bevWyX zt)fJqj#$xXzJ{@P5%dksYaW>>m5F$f#L%RpsdV&TjEn2K(vh9oAxFa?97TA3!JbJo z+dzjln-@I62!9*cXxLWH-;_5aN-c0;PB#}AlL2hep5TlhW$DR zDhd4hIn~`Y-I<=5otvLoSX^9MUS3gr80@bRYDb&9zGZc7ePeS|sZy)g*48xI@mBN^ zoBrN5S=ml$nV|lPL4I)oC_06HYkPZVyPE*9?uJjhdj_M)Y_V8vcDsH5V3hzBCS*NV zwtYyjNLD#LKTG`qlVazvrM(&hS4%6`Plqo_03J} z=2mY~8w_wr1E8=)Io2ZCk9wQR=MZ-ni6-ygfpq%qhn>gA)YH@ROHiwQb-ryXl}a^j zB3P90dBgrR0|F9M$(11(@d1M}0p<{$eBBcHLIONId;nYONvk|I6arb^&YI9gqDMH> z%5h2y1|m^QiUz@>o=!Pej$q{O(#Z@15|c;@1c%;^*I3PbX0OqB zib0d?kUh;6r8hMUit_&q1c#orP89{x0LW-G8SSc1P2dqd!kJd0L*O4sXBf~tfY3yL zb_hVI83Q6j4u86t?vN}YyW85iQXPUpu1qo+hyrMa0KuZaa_Ck0KKF2lSfo5_Vnw3~ zi8HOFV8n=}c~>R_p!b@sDDprUdtu4|M7tUmQ6Qh=AlKR|y&yX)i*$&SiW-E9NqR`9 z*XyW3Z0MhYPNxLOM1ah;@TVr}o{canA{g0&twAkhr}Z>9Z@+}HBh-< zUbM$T%|N7a5F)eBm|bnbP0N_j+6_enV+GgW*xXd8=EkuvOkYKLi1OdL+-IV6IvwHp zEyM8|^~mAC2bui6t-HHHNL+nK24uwqqpY<{s*Z18JPd;g7&&|~9Pqd@_f7|9Ovpta zdGak5i_bqB`Zh*{b$eWRjxT#FxFW{B0?$vO+J?S=_T&V876k-+LXk+sg^~sW`qNYP za99&Q@K}A>TYxC;^N}+YOIngDj4P1JK+!e>G+v+QSp=oB?1Ta1uO{g|8r^<+-*Ep96i#X!igzl zrZ5;~K^TSR(=d}sl3C?etTnR~GgHXan7K8C@%!|>ofU+$zCrUnzj*_1v^&F2ofV!o zn=NLsUN4o)K}IUqQ}Ie|Fz67UG(dUHomCBS+&6t5QN~SBK%i0}lfM)c7W@T8h|5km zXyd}PFGnmqV=gK#DJ|2R;d;qtQ%V>fwI6yZG zDk>`qV)r17%YJ$<5nMcb#!^*XU1Ju@cK|^bdWSuBj3>Ex=R#|BTYE<*3R$~|P`5UX3>Mk| zaT)75TvpSb%zFYYee$- z6hb78x@&1nI!YQ_>K|-(``_GL;sHFpb^EbJB!jfC;9)Pf{o$j7M=%(4!HqRLTcf`t z5t|=B>1nB~xgdpz`hc#!Oa1>yM<1ed>((tp5Vnh~5^{I*w12=;_wN3dkV7@;hOOm1FY-jzftEIuGq&jlfi9)$ptB0Jqh2N+Xr z1tE3`an^b{(g7V1iaUIiE?zu}9c6@$J6sT+-UO*&LUy69alq6V7D7sg*o=*-#x`+S zx6-RH93~w=y*YJ%__1&R>ot>KB?$+7 z3_N56Xg?^WFSUjl~cpRR2i9N zW$^!D6zWqn1>5ZDfR9QwrNrKqT`SGm=DCHoK_9hR?XC9D%)>tCTrP}J?(~D+!S)B! zB8`TY(P%V0UP70g2*EnkQr#*ZAEp@}9*Ib`A;bol3Ej?N*C^t#+G7i_mC*rw{vG%4%clf`l#(X zKHd@e&Wf4;Z+%bw|K@poehj+s`2v0-ZW9y;h>PlaYa5EJOhSDl!Ug3R!03!FE-v}7 zZKY9lz1k%mz+0D(GNfXzRNZfXQnkz%#0&WRcq9@kh$JMl6hDP^QN|?H_g6t&oIM=W znVMSgSjlC>T6;Lm&Arc6REYu`7^LK99Zx%+J%@HD5_%rET{x9Q@9ii=m36*&QB;Qi zMWb;=)GeFJsWSuM*2?yA9nLDJjyHBwJ}MDU17N}MW0oggR4xDgR007S4M|rQY^4-6 zPEj&*QBj#}9REK)JU6a57dPh6L7yenD%J_%_NsQK1NiwU^Z3zd0|g_9k9ofQ{O{0z zVZ(!5>>GDL$-25^7!WcytT=2VrGx1pFO|P?*gmd<^L~p%2YKZia_$sg5Q8>2Mt}c1 zcBR-4(&)!2SGp)WbHj~IHhVf4&(hNCpzR#CcZ@jiy?mVU`1$$!1|Aba4GYjFfnzj zbBcc33>hr2Sy(VGyz$1GW`BdW!Pkee0UiHq{@Nxg0dx`*oi-9X*1m5+&5fjt5gqg~ z8jUYsdSXJXr#)w#s}9nAGAZE`8@(M;ph>li! z?QJ=!V!MsWfwk*fSgn7JdO5lT5Sx^glsASyR+iB3KCjS+(b4|nnsJe92jB2$q!A2lm)xa>(_5yf4s(7$#abGm!}qez=+&61!f%N zM@2mfIuYCvN|A`#DNiLrNY}$b|rg2A< z2-EWz=y-??@b>k_?+JZ(-e3Da=jN4^%KAm|y5du@?sL_P5)YCAtoT z%9^<9Ou~*kBFXvJ#DJ3Z)zqiocpOG@z>)mOkqF%+gko<8nRAC}Pr!lto0Z)G%@NkWF$MHCw&b_@A z0{XB+L-?tAl}5#3VnqFm^%q|(BI4ZvP)OAMu)&BvdSV=c^wzHIfP`UyMN6^3LKLD` zRNY~ct|tNX-c8~C?pA@jo=jQ~y0UX@zn5h>9Ek=T+~pb`N8O-z`(pSZ7WXHTaUY{; zR|^U{#^|5z1N8n~s>aU_yRvigS0d?8q*95rgW4SGEtcYr&zZT;W^%cF>c*?!5Km|? zeXzcMPe_qu7#dz6BJB<- zOdGh*%jp{p^|_GoClbj*$?q0=$6(tW@IZGL`=FTb_B5`h2*glFsIlwwgIpkAp4;a;UPx=)u~ zJHjR9O7&*z`6=uM4Hso@gVGcX>{Xvy%|@*x2b>b0Y3J?C^u!3I2-4K{_%1SNWPD1e zGpWZxW$Ijo3NQ#jslT}7s4$(0%u3UEdTupq<@>-MfYeAkC2>^+wM<%9pb4zQRx4-S42=+kmBAZF%O64*EJwLs?yuSYL zyLyFQUS7ZhplZ34_sgkpB;>nt99ljZPgfW9sF`Y!hQY}9*!=RQ>1^xJ;kf}&G%ovd z#d5VyM9^b@Jwq)P>S`&UOWXrU60e0H53HYzYl~E~QMJ!BIkd1&K>GO=0Bs*TuJ)bj zHc+Wt15vXDruWnW4&#AANdgLb?ZS^_(b8N82pTvTiKyN5`uSDEEr2c+pwvC~Du}8; z0uw}kw#D9%n(PU0NR39FcyfL@lO-URjR9@45KWA=9U2-m7!{M$OfLfHw;ggQ7zt-H zG7$l(TCLUUwR#<7q&ht*!e{ZdTD4j(mx}oU42oxC6;?6^WCD<$fYulK0QFXkfF=lt z972Y?QY98mF``@{4<=B(s}fWMPR^fzK@S({kocGIBLS@dh_xAjph0b~Fm(eRIfQF* zFAa+rk>3xdLVlnMgK6wdL@~bN9Yi zN?(Md*?0!W{6r$*2iO4NyJY!3lgd8CBI!NR?s1&#S`lhiGW5MxhiGxMGsL>g_{q9^ z>~Q^c7m(7C7?3a#X%G%j<{sY_Pi3>w@I@sU68GJL?P&Wqvtezi9clm#ZhJ06X0U5fC(BFaiiq z)b?YO)0ot&%%Yv6A1~SR2!y0yx>AWmA{R`tzM?Njph`L&l$_o>JL5Ur`ps-arZE`# zF4I03r*yNh$as53M8efyH$Ktp#44Ad;2=p5F7*UNao_ItFrIDeCljj}R>y}2Bb`1l z8Rr&Zkr_mXC%B2p+hF8U zjokr@mez=9d-w1d7tGGpa}l2K-2aKbdgbxp@N(&}og5$TSbhT!R_mN@1{K4$?+euD zG9t5x5iNtrgnJ=w?HsVj0nnLWt8BI(PXKecyKS+anT>``BwCM1s}+N^orhG5re+w? zDsE7`{e)}IE!*34HKTSN?C$OW#(MV2Y%*@1t{^~+2L^SH`C3nm3(O*gXmMo?NTyq} za)rKj{f1}!$S2UiozvCjMHV0`*t+Huqq;n(^NC20M~N-3o^G-m&wvG)6@9`}?>oHk zy(avS0W@nX3`gJQ;VyM(a|jlxMAI;74iE78e=BE|5J3zCQ5bi_<^JcSx-#APW+M;Q z?L~ef73|8!h704}%bSA4z1ZyNK9jUpB@K2ILdZ~>M(9VqC@pZ>Epbd9F7s&by1$3a zzOJG(bm%|yaXlztC|w+h9f96B`~c7J54bA@pX)kSPJQaYM|G~<;7wj%Ek>%r z*2{GGBfL=>r~ufMT0JCaj*+mIfF;{0R{u@Ke_Zs6m7 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/mipmap-xxxhdpi/icon.png b/node_modules/cordova-android/bin/templates/project/res/mipmap-xxxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c322f2ea76baa18ada8a8bffceecec84fd35702 GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/bin/templates/project/res/values/strings.xml b/node_modules/cordova-android/bin/templates/project/res/values/strings.xml new file mode 100644 index 0000000..bb049db --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/res/values/strings.xml @@ -0,0 +1,9 @@ + + + + __NAME__ + + @string/app_name + + @string/launcher_name + diff --git a/node_modules/cordova-android/bin/templates/project/res/xml/config.xml b/node_modules/cordova-android/bin/templates/project/res/xml/config.xml new file mode 100644 index 0000000..ae06783 --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/res/xml/config.xml @@ -0,0 +1,58 @@ + + + + Hello Cordova + + + A sample Apache Cordova application that responds to the deviceready event. + + + + Apache Cordova Team + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/bin/templates/project/wrapper.gradle b/node_modules/cordova-android/bin/templates/project/wrapper.gradle new file mode 100644 index 0000000..d7ebabd --- /dev/null +++ b/node_modules/cordova-android/bin/templates/project/wrapper.gradle @@ -0,0 +1 @@ +//This file is intentionally just a comment diff --git a/node_modules/cordova-android/bin/update b/node_modules/cordova-android/bin/update new file mode 100755 index 0000000..c51b7ff --- /dev/null +++ b/node_modules/cordova-android/bin/update @@ -0,0 +1,37 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +var path = require('path'); +var Api = require('./templates/cordova/Api'); +var args = require('nopt')({ + 'link': Boolean, + 'shared': Boolean, + 'help': Boolean +}, { 'd' : '--verbose' }); + +if (args.help || args.argv.remain.length === 0) { + console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'update')) + ' [--link]'); + console.log(' --link will use the CordovaLib project directly instead of making a copy.'); + process.exit(1); +} + +require('./templates/cordova/loggingHelper').adjustLoggerLevel(args); + +Api.updatePlatform(args.argv.remain[0], {link: (args.link || args.shared)}).done(); diff --git a/node_modules/cordova-android/bin/update.bat b/node_modules/cordova-android/bin/update.bat new file mode 100644 index 0000000..d0aa7a0 --- /dev/null +++ b/node_modules/cordova-android/bin/update.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you under the Apache License, Version 2.0 (the +:: "License"); you may not use this file except in compliance +:: with the License. You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, +:: software distributed under the License is distributed on an +:: "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +:: KIND, either express or implied. See the License for the +:: specific language governing permissions and limitations +:: under the License. + +@ECHO OFF +SET script_path="%~dp0update" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'update' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/node_modules/cordova-android/cordova-js-src/android/nativeapiprovider.js b/node_modules/cordova-android/cordova-js-src/android/nativeapiprovider.js new file mode 100644 index 0000000..2e9aa67 --- /dev/null +++ b/node_modules/cordova-android/cordova-js-src/android/nativeapiprovider.js @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +*/ + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; diff --git a/node_modules/cordova-android/cordova-js-src/android/promptbasednativeapi.js b/node_modules/cordova-android/cordova-js-src/android/promptbasednativeapi.js new file mode 100644 index 0000000..f7fb6bc --- /dev/null +++ b/node_modules/cordova-android/cordova-js-src/android/promptbasednativeapi.js @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +*/ + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used pre-JellyBean, where addJavascriptInterface() is disabled. + */ + +module.exports = { + exec: function(bridgeSecret, service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(bridgeSecret, value) { + prompt(value, 'gap_bridge_mode:' + bridgeSecret); + }, + retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret); + } +}; diff --git a/node_modules/cordova-android/cordova-js-src/exec.js b/node_modules/cordova-android/cordova-js-src/exec.js new file mode 100644 index 0000000..f73d87a --- /dev/null +++ b/node_modules/cordova-android/cordova-js-src/exec.js @@ -0,0 +1,297 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * Execute a cordova command. It is up to the native side whether this action + * is synchronous or asynchronous. The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchronous: Empty string "" + * If async, the native side will cordova.callbackSuccess or cordova.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in cordova + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +var cordova = require('cordova'), + nativeApiProvider = require('cordova/android/nativeapiprovider'), + utils = require('cordova/utils'), + base64 = require('cordova/base64'), + channel = require('cordova/channel'), + jsToNativeModes = { + PROMPT: 0, + JS_OBJECT: 1 + }, + nativeToJsModes = { + // Polls for messages using the JS->Native bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, + pollEnabled = false, + bridgeSecret = -1; + +var messagesFromNative = []; +var isProcessing = false; +var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); +var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; + +function androidExec(success, fail, service, action, args) { + if (bridgeSecret < 0) { + // If we ever catch this firing, we'll need to queue up exec()s + // and fire them once we get a secret. For now, I don't think + // it's possible for exec() to be called since plugins are parsed but + // not run until until after onNativeReady. + throw new Error('exec() called without bridgeSecret'); + } + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // If args is not provided, default to an empty array + args = args || []; + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } else if (msgs) { + messagesFromNative.push(msgs); + // Always process async to avoid exceptions messing up stack. + nextTick(processMessages); + } +} + +androidExec.init = function() { + //CB-11828 + //This failsafe checks the version of Android and if it's Jellybean, it switches it to + //using the Online Event bridge for communicating from Native to JS + // + //It's ugly, but it's necessary. + var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/); + var version_code = check && check[0].match(/4.[0-3].*/); + if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) { + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT; + } + + bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); + channel.onNativeReady.fire(); +}; + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + if (bridgeSecret < 0) { + // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. + // We know there's nothing to retrieve, so no need to poll. + return; + } + var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); + if (msgs) { + messagesFromNative.push(msgs); + // Process sync since we know we're already top-of-stack. + processMessages(); + } +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + // Otherwise, it will be set by androidExec.init() + if (bridgeSecret >= 0) { + nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); + } + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +function buildPayload(payload, message) { + var payloadKind = message.charAt(0); + if (payloadKind == 's') { + payload.push(message.slice(1)); + } else if (payloadKind == 't') { + payload.push(true); + } else if (payloadKind == 'f') { + payload.push(false); + } else if (payloadKind == 'N') { + payload.push(null); + } else if (payloadKind == 'n') { + payload.push(+message.slice(1)); + } else if (payloadKind == 'A') { + var data = message.slice(1); + payload.push(base64.toArrayBuffer(data)); + } else if (payloadKind == 'S') { + payload.push(window.atob(message.slice(1))); + } else if (payloadKind == 'M') { + var multipartMessages = message.slice(1); + while (multipartMessages !== "") { + var spaceIdx = multipartMessages.indexOf(' '); + var msgLen = +multipartMessages.slice(0, spaceIdx); + var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); + multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); + buildPayload(payload, multipartMessage); + } + } else { + payload.push(JSON.parse(message)); + } +} + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + // This is deprecated on the .java side. It doesn't work with CSP enabled. + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadMessage = message.slice(nextSpaceIdx + 1); + var payload = []; + buildPayload(payload, payloadMessage); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + } else { + console.log("processMessage failed: invalid message: " + JSON.stringify(message)); + } +} + +function processMessages() { + // Check for the reentrant case. + if (isProcessing) { + return; + } + if (messagesFromNative.length === 0) { + return; + } + isProcessing = true; + try { + var msg = popMessageFromQueue(); + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (msg == '*' && messagesFromNative.length === 0) { + nextTick(pollOnce); + return; + } + processMessage(msg); + } finally { + isProcessing = false; + if (messagesFromNative.length > 0) { + nextTick(processMessages); + } + } +} + +function popMessageFromQueue() { + var messageBatch = messagesFromNative.shift(); + if (messageBatch == '*') { + return '*'; + } + + var spaceIdx = messageBatch.indexOf(' '); + var msgLen = +messageBatch.slice(0, spaceIdx); + var message = messageBatch.substr(spaceIdx + 1, msgLen); + messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); + if (messageBatch) { + messagesFromNative.unshift(messageBatch); + } + return message; +} + +module.exports = androidExec; diff --git a/node_modules/cordova-android/cordova-js-src/platform.js b/node_modules/cordova-android/cordova-js-src/platform.js new file mode 100644 index 0000000..2bfd024 --- /dev/null +++ b/node_modules/cordova-android/cordova-js-src/platform.js @@ -0,0 +1,125 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// The last resume event that was received that had the result of a plugin call. +var lastResumeEvent = null; + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Get the shared secret needed to use the bridge. + exec.init(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + function bindButtonChannel(buttonName) { + // generic button bind used for volumeup/volumedown buttons + var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); + volumeButtonChannel.onHasSubscribersChange = function() { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); + }; + } + // Inject a listener for the volume buttons on the document. + bindButtonChannel('volumeup'); + bindButtonChannel('volumedown'); + + // The resume event is not "sticky", but it is possible that the event + // will contain the result of a plugin call. We need to ensure that the + // plugin result is delivered even after the event is fired (CB-10498) + var cordovaAddEventListener = document.addEventListener; + + document.addEventListener = function(evt, handler, capture) { + cordovaAddEventListener(evt, handler, capture); + + if (evt === 'resume' && lastResumeEvent) { + handler(lastResumeEvent); + } + }; + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); + exec(null, null, APP_PLUGIN_NAME, "show", []); + }); + } +}; + +function onMessageFromNative(msg) { + var cordova = require('cordova'); + var action = msg.action; + + switch (action) + { + // Button events + case 'backbutton': + case 'menubutton': + case 'searchbutton': + // App life cycle events + case 'pause': + // Volume events + case 'volumedownbutton': + case 'volumeupbutton': + cordova.fireDocumentEvent(action); + break; + case 'resume': + if(arguments.length > 1 && msg.pendingResult) { + if(arguments.length === 2) { + msg.pendingResult.result = arguments[1]; + } else { + // The plugin returned a multipart message + var res = []; + for(var i = 1; i < arguments.length; i++) { + res.push(arguments[i]); + } + msg.pendingResult.result = res; + } + + // Save the plugin result so that it can be delivered to the js + // even if they miss the initial firing of the event + lastResumeEvent = msg; + } + cordova.fireDocumentEvent(action, msg); + break; + default: + throw new Error('Unknown event action ' + action); + } +} diff --git a/node_modules/cordova-android/cordova-js-src/plugin/android/app.js b/node_modules/cordova-android/cordova-js-src/plugin/android/app.js new file mode 100644 index 0000000..22cf96e --- /dev/null +++ b/node_modules/cordova-android/cordova-js-src/plugin/android/app.js @@ -0,0 +1,108 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); +var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, APP_PLUGIN_NAME, "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]); + }, + + /** + * Override the default behavior of the Android volume button. + * If overridden, when the volume button is pressed, the "volume[up|down]button" + * JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "volume[up|down]button" event, this is automatically done. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + overrideButton:function(button, override) { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, APP_PLUGIN_NAME, "exitApp", []); + } +}; diff --git a/node_modules/cordova-android/framework/.classpath b/node_modules/cordova-android/framework/.classpath new file mode 100644 index 0000000..0461652 --- /dev/null +++ b/node_modules/cordova-android/framework/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/node_modules/cordova-android/framework/.project b/node_modules/cordova-android/framework/.project new file mode 100644 index 0000000..ed4a955 --- /dev/null +++ b/node_modules/cordova-android/framework/.project @@ -0,0 +1,33 @@ + + + Cordova + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/node_modules/cordova-android/framework/.settings/org.eclipse.jdt.core.prefs b/node_modules/cordova-android/framework/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b080d2d --- /dev/null +++ b/node_modules/cordova-android/framework/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/node_modules/cordova-android/framework/AndroidManifest.xml b/node_modules/cordova-android/framework/AndroidManifest.xml new file mode 100755 index 0000000..1625b89 --- /dev/null +++ b/node_modules/cordova-android/framework/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/node_modules/cordova-android/framework/ant.properties b/node_modules/cordova-android/framework/ant.properties new file mode 100644 index 0000000..243b691 --- /dev/null +++ b/node_modules/cordova-android/framework/ant.properties @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/node_modules/cordova-android/framework/build.gradle b/node_modules/cordova-android/framework/build.gradle new file mode 100644 index 0000000..4ff7264 --- /dev/null +++ b/node_modules/cordova-android/framework/build.gradle @@ -0,0 +1,137 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +ext { + apply from: 'cordova.gradle' + cdvCompileSdkVersion = privateHelpers.getProjectTarget() + cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools() +} + +buildscript { + repositories { + jcenter() + maven { + url "https://maven.google.com" + } + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + } +} + +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'com.jfrog.bintray' + +group = 'org.apache.cordova' +version = '7.1.1' + +android { + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + publishNonDefault true + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } + + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/NOTICE' + } +} + +install { + repositories.mavenInstaller { + pom { + project { + packaging 'aar' + name 'Cordova' + url 'https://cordova.apache.org' + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id 'stevengill' + name 'Steve Gill' + } + } + scm { + connection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + developerConnection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + url 'https://git-wip-us.apache.org/repos/asf?p=cordova-android' + + } + } + } + } +} + +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +artifacts { + archives sourcesJar +} + +bintray { + user = System.getenv('BINTRAY_USER') + key = System.getenv('BINTRAY_KEY') + configurations = ['archives'] + pkg { + repo = 'maven' + name = 'cordova-android' + userOrg = 'cordova' + licenses = ['Apache-2.0'] + vcsUrl = 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + websiteUrl = 'https://cordova.apache.org' + issueTrackerUrl = 'https://issues.apache.org/jira/browse/CB' + publicDownloadNumbers = true + licenses = ['Apache-2.0'] + labels = ['android', 'cordova', 'phonegap'] + version { + name = '7.1.1' + released = new Date() + vcsTag = '7.1.1' + } + } +} diff --git a/node_modules/cordova-android/framework/build.xml b/node_modules/cordova-android/framework/build.xml new file mode 100644 index 0000000..3957084 --- /dev/null +++ b/node_modules/cordova-android/framework/build.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/framework/cordova.gradle b/node_modules/cordova-android/framework/cordova.gradle new file mode 100644 index 0000000..6c6819a --- /dev/null +++ b/node_modules/cordova-android/framework/cordova.gradle @@ -0,0 +1,205 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +import java.util.regex.Pattern +import groovy.swing.SwingBuilder + +String doEnsureValueExists(filePath, props, key) { + if (props.get(key) == null) { + throw new GradleException(filePath + ': Missing key required "' + key + '"') + } + return props.get(key) +} + +String doGetProjectTarget() { + def props = new Properties() + def propertiesFile = 'project.properties'; + if(!(file(propertiesFile).exists())) { + propertiesFile = '../project.properties'; + } + file(propertiesFile).withReader { reader -> + props.load(reader) + } + return doEnsureValueExists('project.properties', props, 'target') +} + +String[] getAvailableBuildTools() { + def buildToolsDir = new File(getAndroidSdkDir(), "build-tools") + buildToolsDir.list() + .findAll { it ==~ /[0-9.]+/ } + .sort { a, b -> compareVersions(b, a) } +} + +String doFindLatestInstalledBuildTools(String minBuildToolsVersion) { + def availableBuildToolsVersions + try { + availableBuildToolsVersions = getAvailableBuildTools() + } catch (e) { + println "An exception occurred while trying to find the Android build tools." + throw e + } + if (availableBuildToolsVersions.length > 0) { + def highestBuildToolsVersion = availableBuildToolsVersions[0] + if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) { + throw new RuntimeException( + "No usable Android build tools found. Highest installed version is " + + highestBuildToolsVersion + "; minimum version required is " + + minBuildToolsVersion + ".") + } + highestBuildToolsVersion + } else { + throw new RuntimeException( + "No installed build tools found. Install the Android build tools version " + + minBuildToolsVersion + " or higher.") + } +} + +// Return the first non-zero result of subtracting version list elements +// pairwise. If they are all identical, return the difference in length of +// the two lists. +int compareVersionList(Collection aParts, Collection bParts) { + def pairs = ([aParts, bParts]).transpose() + pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null} +} + +// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched +// elements are identical, the longer version is the largest by this method. +// Examples: +// "19.0.0" > "19" +// "19.0.1" > "19.0.0" +// "19.1.0" > "19.0.1" +// "19" > "18.999.999" +int compareVersions(String a, String b) { + def aParts = a.tokenize('.').collect {it.toInteger()} + def bParts = b.tokenize('.').collect {it.toInteger()} + compareVersionList(aParts, bParts) +} + +String getAndroidSdkDir() { + def rootDir = project.rootDir + def androidSdkDir = null + String envVar = System.getenv("ANDROID_HOME") + def localProperties = new File(rootDir, 'local.properties') + String systemProperty = System.getProperty("android.home") + if (envVar != null) { + androidSdkDir = envVar + } else if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDirProp = properties.getProperty('sdk.dir') + if (sdkDirProp != null) { + androidSdkDir = sdkDirProp + } else { + sdkDirProp = properties.getProperty('android.dir') + if (sdkDirProp != null) { + androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath() + } + } + } + if (androidSdkDir == null && systemProperty != null) { + androidSdkDir = systemProperty + } + if (androidSdkDir == null) { + throw new RuntimeException( + "Unable to determine Android SDK directory.") + } + androidSdkDir +} + +def doExtractIntFromManifest(name) { + def manifestFile = file(android.sourceSets.main.manifest.srcFile) + def pattern = Pattern.compile(name + "=\"(\\d+)\"") + def matcher = pattern.matcher(manifestFile.getText()) + matcher.find() + return new BigInteger(matcher.group(1)) +} + +def doExtractStringFromManifest(name) { + def manifestFile = file(android.sourceSets.main.manifest.srcFile) + def pattern = Pattern.compile(name + "=\"(\\S+)\"") + def matcher = pattern.matcher(manifestFile.getText()) + matcher.find() + return matcher.group(1) +} + +def doPromptForPassword(msg) { + if (System.console() == null) { + def ret = null + new SwingBuilder().edt { + dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) { + vbox { + label(text: msg) + def input = passwordField() + button(defaultButton: true, text: 'OK', actionPerformed: { + ret = input.password; + dispose(); + }) + } + } + } + if (!ret) { + throw new GradleException('User canceled build') + } + return new String(ret) + } else { + return System.console().readPassword('\n' + msg); + } +} + +def doGetConfigXml() { + def xml = file("src/main/res/xml/config.xml").getText() + // Disable namespace awareness since Cordova doesn't use them properly + return new XmlParser(false, false).parseText(xml) +} + +def doGetConfigPreference(name, defaultValue) { + name = name.toLowerCase() + def root = doGetConfigXml() + + def ret = defaultValue + root.preference.each { it -> + def attrName = it.attribute("name") + if (attrName && attrName.toLowerCase() == name) { + ret = it.attribute("value") + } + } + return ret +} + +// Properties exported here are visible to all plugins. +ext { + // These helpers are shared, but are not guaranteed to be stable / unchanged. + privateHelpers = {} + privateHelpers.getProjectTarget = { doGetProjectTarget() } + privateHelpers.findLatestInstalledBuildTools = { doFindLatestInstalledBuildTools('19.1.0') } + privateHelpers.extractIntFromManifest = { name -> doExtractIntFromManifest(name) } + privateHelpers.extractStringFromManifest = { name -> doExtractStringFromManifest(name) } + privateHelpers.promptForPassword = { msg -> doPromptForPassword(msg) } + privateHelpers.ensureValueExists = { filePath, props, key -> doEnsureValueExists(filePath, props, key) } + + // These helpers can be used by plugins / projects and will not change. + cdvHelpers = {} + // Returns a XmlParser for the config.xml. Added in 4.1.0. + cdvHelpers.getConfigXml = { doGetConfigXml() } + // Returns the value for the desired . Added in 4.1.0. + cdvHelpers.getConfigPreference = { name, defaultValue -> doGetConfigPreference(name, defaultValue) } +} + diff --git a/node_modules/cordova-android/framework/gradle/wrapper/gradle-wrapper.properties b/node_modules/cordova-android/framework/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c3a5fda --- /dev/null +++ b/node_modules/cordova-android/framework/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Nov 09 10:50:25 PST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/node_modules/cordova-android/framework/project.properties b/node_modules/cordova-android/framework/project.properties new file mode 100644 index 0000000..0a372ee --- /dev/null +++ b/node_modules/cordova-android/framework/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-27 +apk-configurations= +renderscript.opt.level=O0 +android.library=true diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/AuthenticationToken.java b/node_modules/cordova-android/framework/src/org/apache/cordova/AuthenticationToken.java new file mode 100644 index 0000000..d3a231a --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/AuthenticationToken.java @@ -0,0 +1,69 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +/** + * The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource + */ +public class AuthenticationToken { + private String userName; + private String password; + + /** + * Gets the user name. + * + * @return the user name + */ + public String getUserName() { + return userName; + } + + /** + * Sets the user name. + * + * @param userName + * the new user name + */ + public void setUserName(String userName) { + this.userName = userName; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the new password + */ + public void setPassword(String password) { + this.password = password; + } + + + + +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/BuildHelper.java b/node_modules/cordova-android/framework/src/org/apache/cordova/BuildHelper.java new file mode 100644 index 0000000..6d9daa4 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/BuildHelper.java @@ -0,0 +1,70 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova; + +/* + * This is a utility class that allows us to get the BuildConfig variable, which is required + * for the use of different providers. This is not guaranteed to work, and it's better for this + * to be set in the build step in config.xml + * + */ + +import android.app.Activity; +import android.content.Context; + +import java.lang.reflect.Field; + + +public class BuildHelper { + + + private static String TAG="BuildHelper"; + + /* + * This needs to be implemented if you wish to use the Camera Plugin or other plugins + * that read the Build Configuration. + * + * Thanks to Phil@Medtronic and Graham Borland for finding the answer and posting it to + * StackOverflow. This is annoying as hell! However, this method does not work with + * ProGuard, and you should use the config.xml to define the application_id + * + */ + + public static Object getBuildConfigValue(Context ctx, String key) + { + try + { + Class clazz = Class.forName(ctx.getPackageName() + ".BuildConfig"); + Field field = clazz.getField(key); + return field.get(null); + } catch (ClassNotFoundException e) { + LOG.d(TAG, "Unable to get the BuildConfig, is this built with ANT?"); + e.printStackTrace(); + } catch (NoSuchFieldException e) { + LOG.d(TAG, key + " is not a valid field. Check your build.gradle"); + } catch (IllegalAccessException e) { + LOG.d(TAG, "Illegal Access Exception: Let's print a stack trace."); + e.printStackTrace(); + } + + return null; + } + +} \ No newline at end of file diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackContext.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackContext.java new file mode 100644 index 0000000..4336386 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackContext.java @@ -0,0 +1,142 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import org.json.JSONArray; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.json.JSONObject; + +public class CallbackContext { + private static final String LOG_TAG = "CordovaPlugin"; + + private String callbackId; + private CordovaWebView webView; + protected boolean finished; + private int changingThreads; + + public CallbackContext(String callbackId, CordovaWebView webView) { + this.callbackId = callbackId; + this.webView = webView; + } + + public boolean isFinished() { + return finished; + } + + public boolean isChangingThreads() { + return changingThreads > 0; + } + + public String getCallbackId() { + return callbackId; + } + + public void sendPluginResult(PluginResult pluginResult) { + synchronized (this) { + if (finished) { + LOG.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage()); + return; + } else { + finished = !pluginResult.getKeepCallback(); + } + } + webView.sendPluginResult(pluginResult, callbackId); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONArray message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(byte[] message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + */ + public void success() { + sendPluginResult(new PluginResult(PluginResult.Status.OK)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackMap.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackMap.java new file mode 100644 index 0000000..050daa0 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CallbackMap.java @@ -0,0 +1,65 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.util.Pair; +import android.util.SparseArray; + +/** + * Provides a collection that maps unique request codes to CordovaPlugins and Integers. + * Used to ensure that when plugins make requests for runtime permissions, those requests do not + * collide with requests from other plugins that use the same request code value. + */ +public class CallbackMap { + private int currentCallbackId = 0; + private SparseArray> callbacks; + + public CallbackMap() { + this.callbacks = new SparseArray>(); + } + + /** + * Stores a CordovaPlugin and request code and returns a new unique request code to use + * in a permission request. + * + * @param receiver The plugin that is making the request + * @param requestCode The original request code used by the plugin + * @return A unique request code that can be used to retrieve this callback + * with getAndRemoveCallback() + */ + public synchronized int registerCallback(CordovaPlugin receiver, int requestCode) { + int mappedId = this.currentCallbackId++; + callbacks.put(mappedId, new Pair(receiver, requestCode)); + return mappedId; + } + + /** + * Retrieves and removes a callback stored in the map using the mapped request code + * obtained from registerCallback() + * + * @param mappedId The request code obtained from registerCallback() + * @return The CordovaPlugin and orignal request code that correspond to the + * given mappedCode + */ + public synchronized Pair getAndRemoveCallback(int mappedId) { + Pair callback = callbacks.get(mappedId); + callbacks.remove(mappedId); + return callback; + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/Config.java b/node_modules/cordova-android/framework/src/org/apache/cordova/Config.java new file mode 100644 index 0000000..0739795 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/Config.java @@ -0,0 +1,71 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova; + +import java.util.List; + +import android.app.Activity; + +@Deprecated // Use Whitelist, CordovaPrefences, etc. directly. +public class Config { + private static final String TAG = "Config"; + + static ConfigXmlParser parser; + + private Config() { + } + + public static void init(Activity action) { + parser = new ConfigXmlParser(); + parser.parse(action); + //TODO: Add feature to bring this back. Some preferences should be overridden by intents, but not all + parser.getPreferences().setPreferencesBundle(action.getIntent().getExtras()); + } + + // Intended to be used for testing only; creates an empty configuration. + public static void init() { + if (parser == null) { + parser = new ConfigXmlParser(); + } + } + + public static String getStartUrl() { + if (parser == null) { + return "file:///android_asset/www/index.html"; + } + return parser.getLaunchUrl(); + } + + public static String getErrorUrl() { + return parser.getPreferences().getString("errorurl", null); + } + + public static List getPluginEntries() { + return parser.getPluginEntries(); + } + + public static CordovaPreferences getPreferences() { + return parser.getPreferences(); + } + + public static boolean isInitialized() { + return parser != null; + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/ConfigXmlParser.java b/node_modules/cordova-android/framework/src/org/apache/cordova/ConfigXmlParser.java new file mode 100644 index 0000000..01a97f2 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/ConfigXmlParser.java @@ -0,0 +1,145 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; + +public class ConfigXmlParser { + private static String TAG = "ConfigXmlParser"; + + private String launchUrl = "file:///android_asset/www/index.html"; + private CordovaPreferences prefs = new CordovaPreferences(); + private ArrayList pluginEntries = new ArrayList(20); + + public CordovaPreferences getPreferences() { + return prefs; + } + + public ArrayList getPluginEntries() { + return pluginEntries; + } + + public String getLaunchUrl() { + return launchUrl; + } + + public void parse(Context action) { + // First checking the class namespace for config.xml + int id = action.getResources().getIdentifier("config", "xml", action.getClass().getPackage().getName()); + if (id == 0) { + // If we couldn't find config.xml there, we'll look in the namespace from AndroidManifest.xml + id = action.getResources().getIdentifier("config", "xml", action.getPackageName()); + if (id == 0) { + LOG.e(TAG, "res/xml/config.xml is missing!"); + return; + } + } + parse(action.getResources().getXml(id)); + } + + boolean insideFeature = false; + String service = "", pluginClass = "", paramType = ""; + boolean onload = false; + + public void parse(XmlPullParser xml) { + int eventType = -1; + + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + handleStartTag(xml); + } + else if (eventType == XmlPullParser.END_TAG) + { + handleEndTag(xml); + } + try { + eventType = xml.next(); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void handleStartTag(XmlPullParser xml) { + String strNode = xml.getName(); + if (strNode.equals("feature")) { + //Check for supported feature sets aka. plugins (Accelerometer, Geolocation, etc) + //Set the bit for reading params + insideFeature = true; + service = xml.getAttributeValue(null, "name"); + } + else if (insideFeature && strNode.equals("param")) { + paramType = xml.getAttributeValue(null, "name"); + if (paramType.equals("service")) // check if it is using the older service param + service = xml.getAttributeValue(null, "value"); + else if (paramType.equals("package") || paramType.equals("android-package")) + pluginClass = xml.getAttributeValue(null,"value"); + else if (paramType.equals("onload")) + onload = "true".equals(xml.getAttributeValue(null, "value")); + } + else if (strNode.equals("preference")) { + String name = xml.getAttributeValue(null, "name").toLowerCase(Locale.ENGLISH); + String value = xml.getAttributeValue(null, "value"); + prefs.set(name, value); + } + else if (strNode.equals("content")) { + String src = xml.getAttributeValue(null, "src"); + if (src != null) { + setStartUrl(src); + } + } + } + + public void handleEndTag(XmlPullParser xml) { + String strNode = xml.getName(); + if (strNode.equals("feature")) { + pluginEntries.add(new PluginEntry(service, pluginClass, onload)); + + service = ""; + pluginClass = ""; + insideFeature = false; + onload = false; + } + } + + private void setStartUrl(String src) { + Pattern schemeRegex = Pattern.compile("^[a-z-]+://"); + Matcher matcher = schemeRegex.matcher(src); + if (matcher.find()) { + launchUrl = src; + } else { + if (src.charAt(0) == '/') { + src = src.substring(1); + } + launchUrl = "file:///android_asset/www/" + src; + } + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaActivity.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaActivity.java new file mode 100755 index 0000000..dbbb48f --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaActivity.java @@ -0,0 +1,519 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import java.util.ArrayList; +import java.util.Locale; + +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.Activity; +import android.app.AlertDialog; +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Color; +import android.media.AudioManager; +import android.os.Build; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; + +/** + * This class is the main Android activity that represents the Cordova + * application. It should be extended by the user to load the specific + * html file that contains the application. + * + * As an example: + * + *

    + *     package org.apache.cordova.examples;
    + *
    + *     import android.os.Bundle;
    + *     import org.apache.cordova.*;
    + *
    + *     public class Example extends CordovaActivity {
    + *       @Override
    + *       public void onCreate(Bundle savedInstanceState) {
    + *         super.onCreate(savedInstanceState);
    + *         super.init();
    + *         // Load your application
    + *         loadUrl(launchUrl);
    + *       }
    + *     }
    + * 
    + * + * Cordova xml configuration: Cordova uses a configuration file at + * res/xml/config.xml to specify its settings. See "The config.xml File" + * guide in cordova-docs at http://cordova.apache.org/docs for the documentation + * for the configuration. The use of the set*Property() methods is + * deprecated in favor of the config.xml file. + * + */ +public class CordovaActivity extends Activity { + public static String TAG = "CordovaActivity"; + + // The webview for our app + protected CordovaWebView appView; + + private static int ACTIVITY_STARTING = 0; + private static int ACTIVITY_RUNNING = 1; + private static int ACTIVITY_EXITING = 2; + + // Keep app running when pause is received. (default = true) + // If true, then the JavaScript and native code continue to run in the background + // when another application (activity) is started. + protected boolean keepRunning = true; + + // Flag to keep immersive mode if set to fullscreen + protected boolean immersiveMode; + + // Read from config.xml: + protected CordovaPreferences preferences; + protected String launchUrl; + protected ArrayList pluginEntries; + protected CordovaInterfaceImpl cordovaInterface; + + /** + * Called when the activity is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + // need to activate preferences before super.onCreate to avoid "requestFeature() must be called before adding content" exception + loadConfig(); + + String logLevel = preferences.getString("loglevel", "ERROR"); + LOG.setLogLevel(logLevel); + + LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting"); + LOG.d(TAG, "CordovaActivity.onCreate()"); + + if (!preferences.getBoolean("ShowTitle", false)) { + getWindow().requestFeature(Window.FEATURE_NO_TITLE); + } + + if (preferences.getBoolean("SetFullscreen", false)) { + LOG.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version."); + preferences.set("Fullscreen", true); + } + if (preferences.getBoolean("Fullscreen", false)) { + // NOTE: use the FullscreenNotImmersive configuration key to set the activity in a REAL full screen + // (as was the case in previous cordova versions) + if (!preferences.getBoolean("FullscreenNotImmersive", false)) { + immersiveMode = true; + } else { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + } else { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + } + + super.onCreate(savedInstanceState); + + cordovaInterface = makeCordovaInterface(); + if (savedInstanceState != null) { + cordovaInterface.restoreInstanceState(savedInstanceState); + } + } + + protected void init() { + appView = makeWebView(); + createViews(); + if (!appView.isInitialized()) { + appView.init(cordovaInterface, pluginEntries, preferences); + } + cordovaInterface.onCordovaInit(appView.getPluginManager()); + + // Wire the hardware volume controls to control media if desired. + String volumePref = preferences.getString("DefaultVolumeStream", ""); + if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) { + setVolumeControlStream(AudioManager.STREAM_MUSIC); + } + } + + @SuppressWarnings("deprecation") + protected void loadConfig() { + ConfigXmlParser parser = new ConfigXmlParser(); + parser.parse(this); + preferences = parser.getPreferences(); + preferences.setPreferencesBundle(getIntent().getExtras()); + launchUrl = parser.getLaunchUrl(); + pluginEntries = parser.getPluginEntries(); + Config.parser = parser; + } + + //Suppressing warnings in AndroidStudio + @SuppressWarnings({"deprecation", "ResourceType"}) + protected void createViews() { + //Why are we setting a constant as the ID? This should be investigated + appView.getView().setId(100); + appView.getView().setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + + setContentView(appView.getView()); + + if (preferences.contains("BackgroundColor")) { + try { + int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK); + // Background of activity: + appView.getView().setBackgroundColor(backgroundColor); + } + catch (NumberFormatException e){ + e.printStackTrace(); + } + } + + appView.getView().requestFocusFromTouch(); + } + + /** + * Construct the default web view object. + *

    + * Override this to customize the webview that is used. + */ + protected CordovaWebView makeWebView() { + return new CordovaWebViewImpl(makeWebViewEngine()); + } + + protected CordovaWebViewEngine makeWebViewEngine() { + return CordovaWebViewImpl.createEngine(this, preferences); + } + + protected CordovaInterfaceImpl makeCordovaInterface() { + return new CordovaInterfaceImpl(this) { + @Override + public Object onMessage(String id, Object data) { + // Plumb this to CordovaActivity.onMessage for backwards compatibility + return CordovaActivity.this.onMessage(id, data); + } + }; + } + + /** + * Load the url into the webview. + */ + public void loadUrl(String url) { + if (appView == null) { + init(); + } + + // If keepRunning + this.keepRunning = preferences.getBoolean("KeepRunning", true); + + appView.loadUrlIntoView(url, true); + } + + /** + * Called when the system is about to start resuming a previous activity. + */ + @Override + protected void onPause() { + super.onPause(); + LOG.d(TAG, "Paused the activity."); + + if (this.appView != null) { + // CB-9382 If there is an activity that started for result and main activity is waiting for callback + // result, we shoudn't stop WebView Javascript timers, as activity for result might be using them + boolean keepRunning = this.keepRunning || this.cordovaInterface.activityResultCallback != null; + this.appView.handlePause(keepRunning); + } + } + + /** + * Called when the activity receives a new intent + */ + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + //Forward to plugins + if (this.appView != null) + this.appView.onNewIntent(intent); + } + + /** + * Called when the activity will start interacting with the user. + */ + @Override + protected void onResume() { + super.onResume(); + LOG.d(TAG, "Resumed the activity."); + + if (this.appView == null) { + return; + } + // Force window to have focus, so application always + // receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least) + this.getWindow().getDecorView().requestFocus(); + + this.appView.handleResume(this.keepRunning); + } + + /** + * Called when the activity is no longer visible to the user. + */ + @Override + protected void onStop() { + super.onStop(); + LOG.d(TAG, "Stopped the activity."); + + if (this.appView == null) { + return; + } + this.appView.handleStop(); + } + + /** + * Called when the activity is becoming visible to the user. + */ + @Override + protected void onStart() { + super.onStart(); + LOG.d(TAG, "Started the activity."); + + if (this.appView == null) { + return; + } + this.appView.handleStart(); + } + + /** + * The final call you receive before your activity is destroyed. + */ + @Override + public void onDestroy() { + LOG.d(TAG, "CordovaActivity.onDestroy()"); + super.onDestroy(); + + if (this.appView != null) { + appView.handleDestroy(); + } + } + + /** + * Called when view focus is changed + */ + @SuppressLint("InlinedApi") + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus && immersiveMode) { + final int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + + getWindow().getDecorView().setSystemUiVisibility(uiOptions); + } + } + + @SuppressLint("NewApi") + @Override + public void startActivityForResult(Intent intent, int requestCode, Bundle options) { + // Capture requestCode here so that it is captured in the setActivityResultCallback() case. + cordovaInterface.setActivityResultRequestCode(requestCode); + super.startActivityForResult(intent, requestCode, options); + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + LOG.d(TAG, "Incoming Result. Request code = " + requestCode); + super.onActivityResult(requestCode, resultCode, intent); + cordovaInterface.onActivityResult(requestCode, resultCode, intent); + } + + /** + * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable). + * The errorCode parameter corresponds to one of the ERROR_* constants. + * + * @param errorCode The error code corresponding to an ERROR_* value. + * @param description A String describing the error. + * @param failingUrl The url that failed to load. + */ + public void onReceivedError(final int errorCode, final String description, final String failingUrl) { + final CordovaActivity me = this; + + // If errorUrl specified, then load it + final String errorUrl = preferences.getString("errorUrl", null); + if ((errorUrl != null) && (!failingUrl.equals(errorUrl)) && (appView != null)) { + // Load URL on UI thread + me.runOnUiThread(new Runnable() { + public void run() { + me.appView.showWebPage(errorUrl, false, true, null); + } + }); + } + // If not, then display error dialog + else { + final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP); + me.runOnUiThread(new Runnable() { + public void run() { + if (exit) { + me.appView.getView().setVisibility(View.GONE); + me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit); + } + } + }); + } + } + + /** + * Display an error dialog and optionally exit application. + */ + public void displayError(final String title, final String message, final String button, final boolean exit) { + final CordovaActivity me = this; + me.runOnUiThread(new Runnable() { + public void run() { + try { + AlertDialog.Builder dlg = new AlertDialog.Builder(me); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(false); + dlg.setPositiveButton(button, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + if (exit) { + finish(); + } + } + }); + dlg.create(); + dlg.show(); + } catch (Exception e) { + finish(); + } + } + }); + } + + /* + * Hook in Cordova for menu plugins + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + if (appView != null) { + appView.getPluginManager().postMessage("onCreateOptionsMenu", menu); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + if (appView != null) { + appView.getPluginManager().postMessage("onPrepareOptionsMenu", menu); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (appView != null) { + appView.getPluginManager().postMessage("onOptionsItemSelected", item); + } + return true; + } + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object or null + */ + public Object onMessage(String id, Object data) { + if ("onReceivedError".equals(id)) { + JSONObject d = (JSONObject) data; + try { + this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url")); + } catch (JSONException e) { + e.printStackTrace(); + } + } else if ("exit".equals(id)) { + finish(); + } + return null; + } + + protected void onSaveInstanceState(Bundle outState) { + cordovaInterface.onSaveInstanceState(outState); + super.onSaveInstanceState(outState); + } + + /** + * Called by the system when the device configuration changes while your activity is running. + * + * @param newConfig The new device configuration + */ + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (this.appView == null) { + return; + } + PluginManager pm = this.appView.getPluginManager(); + if (pm != null) { + pm.onConfigurationChanged(newConfig); + } + } + + /** + * Called by the system when the user grants permissions + * + * @param requestCode + * @param permissions + * @param grantResults + */ + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + try + { + cordovaInterface.onRequestPermissionResult(requestCode, permissions, grantResults); + } + catch (JSONException e) + { + LOG.d(TAG, "JSONException: Parameters fed into the method are not valid"); + e.printStackTrace(); + } + + } + +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaArgs.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaArgs.java new file mode 100644 index 0000000..d40d26e --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaArgs.java @@ -0,0 +1,113 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.util.Base64; + +public class CordovaArgs { + private JSONArray baseArgs; + + public CordovaArgs(JSONArray args) { + this.baseArgs = args; + } + + + // Pass through the basics to the base args. + public Object get(int index) throws JSONException { + return baseArgs.get(index); + } + + public boolean getBoolean(int index) throws JSONException { + return baseArgs.getBoolean(index); + } + + public double getDouble(int index) throws JSONException { + return baseArgs.getDouble(index); + } + + public int getInt(int index) throws JSONException { + return baseArgs.getInt(index); + } + + public JSONArray getJSONArray(int index) throws JSONException { + return baseArgs.getJSONArray(index); + } + + public JSONObject getJSONObject(int index) throws JSONException { + return baseArgs.getJSONObject(index); + } + + public long getLong(int index) throws JSONException { + return baseArgs.getLong(index); + } + + public String getString(int index) throws JSONException { + return baseArgs.getString(index); + } + + + public Object opt(int index) { + return baseArgs.opt(index); + } + + public boolean optBoolean(int index) { + return baseArgs.optBoolean(index); + } + + public double optDouble(int index) { + return baseArgs.optDouble(index); + } + + public int optInt(int index) { + return baseArgs.optInt(index); + } + + public JSONArray optJSONArray(int index) { + return baseArgs.optJSONArray(index); + } + + public JSONObject optJSONObject(int index) { + return baseArgs.optJSONObject(index); + } + + public long optLong(int index) { + return baseArgs.optLong(index); + } + + public String optString(int index) { + return baseArgs.optString(index); + } + + public boolean isNull(int index) { + return baseArgs.isNull(index); + } + + + // The interesting custom helpers. + public byte[] getArrayBuffer(int index) throws JSONException { + String encoded = baseArgs.getString(index); + return Base64.decode(encoded, Base64.DEFAULT); + } +} + + diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaBridge.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaBridge.java new file mode 100644 index 0000000..28c407f --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaBridge.java @@ -0,0 +1,187 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.annotation.SuppressLint; + +import java.security.SecureRandom; + +import org.json.JSONArray; +import org.json.JSONException; + +/** + * Contains APIs that the JS can call. All functions in here should also have + * an equivalent entry in CordovaChromeClient.java, and be added to + * cordova-js/lib/android/plugin/android/promptbasednativeapi.js + */ +public class CordovaBridge { + private static final String LOG_TAG = "CordovaBridge"; + private PluginManager pluginManager; + private NativeToJsMessageQueue jsMessageQueue; + private volatile int expectedBridgeSecret = -1; // written by UI thread, read by JS thread. + + public CordovaBridge(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) { + this.pluginManager = pluginManager; + this.jsMessageQueue = jsMessageQueue; + } + + public String jsExec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException { + if (!verifySecret("exec()", bridgeSecret)) { + return null; + } + // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. + // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. + if (arguments == null) { + return "@Null arguments."; + } + + jsMessageQueue.setPaused(true); + try { + // Tell the resourceApi what thread the JS is running on. + CordovaResourceApi.jsThread = Thread.currentThread(); + + pluginManager.exec(service, action, callbackId, arguments); + String ret = null; + if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { + ret = jsMessageQueue.popAndEncode(false); + } + return ret; + } catch (Throwable e) { + e.printStackTrace(); + return ""; + } finally { + jsMessageQueue.setPaused(false); + } + } + + public void jsSetNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException { + if (!verifySecret("setNativeToJsBridgeMode()", bridgeSecret)) { + return; + } + jsMessageQueue.setBridgeMode(value); + } + + public String jsRetrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException { + if (!verifySecret("retrieveJsMessages()", bridgeSecret)) { + return null; + } + return jsMessageQueue.popAndEncode(fromOnlineEvent); + } + + private boolean verifySecret(String action, int bridgeSecret) throws IllegalAccessException { + if (!jsMessageQueue.isBridgeEnabled()) { + if (bridgeSecret == -1) { + LOG.d(LOG_TAG, action + " call made before bridge was enabled."); + } else { + LOG.d(LOG_TAG, "Ignoring " + action + " from previous page load."); + } + return false; + } + // Bridge secret wrong and bridge not due to it being from the previous page. + if (expectedBridgeSecret < 0 || bridgeSecret != expectedBridgeSecret) { + LOG.e(LOG_TAG, "Bridge access attempt with wrong secret token, possibly from malicious code. Disabling exec() bridge!"); + clearBridgeSecret(); + throw new IllegalAccessException(); + } + return true; + } + + /** Called on page transitions */ + void clearBridgeSecret() { + expectedBridgeSecret = -1; + } + + public boolean isSecretEstablished() { + return expectedBridgeSecret != -1; + } + + /** Called by cordova.js to initialize the bridge. */ + //On old Androids SecureRandom isn't really secure, this is the least of your problems if + //you're running Android 4.3 and below in 2017 + @SuppressLint("TrulyRandom") + int generateBridgeSecret() { + SecureRandom randGen = new SecureRandom(); + expectedBridgeSecret = randGen.nextInt(Integer.MAX_VALUE); + return expectedBridgeSecret; + } + + public void reset() { + jsMessageQueue.reset(); + clearBridgeSecret(); + } + + public String promptOnJsPrompt(String origin, String message, String defaultValue) { + if (defaultValue != null && defaultValue.length() > 3 && defaultValue.startsWith("gap:")) { + JSONArray array; + try { + array = new JSONArray(defaultValue.substring(4)); + int bridgeSecret = array.getInt(0); + String service = array.getString(1); + String action = array.getString(2); + String callbackId = array.getString(3); + String r = jsExec(bridgeSecret, service, action, callbackId, message); + return r == null ? "" : r; + } catch (JSONException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Sets the native->JS bridge mode. + else if (defaultValue != null && defaultValue.startsWith("gap_bridge_mode:")) { + try { + int bridgeSecret = Integer.parseInt(defaultValue.substring(16)); + jsSetNativeToJsBridgeMode(bridgeSecret, Integer.parseInt(message)); + } catch (NumberFormatException e){ + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Polling for JavaScript messages + else if (defaultValue != null && defaultValue.startsWith("gap_poll:")) { + int bridgeSecret = Integer.parseInt(defaultValue.substring(9)); + try { + String r = jsRetrieveJsMessages(bridgeSecret, "1".equals(message)); + return r == null ? "" : r; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + else if (defaultValue != null && defaultValue.startsWith("gap_init:")) { + // Protect against random iframes being able to talk through the bridge. + // Trust only pages which the app would have been allowed to navigate to anyway. + if (pluginManager.shouldAllowBridgeAccess(origin)) { + // Enable the bridge + int bridgeMode = Integer.parseInt(defaultValue.substring(9)); + jsMessageQueue.setBridgeMode(bridgeMode); + // Tell JS the bridge secret. + int secret = generateBridgeSecret(); + return ""+secret; + } else { + LOG.e(LOG_TAG, "gap_init called from restricted origin: " + origin); + } + return ""; + } + return null; + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaClientCertRequest.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaClientCertRequest.java new file mode 100644 index 0000000..ccda027 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaClientCertRequest.java @@ -0,0 +1,105 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import java.security.Principal; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +import android.annotation.SuppressLint; +import android.webkit.ClientCertRequest; + +/** + * Implementation of the ICordovaClientCertRequest for Android WebView. + * + */ +public class CordovaClientCertRequest implements ICordovaClientCertRequest { + + private final ClientCertRequest request; + + public CordovaClientCertRequest(ClientCertRequest request) { + this.request = request; + } + + /** + * Cancel this request + */ + @SuppressLint("NewApi") + public void cancel() + { + request.cancel(); + } + + /* + * Returns the host name of the server requesting the certificate. + */ + @SuppressLint("NewApi") + public String getHost() + { + return request.getHost(); + } + + /* + * Returns the acceptable types of asymmetric keys (can be null). + */ + @SuppressLint("NewApi") + public String[] getKeyTypes() + { + return request.getKeyTypes(); + } + + /* + * Returns the port number of the server requesting the certificate. + */ + @SuppressLint("NewApi") + public int getPort() + { + return request.getPort(); + } + + /* + * Returns the acceptable certificate issuers for the certificate matching the private key (can be null). + */ + @SuppressLint("NewApi") + public Principal[] getPrincipals() + { + return request.getPrincipals(); + } + + /* + * Ignore the request for now. Do not remember user's choice. + */ + @SuppressLint("NewApi") + public void ignore() + { + request.ignore(); + } + + /* + * Proceed with the specified private key and client certificate chain. Remember the user's positive choice and use it for future requests. + * + * @param privateKey The privateKey + * @param chain The certificate chain + */ + @SuppressLint("NewApi") + public void proceed(PrivateKey privateKey, X509Certificate[] chain) + { + request.proceed(privateKey, chain); + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaDialogsHelper.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaDialogsHelper.java new file mode 100644 index 0000000..a219c99 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaDialogsHelper.java @@ -0,0 +1,152 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.KeyEvent; +import android.widget.EditText; + +/** + * Helper class for WebViews to implement prompt(), alert(), confirm() dialogs. + */ +public class CordovaDialogsHelper { + private final Context context; + private AlertDialog lastHandledDialog; + + public CordovaDialogsHelper(Context context) { + this.context = context; + } + + public void showAlert(String message, final Result result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + dlg.setTitle("Alert"); + //Don't let alerts break the back button + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(true, null); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.gotResult(false, null); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.gotResult(true, null); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + } + + public void showConfirm(String message, final Result result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + dlg.setTitle("Confirm"); + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(true, null); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(false, null); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.gotResult(false, null); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.gotResult(false, null); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + } + + /** + * Tell the client to display a prompt dialog to the user. + * If the client returns true, WebView will assume that the client will + * handle the prompt dialog and call the appropriate JsPromptResult method. + * + * Since we are hacking prompts for our own purposes, we should not be using them for + * this purpose, perhaps we should hack console.log to do this instead! + */ + public void showPrompt(String message, String defaultValue, final Result result) { + // Returning false would also show a dialog, but the default one shows the origin (ugly). + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + final EditText input = new EditText(context); + if (defaultValue != null) { + input.setText(defaultValue); + } + dlg.setView(input); + dlg.setCancelable(false); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String userText = input.getText().toString(); + result.gotResult(true, userText); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(false, null); + } + }); + lastHandledDialog = dlg.show(); + } + + public void destroyLastDialog(){ + if (lastHandledDialog != null){ + lastHandledDialog.cancel(); + } + } + + public interface Result { + public void gotResult(boolean success, String value); + } +} \ No newline at end of file diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaHttpAuthHandler.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaHttpAuthHandler.java new file mode 100644 index 0000000..724381e --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaHttpAuthHandler.java @@ -0,0 +1,51 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.webkit.HttpAuthHandler; + +/** + * Specifies interface for HTTP auth handler object which is used to handle auth requests and + * specifying user credentials. + */ +public class CordovaHttpAuthHandler implements ICordovaHttpAuthHandler { + + private final HttpAuthHandler handler; + + public CordovaHttpAuthHandler(HttpAuthHandler handler) { + this.handler = handler; + } + + /** + * Instructs the WebView to cancel the authentication request. + */ + public void cancel () { + this.handler.cancel(); + } + + /** + * Instructs the WebView to proceed with the authentication with the given credentials. + * + * @param username + * @param password + */ + public void proceed (String username, String password) { + this.handler.proceed(username, password); + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterface.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterface.java new file mode 100755 index 0000000..ff90683 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterface.java @@ -0,0 +1,97 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; + +import org.apache.cordova.CordovaPlugin; + +import java.util.concurrent.ExecutorService; + +/** + * The Activity interface that is implemented by CordovaActivity. + * It is used to isolate plugin development, and remove dependency on entire Cordova library. + */ +public interface CordovaInterface { + + /** + * Launch an activity for which you would like a result when it finished. When this activity exits, + * your onActivityResult() method will be called. + * + * @param command The command object + * @param intent The intent to start + * @param requestCode The request code that is passed to callback to identify the activity + */ + abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode); + + /** + * Set the plugin to be called when a sub-activity exits. + * + * @param plugin The plugin on which onActivityResult is to be called + */ + abstract public void setActivityResultCallback(CordovaPlugin plugin); + + /** + * Get the Android activity. + * + * If a custom engine lives outside of the Activity's lifecycle the return value may be null. + * + * @return the Activity + */ + public abstract Activity getActivity(); + + /** + * Get the Android context. + * + * @return the Context + */ + public Context getContext(); + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object or null + */ + public Object onMessage(String id, Object data); + + /** + * Returns a shared thread pool that can be used for background tasks. + */ + public ExecutorService getThreadPool(); + + /** + * Sends a permission request to the activity for one permission. + */ + public void requestPermission(CordovaPlugin plugin, int requestCode, String permission); + + /** + * Sends a permission request to the activity for a group of permissions + */ + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions); + + /** + * Check for a permission. Returns true if the permission is granted, false otherwise. + */ + public boolean hasPermission(String permission); + +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterfaceImpl.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterfaceImpl.java new file mode 100644 index 0000000..9a6e924 --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaInterfaceImpl.java @@ -0,0 +1,249 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.util.Pair; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Default implementation of CordovaInterface. + */ +public class CordovaInterfaceImpl implements CordovaInterface { + private static final String TAG = "CordovaInterfaceImpl"; + protected Activity activity; + protected ExecutorService threadPool; + protected PluginManager pluginManager; + + protected ActivityResultHolder savedResult; + protected CallbackMap permissionResultCallbacks; + protected CordovaPlugin activityResultCallback; + protected String initCallbackService; + protected int activityResultRequestCode; + protected boolean activityWasDestroyed = false; + protected Bundle savedPluginState; + + public CordovaInterfaceImpl(Activity activity) { + this(activity, Executors.newCachedThreadPool()); + } + + public CordovaInterfaceImpl(Activity activity, ExecutorService threadPool) { + this.activity = activity; + this.threadPool = threadPool; + this.permissionResultCallbacks = new CallbackMap(); + } + + @Override + public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { + setActivityResultCallback(command); + try { + activity.startActivityForResult(intent, requestCode); + } catch (RuntimeException e) { // E.g.: ActivityNotFoundException + activityResultCallback = null; + throw e; + } + } + + @Override + public void setActivityResultCallback(CordovaPlugin plugin) { + // Cancel any previously pending activity. + if (activityResultCallback != null) { + activityResultCallback.onActivityResult(activityResultRequestCode, Activity.RESULT_CANCELED, null); + } + activityResultCallback = plugin; + } + + @Override + public Activity getActivity() { + return activity; + } + + @Override + public Context getContext() { + return activity; + } + + @Override + public Object onMessage(String id, Object data) { + if ("exit".equals(id)) { + activity.finish(); + } + return null; + } + + @Override + public ExecutorService getThreadPool() { + return threadPool; + } + + /** + * Dispatches any pending onActivityResult callbacks and sends the resume event if the + * Activity was destroyed by the OS. + */ + public void onCordovaInit(PluginManager pluginManager) { + this.pluginManager = pluginManager; + if (savedResult != null) { + onActivityResult(savedResult.requestCode, savedResult.resultCode, savedResult.intent); + } else if(activityWasDestroyed) { + // If there was no Activity result, we still need to send out the resume event if the + // Activity was destroyed by the OS + activityWasDestroyed = false; + if(pluginManager != null) + { + CoreAndroid appPlugin = (CoreAndroid) pluginManager.getPlugin(CoreAndroid.PLUGIN_NAME); + if(appPlugin != null) { + JSONObject obj = new JSONObject(); + try { + obj.put("action", "resume"); + } catch (JSONException e) { + LOG.e(TAG, "Failed to create event message", e); + } + appPlugin.sendResumeEvent(new PluginResult(PluginResult.Status.OK, obj)); + } + } + + } + } + + /** + * Routes the result to the awaiting plugin. Returns false if no plugin was waiting. + */ + public boolean onActivityResult(int requestCode, int resultCode, Intent intent) { + CordovaPlugin callback = activityResultCallback; + if(callback == null && initCallbackService != null) { + // The application was restarted, but had defined an initial callback + // before being shut down. + savedResult = new ActivityResultHolder(requestCode, resultCode, intent); + if (pluginManager != null) { + callback = pluginManager.getPlugin(initCallbackService); + if(callback != null) { + callback.onRestoreStateForActivityResult(savedPluginState.getBundle(callback.getServiceName()), + new ResumeCallback(callback.getServiceName(), pluginManager)); + } + } + } + activityResultCallback = null; + + if (callback != null) { + LOG.d(TAG, "Sending activity result to plugin"); + initCallbackService = null; + savedResult = null; + callback.onActivityResult(requestCode, resultCode, intent); + return true; + } + LOG.w(TAG, "Got an activity result, but no plugin was registered to receive it" + (savedResult != null ? " yet!" : ".")); + return false; + } + + /** + * Call this from your startActivityForResult() overload. This is required to catch the case + * where plugins use Activity.startActivityForResult() + CordovaInterface.setActivityResultCallback() + * rather than CordovaInterface.startActivityForResult(). + */ + public void setActivityResultRequestCode(int requestCode) { + activityResultRequestCode = requestCode; + } + + /** + * Saves parameters for startActivityForResult(). + */ + public void onSaveInstanceState(Bundle outState) { + if (activityResultCallback != null) { + String serviceName = activityResultCallback.getServiceName(); + outState.putString("callbackService", serviceName); + } + if(pluginManager != null){ + outState.putBundle("plugin", pluginManager.onSaveInstanceState()); + } + + } + + /** + * Call this from onCreate() so that any saved startActivityForResult parameters will be restored. + */ + public void restoreInstanceState(Bundle savedInstanceState) { + initCallbackService = savedInstanceState.getString("callbackService"); + savedPluginState = savedInstanceState.getBundle("plugin"); + activityWasDestroyed = true; + } + + private static class ActivityResultHolder { + private int requestCode; + private int resultCode; + private Intent intent; + + public ActivityResultHolder(int requestCode, int resultCode, Intent intent) { + this.requestCode = requestCode; + this.resultCode = resultCode; + this.intent = intent; + } + } + + /** + * Called by the system when the user grants permissions + * + * @param requestCode + * @param permissions + * @param grantResults + */ + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException { + Pair callback = permissionResultCallbacks.getAndRemoveCallback(requestCode); + if(callback != null) { + callback.first.onRequestPermissionResult(callback.second, permissions, grantResults); + } + } + + public void requestPermission(CordovaPlugin plugin, int requestCode, String permission) { + String[] permissions = new String [1]; + permissions[0] = permission; + requestPermissions(plugin, requestCode, permissions); + } + + @SuppressLint("NewApi") + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions) { + int mappedRequestCode = permissionResultCallbacks.registerCallback(plugin, requestCode); + getActivity().requestPermissions(permissions, mappedRequestCode); + } + + public boolean hasPermission(String permission) + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + int result = activity.checkSelfPermission(permission); + return PackageManager.PERMISSION_GRANTED == result; + } + else + { + return true; + } + } +} diff --git a/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaPlugin.java b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaPlugin.java new file mode 100644 index 0000000..41af1db --- /dev/null +++ b/node_modules/cordova-android/framework/src/org/apache/cordova/CordovaPlugin.java @@ -0,0 +1,422 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova; + +import org.apache.cordova.CordovaArgs; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CallbackContext; +import org.json.JSONArray; +import org.json.JSONException; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; + +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * Plugins must extend this class and override one of the execute methods. + */ +public class CordovaPlugin { + public CordovaWebView webView; + public CordovaInterface cordova; + protected CordovaPreferences preferences; + private String serviceName; + + /** + * Call this after constructing to initialize the plugin. + * Final because we want to be able to change args without breaking plugins. + */ + public final void privateInitialize(String serviceName, CordovaInterface cordova, CordovaWebView webView, CordovaPreferences preferences) { + assert this.cordova == null; + this.serviceName = serviceName; + this.cordova = cordova; + this.webView = webView; + this.preferences = preferences; + initialize(cordova, webView); + pluginInitialize(); + } + + /** + * Called after plugin construction and fields have been initialized. + * Prefer to use pluginInitialize instead since there is no value in + * having parameters on the initialize() function. + */ + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + } + + /** + * Called after plugin construction and fields have been initialized. + */ + protected void pluginInitialize() { + } + + /** + * Returns the plugin's service name (what you'd use when calling pluginManger.getPlugin()) + */ + public String getServiceName() { + return serviceName; + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param rawArgs The exec() arguments in JSON form. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException { + JSONArray args = new JSONArray(rawArgs); + return execute(action, args, callbackContext); + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param args The exec() arguments. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + CordovaArgs cordovaArgs = new CordovaArgs(args); + return execute(action, cordovaArgs, callbackContext); + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param args The exec() arguments, wrapped with some Cordova helpers. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException { + return false; + } + + /** + * Called when the system is about to start resuming a previous activity. + * + * @param multitasking Flag indicating if multitasking is turned on for app + */ + public void onPause(boolean multitasking) { + } + + /** + * Called when the activity will start interacting with the user. + * + * @param multitasking Flag indicating if multitasking is turned on for app + */ + public void onResume(boolean multitasking) { + } + + /** + * Called when the activity is becoming visible to the user. + */ + public void onStart() { + } + + /** + * Called when the activity is no longer visible to the user. + */ + public void onStop() { + } + + /** + * Called when the activity receives a new intent. + */ + public void onNewIntent(Intent intent) { + } + + /** + * The final call you receive before your activity is destroyed. + */ + public void onDestroy() { + } + + /** + * Called when the Activity is being destroyed (e.g. if a plugin calls out to an external + * Activity and the OS kills the CordovaActivity in the background). The plugin should save its + * state in this method only if it is awaiting the result of an external Activity and needs + * to preserve some information so as to handle that result; onRestoreStateForActivityResult() + * will only be called if the plugin is the recipient of an Activity result + * + * @return Bundle containing the state of the plugin or null if state does not need to be saved + */ + public Bundle onSaveInstanceState() { + return null; + } + + /** + * Called when a plugin is the recipient of an Activity result after the CordovaActivity has + * been destroyed. The Bundle will be the same as the one the plugin returned in + * onSaveInstanceState() + * + * @param state Bundle containing the state of the plugin + * @param callbackContext Replacement Context to return the plugin result to + */ + public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) {} + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object to stop propagation or null + */ + public Object onMessage(String id, Object data) { + return null; + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be + * attached to Intent "extras"). + */ + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + } + + /** + * Hook for blocking the loading of external resources. + * + * This will be called when the WebView's shouldInterceptRequest wants to + * know whether to open a connection to an external resource. Return false + * to block the request: if any plugin returns false, Cordova will block + * the request. If all plugins return null, the default policy will be + * enforced. If at least one plugin returns true, and no plugins return + * false, then the request will proceed. + * + * Note that this only affects resource requests which are routed through + * WebViewClient.shouldInterceptRequest, such as XMLHttpRequest requests and + * img tag loads. WebSockets and media requests (such as `. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/balanced-match/index.js b/node_modules/cordova-android/node_modules/balanced-match/index.js new file mode 100644 index 0000000..1685a76 --- /dev/null +++ b/node_modules/cordova-android/node_modules/balanced-match/index.js @@ -0,0 +1,59 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/node_modules/cordova-android/node_modules/balanced-match/package.json b/node_modules/cordova-android/node_modules/balanced-match/package.json new file mode 100644 index 0000000..d7f8fab --- /dev/null +++ b/node_modules/cordova-android/node_modules/balanced-match/package.json @@ -0,0 +1,78 @@ +{ + "_from": "balanced-match@^1.0.0", + "_id": "balanced-match@1.0.0", + "_inBundle": true, + "_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "_location": "/cordova-android/balanced-match", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "balanced-match@^1.0.0", + "name": "balanced-match", + "escapedName": "balanced-match", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/brace-expansion" + ], + "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "_shasum": "89b4d199ab2bee49de164ea02b89ce462d71b767", + "_spec": "balanced-match@^1.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/balanced-match/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "license": "MIT", + "main": "index.js", + "name": "balanced-match", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "scripts": { + "bench": "make bench", + "test": "make test" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.0.0" +} diff --git a/node_modules/cordova-android/node_modules/base64-js/LICENSE b/node_modules/cordova-android/node_modules/base64-js/LICENSE new file mode 100644 index 0000000..96d3f68 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/base64-js/README.md b/node_modules/cordova-android/node_modules/base64-js/README.md new file mode 100644 index 0000000..e546d86 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/README.md @@ -0,0 +1,32 @@ +base64-js +========= + +`base64-js` does basic base64 encoding/decoding in pure JS. + +[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js) + +[![testling badge](https://ci.testling.com/beatgammit/base64-js.png)](https://ci.testling.com/beatgammit/base64-js) + +Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data. + +Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does. + +## install + +With [npm](https://npmjs.org) do: + +`npm install base64-js` + +## methods + +`var base64 = require('base64-js')` + +`base64` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument. + +* `byteLength` - Takes a base64 string and returns length of byte array +* `toByteArray` - Takes a base64 string and returns a byte array +* `fromByteArray` - Takes a byte array and returns a base64 string + +## license + +MIT diff --git a/node_modules/cordova-android/node_modules/base64-js/base64js.min.js b/node_modules/cordova-android/node_modules/base64-js/base64js.min.js new file mode 100644 index 0000000..22ad807 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/base64js.min.js @@ -0,0 +1 @@ +(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,t;return function r(e,t,n){function o(i,a){if(!t[i]){if(!e[i]){var u=typeof require=="function"&&require;if(!a&&u)return u(i,!0);if(f)return f(i,!0);var d=new Error("Cannot find module '"+i+"'");throw d.code="MODULE_NOT_FOUND",d}var c=t[i]={exports:{}};e[i][0].call(c.exports,function(r){var t=e[i][1][r];return o(t?t:r)},c,c.exports,r,e,t,n)}return t[i].exports}var f=typeof require=="function"&&require;for(var i=0;i0){throw new Error("Invalid string. Length must be a multiple of 4")}return r[e-2]==="="?2:r[e-1]==="="?1:0}function c(r){return r.length*3/4-d(r)}function v(r){var e,t,n,i,a,u;var c=r.length;a=d(r);u=new f(c*3/4-a);n=a>0?c-4:c;var v=0;for(e=0,t=0;e>16&255;u[v++]=i>>8&255;u[v++]=i&255}if(a===2){i=o[r.charCodeAt(e)]<<2|o[r.charCodeAt(e+1)]>>4;u[v++]=i&255}else if(a===1){i=o[r.charCodeAt(e)]<<10|o[r.charCodeAt(e+1)]<<4|o[r.charCodeAt(e+2)]>>2;u[v++]=i>>8&255;u[v++]=i&255}return u}function l(r){return n[r>>18&63]+n[r>>12&63]+n[r>>6&63]+n[r&63]}function h(r,e,t){var n;var o=[];for(var f=e;fd?d:u+a))}if(o===1){e=r[t-1];f+=n[e>>2];f+=n[e<<4&63];f+="=="}else if(o===2){e=(r[t-2]<<8)+r[t-1];f+=n[e>>10];f+=n[e>>4&63];f+=n[e<<2&63];f+="="}i.push(f);return i.join("")}},{}]},{},[])("/")}); diff --git a/node_modules/cordova-android/node_modules/base64-js/index.js b/node_modules/cordova-android/node_modules/base64-js/index.js new file mode 100644 index 0000000..8e806ac --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/index.js @@ -0,0 +1,114 @@ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 +} + +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) +} + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} diff --git a/node_modules/cordova-android/node_modules/base64-js/package.json b/node_modules/cordova-android/node_modules/base64-js/package.json new file mode 100644 index 0000000..ac0b810 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/package.json @@ -0,0 +1,66 @@ +{ + "_from": "base64-js@1.2.0", + "_id": "base64-js@1.2.0", + "_inBundle": true, + "_integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "_location": "/cordova-android/base64-js", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "base64-js@1.2.0", + "name": "base64-js", + "escapedName": "base64-js", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/plist" + ], + "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "_shasum": "a39992d723584811982be5e290bb6a53d86700f1", + "_spec": "base64-js@1.2.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/plist", + "author": { + "name": "T. Jameson Little", + "email": "t.jameson.little@gmail.com" + }, + "bugs": { + "url": "https://github.com/beatgammit/base64-js/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Base64 encoding/decoding in pure JS", + "devDependencies": { + "benchmark": "^2.1.0", + "browserify": "^13.0.0", + "standard": "*", + "tape": "4.x", + "uglify-js": "^2.6.2" + }, + "files": [ + "test", + "index.js", + "base64js.min.js" + ], + "homepage": "https://github.com/beatgammit/base64-js", + "keywords": [ + "base64" + ], + "license": "MIT", + "main": "index.js", + "name": "base64-js", + "repository": { + "type": "git", + "url": "git://github.com/beatgammit/base64-js.git" + }, + "scripts": { + "build": "browserify -s base64js -r ./ | uglifyjs -m > base64js.min.js", + "lint": "standard", + "test": "npm run lint && npm run unit", + "unit": "tape test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/cordova-android/node_modules/base64-js/test/big-data.js b/node_modules/cordova-android/node_modules/base64-js/test/big-data.js new file mode 100644 index 0000000..be16ebe --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/test/big-data.js @@ -0,0 +1,24 @@ +var test = require('tape') +var b64 = require('../') + +test('convert big data to base64', function (t) { + var b64str, arr, i, length + var big = new Uint8Array(64 * 1024 * 1024) + for (i = 0, length = big.length; i < length; ++i) { + big[i] = i % 256 + } + b64str = b64.fromByteArray(big) + arr = b64.toByteArray(b64str) + t.ok(equal(arr, big)) + t.end() +}) + +function equal (a, b) { + var i + var length = a.length + if (length !== b.length) return false + for (i = 0; i < length; ++i) { + if (a[i] !== b[i]) return false + } + return true +} diff --git a/node_modules/cordova-android/node_modules/base64-js/test/convert.js b/node_modules/cordova-android/node_modules/base64-js/test/convert.js new file mode 100644 index 0000000..d68e105 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/test/convert.js @@ -0,0 +1,48 @@ +var test = require('tape') +var b64 = require('../') +var checks = [ + 'a', + 'aa', + 'aaa', + 'hi', + 'hi!', + 'hi!!', + 'sup', + 'sup?', + 'sup?!' +] + +test('convert to base64 and back', function (t) { + t.plan(checks.length * 2) + + for (var i = 0; i < checks.length; i++) { + var check = checks[i] + var b64Str, arr, str + + b64Str = b64.fromByteArray(map(check, function (char) { return char.charCodeAt(0) })) + + arr = b64.toByteArray(b64Str) + str = map(arr, function (byte) { return String.fromCharCode(byte) }).join('') + + t.equal(check, str, 'Checked ' + check) + t.equal(b64.byteLength(b64Str), arr.length, 'Checked length for ' + check) + } +}) + +function map (arr, callback) { + var res = [] + var kValue, mappedValue + + for (var k = 0, len = arr.length; k < len; k++) { + if ((typeof arr === 'string' && !!arr.charAt(k))) { + kValue = arr.charAt(k) + mappedValue = callback(kValue, k, arr) + res[k] = mappedValue + } else if (typeof arr !== 'string' && k in arr) { + kValue = arr[k] + mappedValue = callback(kValue, k, arr) + res[k] = mappedValue + } + } + return res +} diff --git a/node_modules/cordova-android/node_modules/base64-js/test/url-safe.js b/node_modules/cordova-android/node_modules/base64-js/test/url-safe.js new file mode 100644 index 0000000..3203b33 --- /dev/null +++ b/node_modules/cordova-android/node_modules/base64-js/test/url-safe.js @@ -0,0 +1,18 @@ +var test = require('tape') +var b64 = require('../') + +test('decode url-safe style base64 strings', function (t) { + var expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff] + + var actual = b64.toByteArray('//++/++/++//') + for (var i = 0; i < actual.length; i++) { + t.equal(actual[i], expected[i]) + } + + actual = b64.toByteArray('__--_--_--__') + for (i = 0; i < actual.length; i++) { + t.equal(actual[i], expected[i]) + } + + t.end() +}) diff --git a/node_modules/cordova-android/node_modules/big-integer/BigInteger.d.ts b/node_modules/cordova-android/node_modules/big-integer/BigInteger.d.ts new file mode 100644 index 0000000..a367aa1 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/BigInteger.d.ts @@ -0,0 +1,2385 @@ +/** + * Type definitions for BigInteger.js + * Definitions by: Tommy Frazier + */ +export = bigInt; +export as namespace bigInt; + +declare var bigInt: bigInt.BigIntegerStatic; + +declare namespace bigInt { + type BigNumber = number | string | BigInteger; + + interface BigIntegerStatic { + /** + * Equivalent to bigInt(0). + */ + (): BigInteger; + + /** + * Parse a Javascript number into a bigInt. + */ + (number: number): BigInteger; + + /** + * Parse a string into a bigInt. + */ + (string: string, base?: BigNumber): BigInteger; + + /** + * no-op. + */ + (bigInt: BigInteger): BigInteger; + + /** + * Constructs a bigInt from an array of digits in specified base. + * The optional isNegative flag will make the number negative. + */ + fromArray: (digits: BigNumber[], base?: BigNumber, isNegative?: boolean) => BigInteger; + + /** + * Finds the greatest common denominator of a and b. + */ + gcd: (a: BigNumber, b: BigNumber) => BigInteger; + + + /** + * Returns true if x is a BigInteger, false otherwise. + */ + isInstance: (x: any) => boolean; + + /** + * Finds the least common multiple of a and b. + */ + lcm: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Returns the largest of a and b. + */ + max: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Returns the smallest of a and b. + */ + min: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Equivalent to bigInt(-1). + */ + minusOne: BigInteger; + + /** + * Equivalent to bigInt(1). + */ + one: BigInteger; + + /** + * Returns a random number between min and max. + */ + randBetween: (min: BigNumber, max: BigNumber) => BigInteger; + + /** + * Equivalent to bigInt(0). + */ + zero: BigInteger; + } + + interface BigInteger { + /** + * Returns the absolute value of a bigInt. + */ + abs(): BigInteger; + + /** + * Performs addition. + */ + add(number: BigNumber): BigInteger; + + /** + * Performs the bitwise AND operation. + */ + and(number: BigNumber): BigInteger; + + /** + * Returns the number of digits required to represent a bigInt in binary. + */ + bitLength(): BigInteger; + + /** + * Performs a comparison between two numbers. If the numbers are equal, it returns 0. + * If the first number is greater, it returns 1. If the first number is lesser, it returns -1. + */ + compare(number: BigNumber): number; + + /** + * Performs a comparison between the absolute value of two numbers. + */ + compareAbs(number: BigNumber): number; + + /** + * Alias for the compare method. + */ + compareTo(number: BigNumber): number; + + /** + * Performs integer division, disregarding the remainder. + */ + divide(number: BigNumber): BigInteger; + + /** + * Performs division and returns an object with two properties: quotient and remainder. + * The sign of the remainder will match the sign of the dividend. + */ + divmod(number: BigNumber): {quotient: BigInteger, remainder: BigInteger}; + + /** + * Alias for the equals method. + */ + eq(number: BigNumber): boolean; + + /** + * Checks if two numbers are equal. + */ + equals(number: BigNumber): boolean; + + /** + * Alias for the greaterOrEquals method. + */ + geq(number: BigNumber): boolean; + + /** + * Checks if the first number is greater than the second. + */ + greater(number: BigNumber): boolean; + + /** + * Checks if the first number is greater than or equal to the second. + */ + greaterOrEquals(number: BigNumber): boolean; + + /** + * Alias for the greater method. + */ + gt(number: BigNumber): boolean; + + /** + * Returns true if the first number is divisible by the second number, false otherwise. + */ + isDivisibleBy(number: BigNumber): boolean; + + /** + * Returns true if the number is even, false otherwise. + */ + isEven(): boolean; + + /** + * Returns true if the number is negative, false otherwise. + * Returns false for 0 and true for -0. + */ + isNegative(): boolean; + + /** + * Returns true if the number is odd, false otherwise. + */ + isOdd(): boolean; + + /** + * Return true if the number is positive, false otherwise. + * Returns true for 0 and false for -0. + */ + isPositive(): boolean; + + /** + * Returns true if the number is prime, false otherwise. + */ + isPrime(): boolean; + + /** + * Returns true if the number is very likely to be prime, false otherwise. + */ + isProbablePrime(iterations?: number): boolean; + + /** + * Returns true if the number is 1 or -1, false otherwise. + */ + isUnit(): boolean; + + /** + * Return true if the number is 0 or -0, false otherwise. + */ + isZero(): boolean; + + /** + * Alias for the lesserOrEquals method. + */ + leq(number: BigNumber): boolean; + + /** + * Checks if the first number is lesser than the second. + */ + lesser(number: BigNumber): boolean; + + /** + * Checks if the first number is less than or equal to the second. + */ + lesserOrEquals(number: BigNumber): boolean; + + /** + * Alias for the lesser method. + */ + lt(number: BigNumber): boolean; + + /** + * Alias for the subtract method. + */ + minus(number: BigNumber): BigInteger; + + /** + * Performs division and returns the remainder, disregarding the quotient. + * The sign of the remainder will match the sign of the dividend. + */ + mod(number: BigNumber): BigInteger; + + /** + * Finds the multiplicative inverse of the number modulo mod. + */ + modInv(number: BigNumber): BigInteger; + + /** + * Takes the number to the power exp modulo mod. + */ + modPow(exp: BigNumber, mod: BigNumber): BigInteger; + + /** + * Performs multiplication. + */ + multiply(number: BigNumber): BigInteger; + + /** + * Reverses the sign of the number. + */ + negate(): BigInteger; + + /** + * Alias for the notEquals method. + */ + neq(number: BigNumber): boolean; + + /** + * Adds one to the number. + */ + next(): BigInteger; + + /** + * Performs the bitwise NOT operation. + */ + not(): BigInteger; + + /** + * Checks if two numbers are not equal. + */ + notEquals(number: BigNumber): boolean; + + /** + * Performs the bitwise OR operation. + */ + or(number: BigNumber): BigInteger; + + /** + * Alias for the divide method. + */ + over(number: BigNumber): BigInteger; + + /** + * Alias for the add method. + */ + plus(number: BigNumber): BigInteger; + + /** + * Performs exponentiation. If the exponent is less than 0, pow returns 0. + * bigInt.zero.pow(0) returns 1. + */ + pow(number: BigNumber): BigInteger; + + /** + * Subtracts one from the number. + */ + prev(): BigInteger; + + /** + * Alias for the mod method. + */ + remainder(number: BigNumber): BigInteger; + + /** + * Shifts the number left by n places in its binary representation. + * If a negative number is provided, it will shift right. + * + * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992]. + */ + shiftLeft(number: BigNumber): BigInteger; + + /** + * Shifts the number right by n places in its binary representation. + * If a negative number is provided, it will shift left. + * + * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992]. + */ + shiftRight(number: BigNumber): BigInteger; + + /** + * Squares the number. + */ + square(): BigInteger; + + /** + * Performs subtraction. + */ + subtract(number: BigNumber): BigInteger; + + /** + * Alias for the multiply method. + */ + times(number: BigNumber): BigInteger; + + /** + * + * Converts a bigInt to an object representing it as an array of integers module the given radix. + */ + toArray(radix: number): BaseArray; + + /** + * Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range. + */ + toJSNumber(): number; + + /** + * Converts a bigInt to a string. + */ + toString(radix?: number): string; + + /** + * Converts a bigInt to a string. This method is called behind the scenes in JSON.stringify. + */ + toJSON(): string; + + /** + * Converts a bigInt to a native Javascript number. This override allows you to use native + * arithmetic operators without explicit conversion. + */ + valueOf(): number; + + /** + * Performs the bitwise XOR operation. + */ + xor(number: BigNumber): BigInteger; + } + + // Array constant accessors + interface BigIntegerStatic { + '-999': BigInteger; + '-998': BigInteger; + '-997': BigInteger; + '-996': BigInteger; + '-995': BigInteger; + '-994': BigInteger; + '-993': BigInteger; + '-992': BigInteger; + '-991': BigInteger; + '-990': BigInteger; + '-989': BigInteger; + '-988': BigInteger; + '-987': BigInteger; + '-986': BigInteger; + '-985': BigInteger; + '-984': BigInteger; + '-983': BigInteger; + '-982': BigInteger; + '-981': BigInteger; + '-980': BigInteger; + '-979': BigInteger; + '-978': BigInteger; + '-977': BigInteger; + '-976': BigInteger; + '-975': BigInteger; + '-974': BigInteger; + '-973': BigInteger; + '-972': BigInteger; + '-971': BigInteger; + '-970': BigInteger; + '-969': BigInteger; + '-968': BigInteger; + '-967': BigInteger; + '-966': BigInteger; + '-965': BigInteger; + '-964': BigInteger; + '-963': BigInteger; + '-962': BigInteger; + '-961': BigInteger; + '-960': BigInteger; + '-959': BigInteger; + '-958': BigInteger; + '-957': BigInteger; + '-956': BigInteger; + '-955': BigInteger; + '-954': BigInteger; + '-953': BigInteger; + '-952': BigInteger; + '-951': BigInteger; + '-950': BigInteger; + '-949': BigInteger; + '-948': BigInteger; + '-947': BigInteger; + '-946': BigInteger; + '-945': BigInteger; + '-944': BigInteger; + '-943': BigInteger; + '-942': BigInteger; + '-941': BigInteger; + '-940': BigInteger; + '-939': BigInteger; + '-938': BigInteger; + '-937': BigInteger; + '-936': BigInteger; + '-935': BigInteger; + '-934': BigInteger; + '-933': BigInteger; + '-932': BigInteger; + '-931': BigInteger; + '-930': BigInteger; + '-929': BigInteger; + '-928': BigInteger; + '-927': BigInteger; + '-926': BigInteger; + '-925': BigInteger; + '-924': BigInteger; + '-923': BigInteger; + '-922': BigInteger; + '-921': BigInteger; + '-920': BigInteger; + '-919': BigInteger; + '-918': BigInteger; + '-917': BigInteger; + '-916': BigInteger; + '-915': BigInteger; + '-914': BigInteger; + '-913': BigInteger; + '-912': BigInteger; + '-911': BigInteger; + '-910': BigInteger; + '-909': BigInteger; + '-908': BigInteger; + '-907': BigInteger; + '-906': BigInteger; + '-905': BigInteger; + '-904': BigInteger; + '-903': BigInteger; + '-902': BigInteger; + '-901': BigInteger; + '-900': BigInteger; + '-899': BigInteger; + '-898': BigInteger; + '-897': BigInteger; + '-896': BigInteger; + '-895': BigInteger; + '-894': BigInteger; + '-893': BigInteger; + '-892': BigInteger; + '-891': BigInteger; + '-890': BigInteger; + '-889': BigInteger; + '-888': BigInteger; + '-887': BigInteger; + '-886': BigInteger; + '-885': BigInteger; + '-884': BigInteger; + '-883': BigInteger; + '-882': BigInteger; + '-881': BigInteger; + '-880': BigInteger; + '-879': BigInteger; + '-878': BigInteger; + '-877': BigInteger; + '-876': BigInteger; + '-875': BigInteger; + '-874': BigInteger; + '-873': BigInteger; + '-872': BigInteger; + '-871': BigInteger; + '-870': BigInteger; + '-869': BigInteger; + '-868': BigInteger; + '-867': BigInteger; + '-866': BigInteger; + '-865': BigInteger; + '-864': BigInteger; + '-863': BigInteger; + '-862': BigInteger; + '-861': BigInteger; + '-860': BigInteger; + '-859': BigInteger; + '-858': BigInteger; + '-857': BigInteger; + '-856': BigInteger; + '-855': BigInteger; + '-854': BigInteger; + '-853': BigInteger; + '-852': BigInteger; + '-851': BigInteger; + '-850': BigInteger; + '-849': BigInteger; + '-848': BigInteger; + '-847': BigInteger; + '-846': BigInteger; + '-845': BigInteger; + '-844': BigInteger; + '-843': BigInteger; + '-842': BigInteger; + '-841': BigInteger; + '-840': BigInteger; + '-839': BigInteger; + '-838': BigInteger; + '-837': BigInteger; + '-836': BigInteger; + '-835': BigInteger; + '-834': BigInteger; + '-833': BigInteger; + '-832': BigInteger; + '-831': BigInteger; + '-830': BigInteger; + '-829': BigInteger; + '-828': BigInteger; + '-827': BigInteger; + '-826': BigInteger; + '-825': BigInteger; + '-824': BigInteger; + '-823': BigInteger; + '-822': BigInteger; + '-821': BigInteger; + '-820': BigInteger; + '-819': BigInteger; + '-818': BigInteger; + '-817': BigInteger; + '-816': BigInteger; + '-815': BigInteger; + '-814': BigInteger; + '-813': BigInteger; + '-812': BigInteger; + '-811': BigInteger; + '-810': BigInteger; + '-809': BigInteger; + '-808': BigInteger; + '-807': BigInteger; + '-806': BigInteger; + '-805': BigInteger; + '-804': BigInteger; + '-803': BigInteger; + '-802': BigInteger; + '-801': BigInteger; + '-800': BigInteger; + '-799': BigInteger; + '-798': BigInteger; + '-797': BigInteger; + '-796': BigInteger; + '-795': BigInteger; + '-794': BigInteger; + '-793': BigInteger; + '-792': BigInteger; + '-791': BigInteger; + '-790': BigInteger; + '-789': BigInteger; + '-788': BigInteger; + '-787': BigInteger; + '-786': BigInteger; + '-785': BigInteger; + '-784': BigInteger; + '-783': BigInteger; + '-782': BigInteger; + '-781': BigInteger; + '-780': BigInteger; + '-779': BigInteger; + '-778': BigInteger; + '-777': BigInteger; + '-776': BigInteger; + '-775': BigInteger; + '-774': BigInteger; + '-773': BigInteger; + '-772': BigInteger; + '-771': BigInteger; + '-770': BigInteger; + '-769': BigInteger; + '-768': BigInteger; + '-767': BigInteger; + '-766': BigInteger; + '-765': BigInteger; + '-764': BigInteger; + '-763': BigInteger; + '-762': BigInteger; + '-761': BigInteger; + '-760': BigInteger; + '-759': BigInteger; + '-758': BigInteger; + '-757': BigInteger; + '-756': BigInteger; + '-755': BigInteger; + '-754': BigInteger; + '-753': BigInteger; + '-752': BigInteger; + '-751': BigInteger; + '-750': BigInteger; + '-749': BigInteger; + '-748': BigInteger; + '-747': BigInteger; + '-746': BigInteger; + '-745': BigInteger; + '-744': BigInteger; + '-743': BigInteger; + '-742': BigInteger; + '-741': BigInteger; + '-740': BigInteger; + '-739': BigInteger; + '-738': BigInteger; + '-737': BigInteger; + '-736': BigInteger; + '-735': BigInteger; + '-734': BigInteger; + '-733': BigInteger; + '-732': BigInteger; + '-731': BigInteger; + '-730': BigInteger; + '-729': BigInteger; + '-728': BigInteger; + '-727': BigInteger; + '-726': BigInteger; + '-725': BigInteger; + '-724': BigInteger; + '-723': BigInteger; + '-722': BigInteger; + '-721': BigInteger; + '-720': BigInteger; + '-719': BigInteger; + '-718': BigInteger; + '-717': BigInteger; + '-716': BigInteger; + '-715': BigInteger; + '-714': BigInteger; + '-713': BigInteger; + '-712': BigInteger; + '-711': BigInteger; + '-710': BigInteger; + '-709': BigInteger; + '-708': BigInteger; + '-707': BigInteger; + '-706': BigInteger; + '-705': BigInteger; + '-704': BigInteger; + '-703': BigInteger; + '-702': BigInteger; + '-701': BigInteger; + '-700': BigInteger; + '-699': BigInteger; + '-698': BigInteger; + '-697': BigInteger; + '-696': BigInteger; + '-695': BigInteger; + '-694': BigInteger; + '-693': BigInteger; + '-692': BigInteger; + '-691': BigInteger; + '-690': BigInteger; + '-689': BigInteger; + '-688': BigInteger; + '-687': BigInteger; + '-686': BigInteger; + '-685': BigInteger; + '-684': BigInteger; + '-683': BigInteger; + '-682': BigInteger; + '-681': BigInteger; + '-680': BigInteger; + '-679': BigInteger; + '-678': BigInteger; + '-677': BigInteger; + '-676': BigInteger; + '-675': BigInteger; + '-674': BigInteger; + '-673': BigInteger; + '-672': BigInteger; + '-671': BigInteger; + '-670': BigInteger; + '-669': BigInteger; + '-668': BigInteger; + '-667': BigInteger; + '-666': BigInteger; + '-665': BigInteger; + '-664': BigInteger; + '-663': BigInteger; + '-662': BigInteger; + '-661': BigInteger; + '-660': BigInteger; + '-659': BigInteger; + '-658': BigInteger; + '-657': BigInteger; + '-656': BigInteger; + '-655': BigInteger; + '-654': BigInteger; + '-653': BigInteger; + '-652': BigInteger; + '-651': BigInteger; + '-650': BigInteger; + '-649': BigInteger; + '-648': BigInteger; + '-647': BigInteger; + '-646': BigInteger; + '-645': BigInteger; + '-644': BigInteger; + '-643': BigInteger; + '-642': BigInteger; + '-641': BigInteger; + '-640': BigInteger; + '-639': BigInteger; + '-638': BigInteger; + '-637': BigInteger; + '-636': BigInteger; + '-635': BigInteger; + '-634': BigInteger; + '-633': BigInteger; + '-632': BigInteger; + '-631': BigInteger; + '-630': BigInteger; + '-629': BigInteger; + '-628': BigInteger; + '-627': BigInteger; + '-626': BigInteger; + '-625': BigInteger; + '-624': BigInteger; + '-623': BigInteger; + '-622': BigInteger; + '-621': BigInteger; + '-620': BigInteger; + '-619': BigInteger; + '-618': BigInteger; + '-617': BigInteger; + '-616': BigInteger; + '-615': BigInteger; + '-614': BigInteger; + '-613': BigInteger; + '-612': BigInteger; + '-611': BigInteger; + '-610': BigInteger; + '-609': BigInteger; + '-608': BigInteger; + '-607': BigInteger; + '-606': BigInteger; + '-605': BigInteger; + '-604': BigInteger; + '-603': BigInteger; + '-602': BigInteger; + '-601': BigInteger; + '-600': BigInteger; + '-599': BigInteger; + '-598': BigInteger; + '-597': BigInteger; + '-596': BigInteger; + '-595': BigInteger; + '-594': BigInteger; + '-593': BigInteger; + '-592': BigInteger; + '-591': BigInteger; + '-590': BigInteger; + '-589': BigInteger; + '-588': BigInteger; + '-587': BigInteger; + '-586': BigInteger; + '-585': BigInteger; + '-584': BigInteger; + '-583': BigInteger; + '-582': BigInteger; + '-581': BigInteger; + '-580': BigInteger; + '-579': BigInteger; + '-578': BigInteger; + '-577': BigInteger; + '-576': BigInteger; + '-575': BigInteger; + '-574': BigInteger; + '-573': BigInteger; + '-572': BigInteger; + '-571': BigInteger; + '-570': BigInteger; + '-569': BigInteger; + '-568': BigInteger; + '-567': BigInteger; + '-566': BigInteger; + '-565': BigInteger; + '-564': BigInteger; + '-563': BigInteger; + '-562': BigInteger; + '-561': BigInteger; + '-560': BigInteger; + '-559': BigInteger; + '-558': BigInteger; + '-557': BigInteger; + '-556': BigInteger; + '-555': BigInteger; + '-554': BigInteger; + '-553': BigInteger; + '-552': BigInteger; + '-551': BigInteger; + '-550': BigInteger; + '-549': BigInteger; + '-548': BigInteger; + '-547': BigInteger; + '-546': BigInteger; + '-545': BigInteger; + '-544': BigInteger; + '-543': BigInteger; + '-542': BigInteger; + '-541': BigInteger; + '-540': BigInteger; + '-539': BigInteger; + '-538': BigInteger; + '-537': BigInteger; + '-536': BigInteger; + '-535': BigInteger; + '-534': BigInteger; + '-533': BigInteger; + '-532': BigInteger; + '-531': BigInteger; + '-530': BigInteger; + '-529': BigInteger; + '-528': BigInteger; + '-527': BigInteger; + '-526': BigInteger; + '-525': BigInteger; + '-524': BigInteger; + '-523': BigInteger; + '-522': BigInteger; + '-521': BigInteger; + '-520': BigInteger; + '-519': BigInteger; + '-518': BigInteger; + '-517': BigInteger; + '-516': BigInteger; + '-515': BigInteger; + '-514': BigInteger; + '-513': BigInteger; + '-512': BigInteger; + '-511': BigInteger; + '-510': BigInteger; + '-509': BigInteger; + '-508': BigInteger; + '-507': BigInteger; + '-506': BigInteger; + '-505': BigInteger; + '-504': BigInteger; + '-503': BigInteger; + '-502': BigInteger; + '-501': BigInteger; + '-500': BigInteger; + '-499': BigInteger; + '-498': BigInteger; + '-497': BigInteger; + '-496': BigInteger; + '-495': BigInteger; + '-494': BigInteger; + '-493': BigInteger; + '-492': BigInteger; + '-491': BigInteger; + '-490': BigInteger; + '-489': BigInteger; + '-488': BigInteger; + '-487': BigInteger; + '-486': BigInteger; + '-485': BigInteger; + '-484': BigInteger; + '-483': BigInteger; + '-482': BigInteger; + '-481': BigInteger; + '-480': BigInteger; + '-479': BigInteger; + '-478': BigInteger; + '-477': BigInteger; + '-476': BigInteger; + '-475': BigInteger; + '-474': BigInteger; + '-473': BigInteger; + '-472': BigInteger; + '-471': BigInteger; + '-470': BigInteger; + '-469': BigInteger; + '-468': BigInteger; + '-467': BigInteger; + '-466': BigInteger; + '-465': BigInteger; + '-464': BigInteger; + '-463': BigInteger; + '-462': BigInteger; + '-461': BigInteger; + '-460': BigInteger; + '-459': BigInteger; + '-458': BigInteger; + '-457': BigInteger; + '-456': BigInteger; + '-455': BigInteger; + '-454': BigInteger; + '-453': BigInteger; + '-452': BigInteger; + '-451': BigInteger; + '-450': BigInteger; + '-449': BigInteger; + '-448': BigInteger; + '-447': BigInteger; + '-446': BigInteger; + '-445': BigInteger; + '-444': BigInteger; + '-443': BigInteger; + '-442': BigInteger; + '-441': BigInteger; + '-440': BigInteger; + '-439': BigInteger; + '-438': BigInteger; + '-437': BigInteger; + '-436': BigInteger; + '-435': BigInteger; + '-434': BigInteger; + '-433': BigInteger; + '-432': BigInteger; + '-431': BigInteger; + '-430': BigInteger; + '-429': BigInteger; + '-428': BigInteger; + '-427': BigInteger; + '-426': BigInteger; + '-425': BigInteger; + '-424': BigInteger; + '-423': BigInteger; + '-422': BigInteger; + '-421': BigInteger; + '-420': BigInteger; + '-419': BigInteger; + '-418': BigInteger; + '-417': BigInteger; + '-416': BigInteger; + '-415': BigInteger; + '-414': BigInteger; + '-413': BigInteger; + '-412': BigInteger; + '-411': BigInteger; + '-410': BigInteger; + '-409': BigInteger; + '-408': BigInteger; + '-407': BigInteger; + '-406': BigInteger; + '-405': BigInteger; + '-404': BigInteger; + '-403': BigInteger; + '-402': BigInteger; + '-401': BigInteger; + '-400': BigInteger; + '-399': BigInteger; + '-398': BigInteger; + '-397': BigInteger; + '-396': BigInteger; + '-395': BigInteger; + '-394': BigInteger; + '-393': BigInteger; + '-392': BigInteger; + '-391': BigInteger; + '-390': BigInteger; + '-389': BigInteger; + '-388': BigInteger; + '-387': BigInteger; + '-386': BigInteger; + '-385': BigInteger; + '-384': BigInteger; + '-383': BigInteger; + '-382': BigInteger; + '-381': BigInteger; + '-380': BigInteger; + '-379': BigInteger; + '-378': BigInteger; + '-377': BigInteger; + '-376': BigInteger; + '-375': BigInteger; + '-374': BigInteger; + '-373': BigInteger; + '-372': BigInteger; + '-371': BigInteger; + '-370': BigInteger; + '-369': BigInteger; + '-368': BigInteger; + '-367': BigInteger; + '-366': BigInteger; + '-365': BigInteger; + '-364': BigInteger; + '-363': BigInteger; + '-362': BigInteger; + '-361': BigInteger; + '-360': BigInteger; + '-359': BigInteger; + '-358': BigInteger; + '-357': BigInteger; + '-356': BigInteger; + '-355': BigInteger; + '-354': BigInteger; + '-353': BigInteger; + '-352': BigInteger; + '-351': BigInteger; + '-350': BigInteger; + '-349': BigInteger; + '-348': BigInteger; + '-347': BigInteger; + '-346': BigInteger; + '-345': BigInteger; + '-344': BigInteger; + '-343': BigInteger; + '-342': BigInteger; + '-341': BigInteger; + '-340': BigInteger; + '-339': BigInteger; + '-338': BigInteger; + '-337': BigInteger; + '-336': BigInteger; + '-335': BigInteger; + '-334': BigInteger; + '-333': BigInteger; + '-332': BigInteger; + '-331': BigInteger; + '-330': BigInteger; + '-329': BigInteger; + '-328': BigInteger; + '-327': BigInteger; + '-326': BigInteger; + '-325': BigInteger; + '-324': BigInteger; + '-323': BigInteger; + '-322': BigInteger; + '-321': BigInteger; + '-320': BigInteger; + '-319': BigInteger; + '-318': BigInteger; + '-317': BigInteger; + '-316': BigInteger; + '-315': BigInteger; + '-314': BigInteger; + '-313': BigInteger; + '-312': BigInteger; + '-311': BigInteger; + '-310': BigInteger; + '-309': BigInteger; + '-308': BigInteger; + '-307': BigInteger; + '-306': BigInteger; + '-305': BigInteger; + '-304': BigInteger; + '-303': BigInteger; + '-302': BigInteger; + '-301': BigInteger; + '-300': BigInteger; + '-299': BigInteger; + '-298': BigInteger; + '-297': BigInteger; + '-296': BigInteger; + '-295': BigInteger; + '-294': BigInteger; + '-293': BigInteger; + '-292': BigInteger; + '-291': BigInteger; + '-290': BigInteger; + '-289': BigInteger; + '-288': BigInteger; + '-287': BigInteger; + '-286': BigInteger; + '-285': BigInteger; + '-284': BigInteger; + '-283': BigInteger; + '-282': BigInteger; + '-281': BigInteger; + '-280': BigInteger; + '-279': BigInteger; + '-278': BigInteger; + '-277': BigInteger; + '-276': BigInteger; + '-275': BigInteger; + '-274': BigInteger; + '-273': BigInteger; + '-272': BigInteger; + '-271': BigInteger; + '-270': BigInteger; + '-269': BigInteger; + '-268': BigInteger; + '-267': BigInteger; + '-266': BigInteger; + '-265': BigInteger; + '-264': BigInteger; + '-263': BigInteger; + '-262': BigInteger; + '-261': BigInteger; + '-260': BigInteger; + '-259': BigInteger; + '-258': BigInteger; + '-257': BigInteger; + '-256': BigInteger; + '-255': BigInteger; + '-254': BigInteger; + '-253': BigInteger; + '-252': BigInteger; + '-251': BigInteger; + '-250': BigInteger; + '-249': BigInteger; + '-248': BigInteger; + '-247': BigInteger; + '-246': BigInteger; + '-245': BigInteger; + '-244': BigInteger; + '-243': BigInteger; + '-242': BigInteger; + '-241': BigInteger; + '-240': BigInteger; + '-239': BigInteger; + '-238': BigInteger; + '-237': BigInteger; + '-236': BigInteger; + '-235': BigInteger; + '-234': BigInteger; + '-233': BigInteger; + '-232': BigInteger; + '-231': BigInteger; + '-230': BigInteger; + '-229': BigInteger; + '-228': BigInteger; + '-227': BigInteger; + '-226': BigInteger; + '-225': BigInteger; + '-224': BigInteger; + '-223': BigInteger; + '-222': BigInteger; + '-221': BigInteger; + '-220': BigInteger; + '-219': BigInteger; + '-218': BigInteger; + '-217': BigInteger; + '-216': BigInteger; + '-215': BigInteger; + '-214': BigInteger; + '-213': BigInteger; + '-212': BigInteger; + '-211': BigInteger; + '-210': BigInteger; + '-209': BigInteger; + '-208': BigInteger; + '-207': BigInteger; + '-206': BigInteger; + '-205': BigInteger; + '-204': BigInteger; + '-203': BigInteger; + '-202': BigInteger; + '-201': BigInteger; + '-200': BigInteger; + '-199': BigInteger; + '-198': BigInteger; + '-197': BigInteger; + '-196': BigInteger; + '-195': BigInteger; + '-194': BigInteger; + '-193': BigInteger; + '-192': BigInteger; + '-191': BigInteger; + '-190': BigInteger; + '-189': BigInteger; + '-188': BigInteger; + '-187': BigInteger; + '-186': BigInteger; + '-185': BigInteger; + '-184': BigInteger; + '-183': BigInteger; + '-182': BigInteger; + '-181': BigInteger; + '-180': BigInteger; + '-179': BigInteger; + '-178': BigInteger; + '-177': BigInteger; + '-176': BigInteger; + '-175': BigInteger; + '-174': BigInteger; + '-173': BigInteger; + '-172': BigInteger; + '-171': BigInteger; + '-170': BigInteger; + '-169': BigInteger; + '-168': BigInteger; + '-167': BigInteger; + '-166': BigInteger; + '-165': BigInteger; + '-164': BigInteger; + '-163': BigInteger; + '-162': BigInteger; + '-161': BigInteger; + '-160': BigInteger; + '-159': BigInteger; + '-158': BigInteger; + '-157': BigInteger; + '-156': BigInteger; + '-155': BigInteger; + '-154': BigInteger; + '-153': BigInteger; + '-152': BigInteger; + '-151': BigInteger; + '-150': BigInteger; + '-149': BigInteger; + '-148': BigInteger; + '-147': BigInteger; + '-146': BigInteger; + '-145': BigInteger; + '-144': BigInteger; + '-143': BigInteger; + '-142': BigInteger; + '-141': BigInteger; + '-140': BigInteger; + '-139': BigInteger; + '-138': BigInteger; + '-137': BigInteger; + '-136': BigInteger; + '-135': BigInteger; + '-134': BigInteger; + '-133': BigInteger; + '-132': BigInteger; + '-131': BigInteger; + '-130': BigInteger; + '-129': BigInteger; + '-128': BigInteger; + '-127': BigInteger; + '-126': BigInteger; + '-125': BigInteger; + '-124': BigInteger; + '-123': BigInteger; + '-122': BigInteger; + '-121': BigInteger; + '-120': BigInteger; + '-119': BigInteger; + '-118': BigInteger; + '-117': BigInteger; + '-116': BigInteger; + '-115': BigInteger; + '-114': BigInteger; + '-113': BigInteger; + '-112': BigInteger; + '-111': BigInteger; + '-110': BigInteger; + '-109': BigInteger; + '-108': BigInteger; + '-107': BigInteger; + '-106': BigInteger; + '-105': BigInteger; + '-104': BigInteger; + '-103': BigInteger; + '-102': BigInteger; + '-101': BigInteger; + '-100': BigInteger; + '-99': BigInteger; + '-98': BigInteger; + '-97': BigInteger; + '-96': BigInteger; + '-95': BigInteger; + '-94': BigInteger; + '-93': BigInteger; + '-92': BigInteger; + '-91': BigInteger; + '-90': BigInteger; + '-89': BigInteger; + '-88': BigInteger; + '-87': BigInteger; + '-86': BigInteger; + '-85': BigInteger; + '-84': BigInteger; + '-83': BigInteger; + '-82': BigInteger; + '-81': BigInteger; + '-80': BigInteger; + '-79': BigInteger; + '-78': BigInteger; + '-77': BigInteger; + '-76': BigInteger; + '-75': BigInteger; + '-74': BigInteger; + '-73': BigInteger; + '-72': BigInteger; + '-71': BigInteger; + '-70': BigInteger; + '-69': BigInteger; + '-68': BigInteger; + '-67': BigInteger; + '-66': BigInteger; + '-65': BigInteger; + '-64': BigInteger; + '-63': BigInteger; + '-62': BigInteger; + '-61': BigInteger; + '-60': BigInteger; + '-59': BigInteger; + '-58': BigInteger; + '-57': BigInteger; + '-56': BigInteger; + '-55': BigInteger; + '-54': BigInteger; + '-53': BigInteger; + '-52': BigInteger; + '-51': BigInteger; + '-50': BigInteger; + '-49': BigInteger; + '-48': BigInteger; + '-47': BigInteger; + '-46': BigInteger; + '-45': BigInteger; + '-44': BigInteger; + '-43': BigInteger; + '-42': BigInteger; + '-41': BigInteger; + '-40': BigInteger; + '-39': BigInteger; + '-38': BigInteger; + '-37': BigInteger; + '-36': BigInteger; + '-35': BigInteger; + '-34': BigInteger; + '-33': BigInteger; + '-32': BigInteger; + '-31': BigInteger; + '-30': BigInteger; + '-29': BigInteger; + '-28': BigInteger; + '-27': BigInteger; + '-26': BigInteger; + '-25': BigInteger; + '-24': BigInteger; + '-23': BigInteger; + '-22': BigInteger; + '-21': BigInteger; + '-20': BigInteger; + '-19': BigInteger; + '-18': BigInteger; + '-17': BigInteger; + '-16': BigInteger; + '-15': BigInteger; + '-14': BigInteger; + '-13': BigInteger; + '-12': BigInteger; + '-11': BigInteger; + '-10': BigInteger; + '-9': BigInteger; + '-8': BigInteger; + '-7': BigInteger; + '-6': BigInteger; + '-5': BigInteger; + '-4': BigInteger; + '-3': BigInteger; + '-2': BigInteger; + '-1': BigInteger; + '0': BigInteger; + '1': BigInteger; + '2': BigInteger; + '3': BigInteger; + '4': BigInteger; + '5': BigInteger; + '6': BigInteger; + '7': BigInteger; + '8': BigInteger; + '9': BigInteger; + '10': BigInteger; + '11': BigInteger; + '12': BigInteger; + '13': BigInteger; + '14': BigInteger; + '15': BigInteger; + '16': BigInteger; + '17': BigInteger; + '18': BigInteger; + '19': BigInteger; + '20': BigInteger; + '21': BigInteger; + '22': BigInteger; + '23': BigInteger; + '24': BigInteger; + '25': BigInteger; + '26': BigInteger; + '27': BigInteger; + '28': BigInteger; + '29': BigInteger; + '30': BigInteger; + '31': BigInteger; + '32': BigInteger; + '33': BigInteger; + '34': BigInteger; + '35': BigInteger; + '36': BigInteger; + '37': BigInteger; + '38': BigInteger; + '39': BigInteger; + '40': BigInteger; + '41': BigInteger; + '42': BigInteger; + '43': BigInteger; + '44': BigInteger; + '45': BigInteger; + '46': BigInteger; + '47': BigInteger; + '48': BigInteger; + '49': BigInteger; + '50': BigInteger; + '51': BigInteger; + '52': BigInteger; + '53': BigInteger; + '54': BigInteger; + '55': BigInteger; + '56': BigInteger; + '57': BigInteger; + '58': BigInteger; + '59': BigInteger; + '60': BigInteger; + '61': BigInteger; + '62': BigInteger; + '63': BigInteger; + '64': BigInteger; + '65': BigInteger; + '66': BigInteger; + '67': BigInteger; + '68': BigInteger; + '69': BigInteger; + '70': BigInteger; + '71': BigInteger; + '72': BigInteger; + '73': BigInteger; + '74': BigInteger; + '75': BigInteger; + '76': BigInteger; + '77': BigInteger; + '78': BigInteger; + '79': BigInteger; + '80': BigInteger; + '81': BigInteger; + '82': BigInteger; + '83': BigInteger; + '84': BigInteger; + '85': BigInteger; + '86': BigInteger; + '87': BigInteger; + '88': BigInteger; + '89': BigInteger; + '90': BigInteger; + '91': BigInteger; + '92': BigInteger; + '93': BigInteger; + '94': BigInteger; + '95': BigInteger; + '96': BigInteger; + '97': BigInteger; + '98': BigInteger; + '99': BigInteger; + '100': BigInteger; + '101': BigInteger; + '102': BigInteger; + '103': BigInteger; + '104': BigInteger; + '105': BigInteger; + '106': BigInteger; + '107': BigInteger; + '108': BigInteger; + '109': BigInteger; + '110': BigInteger; + '111': BigInteger; + '112': BigInteger; + '113': BigInteger; + '114': BigInteger; + '115': BigInteger; + '116': BigInteger; + '117': BigInteger; + '118': BigInteger; + '119': BigInteger; + '120': BigInteger; + '121': BigInteger; + '122': BigInteger; + '123': BigInteger; + '124': BigInteger; + '125': BigInteger; + '126': BigInteger; + '127': BigInteger; + '128': BigInteger; + '129': BigInteger; + '130': BigInteger; + '131': BigInteger; + '132': BigInteger; + '133': BigInteger; + '134': BigInteger; + '135': BigInteger; + '136': BigInteger; + '137': BigInteger; + '138': BigInteger; + '139': BigInteger; + '140': BigInteger; + '141': BigInteger; + '142': BigInteger; + '143': BigInteger; + '144': BigInteger; + '145': BigInteger; + '146': BigInteger; + '147': BigInteger; + '148': BigInteger; + '149': BigInteger; + '150': BigInteger; + '151': BigInteger; + '152': BigInteger; + '153': BigInteger; + '154': BigInteger; + '155': BigInteger; + '156': BigInteger; + '157': BigInteger; + '158': BigInteger; + '159': BigInteger; + '160': BigInteger; + '161': BigInteger; + '162': BigInteger; + '163': BigInteger; + '164': BigInteger; + '165': BigInteger; + '166': BigInteger; + '167': BigInteger; + '168': BigInteger; + '169': BigInteger; + '170': BigInteger; + '171': BigInteger; + '172': BigInteger; + '173': BigInteger; + '174': BigInteger; + '175': BigInteger; + '176': BigInteger; + '177': BigInteger; + '178': BigInteger; + '179': BigInteger; + '180': BigInteger; + '181': BigInteger; + '182': BigInteger; + '183': BigInteger; + '184': BigInteger; + '185': BigInteger; + '186': BigInteger; + '187': BigInteger; + '188': BigInteger; + '189': BigInteger; + '190': BigInteger; + '191': BigInteger; + '192': BigInteger; + '193': BigInteger; + '194': BigInteger; + '195': BigInteger; + '196': BigInteger; + '197': BigInteger; + '198': BigInteger; + '199': BigInteger; + '200': BigInteger; + '201': BigInteger; + '202': BigInteger; + '203': BigInteger; + '204': BigInteger; + '205': BigInteger; + '206': BigInteger; + '207': BigInteger; + '208': BigInteger; + '209': BigInteger; + '210': BigInteger; + '211': BigInteger; + '212': BigInteger; + '213': BigInteger; + '214': BigInteger; + '215': BigInteger; + '216': BigInteger; + '217': BigInteger; + '218': BigInteger; + '219': BigInteger; + '220': BigInteger; + '221': BigInteger; + '222': BigInteger; + '223': BigInteger; + '224': BigInteger; + '225': BigInteger; + '226': BigInteger; + '227': BigInteger; + '228': BigInteger; + '229': BigInteger; + '230': BigInteger; + '231': BigInteger; + '232': BigInteger; + '233': BigInteger; + '234': BigInteger; + '235': BigInteger; + '236': BigInteger; + '237': BigInteger; + '238': BigInteger; + '239': BigInteger; + '240': BigInteger; + '241': BigInteger; + '242': BigInteger; + '243': BigInteger; + '244': BigInteger; + '245': BigInteger; + '246': BigInteger; + '247': BigInteger; + '248': BigInteger; + '249': BigInteger; + '250': BigInteger; + '251': BigInteger; + '252': BigInteger; + '253': BigInteger; + '254': BigInteger; + '255': BigInteger; + '256': BigInteger; + '257': BigInteger; + '258': BigInteger; + '259': BigInteger; + '260': BigInteger; + '261': BigInteger; + '262': BigInteger; + '263': BigInteger; + '264': BigInteger; + '265': BigInteger; + '266': BigInteger; + '267': BigInteger; + '268': BigInteger; + '269': BigInteger; + '270': BigInteger; + '271': BigInteger; + '272': BigInteger; + '273': BigInteger; + '274': BigInteger; + '275': BigInteger; + '276': BigInteger; + '277': BigInteger; + '278': BigInteger; + '279': BigInteger; + '280': BigInteger; + '281': BigInteger; + '282': BigInteger; + '283': BigInteger; + '284': BigInteger; + '285': BigInteger; + '286': BigInteger; + '287': BigInteger; + '288': BigInteger; + '289': BigInteger; + '290': BigInteger; + '291': BigInteger; + '292': BigInteger; + '293': BigInteger; + '294': BigInteger; + '295': BigInteger; + '296': BigInteger; + '297': BigInteger; + '298': BigInteger; + '299': BigInteger; + '300': BigInteger; + '301': BigInteger; + '302': BigInteger; + '303': BigInteger; + '304': BigInteger; + '305': BigInteger; + '306': BigInteger; + '307': BigInteger; + '308': BigInteger; + '309': BigInteger; + '310': BigInteger; + '311': BigInteger; + '312': BigInteger; + '313': BigInteger; + '314': BigInteger; + '315': BigInteger; + '316': BigInteger; + '317': BigInteger; + '318': BigInteger; + '319': BigInteger; + '320': BigInteger; + '321': BigInteger; + '322': BigInteger; + '323': BigInteger; + '324': BigInteger; + '325': BigInteger; + '326': BigInteger; + '327': BigInteger; + '328': BigInteger; + '329': BigInteger; + '330': BigInteger; + '331': BigInteger; + '332': BigInteger; + '333': BigInteger; + '334': BigInteger; + '335': BigInteger; + '336': BigInteger; + '337': BigInteger; + '338': BigInteger; + '339': BigInteger; + '340': BigInteger; + '341': BigInteger; + '342': BigInteger; + '343': BigInteger; + '344': BigInteger; + '345': BigInteger; + '346': BigInteger; + '347': BigInteger; + '348': BigInteger; + '349': BigInteger; + '350': BigInteger; + '351': BigInteger; + '352': BigInteger; + '353': BigInteger; + '354': BigInteger; + '355': BigInteger; + '356': BigInteger; + '357': BigInteger; + '358': BigInteger; + '359': BigInteger; + '360': BigInteger; + '361': BigInteger; + '362': BigInteger; + '363': BigInteger; + '364': BigInteger; + '365': BigInteger; + '366': BigInteger; + '367': BigInteger; + '368': BigInteger; + '369': BigInteger; + '370': BigInteger; + '371': BigInteger; + '372': BigInteger; + '373': BigInteger; + '374': BigInteger; + '375': BigInteger; + '376': BigInteger; + '377': BigInteger; + '378': BigInteger; + '379': BigInteger; + '380': BigInteger; + '381': BigInteger; + '382': BigInteger; + '383': BigInteger; + '384': BigInteger; + '385': BigInteger; + '386': BigInteger; + '387': BigInteger; + '388': BigInteger; + '389': BigInteger; + '390': BigInteger; + '391': BigInteger; + '392': BigInteger; + '393': BigInteger; + '394': BigInteger; + '395': BigInteger; + '396': BigInteger; + '397': BigInteger; + '398': BigInteger; + '399': BigInteger; + '400': BigInteger; + '401': BigInteger; + '402': BigInteger; + '403': BigInteger; + '404': BigInteger; + '405': BigInteger; + '406': BigInteger; + '407': BigInteger; + '408': BigInteger; + '409': BigInteger; + '410': BigInteger; + '411': BigInteger; + '412': BigInteger; + '413': BigInteger; + '414': BigInteger; + '415': BigInteger; + '416': BigInteger; + '417': BigInteger; + '418': BigInteger; + '419': BigInteger; + '420': BigInteger; + '421': BigInteger; + '422': BigInteger; + '423': BigInteger; + '424': BigInteger; + '425': BigInteger; + '426': BigInteger; + '427': BigInteger; + '428': BigInteger; + '429': BigInteger; + '430': BigInteger; + '431': BigInteger; + '432': BigInteger; + '433': BigInteger; + '434': BigInteger; + '435': BigInteger; + '436': BigInteger; + '437': BigInteger; + '438': BigInteger; + '439': BigInteger; + '440': BigInteger; + '441': BigInteger; + '442': BigInteger; + '443': BigInteger; + '444': BigInteger; + '445': BigInteger; + '446': BigInteger; + '447': BigInteger; + '448': BigInteger; + '449': BigInteger; + '450': BigInteger; + '451': BigInteger; + '452': BigInteger; + '453': BigInteger; + '454': BigInteger; + '455': BigInteger; + '456': BigInteger; + '457': BigInteger; + '458': BigInteger; + '459': BigInteger; + '460': BigInteger; + '461': BigInteger; + '462': BigInteger; + '463': BigInteger; + '464': BigInteger; + '465': BigInteger; + '466': BigInteger; + '467': BigInteger; + '468': BigInteger; + '469': BigInteger; + '470': BigInteger; + '471': BigInteger; + '472': BigInteger; + '473': BigInteger; + '474': BigInteger; + '475': BigInteger; + '476': BigInteger; + '477': BigInteger; + '478': BigInteger; + '479': BigInteger; + '480': BigInteger; + '481': BigInteger; + '482': BigInteger; + '483': BigInteger; + '484': BigInteger; + '485': BigInteger; + '486': BigInteger; + '487': BigInteger; + '488': BigInteger; + '489': BigInteger; + '490': BigInteger; + '491': BigInteger; + '492': BigInteger; + '493': BigInteger; + '494': BigInteger; + '495': BigInteger; + '496': BigInteger; + '497': BigInteger; + '498': BigInteger; + '499': BigInteger; + '500': BigInteger; + '501': BigInteger; + '502': BigInteger; + '503': BigInteger; + '504': BigInteger; + '505': BigInteger; + '506': BigInteger; + '507': BigInteger; + '508': BigInteger; + '509': BigInteger; + '510': BigInteger; + '511': BigInteger; + '512': BigInteger; + '513': BigInteger; + '514': BigInteger; + '515': BigInteger; + '516': BigInteger; + '517': BigInteger; + '518': BigInteger; + '519': BigInteger; + '520': BigInteger; + '521': BigInteger; + '522': BigInteger; + '523': BigInteger; + '524': BigInteger; + '525': BigInteger; + '526': BigInteger; + '527': BigInteger; + '528': BigInteger; + '529': BigInteger; + '530': BigInteger; + '531': BigInteger; + '532': BigInteger; + '533': BigInteger; + '534': BigInteger; + '535': BigInteger; + '536': BigInteger; + '537': BigInteger; + '538': BigInteger; + '539': BigInteger; + '540': BigInteger; + '541': BigInteger; + '542': BigInteger; + '543': BigInteger; + '544': BigInteger; + '545': BigInteger; + '546': BigInteger; + '547': BigInteger; + '548': BigInteger; + '549': BigInteger; + '550': BigInteger; + '551': BigInteger; + '552': BigInteger; + '553': BigInteger; + '554': BigInteger; + '555': BigInteger; + '556': BigInteger; + '557': BigInteger; + '558': BigInteger; + '559': BigInteger; + '560': BigInteger; + '561': BigInteger; + '562': BigInteger; + '563': BigInteger; + '564': BigInteger; + '565': BigInteger; + '566': BigInteger; + '567': BigInteger; + '568': BigInteger; + '569': BigInteger; + '570': BigInteger; + '571': BigInteger; + '572': BigInteger; + '573': BigInteger; + '574': BigInteger; + '575': BigInteger; + '576': BigInteger; + '577': BigInteger; + '578': BigInteger; + '579': BigInteger; + '580': BigInteger; + '581': BigInteger; + '582': BigInteger; + '583': BigInteger; + '584': BigInteger; + '585': BigInteger; + '586': BigInteger; + '587': BigInteger; + '588': BigInteger; + '589': BigInteger; + '590': BigInteger; + '591': BigInteger; + '592': BigInteger; + '593': BigInteger; + '594': BigInteger; + '595': BigInteger; + '596': BigInteger; + '597': BigInteger; + '598': BigInteger; + '599': BigInteger; + '600': BigInteger; + '601': BigInteger; + '602': BigInteger; + '603': BigInteger; + '604': BigInteger; + '605': BigInteger; + '606': BigInteger; + '607': BigInteger; + '608': BigInteger; + '609': BigInteger; + '610': BigInteger; + '611': BigInteger; + '612': BigInteger; + '613': BigInteger; + '614': BigInteger; + '615': BigInteger; + '616': BigInteger; + '617': BigInteger; + '618': BigInteger; + '619': BigInteger; + '620': BigInteger; + '621': BigInteger; + '622': BigInteger; + '623': BigInteger; + '624': BigInteger; + '625': BigInteger; + '626': BigInteger; + '627': BigInteger; + '628': BigInteger; + '629': BigInteger; + '630': BigInteger; + '631': BigInteger; + '632': BigInteger; + '633': BigInteger; + '634': BigInteger; + '635': BigInteger; + '636': BigInteger; + '637': BigInteger; + '638': BigInteger; + '639': BigInteger; + '640': BigInteger; + '641': BigInteger; + '642': BigInteger; + '643': BigInteger; + '644': BigInteger; + '645': BigInteger; + '646': BigInteger; + '647': BigInteger; + '648': BigInteger; + '649': BigInteger; + '650': BigInteger; + '651': BigInteger; + '652': BigInteger; + '653': BigInteger; + '654': BigInteger; + '655': BigInteger; + '656': BigInteger; + '657': BigInteger; + '658': BigInteger; + '659': BigInteger; + '660': BigInteger; + '661': BigInteger; + '662': BigInteger; + '663': BigInteger; + '664': BigInteger; + '665': BigInteger; + '666': BigInteger; + '667': BigInteger; + '668': BigInteger; + '669': BigInteger; + '670': BigInteger; + '671': BigInteger; + '672': BigInteger; + '673': BigInteger; + '674': BigInteger; + '675': BigInteger; + '676': BigInteger; + '677': BigInteger; + '678': BigInteger; + '679': BigInteger; + '680': BigInteger; + '681': BigInteger; + '682': BigInteger; + '683': BigInteger; + '684': BigInteger; + '685': BigInteger; + '686': BigInteger; + '687': BigInteger; + '688': BigInteger; + '689': BigInteger; + '690': BigInteger; + '691': BigInteger; + '692': BigInteger; + '693': BigInteger; + '694': BigInteger; + '695': BigInteger; + '696': BigInteger; + '697': BigInteger; + '698': BigInteger; + '699': BigInteger; + '700': BigInteger; + '701': BigInteger; + '702': BigInteger; + '703': BigInteger; + '704': BigInteger; + '705': BigInteger; + '706': BigInteger; + '707': BigInteger; + '708': BigInteger; + '709': BigInteger; + '710': BigInteger; + '711': BigInteger; + '712': BigInteger; + '713': BigInteger; + '714': BigInteger; + '715': BigInteger; + '716': BigInteger; + '717': BigInteger; + '718': BigInteger; + '719': BigInteger; + '720': BigInteger; + '721': BigInteger; + '722': BigInteger; + '723': BigInteger; + '724': BigInteger; + '725': BigInteger; + '726': BigInteger; + '727': BigInteger; + '728': BigInteger; + '729': BigInteger; + '730': BigInteger; + '731': BigInteger; + '732': BigInteger; + '733': BigInteger; + '734': BigInteger; + '735': BigInteger; + '736': BigInteger; + '737': BigInteger; + '738': BigInteger; + '739': BigInteger; + '740': BigInteger; + '741': BigInteger; + '742': BigInteger; + '743': BigInteger; + '744': BigInteger; + '745': BigInteger; + '746': BigInteger; + '747': BigInteger; + '748': BigInteger; + '749': BigInteger; + '750': BigInteger; + '751': BigInteger; + '752': BigInteger; + '753': BigInteger; + '754': BigInteger; + '755': BigInteger; + '756': BigInteger; + '757': BigInteger; + '758': BigInteger; + '759': BigInteger; + '760': BigInteger; + '761': BigInteger; + '762': BigInteger; + '763': BigInteger; + '764': BigInteger; + '765': BigInteger; + '766': BigInteger; + '767': BigInteger; + '768': BigInteger; + '769': BigInteger; + '770': BigInteger; + '771': BigInteger; + '772': BigInteger; + '773': BigInteger; + '774': BigInteger; + '775': BigInteger; + '776': BigInteger; + '777': BigInteger; + '778': BigInteger; + '779': BigInteger; + '780': BigInteger; + '781': BigInteger; + '782': BigInteger; + '783': BigInteger; + '784': BigInteger; + '785': BigInteger; + '786': BigInteger; + '787': BigInteger; + '788': BigInteger; + '789': BigInteger; + '790': BigInteger; + '791': BigInteger; + '792': BigInteger; + '793': BigInteger; + '794': BigInteger; + '795': BigInteger; + '796': BigInteger; + '797': BigInteger; + '798': BigInteger; + '799': BigInteger; + '800': BigInteger; + '801': BigInteger; + '802': BigInteger; + '803': BigInteger; + '804': BigInteger; + '805': BigInteger; + '806': BigInteger; + '807': BigInteger; + '808': BigInteger; + '809': BigInteger; + '810': BigInteger; + '811': BigInteger; + '812': BigInteger; + '813': BigInteger; + '814': BigInteger; + '815': BigInteger; + '816': BigInteger; + '817': BigInteger; + '818': BigInteger; + '819': BigInteger; + '820': BigInteger; + '821': BigInteger; + '822': BigInteger; + '823': BigInteger; + '824': BigInteger; + '825': BigInteger; + '826': BigInteger; + '827': BigInteger; + '828': BigInteger; + '829': BigInteger; + '830': BigInteger; + '831': BigInteger; + '832': BigInteger; + '833': BigInteger; + '834': BigInteger; + '835': BigInteger; + '836': BigInteger; + '837': BigInteger; + '838': BigInteger; + '839': BigInteger; + '840': BigInteger; + '841': BigInteger; + '842': BigInteger; + '843': BigInteger; + '844': BigInteger; + '845': BigInteger; + '846': BigInteger; + '847': BigInteger; + '848': BigInteger; + '849': BigInteger; + '850': BigInteger; + '851': BigInteger; + '852': BigInteger; + '853': BigInteger; + '854': BigInteger; + '855': BigInteger; + '856': BigInteger; + '857': BigInteger; + '858': BigInteger; + '859': BigInteger; + '860': BigInteger; + '861': BigInteger; + '862': BigInteger; + '863': BigInteger; + '864': BigInteger; + '865': BigInteger; + '866': BigInteger; + '867': BigInteger; + '868': BigInteger; + '869': BigInteger; + '870': BigInteger; + '871': BigInteger; + '872': BigInteger; + '873': BigInteger; + '874': BigInteger; + '875': BigInteger; + '876': BigInteger; + '877': BigInteger; + '878': BigInteger; + '879': BigInteger; + '880': BigInteger; + '881': BigInteger; + '882': BigInteger; + '883': BigInteger; + '884': BigInteger; + '885': BigInteger; + '886': BigInteger; + '887': BigInteger; + '888': BigInteger; + '889': BigInteger; + '890': BigInteger; + '891': BigInteger; + '892': BigInteger; + '893': BigInteger; + '894': BigInteger; + '895': BigInteger; + '896': BigInteger; + '897': BigInteger; + '898': BigInteger; + '899': BigInteger; + '900': BigInteger; + '901': BigInteger; + '902': BigInteger; + '903': BigInteger; + '904': BigInteger; + '905': BigInteger; + '906': BigInteger; + '907': BigInteger; + '908': BigInteger; + '909': BigInteger; + '910': BigInteger; + '911': BigInteger; + '912': BigInteger; + '913': BigInteger; + '914': BigInteger; + '915': BigInteger; + '916': BigInteger; + '917': BigInteger; + '918': BigInteger; + '919': BigInteger; + '920': BigInteger; + '921': BigInteger; + '922': BigInteger; + '923': BigInteger; + '924': BigInteger; + '925': BigInteger; + '926': BigInteger; + '927': BigInteger; + '928': BigInteger; + '929': BigInteger; + '930': BigInteger; + '931': BigInteger; + '932': BigInteger; + '933': BigInteger; + '934': BigInteger; + '935': BigInteger; + '936': BigInteger; + '937': BigInteger; + '938': BigInteger; + '939': BigInteger; + '940': BigInteger; + '941': BigInteger; + '942': BigInteger; + '943': BigInteger; + '944': BigInteger; + '945': BigInteger; + '946': BigInteger; + '947': BigInteger; + '948': BigInteger; + '949': BigInteger; + '950': BigInteger; + '951': BigInteger; + '952': BigInteger; + '953': BigInteger; + '954': BigInteger; + '955': BigInteger; + '956': BigInteger; + '957': BigInteger; + '958': BigInteger; + '959': BigInteger; + '960': BigInteger; + '961': BigInteger; + '962': BigInteger; + '963': BigInteger; + '964': BigInteger; + '965': BigInteger; + '966': BigInteger; + '967': BigInteger; + '968': BigInteger; + '969': BigInteger; + '970': BigInteger; + '971': BigInteger; + '972': BigInteger; + '973': BigInteger; + '974': BigInteger; + '975': BigInteger; + '976': BigInteger; + '977': BigInteger; + '978': BigInteger; + '979': BigInteger; + '980': BigInteger; + '981': BigInteger; + '982': BigInteger; + '983': BigInteger; + '984': BigInteger; + '985': BigInteger; + '986': BigInteger; + '987': BigInteger; + '988': BigInteger; + '989': BigInteger; + '990': BigInteger; + '991': BigInteger; + '992': BigInteger; + '993': BigInteger; + '994': BigInteger; + '995': BigInteger; + '996': BigInteger; + '997': BigInteger; + '998': BigInteger; + '999': BigInteger; + } + + interface BaseArray { + value: number[], + isNegative: boolean + } +} diff --git a/node_modules/cordova-android/node_modules/big-integer/BigInteger.js b/node_modules/cordova-android/node_modules/big-integer/BigInteger.js new file mode 100644 index 0000000..e560954 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/BigInteger.js @@ -0,0 +1,1308 @@ +var bigInt = (function (undefined) { + "use strict"; + + var BASE = 1e7, + LOG_BASE = 7, + MAX_INT = 9007199254740992, + MAX_INT_ARR = smallToArray(MAX_INT), + LOG_MAX_INT = Math.log(MAX_INT); + + function Integer(v, radix) { + if (typeof v === "undefined") return Integer[0]; + if (typeof radix !== "undefined") return +radix === 10 ? parseValue(v) : parseBase(v, radix); + return parseValue(v); + } + + function BigInteger(value, sign) { + this.value = value; + this.sign = sign; + this.isSmall = false; + } + BigInteger.prototype = Object.create(Integer.prototype); + + function SmallInteger(value) { + this.value = value; + this.sign = value < 0; + this.isSmall = true; + } + SmallInteger.prototype = Object.create(Integer.prototype); + + function isPrecise(n) { + return -MAX_INT < n && n < MAX_INT; + } + + function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes + if (n < 1e7) + return [n]; + if (n < 1e14) + return [n % 1e7, Math.floor(n / 1e7)]; + return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)]; + } + + function arrayToSmall(arr) { // If BASE changes this function may need to change + trim(arr); + var length = arr.length; + if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) { + switch (length) { + case 0: return 0; + case 1: return arr[0]; + case 2: return arr[0] + arr[1] * BASE; + default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE; + } + } + return arr; + } + + function trim(v) { + var i = v.length; + while (v[--i] === 0); + v.length = i + 1; + } + + function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger + var x = new Array(length); + var i = -1; + while (++i < length) { + x[i] = 0; + } + return x; + } + + function truncate(n) { + if (n > 0) return Math.floor(n); + return Math.ceil(n); + } + + function add(a, b) { // assumes a and b are arrays with a.length >= b.length + var l_a = a.length, + l_b = b.length, + r = new Array(l_a), + carry = 0, + base = BASE, + sum, i; + for (i = 0; i < l_b; i++) { + sum = a[i] + b[i] + carry; + carry = sum >= base ? 1 : 0; + r[i] = sum - carry * base; + } + while (i < l_a) { + sum = a[i] + carry; + carry = sum === base ? 1 : 0; + r[i++] = sum - carry * base; + } + if (carry > 0) r.push(carry); + return r; + } + + function addAny(a, b) { + if (a.length >= b.length) return add(a, b); + return add(b, a); + } + + function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT + var l = a.length, + r = new Array(l), + base = BASE, + sum, i; + for (i = 0; i < l; i++) { + sum = a[i] - base + carry; + carry = Math.floor(sum / base); + r[i] = sum - carry * base; + carry += 1; + } + while (carry > 0) { + r[i++] = carry % base; + carry = Math.floor(carry / base); + } + return r; + } + + BigInteger.prototype.add = function (v) { + var n = parseValue(v); + if (this.sign !== n.sign) { + return this.subtract(n.negate()); + } + var a = this.value, b = n.value; + if (n.isSmall) { + return new BigInteger(addSmall(a, Math.abs(b)), this.sign); + } + return new BigInteger(addAny(a, b), this.sign); + }; + BigInteger.prototype.plus = BigInteger.prototype.add; + + SmallInteger.prototype.add = function (v) { + var n = parseValue(v); + var a = this.value; + if (a < 0 !== n.sign) { + return this.subtract(n.negate()); + } + var b = n.value; + if (n.isSmall) { + if (isPrecise(a + b)) return new SmallInteger(a + b); + b = smallToArray(Math.abs(b)); + } + return new BigInteger(addSmall(b, Math.abs(a)), a < 0); + }; + SmallInteger.prototype.plus = SmallInteger.prototype.add; + + function subtract(a, b) { // assumes a and b are arrays with a >= b + var a_l = a.length, + b_l = b.length, + r = new Array(a_l), + borrow = 0, + base = BASE, + i, difference; + for (i = 0; i < b_l; i++) { + difference = a[i] - borrow - b[i]; + if (difference < 0) { + difference += base; + borrow = 1; + } else borrow = 0; + r[i] = difference; + } + for (i = b_l; i < a_l; i++) { + difference = a[i] - borrow; + if (difference < 0) difference += base; + else { + r[i++] = difference; + break; + } + r[i] = difference; + } + for (; i < a_l; i++) { + r[i] = a[i]; + } + trim(r); + return r; + } + + function subtractAny(a, b, sign) { + var value; + if (compareAbs(a, b) >= 0) { + value = subtract(a, b); + } else { + value = subtract(b, a); + sign = !sign; + } + value = arrayToSmall(value); + if (typeof value === "number") { + if (sign) value = -value; + return new SmallInteger(value); + } + return new BigInteger(value, sign); + } + + function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT + var l = a.length, + r = new Array(l), + carry = -b, + base = BASE, + i, difference; + for (i = 0; i < l; i++) { + difference = a[i] + carry; + carry = Math.floor(difference / base); + difference %= base; + r[i] = difference < 0 ? difference + base : difference; + } + r = arrayToSmall(r); + if (typeof r === "number") { + if (sign) r = -r; + return new SmallInteger(r); + } return new BigInteger(r, sign); + } + + BigInteger.prototype.subtract = function (v) { + var n = parseValue(v); + if (this.sign !== n.sign) { + return this.add(n.negate()); + } + var a = this.value, b = n.value; + if (n.isSmall) + return subtractSmall(a, Math.abs(b), this.sign); + return subtractAny(a, b, this.sign); + }; + BigInteger.prototype.minus = BigInteger.prototype.subtract; + + SmallInteger.prototype.subtract = function (v) { + var n = parseValue(v); + var a = this.value; + if (a < 0 !== n.sign) { + return this.add(n.negate()); + } + var b = n.value; + if (n.isSmall) { + return new SmallInteger(a - b); + } + return subtractSmall(b, Math.abs(a), a >= 0); + }; + SmallInteger.prototype.minus = SmallInteger.prototype.subtract; + + BigInteger.prototype.negate = function () { + return new BigInteger(this.value, !this.sign); + }; + SmallInteger.prototype.negate = function () { + var sign = this.sign; + var small = new SmallInteger(-this.value); + small.sign = !sign; + return small; + }; + + BigInteger.prototype.abs = function () { + return new BigInteger(this.value, false); + }; + SmallInteger.prototype.abs = function () { + return new SmallInteger(Math.abs(this.value)); + }; + + function multiplyLong(a, b) { + var a_l = a.length, + b_l = b.length, + l = a_l + b_l, + r = createArray(l), + base = BASE, + product, carry, i, a_i, b_j; + for (i = 0; i < a_l; ++i) { + a_i = a[i]; + for (var j = 0; j < b_l; ++j) { + b_j = b[j]; + product = a_i * b_j + r[i + j]; + carry = Math.floor(product / base); + r[i + j] = product - carry * base; + r[i + j + 1] += carry; + } + } + trim(r); + return r; + } + + function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE + var l = a.length, + r = new Array(l), + base = BASE, + carry = 0, + product, i; + for (i = 0; i < l; i++) { + product = a[i] * b + carry; + carry = Math.floor(product / base); + r[i] = product - carry * base; + } + while (carry > 0) { + r[i++] = carry % base; + carry = Math.floor(carry / base); + } + return r; + } + + function shiftLeft(x, n) { + var r = []; + while (n-- > 0) r.push(0); + return r.concat(x); + } + + function multiplyKaratsuba(x, y) { + var n = Math.max(x.length, y.length); + + if (n <= 30) return multiplyLong(x, y); + n = Math.ceil(n / 2); + + var b = x.slice(n), + a = x.slice(0, n), + d = y.slice(n), + c = y.slice(0, n); + + var ac = multiplyKaratsuba(a, c), + bd = multiplyKaratsuba(b, d), + abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d)); + + var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n)); + trim(product); + return product; + } + + // The following function is derived from a surface fit of a graph plotting the performance difference + // between long multiplication and karatsuba multiplication versus the lengths of the two arrays. + function useKaratsuba(l1, l2) { + return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0; + } + + BigInteger.prototype.multiply = function (v) { + var n = parseValue(v), + a = this.value, b = n.value, + sign = this.sign !== n.sign, + abs; + if (n.isSmall) { + if (b === 0) return Integer[0]; + if (b === 1) return this; + if (b === -1) return this.negate(); + abs = Math.abs(b); + if (abs < BASE) { + return new BigInteger(multiplySmall(a, abs), sign); + } + b = smallToArray(abs); + } + if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes + return new BigInteger(multiplyKaratsuba(a, b), sign); + return new BigInteger(multiplyLong(a, b), sign); + }; + + BigInteger.prototype.times = BigInteger.prototype.multiply; + + function multiplySmallAndArray(a, b, sign) { // a >= 0 + if (a < BASE) { + return new BigInteger(multiplySmall(b, a), sign); + } + return new BigInteger(multiplyLong(b, smallToArray(a)), sign); + } + SmallInteger.prototype._multiplyBySmall = function (a) { + if (isPrecise(a.value * this.value)) { + return new SmallInteger(a.value * this.value); + } + return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign); + }; + BigInteger.prototype._multiplyBySmall = function (a) { + if (a.value === 0) return Integer[0]; + if (a.value === 1) return this; + if (a.value === -1) return this.negate(); + return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign); + }; + SmallInteger.prototype.multiply = function (v) { + return parseValue(v)._multiplyBySmall(this); + }; + SmallInteger.prototype.times = SmallInteger.prototype.multiply; + + function square(a) { + //console.assert(2 * BASE * BASE < MAX_INT); + var l = a.length, + r = createArray(l + l), + base = BASE, + product, carry, i, a_i, a_j; + for (i = 0; i < l; i++) { + a_i = a[i]; + carry = 0 - a_i * a_i; + for (var j = i; j < l; j++) { + a_j = a[j]; + product = 2 * (a_i * a_j) + r[i + j] + carry; + carry = Math.floor(product / base); + r[i + j] = product - carry * base; + } + r[i + l] = carry; + } + trim(r); + return r; + } + + BigInteger.prototype.square = function () { + return new BigInteger(square(this.value), false); + }; + + SmallInteger.prototype.square = function () { + var value = this.value * this.value; + if (isPrecise(value)) return new SmallInteger(value); + return new BigInteger(square(smallToArray(Math.abs(this.value))), false); + }; + + function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes. + var a_l = a.length, + b_l = b.length, + base = BASE, + result = createArray(b.length), + divisorMostSignificantDigit = b[b_l - 1], + // normalization + lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)), + remainder = multiplySmall(a, lambda), + divisor = multiplySmall(b, lambda), + quotientDigit, shift, carry, borrow, i, l, q; + if (remainder.length <= a_l) remainder.push(0); + divisor.push(0); + divisorMostSignificantDigit = divisor[b_l - 1]; + for (shift = a_l - b_l; shift >= 0; shift--) { + quotientDigit = base - 1; + if (remainder[shift + b_l] !== divisorMostSignificantDigit) { + quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit); + } + // quotientDigit <= base - 1 + carry = 0; + borrow = 0; + l = divisor.length; + for (i = 0; i < l; i++) { + carry += quotientDigit * divisor[i]; + q = Math.floor(carry / base); + borrow += remainder[shift + i] - (carry - q * base); + carry = q; + if (borrow < 0) { + remainder[shift + i] = borrow + base; + borrow = -1; + } else { + remainder[shift + i] = borrow; + borrow = 0; + } + } + while (borrow !== 0) { + quotientDigit -= 1; + carry = 0; + for (i = 0; i < l; i++) { + carry += remainder[shift + i] - base + divisor[i]; + if (carry < 0) { + remainder[shift + i] = carry + base; + carry = 0; + } else { + remainder[shift + i] = carry; + carry = 1; + } + } + borrow += carry; + } + result[shift] = quotientDigit; + } + // denormalization + remainder = divModSmall(remainder, lambda)[0]; + return [arrayToSmall(result), arrayToSmall(remainder)]; + } + + function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/ + // Performs faster than divMod1 on larger input sizes. + var a_l = a.length, + b_l = b.length, + result = [], + part = [], + base = BASE, + guess, xlen, highx, highy, check; + while (a_l) { + part.unshift(a[--a_l]); + trim(part); + if (compareAbs(part, b) < 0) { + result.push(0); + continue; + } + xlen = part.length; + highx = part[xlen - 1] * base + part[xlen - 2]; + highy = b[b_l - 1] * base + b[b_l - 2]; + if (xlen > b_l) { + highx = (highx + 1) * base; + } + guess = Math.ceil(highx / highy); + do { + check = multiplySmall(b, guess); + if (compareAbs(check, part) <= 0) break; + guess--; + } while (guess); + result.push(guess); + part = subtract(part, check); + } + result.reverse(); + return [arrayToSmall(result), arrayToSmall(part)]; + } + + function divModSmall(value, lambda) { + var length = value.length, + quotient = createArray(length), + base = BASE, + i, q, remainder, divisor; + remainder = 0; + for (i = length - 1; i >= 0; --i) { + divisor = remainder * base + value[i]; + q = truncate(divisor / lambda); + remainder = divisor - q * lambda; + quotient[i] = q | 0; + } + return [quotient, remainder | 0]; + } + + function divModAny(self, v) { + var value, n = parseValue(v); + var a = self.value, b = n.value; + var quotient; + if (b === 0) throw new Error("Cannot divide by zero"); + if (self.isSmall) { + if (n.isSmall) { + return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)]; + } + return [Integer[0], self]; + } + if (n.isSmall) { + if (b === 1) return [self, Integer[0]]; + if (b == -1) return [self.negate(), Integer[0]]; + var abs = Math.abs(b); + if (abs < BASE) { + value = divModSmall(a, abs); + quotient = arrayToSmall(value[0]); + var remainder = value[1]; + if (self.sign) remainder = -remainder; + if (typeof quotient === "number") { + if (self.sign !== n.sign) quotient = -quotient; + return [new SmallInteger(quotient), new SmallInteger(remainder)]; + } + return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)]; + } + b = smallToArray(abs); + } + var comparison = compareAbs(a, b); + if (comparison === -1) return [Integer[0], self]; + if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]]; + + // divMod1 is faster on smaller input sizes + if (a.length + b.length <= 200) + value = divMod1(a, b); + else value = divMod2(a, b); + + quotient = value[0]; + var qSign = self.sign !== n.sign, + mod = value[1], + mSign = self.sign; + if (typeof quotient === "number") { + if (qSign) quotient = -quotient; + quotient = new SmallInteger(quotient); + } else quotient = new BigInteger(quotient, qSign); + if (typeof mod === "number") { + if (mSign) mod = -mod; + mod = new SmallInteger(mod); + } else mod = new BigInteger(mod, mSign); + return [quotient, mod]; + } + + BigInteger.prototype.divmod = function (v) { + var result = divModAny(this, v); + return { + quotient: result[0], + remainder: result[1] + }; + }; + SmallInteger.prototype.divmod = BigInteger.prototype.divmod; + + BigInteger.prototype.divide = function (v) { + return divModAny(this, v)[0]; + }; + SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide; + + BigInteger.prototype.mod = function (v) { + return divModAny(this, v)[1]; + }; + SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod; + + BigInteger.prototype.pow = function (v) { + var n = parseValue(v), + a = this.value, + b = n.value, + value, x, y; + if (b === 0) return Integer[1]; + if (a === 0) return Integer[0]; + if (a === 1) return Integer[1]; + if (a === -1) return n.isEven() ? Integer[1] : Integer[-1]; + if (n.sign) { + return Integer[0]; + } + if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large."); + if (this.isSmall) { + if (isPrecise(value = Math.pow(a, b))) + return new SmallInteger(truncate(value)); + } + x = this; + y = Integer[1]; + while (true) { + if (b & 1 === 1) { + y = y.times(x); + --b; + } + if (b === 0) break; + b /= 2; + x = x.square(); + } + return y; + }; + SmallInteger.prototype.pow = BigInteger.prototype.pow; + + BigInteger.prototype.modPow = function (exp, mod) { + exp = parseValue(exp); + mod = parseValue(mod); + if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0"); + var r = Integer[1], + base = this.mod(mod); + while (exp.isPositive()) { + if (base.isZero()) return Integer[0]; + if (exp.isOdd()) r = r.multiply(base).mod(mod); + exp = exp.divide(2); + base = base.square().mod(mod); + } + return r; + }; + SmallInteger.prototype.modPow = BigInteger.prototype.modPow; + + function compareAbs(a, b) { + if (a.length !== b.length) { + return a.length > b.length ? 1 : -1; + } + for (var i = a.length - 1; i >= 0; i--) { + if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1; + } + return 0; + } + + BigInteger.prototype.compareAbs = function (v) { + var n = parseValue(v), + a = this.value, + b = n.value; + if (n.isSmall) return 1; + return compareAbs(a, b); + }; + SmallInteger.prototype.compareAbs = function (v) { + var n = parseValue(v), + a = Math.abs(this.value), + b = n.value; + if (n.isSmall) { + b = Math.abs(b); + return a === b ? 0 : a > b ? 1 : -1; + } + return -1; + }; + + BigInteger.prototype.compare = function (v) { + // See discussion about comparison with Infinity: + // https://github.com/peterolson/BigInteger.js/issues/61 + if (v === Infinity) { + return -1; + } + if (v === -Infinity) { + return 1; + } + + var n = parseValue(v), + a = this.value, + b = n.value; + if (this.sign !== n.sign) { + return n.sign ? 1 : -1; + } + if (n.isSmall) { + return this.sign ? -1 : 1; + } + return compareAbs(a, b) * (this.sign ? -1 : 1); + }; + BigInteger.prototype.compareTo = BigInteger.prototype.compare; + + SmallInteger.prototype.compare = function (v) { + if (v === Infinity) { + return -1; + } + if (v === -Infinity) { + return 1; + } + + var n = parseValue(v), + a = this.value, + b = n.value; + if (n.isSmall) { + return a == b ? 0 : a > b ? 1 : -1; + } + if (a < 0 !== n.sign) { + return a < 0 ? -1 : 1; + } + return a < 0 ? 1 : -1; + }; + SmallInteger.prototype.compareTo = SmallInteger.prototype.compare; + + BigInteger.prototype.equals = function (v) { + return this.compare(v) === 0; + }; + SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals; + + BigInteger.prototype.notEquals = function (v) { + return this.compare(v) !== 0; + }; + SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals; + + BigInteger.prototype.greater = function (v) { + return this.compare(v) > 0; + }; + SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater; + + BigInteger.prototype.lesser = function (v) { + return this.compare(v) < 0; + }; + SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser; + + BigInteger.prototype.greaterOrEquals = function (v) { + return this.compare(v) >= 0; + }; + SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals; + + BigInteger.prototype.lesserOrEquals = function (v) { + return this.compare(v) <= 0; + }; + SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals; + + BigInteger.prototype.isEven = function () { + return (this.value[0] & 1) === 0; + }; + SmallInteger.prototype.isEven = function () { + return (this.value & 1) === 0; + }; + + BigInteger.prototype.isOdd = function () { + return (this.value[0] & 1) === 1; + }; + SmallInteger.prototype.isOdd = function () { + return (this.value & 1) === 1; + }; + + BigInteger.prototype.isPositive = function () { + return !this.sign; + }; + SmallInteger.prototype.isPositive = function () { + return this.value > 0; + }; + + BigInteger.prototype.isNegative = function () { + return this.sign; + }; + SmallInteger.prototype.isNegative = function () { + return this.value < 0; + }; + + BigInteger.prototype.isUnit = function () { + return false; + }; + SmallInteger.prototype.isUnit = function () { + return Math.abs(this.value) === 1; + }; + + BigInteger.prototype.isZero = function () { + return false; + }; + SmallInteger.prototype.isZero = function () { + return this.value === 0; + }; + BigInteger.prototype.isDivisibleBy = function (v) { + var n = parseValue(v); + var value = n.value; + if (value === 0) return false; + if (value === 1) return true; + if (value === 2) return this.isEven(); + return this.mod(n).equals(Integer[0]); + }; + SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy; + + function isBasicPrime(v) { + var n = v.abs(); + if (n.isUnit()) return false; + if (n.equals(2) || n.equals(3) || n.equals(5)) return true; + if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false; + if (n.lesser(25)) return true; + // we don't know if it's prime: let the other functions figure it out + } + + BigInteger.prototype.isPrime = function () { + var isPrime = isBasicPrime(this); + if (isPrime !== undefined) return isPrime; + var n = this.abs(), + nPrev = n.prev(); + var a = [2, 3, 5, 7, 11, 13, 17, 19], + b = nPrev, + d, t, i, x; + while (b.isEven()) b = b.divide(2); + for (i = 0; i < a.length; i++) { + x = bigInt(a[i]).modPow(b, n); + if (x.equals(Integer[1]) || x.equals(nPrev)) continue; + for (t = true, d = b; t && d.lesser(nPrev); d = d.multiply(2)) { + x = x.square().mod(n); + if (x.equals(nPrev)) t = false; + } + if (t) return false; + } + return true; + }; + SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime; + + BigInteger.prototype.isProbablePrime = function (iterations) { + var isPrime = isBasicPrime(this); + if (isPrime !== undefined) return isPrime; + var n = this.abs(); + var t = iterations === undefined ? 5 : iterations; + // use the Fermat primality test + for (var i = 0; i < t; i++) { + var a = bigInt.randBetween(2, n.minus(2)); + if (!a.modPow(n.prev(), n).isUnit()) return false; // definitely composite + } + return true; // large chance of being prime + }; + SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime; + + BigInteger.prototype.modInv = function (n) { + var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR; + while (!newR.equals(bigInt.zero)) { + q = r.divide(newR); + lastT = t; + lastR = r; + t = newT; + r = newR; + newT = lastT.subtract(q.multiply(newT)); + newR = lastR.subtract(q.multiply(newR)); + } + if (!r.equals(1)) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime"); + if (t.compare(0) === -1) { + t = t.add(n); + } + if (this.isNegative()) { + return t.negate(); + } + return t; + }; + + SmallInteger.prototype.modInv = BigInteger.prototype.modInv; + + BigInteger.prototype.next = function () { + var value = this.value; + if (this.sign) { + return subtractSmall(value, 1, this.sign); + } + return new BigInteger(addSmall(value, 1), this.sign); + }; + SmallInteger.prototype.next = function () { + var value = this.value; + if (value + 1 < MAX_INT) return new SmallInteger(value + 1); + return new BigInteger(MAX_INT_ARR, false); + }; + + BigInteger.prototype.prev = function () { + var value = this.value; + if (this.sign) { + return new BigInteger(addSmall(value, 1), true); + } + return subtractSmall(value, 1, this.sign); + }; + SmallInteger.prototype.prev = function () { + var value = this.value; + if (value - 1 > -MAX_INT) return new SmallInteger(value - 1); + return new BigInteger(MAX_INT_ARR, true); + }; + + var powersOfTwo = [1]; + while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]); + var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1]; + + function shift_isSmall(n) { + return ((typeof n === "number" || typeof n === "string") && +Math.abs(n) <= BASE) || + (n instanceof BigInteger && n.value.length <= 1); + } + + BigInteger.prototype.shiftLeft = function (n) { + if (!shift_isSmall(n)) { + throw new Error(String(n) + " is too large for shifting."); + } + n = +n; + if (n < 0) return this.shiftRight(-n); + var result = this; + if (result.isZero()) return result; + while (n >= powers2Length) { + result = result.multiply(highestPower2); + n -= powers2Length - 1; + } + return result.multiply(powersOfTwo[n]); + }; + SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft; + + BigInteger.prototype.shiftRight = function (n) { + var remQuo; + if (!shift_isSmall(n)) { + throw new Error(String(n) + " is too large for shifting."); + } + n = +n; + if (n < 0) return this.shiftLeft(-n); + var result = this; + while (n >= powers2Length) { + if (result.isZero() || (result.isNegative() && result.isUnit())) return result; + remQuo = divModAny(result, highestPower2); + result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; + n -= powers2Length - 1; + } + remQuo = divModAny(result, powersOfTwo[n]); + return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; + }; + SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight; + + function bitwise(x, y, fn) { + y = parseValue(y); + var xSign = x.isNegative(), ySign = y.isNegative(); + var xRem = xSign ? x.not() : x, + yRem = ySign ? y.not() : y; + var xDigit = 0, yDigit = 0; + var xDivMod = null, yDivMod = null; + var result = []; + while (!xRem.isZero() || !yRem.isZero()) { + xDivMod = divModAny(xRem, highestPower2); + xDigit = xDivMod[1].toJSNumber(); + if (xSign) { + xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers + } + + yDivMod = divModAny(yRem, highestPower2); + yDigit = yDivMod[1].toJSNumber(); + if (ySign) { + yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers + } + + xRem = xDivMod[0]; + yRem = yDivMod[0]; + result.push(fn(xDigit, yDigit)); + } + var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0); + for (var i = result.length - 1; i >= 0; i -= 1) { + sum = sum.multiply(highestPower2).add(bigInt(result[i])); + } + return sum; + } + + BigInteger.prototype.not = function () { + return this.negate().prev(); + }; + SmallInteger.prototype.not = BigInteger.prototype.not; + + BigInteger.prototype.and = function (n) { + return bitwise(this, n, function (a, b) { return a & b; }); + }; + SmallInteger.prototype.and = BigInteger.prototype.and; + + BigInteger.prototype.or = function (n) { + return bitwise(this, n, function (a, b) { return a | b; }); + }; + SmallInteger.prototype.or = BigInteger.prototype.or; + + BigInteger.prototype.xor = function (n) { + return bitwise(this, n, function (a, b) { return a ^ b; }); + }; + SmallInteger.prototype.xor = BigInteger.prototype.xor; + + var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I; + function roughLOB(n) { // get lowestOneBit (rough) + // SmallInteger: return Min(lowestOneBit(n), 1 << 30) + // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7] + var v = n.value, x = typeof v === "number" ? v | LOBMASK_I : v[0] + v[1] * BASE | LOBMASK_BI; + return x & -x; + } + + function integerLogarithm(value, base) { + if (base.compareTo(value) <= 0) { + var tmp = integerLogarithm(value, base.square(base)); + var p = tmp.p; + var e = tmp.e; + var t = p.multiply(base); + return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 }; + } + return { p: bigInt(1), e: 0 }; + } + + BigInteger.prototype.bitLength = function () { + var n = this; + if (n.compareTo(bigInt(0)) < 0) { + n = n.negate().subtract(bigInt(1)); + } + if (n.compareTo(bigInt(0)) === 0) { + return bigInt(0); + } + return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1)); + } + SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength; + + function max(a, b) { + a = parseValue(a); + b = parseValue(b); + return a.greater(b) ? a : b; + } + function min(a, b) { + a = parseValue(a); + b = parseValue(b); + return a.lesser(b) ? a : b; + } + function gcd(a, b) { + a = parseValue(a).abs(); + b = parseValue(b).abs(); + if (a.equals(b)) return a; + if (a.isZero()) return b; + if (b.isZero()) return a; + var c = Integer[1], d, t; + while (a.isEven() && b.isEven()) { + d = Math.min(roughLOB(a), roughLOB(b)); + a = a.divide(d); + b = b.divide(d); + c = c.multiply(d); + } + while (a.isEven()) { + a = a.divide(roughLOB(a)); + } + do { + while (b.isEven()) { + b = b.divide(roughLOB(b)); + } + if (a.greater(b)) { + t = b; b = a; a = t; + } + b = b.subtract(a); + } while (!b.isZero()); + return c.isUnit() ? a : a.multiply(c); + } + function lcm(a, b) { + a = parseValue(a).abs(); + b = parseValue(b).abs(); + return a.divide(gcd(a, b)).multiply(b); + } + function randBetween(a, b) { + a = parseValue(a); + b = parseValue(b); + var low = min(a, b), high = max(a, b); + var range = high.subtract(low).add(1); + if (range.isSmall) return low.add(Math.floor(Math.random() * range)); + var length = range.value.length - 1; + var result = [], restricted = true; + for (var i = length; i >= 0; i--) { + var top = restricted ? range.value[i] : BASE; + var digit = truncate(Math.random() * top); + result.unshift(digit); + if (digit < top) restricted = false; + } + result = arrayToSmall(result); + return low.add(typeof result === "number" ? new SmallInteger(result) : new BigInteger(result, false)); + } + var parseBase = function (text, base) { + var length = text.length; + var i; + var absBase = Math.abs(base); + for (var i = 0; i < length; i++) { + var c = text[i].toLowerCase(); + if (c === "-") continue; + if (/[a-z0-9]/.test(c)) { + if (/[0-9]/.test(c) && +c >= absBase) { + if (c === "1" && absBase === 1) continue; + throw new Error(c + " is not a valid digit in base " + base + "."); + } else if (c.charCodeAt(0) - 87 >= absBase) { + throw new Error(c + " is not a valid digit in base " + base + "."); + } + } + } + if (2 <= base && base <= 36) { + if (length <= LOG_MAX_INT / Math.log(base)) { + var result = parseInt(text, base); + if (isNaN(result)) { + throw new Error(c + " is not a valid digit in base " + base + "."); + } + return new SmallInteger(parseInt(text, base)); + } + } + base = parseValue(base); + var digits = []; + var isNegative = text[0] === "-"; + for (i = isNegative ? 1 : 0; i < text.length; i++) { + var c = text[i].toLowerCase(), + charCode = c.charCodeAt(0); + if (48 <= charCode && charCode <= 57) digits.push(parseValue(c)); + else if (97 <= charCode && charCode <= 122) digits.push(parseValue(c.charCodeAt(0) - 87)); + else if (c === "<") { + var start = i; + do { i++; } while (text[i] !== ">"); + digits.push(parseValue(text.slice(start + 1, i))); + } + else throw new Error(c + " is not a valid character"); + } + return parseBaseFromArray(digits, base, isNegative); + }; + + function parseBaseFromArray(digits, base, isNegative) { + var val = Integer[0], pow = Integer[1], i; + for (i = digits.length - 1; i >= 0; i--) { + val = val.add(digits[i].times(pow)); + pow = pow.times(base); + } + return isNegative ? val.negate() : val; + } + + function stringify(digit) { + if (digit <= 35) { + return "0123456789abcdefghijklmnopqrstuvwxyz".charAt(digit); + } + return "<" + digit + ">"; + } + + function toBase(n, base) { + base = bigInt(base); + if (base.isZero()) { + if (n.isZero()) return { value: [0], isNegative: false }; + throw new Error("Cannot convert nonzero numbers to base 0."); + } + if (base.equals(-1)) { + if (n.isZero()) return { value: [0], isNegative: false }; + if (n.isNegative()) + return { + value: [].concat.apply([], Array.apply(null, Array(-n)) + .map(Array.prototype.valueOf, [1, 0]) + ), + isNegative: false + }; + + var arr = Array.apply(null, Array(+n - 1)) + .map(Array.prototype.valueOf, [0, 1]); + arr.unshift([1]); + return { + value: [].concat.apply([], arr), + isNegative: false + }; + } + + var neg = false; + if (n.isNegative() && base.isPositive()) { + neg = true; + n = n.abs(); + } + if (base.equals(1)) { + if (n.isZero()) return { value: [0], isNegative: false }; + + return { + value: Array.apply(null, Array(+n)) + .map(Number.prototype.valueOf, 1), + isNegative: neg + }; + } + var out = []; + var left = n, divmod; + while (left.isNegative() || left.compareAbs(base) >= 0) { + divmod = left.divmod(base); + left = divmod.quotient; + var digit = divmod.remainder; + if (digit.isNegative()) { + digit = base.minus(digit).abs(); + left = left.next(); + } + out.push(digit.toJSNumber()); + } + out.push(left.toJSNumber()); + return { value: out.reverse(), isNegative: neg }; + } + + function toBaseString(n, base) { + var arr = toBase(n, base); + return (arr.isNegative ? "-" : "") + arr.value.map(stringify).join(''); + } + + BigInteger.prototype.toArray = function (radix) { + return toBase(this, radix); + }; + + SmallInteger.prototype.toArray = function (radix) { + return toBase(this, radix); + }; + + BigInteger.prototype.toString = function (radix) { + if (radix === undefined) radix = 10; + if (radix !== 10) return toBaseString(this, radix); + var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit; + while (--l >= 0) { + digit = String(v[l]); + str += zeros.slice(digit.length) + digit; + } + var sign = this.sign ? "-" : ""; + return sign + str; + }; + + SmallInteger.prototype.toString = function (radix) { + if (radix === undefined) radix = 10; + if (radix != 10) return toBaseString(this, radix); + return String(this.value); + }; + BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); } + + BigInteger.prototype.valueOf = function () { + return parseInt(this.toString(), 10); + }; + BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf; + + SmallInteger.prototype.valueOf = function () { + return this.value; + }; + SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf; + + function parseStringValue(v) { + if (isPrecise(+v)) { + var x = +v; + if (x === truncate(x)) + return new SmallInteger(x); + throw new Error("Invalid integer: " + v); + } + var sign = v[0] === "-"; + if (sign) v = v.slice(1); + var split = v.split(/e/i); + if (split.length > 2) throw new Error("Invalid integer: " + split.join("e")); + if (split.length === 2) { + var exp = split[1]; + if (exp[0] === "+") exp = exp.slice(1); + exp = +exp; + if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent."); + var text = split[0]; + var decimalPlace = text.indexOf("."); + if (decimalPlace >= 0) { + exp -= text.length - decimalPlace - 1; + text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1); + } + if (exp < 0) throw new Error("Cannot include negative exponent part for integers"); + text += (new Array(exp + 1)).join("0"); + v = text; + } + var isValid = /^([0-9][0-9]*)$/.test(v); + if (!isValid) throw new Error("Invalid integer: " + v); + var r = [], max = v.length, l = LOG_BASE, min = max - l; + while (max > 0) { + r.push(+v.slice(min, max)); + min -= l; + if (min < 0) min = 0; + max -= l; + } + trim(r); + return new BigInteger(r, sign); + } + + function parseNumberValue(v) { + if (isPrecise(v)) { + if (v !== truncate(v)) throw new Error(v + " is not an integer."); + return new SmallInteger(v); + } + return parseStringValue(v.toString()); + } + + function parseValue(v) { + if (typeof v === "number") { + return parseNumberValue(v); + } + if (typeof v === "string") { + return parseStringValue(v); + } + return v; + } + // Pre-define numbers in range [-999,999] + for (var i = 0; i < 1000; i++) { + Integer[i] = new SmallInteger(i); + if (i > 0) Integer[-i] = new SmallInteger(-i); + } + // Backwards compatibility + Integer.one = Integer[1]; + Integer.zero = Integer[0]; + Integer.minusOne = Integer[-1]; + Integer.max = max; + Integer.min = min; + Integer.gcd = gcd; + Integer.lcm = lcm; + Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger; }; + Integer.randBetween = randBetween; + + Integer.fromArray = function (digits, base, isNegative) { + return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative); + }; + + return Integer; +})(); + +// Node.js check +if (typeof module !== "undefined" && module.hasOwnProperty("exports")) { + module.exports = bigInt; +} + +//amd check +if (typeof define === "function" && define.amd) { + define("big-integer", [], function () { + return bigInt; + }); +} diff --git a/node_modules/cordova-android/node_modules/big-integer/BigInteger.min.js b/node_modules/cordova-android/node_modules/big-integer/BigInteger.min.js new file mode 100644 index 0000000..8ec9160 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/BigInteger.min.js @@ -0,0 +1 @@ +var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i=base?1:0;r[i]=sum-carry*base}while(i0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;ib_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(absb.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;if(result.isZero())return result;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero()||result.isNegative()&&result.isUnit())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function integerLogarithm(value,base){if(base.compareTo(value)<=0){var tmp=integerLogarithm(value,base.square(base));var p=tmp.p;var e=tmp.e;var t=p.multiply(base);return t.compareTo(value)<=0?{p:t,e:e*2+1}:{p:p,e:e*2}}return{p:bigInt(1),e:0}}BigInteger.prototype.bitLength=function(){var n=this;if(n.compareTo(bigInt(0))<0){n=n.negate().subtract(bigInt(1))}if(n.compareTo(bigInt(0))===0){return bigInt(0)}return bigInt(integerLogarithm(n,bigInt(2)).e).add(bigInt(1))};SmallInteger.prototype.bitLength=BigInteger.prototype.bitLength;function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){if(digit<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(digit)}return"<"+digit+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return{value:[0],isNegative:false};throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return{value:[0],isNegative:false};if(n.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-n)).map(Array.prototype.valueOf,[1,0])),isNegative:false};var arr=Array.apply(null,Array(+n-1)).map(Array.prototype.valueOf,[0,1]);arr.unshift([1]);return{value:[].concat.apply([],arr),isNegative:false}}var neg=false;if(n.isNegative()&&base.isPositive()){neg=true;n=n.abs()}if(base.equals(1)){if(n.isZero())return{value:[0],isNegative:false};return{value:Array.apply(null,Array(+n)).map(Number.prototype.valueOf,1),isNegative:neg}}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(digit.toJSNumber())}out.push(left.toJSNumber());return{value:out.reverse(),isNegative:neg}}function toBaseString(n,base){var arr=toBase(n,base);return(arr.isNegative?"-":"")+arr.value.map(stringify).join("")}BigInteger.prototype.toArray=function(radix){return toBase(this,radix)};SmallInteger.prototype.toArray=function(radix){return toBase(this,radix)};BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBaseString(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBaseString(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return parseInt(this.toString(),10)};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw new Error("Invalid integer: "+v)}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})} \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/big-integer/LICENSE b/node_modules/cordova-android/node_modules/big-integer/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/node_modules/cordova-android/node_modules/big-integer/README.md b/node_modules/cordova-android/node_modules/big-integer/README.md new file mode 100644 index 0000000..55ab8d3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/README.md @@ -0,0 +1,570 @@ +# BigInteger.js [![Build Status][travis-img]][travis-url] [![Coverage Status][coveralls-img]][coveralls-url] [![Monthly Downloads][downloads-img]][downloads-url] + +[travis-url]: https://travis-ci.org/peterolson/BigInteger.js +[travis-img]: https://travis-ci.org/peterolson/BigInteger.js.svg?branch=master +[coveralls-url]: https://coveralls.io/github/peterolson/BigInteger.js?branch=master +[coveralls-img]: https://coveralls.io/repos/peterolson/BigInteger.js/badge.svg?branch=master&service=github +[downloads-url]: https://www.npmjs.com/package/big-integer +[downloads-img]: https://img.shields.io/npm/dm/big-integer.svg + +**BigInteger.js** is an arbitrary-length integer library for Javascript, allowing arithmetic operations on integers of unlimited size, notwithstanding memory and time limitations. + +## Installation + +If you are using a browser, you can download [BigInteger.js from GitHub](http://peterolson.github.com/BigInteger.js/BigInteger.min.js) or just hotlink to it: + + + +If you are using node, you can install BigInteger with [npm](https://npmjs.org/). + + npm install big-integer + +Then you can include it in your code: + + var bigInt = require("big-integer"); + + +## Usage +### `bigInt(number, [base])` + +You can create a bigInt by calling the `bigInt` function. You can pass in + + - a string, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails. + - a Javascript number, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails. + - another bigInt. + - nothing, and it will return `bigInt.zero`. + + If you provide a second parameter, then it will parse `number` as a number in base `base`. Note that `base` can be any bigInt (even negative or zero). The letters "a-z" and "A-Z" will be interpreted as the numbers 10 to 35. Higher digits can be specified in angle brackets (`<` and `>`). + +Examples: + + var zero = bigInt(); + var ninetyThree = bigInt(93); + var largeNumber = bigInt("75643564363473453456342378564387956906736546456235345"); + var googol = bigInt("1e100"); + var bigNumber = bigInt(largeNumber); + + var maximumByte = bigInt("FF", 16); + var fiftyFiveGoogol = bigInt("<55>0", googol); + +Note that Javascript numbers larger than `9007199254740992` and smaller than `-9007199254740992` are not precisely represented numbers and will not produce exact results. If you are dealing with numbers outside that range, it is better to pass in strings. + +### Method Chaining + +Note that bigInt operations return bigInts, which allows you to chain methods, for example: + + var salary = bigInt(dollarsPerHour).times(hoursWorked).plus(randomBonuses) + +### Constants + +There are three named constants already stored that you do not have to construct with the `bigInt` function yourself: + + - `bigInt.one`, equivalent to `bigInt(1)` + - `bigInt.zero`, equivalent to `bigInt(0)` + - `bigInt.minusOne`, equivalent to `bigInt(-1)` + +The numbers from -999 to 999 are also already prestored and can be accessed using `bigInt[index]`, for example: + + - `bigInt[-999]`, equivalent to `bigInt(-999)` + - `bigInt[256]`, equivalent to `bigInt(256)` + +### Methods + +#### `abs()` + +Returns the absolute value of a bigInt. + + - `bigInt(-45).abs()` => `45` + - `bigInt(45).abs()` => `45` + +#### `add(number)` + +Performs addition. + + - `bigInt(5).add(7)` => `12` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition) + +#### `and(number)` + +Performs the bitwise AND operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(6).and(3)` => `2` + - `bigInt(6).and(-3)` => `4` + +#### `bitLength()` + +Returns the number of digits required to represent a bigInt in binary. + + - `bigInt(5)` => `3` (since 5 is `101` in binary, which is three digits long) + +#### `compare(number)` + +Performs a comparison between two numbers. If the numbers are equal, it returns `0`. If the first number is greater, it returns `1`. If the first number is lesser, it returns `-1`. + + - `bigInt(5).compare(5)` => `0` + - `bigInt(5).compare(4)` => `1` + - `bigInt(4).compare(5)` => `-1` + +#### `compareAbs(number)` + +Performs a comparison between the absolute value of two numbers. + + - `bigInt(5).compareAbs(-5)` => `0` + - `bigInt(5).compareAbs(4)` => `1` + - `bigInt(4).compareAbs(-5)` => `-1` + +#### `compareTo(number)` + +Alias for the `compare` method. + +#### `divide(number)` + +Performs integer division, disregarding the remainder. + + - `bigInt(59).divide(5)` => `11` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `divmod(number)` + +Performs division and returns an object with two properties: `quotient` and `remainder`. The sign of the remainder will match the sign of the dividend. + + - `bigInt(59).divmod(5)` => `{quotient: bigInt(11), remainder: bigInt(4) }` + - `bigInt(-5).divmod(2)` => `{quotient: bigInt(-2), remainder: bigInt(-1) }` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `eq(number)` + +Alias for the `equals` method. + +#### `equals(number)` + +Checks if two numbers are equal. + + - `bigInt(5).equals(5)` => `true` + - `bigInt(4).equals(7)` => `false` + +#### `geq(number)` + +Alias for the `greaterOrEquals` method. + + +#### `greater(number)` + +Checks if the first number is greater than the second. + + - `bigInt(5).greater(6)` => `false` + - `bigInt(5).greater(5)` => `false` + - `bigInt(5).greater(4)` => `true` + +#### `greaterOrEquals(number)` + +Checks if the first number is greater than or equal to the second. + + - `bigInt(5).greaterOrEquals(6)` => `false` + - `bigInt(5).greaterOrEquals(5)` => `true` + - `bigInt(5).greaterOrEquals(4)` => `true` + +#### `gt(number)` + +Alias for the `greater` method. + +#### `isDivisibleBy(number)` + +Returns `true` if the first number is divisible by the second number, `false` otherwise. + + - `bigInt(999).isDivisibleBy(333)` => `true` + - `bigInt(99).isDivisibleBy(5)` => `false` + +#### `isEven()` + +Returns `true` if the number is even, `false` otherwise. + + - `bigInt(6).isEven()` => `true` + - `bigInt(3).isEven()` => `false` + +#### `isNegative()` + +Returns `true` if the number is negative, `false` otherwise. +Returns `false` for `0` and `-0`. + + - `bigInt(-23).isNegative()` => `true` + - `bigInt(50).isNegative()` => `false` + +#### `isOdd()` + +Returns `true` if the number is odd, `false` otherwise. + + - `bigInt(13).isOdd()` => `true` + - `bigInt(40).isOdd()` => `false` + +#### `isPositive()` + +Return `true` if the number is positive, `false` otherwise. +Returns `false` for `0` and `-0`. + + - `bigInt(54).isPositive()` => `true` + - `bigInt(-1).isPositive()` => `false` + +#### `isPrime()` + +Returns `true` if the number is prime, `false` otherwise. + + - `bigInt(5).isPrime()` => `true` + - `bigInt(6).isPrime()` => `false` + +#### `isProbablePrime([iterations])` + +Returns `true` if the number is very likely to be prime, `false` otherwise. +Argument is optional and determines the amount of iterations of the test (default: `5`). The more iterations, the lower chance of getting a false positive. +This uses the [Fermat primality test](https://en.wikipedia.org/wiki/Fermat_primality_test). + + - `bigInt(5).isProbablePrime()` => `true` + - `bigInt(49).isProbablePrime()` => `false` + - `bigInt(1729).isProbablePrime(50)` => `false` + +Note that this function is not deterministic, since it relies on random sampling of factors, so the result for some numbers is not always the same. [Carmichael numbers](https://en.wikipedia.org/wiki/Carmichael_number) are particularly prone to give unreliable results. + +For example, `bigInt(1729).isProbablePrime()` returns `false` about 76% of the time and `true` about 24% of the time. The correct result is `false`. + +#### `isUnit()` + +Returns `true` if the number is `1` or `-1`, `false` otherwise. + + - `bigInt.one.isUnit()` => `true` + - `bigInt.minusOne.isUnit()` => `true` + - `bigInt(5).isUnit()` => `false` + +#### `isZero()` + +Return `true` if the number is `0` or `-0`, `false` otherwise. + + - `bigInt.zero.isZero()` => `true` + - `bigInt("-0").isZero()` => `true` + - `bigInt(50).isZero()` => `false` + +#### `leq(number)` + +Alias for the `lesserOrEquals` method. + +#### `lesser(number)` + +Checks if the first number is lesser than the second. + + - `bigInt(5).lesser(6)` => `true` + - `bigInt(5).lesser(5)` => `false` + - `bigInt(5).lesser(4)` => `false` + +#### `lesserOrEquals(number)` + +Checks if the first number is less than or equal to the second. + + - `bigInt(5).lesserOrEquals(6)` => `true` + - `bigInt(5).lesserOrEquals(5)` => `true` + - `bigInt(5).lesserOrEquals(4)` => `false` + +#### `lt(number)` + +Alias for the `lesser` method. + +#### `minus(number)` + +Alias for the `subtract` method. + + - `bigInt(3).minus(5)` => `-2` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction) + +#### `mod(number)` + +Performs division and returns the remainder, disregarding the quotient. The sign of the remainder will match the sign of the dividend. + + - `bigInt(59).mod(5)` => `4` + - `bigInt(-5).mod(2)` => `-1` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `modInv(mod)` + +Finds the [multiplicative inverse](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse) of the number modulo `mod`. + + - `bigInt(3).modInv(11)` => `4` + - `bigInt(42).modInv(2017)` => `1969` + +#### `modPow(exp, mod)` + +Takes the number to the power `exp` modulo `mod`. + + - `bigInt(10).modPow(3, 30)` => `10` + +#### `multiply(number)` + +Performs multiplication. + + - `bigInt(111).multiply(111)` => `12321` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication) + +#### `neq(number)` + +Alias for the `notEquals` method. + +#### `next()` + +Adds one to the number. + + - `bigInt(6).next()` => `7` + +#### `not()` + +Performs the bitwise NOT operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(10).not()` => `-11` + - `bigInt(0).not()` => `-1` + +#### `notEquals(number)` + +Checks if two numbers are not equal. + + - `bigInt(5).notEquals(5)` => `false` + - `bigInt(4).notEquals(7)` => `true` + +#### `or(number)` + +Performs the bitwise OR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(13).or(10)` => `15` + - `bigInt(13).or(-8)` => `-3` + +#### `over(number)` + +Alias for the `divide` method. + + - `bigInt(59).over(5)` => `11` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `plus(number)` + +Alias for the `add` method. + + - `bigInt(5).plus(7)` => `12` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition) + +#### `pow(number)` + +Performs exponentiation. If the exponent is less than `0`, `pow` returns `0`. `bigInt.zero.pow(0)` returns `1`. + + - `bigInt(16).pow(16)` => `18446744073709551616` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Exponentiation) + +#### `prev(number)` + +Subtracts one from the number. + + - `bigInt(6).prev()` => `5` + +#### `remainder(number)` + +Alias for the `mod` method. + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `shiftLeft(n)` + +Shifts the number left by `n` places in its binary representation. If a negative number is provided, it will shift right. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt(8).shiftLeft(2)` => `32` + - `bigInt(8).shiftLeft(-2)` => `2` + +#### `shiftRight(n)` + +Shifts the number right by `n` places in its binary representation. If a negative number is provided, it will shift left. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt(8).shiftRight(2)` => `2` + - `bigInt(8).shiftRight(-2)` => `32` + +#### `square()` + +Squares the number + + - `bigInt(3).square()` => `9` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Squaring) + +#### `subtract(number)` + +Performs subtraction. + + - `bigInt(3).subtract(5)` => `-2` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction) + +#### `times(number)` + +Alias for the `multiply` method. + + - `bigInt(111).times(111)` => `12321` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication) + +#### `toArray(radix)` + +Converts a bigInt into an object with the properties "value" and "isNegative." "Value" is an array of integers modulo the given radix. "isNegative" is a boolean that represents the sign of the result. + + - `bigInt("1e9").toArray(10)` => { + value: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + isNegative: false + } + - `bigInt("1e9").toArray(16)` => { + value: [3, 11, 9, 10, 12, 10, 0, 0], + isNegative: false + } + - `bigInt(567890).toArray(100)` => { + value: [56, 78, 90], + isNegative: false + } + +Negative bases are supported. + + - `bigInt(12345).toArray(-10)` => { + value: [2, 8, 4, 6, 5], + isNegative: false + } + +Base 1 and base -1 are also supported. + + - `bigInt(-15).toArray(1)` => { + value: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + isNegative: true + } + - `bigInt(-15).toArray(-1)` => { + value: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], + isNegative: false + } + +Base 0 is only allowed for the number zero. + + - `bigInt(0).toArray(0)` => { + value: [0], + isNegative: false + } + - `bigInt(1).toArray(0)` => `Error: Cannot convert nonzero numbers to base 0.` + +#### `toJSNumber()` + +Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt("18446744073709551616").toJSNumber()` => `18446744073709552000` + +#### `xor(number)` + +Performs the bitwise XOR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(12).xor(5)` => `9` + - `bigInt(12).xor(-5)` => `-9` + +### Static Methods + +#### `fromArray(digits, base = 10, isNegative?)` + +Constructs a bigInt from an array of digits in base `base`. The optional `isNegative` flag will make the number negative. + + - `bigInt.fromArray([1, 2, 3, 4, 5], 10)` => `12345` + - `bigInt.fromArray([1, 0, 0], 2, true)` => `-4` + +#### `gcd(a, b)` + +Finds the greatest common denominator of `a` and `b`. + + - `bigInt.gcd(42,56)` => `14` + +#### `isInstance(x)` + +Returns `true` if `x` is a BigInteger, `false` otherwise. + + - `bigInt.isInstance(bigInt(14))` => `true` + - `bigInt.isInstance(14)` => `false` + +#### `lcm(a,b)` + +Finds the least common multiple of `a` and `b`. + + - `bigInt.lcm(21, 6)` => `42` + +#### `max(a,b)` + +Returns the largest of `a` and `b`. + + - `bigInt.max(77, 432)` => `432` + +#### `min(a,b)` + +Returns the smallest of `a` and `b`. + + - `bigInt.min(77, 432)` => `77` + +#### `randBetween(min, max)` + +Returns a random number between `min` and `max`. + + - `bigInt.randBetween("-1e100", "1e100")` => (for example) `8494907165436643479673097939554427056789510374838494147955756275846226209006506706784609314471378745` + + +### Override Methods + +#### `toString(radix = 10)` + +Converts a bigInt to a string. There is an optional radix parameter (which defaults to 10) that converts the number to the given radix. Digits in the range `10-35` will use the letters `a-z`. + + - `bigInt("1e9").toString()` => `"1000000000"` + - `bigInt("1e9").toString(16)` => `"3b9aca00"` + +**Note that arithmetical operators will trigger the `valueOf` function rather than the `toString` function.** When converting a bigInteger to a string, you should use the `toString` method or the `String` function instead of adding the empty string. + + - `bigInt("999999999999999999").toString()` => `"999999999999999999"` + - `String(bigInt("999999999999999999"))` => `"999999999999999999"` + - `bigInt("999999999999999999") + ""` => `1000000000000000000` + +Bases larger than 36 are supported. If a digit is greater than or equal to 36, it will be enclosed in angle brackets. + + - `bigInt(567890).toString(100)` => `"<56><78><90>"` + +Negative bases are also supported. + + - `bigInt(12345).toString(-10)` => `"28465"` + +Base 1 and base -1 are also supported. + + - `bigInt(-15).toString(1)` => `"-111111111111111"` + - `bigInt(-15).toString(-1)` => `"101010101010101010101010101010"` + +Base 0 is only allowed for the number zero. + + - `bigInt(0).toString(0)` => `0` + - `bigInt(1).toString(0)` => `Error: Cannot convert nonzero numbers to base 0.` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#toString) + +#### `valueOf()` + +Converts a bigInt to a native Javascript number. This override allows you to use native arithmetic operators without explicit conversion: + + - `bigInt("100") + bigInt("200") === 300; //true` + +## Contributors + +To contribute, just fork the project, make some changes, and submit a pull request. Please verify that the unit tests pass before submitting. + +The unit tests are contained in the `spec/spec.js` file. You can run them locally by opening the `spec/SpecRunner.html` or file or running `npm test`. You can also [run the tests online from GitHub](http://peterolson.github.io/BigInteger.js/spec/SpecRunner.html). + +There are performance benchmarks that can be viewed from the `benchmarks/index.html` page. You can [run them online from GitHub](http://peterolson.github.io/BigInteger.js/benchmark/). + +## License + +This project is public domain. For more details, read about the [Unlicense](http://unlicense.org/). diff --git a/node_modules/cordova-android/node_modules/big-integer/bower.json b/node_modules/cordova-android/node_modules/big-integer/bower.json new file mode 100644 index 0000000..22dc58f --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/bower.json @@ -0,0 +1,29 @@ +{ + "name": "big-integer", + "description": "An arbitrary length integer library for Javascript", + "main": "./BigInteger.js", + "authors": [ + "Peter Olson" + ], + "license": "Unlicense", + "keywords": [ + "math", + "big", + "bignum", + "bigint", + "biginteger", + "integer", + "arbitrary", + "precision", + "arithmetic" + ], + "homepage": "https://github.com/peterolson/BigInteger.js", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "coverage", + "tests" + ] +} diff --git a/node_modules/cordova-android/node_modules/big-integer/package.json b/node_modules/cordova-android/node_modules/big-integer/package.json new file mode 100644 index 0000000..867c19e --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/package.json @@ -0,0 +1,81 @@ +{ + "_from": "big-integer@^1.6.7", + "_id": "big-integer@1.6.32", + "_inBundle": true, + "_integrity": "sha512-ljKJdR3wk9thHfLj4DtrNiOSTxvGFaMjWrG4pW75juXC4j7+XuKJVFdg4kgFMYp85PVkO05dFMj2dk2xVsH4xw==", + "_location": "/cordova-android/big-integer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "big-integer@^1.6.7", + "name": "big-integer", + "escapedName": "big-integer", + "rawSpec": "^1.6.7", + "saveSpec": null, + "fetchSpec": "^1.6.7" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/bplist-parser" + ], + "_resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.32.tgz", + "_shasum": "5867458b25ecd5bcb36b627c30bb501a13c07e89", + "_spec": "big-integer@^1.6.7", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/bplist-parser", + "author": { + "name": "Peter Olson", + "email": "peter.e.c.olson+npm@gmail.com" + }, + "bin": {}, + "bugs": { + "url": "https://github.com/peterolson/BigInteger.js/issues" + }, + "bundleDependencies": false, + "contributors": [], + "deprecated": false, + "description": "An arbitrary length integer library for Javascript", + "devDependencies": { + "@types/lodash": "^4.14.109", + "@types/node": "^7.0.65", + "coveralls": "^2.11.4", + "jasmine": "2.1.x", + "jasmine-core": "^2.3.4", + "karma": "^0.13.22", + "karma-cli": "^1.0.1", + "karma-coverage": "^0.4.2", + "karma-jasmine": "^0.3.6", + "karma-phantomjs-launcher": "^1.0.4", + "lodash": "^4.17.4", + "typescript": "^2.3.3", + "uglifyjs": "^2.4.10" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/peterolson/BigInteger.js#readme", + "keywords": [ + "math", + "big", + "bignum", + "bigint", + "biginteger", + "integer", + "arbitrary", + "precision", + "arithmetic" + ], + "license": "Unlicense", + "main": "./BigInteger", + "name": "big-integer", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/peterolson/BigInteger.js.git" + }, + "scripts": { + "minify": "uglifyjs BigInteger.js -o BigInteger.min.js", + "test": "tsc && karma start my.conf.js && node spec/tsDefinitions.js" + }, + "typings": "./BigInteger.d.ts", + "version": "1.6.32" +} diff --git a/node_modules/cordova-android/node_modules/big-integer/tsconfig.json b/node_modules/cordova-android/node_modules/big-integer/tsconfig.json new file mode 100644 index 0000000..62636e8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/big-integer/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "baseUrl": "./", + "moduleResolution": "node", + "allowJs": true, + "typeRoots": [ + "./" + ], + "types": [ + "node" + ], + "forceConsistentCasingInFileNames": true + }, + "files": [ + "BigInteger.d.ts", + "spec/tsDefinitions.ts" + ] +} \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/bplist-parser/.npmignore b/node_modules/cordova-android/node_modules/bplist-parser/.npmignore new file mode 100644 index 0000000..a9b46ea --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/.npmignore @@ -0,0 +1,8 @@ +/build/* +node_modules +*.node +*.sh +*.swp +.lock* +npm-debug.log +.idea diff --git a/node_modules/cordova-android/node_modules/bplist-parser/README.md b/node_modules/cordova-android/node_modules/bplist-parser/README.md new file mode 100644 index 0000000..37e5e1c --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/README.md @@ -0,0 +1,47 @@ +bplist-parser +============= + +Binary Mac OS X Plist (property list) parser. + +## Installation + +```bash +$ npm install bplist-parser +``` + +## Quick Examples + +```javascript +var bplist = require('bplist-parser'); + +bplist.parseFile('myPlist.bplist', function(err, obj) { + if (err) throw err; + + console.log(JSON.stringify(obj)); +}); +``` + +## License + +(The MIT License) + +Copyright (c) 2012 Near Infinity Corporation + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/bplist-parser/bplistParser.js b/node_modules/cordova-android/node_modules/bplist-parser/bplistParser.js new file mode 100644 index 0000000..f8335bc --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/bplistParser.js @@ -0,0 +1,357 @@ +'use strict'; + +// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java + +var fs = require('fs'); +var bigInt = require("big-integer"); +var debug = false; + +exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg +exports.maxObjectCount = 32768; + +// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime(); +// ...but that's annoying in a static initializer because it can throw exceptions, ick. +// So we just hardcode the correct value. +var EPOCH = 978307200000; + +// UID object definition +var UID = exports.UID = function(id) { + this.UID = id; +} + +var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) { + function tryParseBuffer(buffer) { + var err = null; + var result; + try { + result = parseBuffer(buffer); + } catch (ex) { + err = ex; + } + callback(err, result); + } + + if (Buffer.isBuffer(fileNameOrBuffer)) { + return tryParseBuffer(fileNameOrBuffer); + } else { + fs.readFile(fileNameOrBuffer, function (err, data) { + if (err) { return callback(err); } + tryParseBuffer(data); + }); + } +}; + +var parseBuffer = exports.parseBuffer = function (buffer) { + var result = {}; + + // check header + var header = buffer.slice(0, 'bplist'.length).toString('utf8'); + if (header !== 'bplist') { + throw new Error("Invalid binary plist. Expected 'bplist' at offset 0."); + } + + // Handle trailer, last 32 bytes of the file + var trailer = buffer.slice(buffer.length - 32, buffer.length); + // 6 null bytes (index 0 to 5) + var offsetSize = trailer.readUInt8(6); + if (debug) { + console.log("offsetSize: " + offsetSize); + } + var objectRefSize = trailer.readUInt8(7); + if (debug) { + console.log("objectRefSize: " + objectRefSize); + } + var numObjects = readUInt64BE(trailer, 8); + if (debug) { + console.log("numObjects: " + numObjects); + } + var topObject = readUInt64BE(trailer, 16); + if (debug) { + console.log("topObject: " + topObject); + } + var offsetTableOffset = readUInt64BE(trailer, 24); + if (debug) { + console.log("offsetTableOffset: " + offsetTableOffset); + } + + if (numObjects > exports.maxObjectCount) { + throw new Error("maxObjectCount exceeded"); + } + + // Handle offset table + var offsetTable = []; + + for (var i = 0; i < numObjects; i++) { + var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize); + offsetTable[i] = readUInt(offsetBytes, 0); + if (debug) { + console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]"); + } + } + + // Parses an object inside the currently parsed binary property list. + // For the format specification check + // + // Apple's binary property list parser implementation. + function parseObject(tableOffset) { + var offset = offsetTable[tableOffset]; + var type = buffer[offset]; + var objType = (type & 0xF0) >> 4; //First 4 bits + var objInfo = (type & 0x0F); //Second 4 bits + switch (objType) { + case 0x0: + return parseSimple(); + case 0x1: + return parseInteger(); + case 0x8: + return parseUID(); + case 0x2: + return parseReal(); + case 0x3: + return parseDate(); + case 0x4: + return parseData(); + case 0x5: // ASCII + return parsePlistString(); + case 0x6: // UTF-16 + return parsePlistString(true); + case 0xA: + return parseArray(); + case 0xD: + return parseDictionary(); + default: + throw new Error("Unhandled type 0x" + objType.toString(16)); + } + + function parseSimple() { + //Simple + switch (objInfo) { + case 0x0: // null + return null; + case 0x8: // false + return false; + case 0x9: // true + return true; + case 0xF: // filler byte + return null; + default: + throw new Error("Unhandled simple type 0x" + objType.toString(16)); + } + } + + function bufferToHexString(buffer) { + var str = ''; + var i; + for (i = 0; i < buffer.length; i++) { + if (buffer[i] != 0x00) { + break; + } + } + for (; i < buffer.length; i++) { + var part = '00' + buffer[i].toString(16); + str += part.substr(part.length - 2); + } + return str; + } + + function parseInteger() { + var length = Math.pow(2, objInfo); + if (length > 4) { + var data = buffer.slice(offset + 1, offset + 1 + length); + var str = bufferToHexString(data); + return bigInt(str, 16); + } if (length < exports.maxObjectSize) { + return readUInt(buffer.slice(offset + 1, offset + 1 + length)); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseUID() { + var length = objInfo + 1; + if (length < exports.maxObjectSize) { + return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length))); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseReal() { + var length = Math.pow(2, objInfo); + if (length < exports.maxObjectSize) { + var realBuffer = buffer.slice(offset + 1, offset + 1 + length); + if (length === 4) { + return realBuffer.readFloatBE(0); + } + else if (length === 8) { + return realBuffer.readDoubleBE(0); + } + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseDate() { + if (objInfo != 0x3) { + console.error("Unknown date type :" + objInfo + ". Parsing anyway..."); + } + var dateBuffer = buffer.slice(offset + 1, offset + 9); + return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0))); + } + + function parseData() { + var dataoffset = 1; + var length = objInfo; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + dataoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length < exports.maxObjectSize) { + return buffer.slice(offset + dataoffset, offset + dataoffset + length); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parsePlistString (isUtf16) { + isUtf16 = isUtf16 || 0; + var enc = "utf8"; + var length = objInfo; + var stroffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.err("UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + var stroffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + // length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16 + length *= (isUtf16 + 1); + if (length < exports.maxObjectSize) { + var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length)); + if (isUtf16) { + plistString = swapBytes(plistString); + enc = "ucs2"; + } + return plistString.toString(enc); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseArray() { + var length = objInfo; + var arrayoffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + arrayoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length * objectRefSize > exports.maxObjectSize) { + throw new Error("To little heap space available!"); + } + var array = []; + for (var i = 0; i < length; i++) { + var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize)); + array[i] = parseObject(objRef); + } + return array; + } + + function parseDictionary() { + var length = objInfo; + var dictoffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + dictoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length * 2 * objectRefSize > exports.maxObjectSize) { + throw new Error("To little heap space available!"); + } + if (debug) { + console.log("Parsing dictionary #" + tableOffset); + } + var dict = {}; + for (var i = 0; i < length; i++) { + var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize)); + var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize)); + var key = parseObject(keyRef); + var val = parseObject(valRef); + if (debug) { + console.log(" DICT #" + tableOffset + ": Mapped " + key + " to " + val); + } + dict[key] = val; + } + return dict; + } + } + + return [ parseObject(topObject) ]; +}; + +function readUInt(buffer, start) { + start = start || 0; + + var l = 0; + for (var i = start; i < buffer.length; i++) { + l <<= 8; + l |= buffer[i] & 0xFF; + } + return l; +} + +// we're just going to toss the high order bits because javascript doesn't have 64-bit ints +function readUInt64BE(buffer, start) { + var data = buffer.slice(start, start + 8); + return data.readUInt32BE(4, 8); +} + +function swapBytes(buffer) { + var len = buffer.length; + for (var i = 0; i < len; i += 2) { + var a = buffer[i]; + buffer[i] = buffer[i+1]; + buffer[i+1] = a; + } + return buffer; +} diff --git a/node_modules/cordova-android/node_modules/bplist-parser/package.json b/node_modules/cordova-android/node_modules/bplist-parser/package.json new file mode 100644 index 0000000..a5ffdff --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/package.json @@ -0,0 +1,59 @@ +{ + "_from": "bplist-parser@^0.1.0", + "_id": "bplist-parser@0.1.1", + "_inBundle": true, + "_integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "_location": "/cordova-android/bplist-parser", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "bplist-parser@^0.1.0", + "name": "bplist-parser", + "escapedName": "bplist-parser", + "rawSpec": "^0.1.0", + "saveSpec": null, + "fetchSpec": "^0.1.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "_shasum": "d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6", + "_spec": "bplist-parser@^0.1.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Joe Ferner", + "email": "joe.ferner@nearinfinity.com" + }, + "bugs": { + "url": "https://github.com/nearinfinity/node-bplist-parser/issues" + }, + "bundleDependencies": false, + "dependencies": { + "big-integer": "^1.6.7" + }, + "deprecated": false, + "description": "Binary plist parser.", + "devDependencies": { + "nodeunit": "~0.9.1" + }, + "homepage": "https://github.com/nearinfinity/node-bplist-parser#readme", + "keywords": [ + "bplist", + "plist", + "parser" + ], + "license": "MIT", + "main": "bplistParser.js", + "name": "bplist-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/nearinfinity/node-bplist-parser.git" + }, + "scripts": { + "test": "./node_modules/nodeunit/bin/nodeunit test" + }, + "version": "0.1.1" +} diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/airplay.bplist b/node_modules/cordova-android/node_modules/bplist-parser/test/airplay.bplist new file mode 100644 index 0000000000000000000000000000000000000000..931adea120d583e59d640bf218696d3a07a1455d GIT binary patch literal 341 zcmYc)$jK}&F)+Bv$i&RT%Er#Y$;B-oC?qT*Di)DaT9jClnV%OgAdr)vn39?jl9`(t zl$e*ES{yGRT#%DknUt8E?NpkUmRjVRTToINFCc^}>QH=U7HCd!YHD_3QcfzuN@a(wn|ao77^*Mixx~oJ z#~)f;l2}v%7gc6}0!|K2We1@q9tK@&Yi0Wn5K+#B;y_Ijl9N7$ zsu@}sIvJ)itYX;Au$5sK!vThq43`)#GhAV~%5ab2Il~KvR}AkNen8A*Vuac#1*M@B GBO?InLtPpG literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/iTunes-small.bplist b/node_modules/cordova-android/node_modules/bplist-parser/test/iTunes-small.bplist new file mode 100644 index 0000000000000000000000000000000000000000..b7edb14a00912ef3e673c0a5d8e0d0f1a7a5cad3 GIT binary patch literal 24433 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/int64.bplist b/node_modules/cordova-android/node_modules/bplist-parser/test/int64.bplist new file mode 100644 index 0000000000000000000000000000000000000000..6da9c046165aa3b5327da20d50c021b1c2474fa8 GIT binary patch literal 84 zcmYc)$jK}&F)+Bq$jrnNQk7biFTfC)nO9#K9{hA_oy; NWQ5AG!W2PieE?iB4ru@Y literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/int64.xml b/node_modules/cordova-android/node_modules/bplist-parser/test/int64.xml new file mode 100644 index 0000000..cc6cb03 --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/test/int64.xml @@ -0,0 +1,10 @@ + + + + + zero + 0 + int64item + 12345678901234567890 + + diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/parseTest.js b/node_modules/cordova-android/node_modules/bplist-parser/test/parseTest.js new file mode 100644 index 0000000..67e7bfa --- /dev/null +++ b/node_modules/cordova-android/node_modules/bplist-parser/test/parseTest.js @@ -0,0 +1,159 @@ +'use strict'; + +// tests are adapted from https://github.com/TooTallNate/node-plist + +var path = require('path'); +var nodeunit = require('nodeunit'); +var bplist = require('../'); + +module.exports = { + 'iTunes Small': function (test) { + var file = path.join(__dirname, "iTunes-small.bplist"); + var startTime1 = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime1) + 'ms'); + var dict = dicts[0]; + test.equal(dict['Application Version'], "9.0.3"); + test.equal(dict['Library Persistent ID'], "6F81D37F95101437"); + test.done(); + }); + }, + + 'sample1': function (test) { + var file = path.join(__dirname, "sample1.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['CFBundleIdentifier'], 'com.apple.dictionary.MySample'); + test.done(); + }); + }, + + 'sample2': function (test) { + var file = path.join(__dirname, "sample2.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['PopupMenu'][2]['Key'], "\n #import \n\n#import \n\nint main(int argc, char *argv[])\n{\n return macruby_main(\"rb_main.rb\", argc, argv);\n}\n"); + test.done(); + }); + }, + + 'airplay': function (test) { + var file = path.join(__dirname, "airplay.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['duration'], 5555.0495000000001); + test.equal(dict['position'], 4.6269989039999997); + test.done(); + }); + }, + + 'utf16': function (test) { + var file = path.join(__dirname, "utf16.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['CFBundleName'], 'sellStuff'); + test.equal(dict['CFBundleShortVersionString'], '2.6.1'); + test.equal(dict['NSHumanReadableCopyright'], '©2008-2012, sellStuff, Inc.'); + test.done(); + }); + }, + + 'utf16chinese': function (test) { + var file = path.join(__dirname, "utf16_chinese.plist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['CFBundleName'], '天翼阅读'); + test.equal(dict['CFBundleDisplayName'], '天翼阅读'); + test.done(); + }); + }, + + + + 'uid': function (test) { + var file = path.join(__dirname, "uid.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.deepEqual(dict['$objects'][1]['NS.keys'], [{UID:2}, {UID:3}, {UID:4}]); + test.deepEqual(dict['$objects'][1]['NS.objects'], [{UID: 5}, {UID:6}, {UID:7}]); + test.deepEqual(dict['$top']['root'], {UID:1}); + test.done(); + }); + }, + + 'int64': function (test) { + var file = path.join(__dirname, "int64.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['zero'], '0'); + test.equal(dict['int64item'], '12345678901234567890'); + test.done(); + }); + } +}; diff --git a/node_modules/cordova-android/node_modules/bplist-parser/test/sample1.bplist b/node_modules/cordova-android/node_modules/bplist-parser/test/sample1.bplist new file mode 100644 index 0000000000000000000000000000000000000000..5b808ff2e4be8741f9cc0ad57263fffca75e3d2c GIT binary patch literal 605 zcmY*V&rTFE81J`=Afgm>K|tar9y~c2xEPPHBf1Gggdsu{Y|896yA7RA)9Csz=NK64SfK+yDTuheChAkufIPBT8iBI{yEfc+#If&cxk&lXUjs z+&rUm&9&7+wIv34gfi19D!YXpkts%}hg_@eP>~2UdqZf0r^x91@EUb9W8b35-C|^o zP#s2Rf@Tzm*gA-tvYF}9h)&l!%?c4A@eWw1QEpjb+`7F+4k-AnVhk$k} z&hox?Aqy1?-fL>-Xi(zj(x#J`N_qvb10El;v|q!!D+xwtubX1J*Pz$6sdPE7Gu}xq z$rxEAFUSUYPfo}u@`d~+e_;Y1!&7(#+pr7Aa0(ycGkk?_@Ev}@FF1#PqR!n)uZ|pt(tOY<*1I zyr20SI><;{2aQ&qOf$`M{D#-nO3m?|J&y*YZ*NP-C6~&63!~|pzO(-)rCa?Mp$s)R ifMYm=K3u~9MlgXXPedc4}pD6p)7M4pT|aNh~g2%*)5$ zz|_Fpz_M6SNVtKufvthPfg=Q{*bqb*g9xJ#pdLdIVGJUSF3HHs$wxu-=OyN*MnIUU z#qk2de!;$_C5cHnsVaaBL;H@M+SEWKZY=dM1~B89ELoG0)`@nGKLC^5s7+z`B(on!kQfQjel9ql#A|%BhDYS&dAFZc})Z{wq7iiEBA_(^^jQ<*9;qX2-TcH*SOCutVlkO zCESSgnGu8@cbLW!hnz621()YiV>mK1J#m*BNDVfy?}VO-k&8{Pz%(L9_r}d1cQg~v zhegVpgb_Qmw@}KMnVb@*@3yM^0uU2d44cs5T_015g0RzywND%`WSo6L;V+?D#oFn`&KK*9!RtW-VRGD_Tp_%DLs8 z={G>r5*Xa>DY?l zx)dvX6?f8CD1BfnCN)@J(K_mW?vH%oP%n9VkvYIN_77IBO}KV@T|HmO=9aVhoThWY ziHJHaiZYTi)m-Jz!Q!X#C~nc&66r zMn6X#WfgT)rv00;0FHs%pv}wtHTV|%0Dc0$foI?)_*a-0RG}!`7aZY{a3DMueii-_ zUI_n*GvX!jx>y%o@f-1xcp&~PJ{5n5N8xdJ63)T1@Ep7hm*5J#0XJX`Zo~V~f;M~z zzk}byefSG}0-wS^;otBDdZR6&iD2mXuvJ%?Z&9;=5#*@uSb6~T(>~3g+7DZ4H zyy1-(8Hsk(8GUj_beM4*M}2U3v4{^oC^)0z_{Ja)GG4}ilWa&C_hong+xh5`HEXscCNa$tGma4Z#34||FHPT zmaV9~r&8TpUA6D27hZgMytjW-S<9<<0G04)G9x9oIA2+Qp{o!TU9)B3bMw zDwc}KB-&)3hH@$f@p9KTiT7YtH%eHuhwvoPwJbm1)eU3Qs!Nv3qGThxY;8hjhG=#g znQ)>F>WO3~ts=Xio23Sb#jbNwSISP*Ox3_vmcQARr;)M?O=3r!QF^E}CR zptdW^h5>4vcaMU2ovx>-74#%gYygVPY726UjJ^t1%C?hsmR~80LwI+Ym^cr469xAo z1LcTHY=W%`Sxlj_rWC~z;DaN0_Xv3?)y$$5Rm?+bq(HE_T^2VQM!&Av;IhDVk;tS5 zgqd*Yow7Jg@Ki5Yn7XQBa}%;~zQrdvW1v%0@DA6xUO%X3N@}9D#B@>D@SxPjW0F{g zimDCPyP!ZWNumaYDIf(8ngl>1hZ%sjLeBJ68ZPID_ zRKuuKzDX8FK7ebX?;WPJ-#qE!W1L5v2_?(vFexZSJ+bCdMbgf@B8UyoCEYjTtpVJM~vGE8vL_OaJ3$?D_?(`}k<#w()+>2jfSuObt*}#? z9pFwqNF=3*OV}Fj%M%!x;VDciM5`5Hnx-m3LWtxNIRy*hLMRYQ)I;vvC0FYMZjTtEm#aV(E=C?5)-LNE}o`)K;8qL=&-Jg3);@u?g@jmN{`P$W>- z!%~M{bh=zOu!am$1IqcPC?E*&a6Bj^viwp-^9SMy6QjJ}CP=Fit61JiP;Cm9jii@N z1w(U6Ff+XaJp*t-Ak}Z%h0F$c=FP5te0J>G(viy>UEQ2N`11qq;8~bdmIVaA9ynXn& ziRLe?9A_w9Z64WZ_UQ9)cQ*9}SW+6?gFWDeHRq<3?20|s);YD8c&{|tCwV$NeV!rD zxM#QLuxG||%5&E9v*(I;zPH;edWm5Z&mr7GRsGZalb&xtny+XZCouE!qA5ouBpHbgXKTp@62W93hQAPvUjk4Hp0f(6f3c#>=^qLdx$;8zRI3t z-(yd)pR#AzU)kR{nw!U6$KA;B++uDCw~R}0_j5^ZgxksO@aTmB> YxQpB+?y{%;_`Hp`=UDUId~tvN2l=KQ%m4rY literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/node_modules/brace-expansion/LICENSE b/node_modules/cordova-android/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/node_modules/cordova-android/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/brace-expansion/README.md b/node_modules/cordova-android/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/node_modules/cordova-android/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/brace-expansion/index.js b/node_modules/cordova-android/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..0478be8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/node_modules/cordova-android/node_modules/brace-expansion/package.json b/node_modules/cordova-android/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..f693c51 --- /dev/null +++ b/node_modules/cordova-android/node_modules/brace-expansion/package.json @@ -0,0 +1,76 @@ +{ + "_from": "brace-expansion@^1.1.7", + "_id": "brace-expansion@1.1.11", + "_inBundle": true, + "_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "_location": "/cordova-android/brace-expansion", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "brace-expansion@^1.1.7", + "name": "brace-expansion", + "escapedName": "brace-expansion", + "rawSpec": "^1.1.7", + "saveSpec": null, + "fetchSpec": "^1.1.7" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/minimatch" + ], + "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "_shasum": "3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "_spec": "brace-expansion@^1.1.7", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/minimatch", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/brace-expansion/issues" + }, + "bundleDependencies": false, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "deprecated": false, + "description": "Brace expansion as known from sh/bash", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "keywords": [], + "license": "MIT", + "main": "index.js", + "name": "brace-expansion", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "scripts": { + "bench": "matcha test/perf/bench.js", + "gentest": "bash test/generate.sh", + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.1.11" +} diff --git a/node_modules/cordova-android/node_modules/concat-map/.travis.yml b/node_modules/cordova-android/node_modules/concat-map/.travis.yml new file mode 100644 index 0000000..f1d0f13 --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/cordova-android/node_modules/concat-map/LICENSE b/node_modules/cordova-android/node_modules/concat-map/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/concat-map/README.markdown b/node_modules/cordova-android/node_modules/concat-map/README.markdown new file mode 100644 index 0000000..408f70a --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/README.markdown @@ -0,0 +1,62 @@ +concat-map +========== + +Concatenative mapdashery. + +[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) + +[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) + +example +======= + +``` js +var concatMap = require('concat-map'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); +``` + +*** + +``` +[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] +``` + +methods +======= + +``` js +var concatMap = require('concat-map') +``` + +concatMap(xs, fn) +----------------- + +Return an array of concatenated elements by calling `fn(x, i)` for each element +`x` and each index `i` in the array `xs`. + +When `fn(x, i)` returns an array, its result will be concatenated with the +result array. If `fn(x, i)` returns anything else, that value will be pushed +onto the end of the result array. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install concat-map +``` + +license +======= + +MIT + +notes +===== + +This module was written while sitting high above the ground in a tree. diff --git a/node_modules/cordova-android/node_modules/concat-map/index.js b/node_modules/cordova-android/node_modules/concat-map/index.js new file mode 100644 index 0000000..b29a781 --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/node_modules/cordova-android/node_modules/concat-map/package.json b/node_modules/cordova-android/node_modules/concat-map/package.json new file mode 100644 index 0000000..b25d955 --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/package.json @@ -0,0 +1,89 @@ +{ + "_from": "concat-map@0.0.1", + "_id": "concat-map@0.0.1", + "_inBundle": true, + "_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "_location": "/cordova-android/concat-map", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "concat-map@0.0.1", + "name": "concat-map", + "escapedName": "concat-map", + "rawSpec": "0.0.1", + "saveSpec": null, + "fetchSpec": "0.0.1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/brace-expansion" + ], + "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "_spec": "concat-map@0.0.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/node-concat-map/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "concatenative mapdashery", + "devDependencies": { + "tape": "~2.4.0" + }, + "directories": { + "example": "example", + "test": "test" + }, + "homepage": "https://github.com/substack/node-concat-map#readme", + "keywords": [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "license": "MIT", + "main": "index.js", + "name": "concat-map", + "repository": { + "type": "git", + "url": "git://github.com/substack/node-concat-map.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": { + "ie": [ + 6, + 7, + 8, + 9 + ], + "ff": [ + 3.5, + 10, + 15 + ], + "chrome": [ + 10, + 22 + ], + "safari": [ + 5.1 + ], + "opera": [ + 12 + ] + } + }, + "version": "0.0.1" +} diff --git a/node_modules/cordova-android/node_modules/concat-map/test/map.js b/node_modules/cordova-android/node_modules/concat-map/test/map.js new file mode 100644 index 0000000..fdbd702 --- /dev/null +++ b/node_modules/cordova-android/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/node_modules/cordova-android/node_modules/cordova-common/.eslintignore b/node_modules/cordova-android/node_modules/cordova-common/.eslintignore new file mode 100644 index 0000000..161d0c6 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.eslintignore @@ -0,0 +1 @@ +spec/fixtures/* \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/cordova-common/.eslintrc.yml b/node_modules/cordova-android/node_modules/cordova-common/.eslintrc.yml new file mode 100644 index 0000000..21a8e7b --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.eslintrc.yml @@ -0,0 +1,13 @@ +root: true +extends: semistandard +rules: + indent: + - error + - 4 + camelcase: off + padded-blocks: off + operator-linebreak: off + no-throw-literal: off + no-unused-vars: + - error + - args: after-used diff --git a/node_modules/cordova-android/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/cordova-android/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..91582f4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Platforms affected + + +### What does this PR do? + + +### What testing has been done on this change? + + +### Checklist +- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database +- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected. +- [ ] Added automated test coverage as appropriate for this change. diff --git a/node_modules/cordova-android/node_modules/cordova-common/.npmignore b/node_modules/cordova-android/node_modules/cordova-common/.npmignore new file mode 100644 index 0000000..5d14118 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.npmignore @@ -0,0 +1,2 @@ +spec +coverage diff --git a/node_modules/cordova-android/node_modules/cordova-common/.ratignore b/node_modules/cordova-android/node_modules/cordova-common/.ratignore new file mode 100644 index 0000000..f107416 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.ratignore @@ -0,0 +1,4 @@ +fixtures +coverage +jasmine.json +appveyor.yml diff --git a/node_modules/cordova-android/node_modules/cordova-common/.travis.yml b/node_modules/cordova-android/node_modules/cordova-common/.travis.yml new file mode 100644 index 0000000..b4e310d --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/.travis.yml @@ -0,0 +1,17 @@ +language: node_js +sudo: false +git: + depth: 10 +node_js: + - "4" + - "6" + - "8" + - "10" +install: + - npm install + - npm install -g codecov +script: + - npm test + - npm run cover +after_script: + - codecov diff --git a/node_modules/cordova-android/node_modules/cordova-common/README.md b/node_modules/cordova-android/node_modules/cordova-common/README.md new file mode 100644 index 0000000..422c98b --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/README.md @@ -0,0 +1,155 @@ + + +[![Build status](https://ci.appveyor.com/api/projects/status/wxkmo0jalsr8gane?svg=true)](https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-common/branch/master) +[![Build Status](https://travis-ci.org/apache/cordova-common.svg?branch=master)](https://travis-ci.org/apache/cordova-common) +[![NPM](https://nodei.co/npm/cordova-common.png)](https://nodei.co/npm/cordova-common/) + +# cordova-common +Exposes shared functionality used by [cordova-lib](https://github.com/apache/cordova-lib/) and Cordova platforms. +## Exposed APIs + +### `events` + +Represents special instance of NodeJS EventEmitter which is intended to be used to post events to cordova-lib and cordova-cli + +Usage: +```js +var events = require('cordova-common').events; +events.emit('warn', 'Some warning message') +``` + +There are the following events supported by cordova-cli: `verbose`, `log`, `info`, `warn`, `error`. + +### `CordovaError` + +An error class used by Cordova to throw cordova-specific errors. The CordovaError class is inherited from Error, so CordovaError instances is also valid Error instances (`instanceof` check succeeds). + +Usage: + +```js +var CordovaError = require('cordova-common').CordovaError; +throw new CordovaError('Some error message', SOME_ERR_CODE); +``` + +See [CordovaError](src/CordovaError/CordovaError.js) for supported error codes. + +### `ConfigParser` + +Exposes functionality to deal with cordova project `config.xml` files. For ConfigParser API reference check [ConfigParser Readme](src/ConfigParser/README.md). + +Usage: +```js +var ConfigParser = require('cordova-common').ConfigParser; +var appConfig = new ConfigParser('path/to/cordova-app/config.xml'); +console.log(appconfig.name() + ':' + appConfig.version()); +``` + +### `PluginInfoProvider` and `PluginInfo` + +`PluginInfo` is a wrapper for cordova plugins' `plugin.xml` files. This class may be instantiated directly or via `PluginInfoProvider`. The difference is that `PluginInfoProvider` caches `PluginInfo` instances based on plugin source directory. + +Usage: +```js +var PluginInfo: require('cordova-common').PluginInfo; +var PluginInfoProvider: require('cordova-common').PluginInfoProvider; + +// The following instances are equal +var plugin1 = new PluginInfo('path/to/plugin_directory'); +var plugin2 = new PluginInfoProvider().get('path/to/plugin_directory'); + +console.log('The plugin ' + plugin1.id + ' has version ' + plugin1.version) +``` + +### `ActionStack` + +Utility module for dealing with sequential tasks. Provides a set of tasks that are needed to be done and reverts all tasks that are already completed if one of those tasks fail to complete. Used internally by cordova-lib and platform's plugin installation routines. + +Usage: +```js +var ActionStack = require('cordova-common').ActionStack; +var stack = new ActionStack() + +var action1 = stack.createAction(task1, [], task1_reverter, []); +var action2 = stack.createAction(task2, [], task2_reverter, []); + +stack.push(action1); +stack.push(action2); + +stack.process() +.then(function() { + // all actions succeded +}) +.catch(function(error){ + // One of actions failed with error +}) +``` + +### `superspawn` + +Module for spawning child processes with some advanced logic. + +Usage: +```js +var superspawn = require('cordova-common').superspawn; +superspawn.spawn('adb', ['devices']) +.progress(function(data){ + if (data.stderr) + console.error('"adb devices" raised an error: ' + data.stderr); +}) +.then(function(devices){ + // Do something... +}) +``` + +### `xmlHelpers` + +A set of utility methods for dealing with XML files. + +Usage: +```js +var xml = require('cordova-common').xmlHelpers; + +var xmlDoc1 = xml.parseElementtreeSync('some/xml/file'); +var xmlDoc2 = xml.parseElementtreeSync('another/xml/file'); + +xml.mergeXml(doc1, doc2); // doc2 now contains all the nodes from doc1 +``` + +### Other APIs + +The APIs listed below are also exposed but are intended to be only used internally by cordova plugin installation routines. + +``` +PlatformJson +ConfigChanges +ConfigKeeper +ConfigFile +mungeUtil +``` + +## Setup +* Clone this repository onto your local machine + `git clone https://github.com/apache/cordova-common.git` +* Navigate to cordova-common directory, install dependencies and npm-link + `cd cordova-common && npm install && npm link` +* Navigate to cordova-lib directory and link cordova-common + `cd && npm link cordova-common && npm install` diff --git a/node_modules/cordova-android/node_modules/cordova-common/RELEASENOTES.md b/node_modules/cordova-android/node_modules/cordova-common/RELEASENOTES.md new file mode 100644 index 0000000..1964047 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/RELEASENOTES.md @@ -0,0 +1,153 @@ + +# Cordova-common Release Notes + +### 2.2.5 (Jun 26, 2018) +* Use plist@2 (^2.1.0) to avoid engine warning message on Node.js 4 + +### 2.2.4 (June 15, 2018) + +* Revert change to update dependencies in package.json (needed to resolve issues with cordova-ios@4) +* Revert change to use strip-bom package to strip BOM +* Continue to use plist@^3.0.1 in package.json + +### 2.2.3 (June 1, 2018) +* Revert a minor refactoring that was incompatible with NodeJS 4.x. No change to functionality. + +### 2.2.2 (May 30, 2018) +* [CB-13979](https://issues.apache.org/jira/browse/CB-13979) More consistency for `config.xml` lookups +* [CB-14064](https://issues.apache.org/jira/browse/CB-14064) Remove Node 4 from CI matrix +* [CB-14088](https://issues.apache.org/jira/browse/CB-14088) Update dependencies +* [CB-11691](https://issues.apache.org/jira/browse/CB-11691) Fix for modifying binary plists +* [CB-13770](https://issues.apache.org/jira/browse/CB-13770) Warn when or not found +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) Fix tests and path issues for **Windows** +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) added unit test for config file provider +* [CB-13744](https://issues.apache.org/jira/browse/CB-13744) Recognize storyboards as XML files +* [CB-13674](https://issues.apache.org/jira/browse/CB-13674) Incremented package version to -dev + +### 2.2.1 (Dec 14, 2017) +* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies + +### 2.2.0 (Nov 22, 2017) +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389 + +### 2.1.1 (Oct 04, 2017) +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag + +### 2.1.0 (August 30, 2017) +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag +* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses` +* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `` in `config.xml` +* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint` +* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support +* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file +* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors +* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation + +### 2.0.3 (May 02, 2017) +* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root` +* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml` +* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated + +### 2.0.2 (Apr 14, 2017) +* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project +* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0 +* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml +* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check +* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve + +### 2.0.1 (Mar 09, 2017) +* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler. + +### 2.0.0 (Jan 17, 2017) +* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml` +* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node` +* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows** +* Move windows-specific logic to `cordova-windows` +* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework + +### 1.5.1 (Oct 12, 2016) +* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser` +* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0` + +### 1.5.0 (Oct 06, 2016) +* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets +* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml` +* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys +* update `config.xml` location if it is a **Android Studio** project. +* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops +* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches +* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists + +### 1.4.1 (Aug 09, 2016) +* Add general purpose `ConfigParser.getAttribute` API +* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common` +* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly +* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it +* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing + +### 1.4.0 (Jul 12, 2016) +* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality + +### 1.3.0 (May 12, 2016) +* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging +* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time +* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`. +* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger` + +### 1.2.0 (Apr 18, 2016) +* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary +* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation +* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson +* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path +* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml + +### 1.1.1 (Mar 18, 2016) +* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix +* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings +* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml` +* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger` +* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources` +* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`. +* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties. + +### 1.1.0 (Feb 16, 2016) +* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli +* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters +* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli +* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification +* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform +* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test + +### 1.0.0 (Oct 29, 2015) + +* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README +* Pick ConfigParser changes from apache@0c3614e +* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common` +* Pick ConfigParser changes from apache@ddb027b +* Picking CordovaError changes from apache@a3b1fca +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common + diff --git a/node_modules/cordova-android/node_modules/cordova-common/appveyor.yml b/node_modules/cordova-android/node_modules/cordova-common/appveyor.yml new file mode 100644 index 0000000..5302ae0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/appveyor.yml @@ -0,0 +1,20 @@ +# appveyor file +# http://www.appveyor.com/docs/appveyor-yml + +environment: + matrix: + - nodejs_version: "4" + - nodejs_version: "6" + - nodejs_version: "8" + - nodejs_version: "10" + +install: + - ps: Install-Product node $env:nodejs_version + - npm install + +build: off + +test_script: + - node --version + - npm --version + - npm test diff --git a/node_modules/cordova-android/node_modules/cordova-common/cordova-common.js b/node_modules/cordova-android/node_modules/cordova-common/cordova-common.js new file mode 100644 index 0000000..801d510 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/cordova-common.js @@ -0,0 +1,47 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var addProperty = require('./src/util/addProperty'); + +module.exports = { }; + +addProperty(module, 'events', './src/events'); +addProperty(module, 'superspawn', './src/superspawn'); + +addProperty(module, 'ActionStack', './src/ActionStack'); +addProperty(module, 'CordovaError', './src/CordovaError/CordovaError'); +addProperty(module, 'CordovaLogger', './src/CordovaLogger'); +addProperty(module, 'CordovaCheck', './src/CordovaCheck'); +addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext'); +addProperty(module, 'PlatformJson', './src/PlatformJson'); +addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser'); +addProperty(module, 'FileUpdater', './src/FileUpdater'); + +addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo'); +addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider'); + +addProperty(module, 'PluginManager', './src/PluginManager'); + +addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges'); +addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper'); +addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile'); +addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util'); + +addProperty(module, 'xmlHelpers', './src/util/xml-helpers'); + diff --git a/node_modules/cordova-android/node_modules/cordova-common/package.json b/node_modules/cordova-android/node_modules/cordova-common/package.json new file mode 100644 index 0000000..d8a74af --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/package.json @@ -0,0 +1,81 @@ +{ + "_from": "cordova-common@2.2.5", + "_id": "cordova-common@2.2.5", + "_inBundle": true, + "_integrity": "sha1-+TzvKtSUz8v1bEbj1hKqqctfzDI=", + "_location": "/cordova-android/cordova-common", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "cordova-common@2.2.5", + "name": "cordova-common", + "escapedName": "cordova-common", + "rawSpec": "2.2.5", + "saveSpec": null, + "fetchSpec": "2.2.5" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.2.5.tgz", + "_shasum": "f93cef2ad494cfcbf56c46e3d612aaa9cb5fcc32", + "_spec": "cordova-common@2.2.5", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Apache Software Foundation" + }, + "bugs": { + "url": "https://issues.apache.org/jira/browse/CB", + "email": "dev@cordova.apache.org" + }, + "bundleDependencies": false, + "contributors": [], + "dependencies": { + "ansi": "^0.3.1", + "bplist-parser": "^0.1.0", + "cordova-registry-mapper": "^1.1.8", + "elementtree": "0.1.6", + "glob": "^5.0.13", + "minimatch": "^3.0.0", + "plist": "^2.1.0", + "q": "^1.4.1", + "shelljs": "^0.5.3", + "underscore": "^1.8.3", + "unorm": "^1.3.3" + }, + "deprecated": false, + "description": "Apache Cordova tools and platforms shared routines", + "devDependencies": { + "eslint": "^4.0.0", + "eslint-config-semistandard": "^11.0.0", + "eslint-config-standard": "^10.2.1", + "eslint-plugin-import": "^2.3.0", + "eslint-plugin-node": "^5.0.0", + "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-standard": "^3.0.1", + "istanbul": "^0.4.5", + "jasmine": "^2.5.2", + "osenv": "^0.1.3", + "promise-matchers": "^0.9.6", + "rewire": "^2.5.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "homepage": "https://github.com/apache/cordova-common#readme", + "license": "Apache-2.0", + "main": "cordova-common.js", + "name": "cordova-common", + "repository": { + "type": "git", + "url": "git+https://github.com/apache/cordova-common.git" + }, + "scripts": { + "cover": "istanbul cover --root src --print detail jasmine", + "eslint": "eslint src spec", + "jasmine": "jasmine JASMINE_CONFIG_PATH=spec/support/jasmine.json", + "test": "npm run eslint && npm run jasmine" + }, + "version": "2.2.5" +} diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ActionStack.js b/node_modules/cordova-android/node_modules/cordova-common/src/ActionStack.js new file mode 100644 index 0000000..6983c5c --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ActionStack.js @@ -0,0 +1,85 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint quotmark:false */ + +var events = require('./events'); +var Q = require('q'); + +function ActionStack () { + this.stack = []; + this.completed = []; +} + +ActionStack.prototype = { + createAction: function (handler, action_params, reverter, revert_params) { + return { + handler: { + run: handler, + params: action_params + }, + reverter: { + run: reverter, + params: revert_params + } + }; + }, + push: function (tx) { + this.stack.push(tx); + }, + // Returns a promise. + process: function (platform) { + events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...'); + + while (this.stack.length) { + var action = this.stack.shift(); + var handler = action.handler.run; + var action_params = action.handler.params; + + try { + handler.apply(null, action_params); + } catch (e) { + events.emit('warn', 'Error during processing of action! Attempting to revert...'); + this.stack.unshift(action); + var issue = 'Uh oh!\n'; + // revert completed tasks + while (this.completed.length) { + var undo = this.completed.shift(); + var revert = undo.reverter.run; + var revert_params = undo.reverter.params; + + try { + revert.apply(null, revert_params); + } catch (err) { + events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:'); + issue += 'A reversion action failed: ' + err.message + '\n'; + } + } + e.message = issue + e.message; + return Q.reject(e); + } + this.completed.push(action); + } + events.emit('verbose', 'Action stack processing complete.'); + + return Q(); + } +}; + +module.exports = ActionStack; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js new file mode 100644 index 0000000..e7ad0e2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js @@ -0,0 +1,426 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* + * This module deals with shared configuration / dependency "stuff". That is: + * - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml. + * - plist files in iOS + * Essentially, any type of shared resources that we need to handle with awareness + * of how potentially multiple plugins depend on a single shared resource, should be + * handled in this module. + * + * The implementation uses an object as a hash table, with "leaves" of the table tracking + * reference counts. + */ + +var path = require('path'); +var et = require('elementtree'); +var ConfigKeeper = require('./ConfigKeeper'); +var events = require('../events'); + +var mungeutil = require('./munge-util'); +var xml_helpers = require('../util/xml-helpers'); + +exports.PlatformMunger = PlatformMunger; + +exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) { + var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider); + munger.process(plugins_dir); + munger.save_all(); +}; + +/****************************************************************************** +* PlatformMunger class +* +* Can deal with config file of a single project. +* Parsed config files are cached in a ConfigKeeper object. +******************************************************************************/ +function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) { + this.platform = platform; + this.project_dir = project_dir; + this.config_keeper = new ConfigKeeper(project_dir); + this.platformJson = platformJson; + this.pluginInfoProvider = pluginInfoProvider; +} + +// Write out all unsaved files. +PlatformMunger.prototype.save_all = PlatformMunger_save_all; +function PlatformMunger_save_all () { + this.config_keeper.save_all(); + this.platformJson.save(); +} + +// Apply a munge object to a single config file. +// The remove parameter tells whether to add the change or remove it. +PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge; +function PlatformMunger_apply_file_munge (file, munge, remove) { + var self = this; + + for (var selector in munge.parents) { + for (var xml_child in munge.parents[selector]) { + // this xml child is new, graft it (only if config file exists) + var config_file = self.config_keeper.get(self.project_dir, self.platform, file); + if (config_file.exists) { + if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]); + else config_file.graft_child(selector, munge.parents[selector][xml_child]); + } else { + events.emit('warn', 'config file ' + file + ' requested for changes not found at ' + config_file.filepath + ', ignoring'); + } + } + } +} + +PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes; +function remove_plugin_changes (pluginInfo, is_top_level) { + var self = this; + var platform_config = self.platformJson.root; + var plugin_vars = is_top_level ? + platform_config.installed_plugins[pluginInfo.id] : + platform_config.dependent_plugins[pluginInfo.id]; + var edit_config_changes = null; + if (pluginInfo.getEditConfigs) { + edit_config_changes = pluginInfo.getEditConfigs(self.platform); + } + + // get config munge, aka how did this plugin change various config files + var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + // global munge looks at all plugins' changes to config files + var global_munge = platform_config.config_munge; + var munge = mungeutil.decrement_munge(global_munge, config_munge); + + for (var file in munge.files) { + self.apply_file_munge(file, munge.files[file], /* remove = */ true); + } + + // Remove from installed_plugins + self.platformJson.removePlugin(pluginInfo.id, is_top_level); + return self; +} + +PlatformMunger.prototype.add_plugin_changes = add_plugin_changes; +function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) { + var self = this; + var platform_config = self.platformJson.root; + + var edit_config_changes = null; + if (pluginInfo.getEditConfigs) { + edit_config_changes = pluginInfo.getEditConfigs(self.platform); + } + + var config_munge; + + if (!edit_config_changes || edit_config_changes.length === 0) { + // get config munge, aka how should this plugin change various config files + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars); + } else { + var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force); + + if (isConflictingInfo.conflictWithConfigxml) { + throw new Error(pluginInfo.id + + ' cannot be added. changes in this plugin conflicts with changes in config.xml. Conflicts must be resolved before plugin can be added.'); + } + if (plugin_force) { + events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.'); + + // remove conflicting munges + var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge); + for (var conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + + // force add new munges + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + } else if (isConflictingInfo.conflictFound) { + throw new Error('There was a conflict trying to modify attributes with in plugin ' + pluginInfo.id + + '. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' + + pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.'); + } else { + // no conflicts, will handle edit-config + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + } + } + + self = munge_helper(should_increment, self, platform_config, config_munge); + + // Move to installed/dependent_plugins + self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level); + return self; +} + +// Handle edit-config changes from config.xml +PlatformMunger.prototype.add_config_changes = add_config_changes; +function add_config_changes (config, should_increment) { + var self = this; + var platform_config = self.platformJson.root; + + var config_munge; + var changes = []; + + if (config.getEditConfigs) { + var edit_config_changes = config.getEditConfigs(self.platform); + if (edit_config_changes) { + changes = changes.concat(edit_config_changes); + } + } + + if (config.getConfigFiles) { + var config_files_changes = config.getConfigFiles(self.platform); + if (config_files_changes) { + changes = changes.concat(config_files_changes); + } + } + + if (changes && changes.length > 0) { + var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */); + if (isConflictingInfo.conflictFound) { + var conflict_munge; + var conflict_file; + + if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) { + // silently remove conflicting config.xml munges so new munges can be added + conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge); + for (conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + } + if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) { + events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes'); + + // remove conflicting plugin.xml munges + conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge); + for (conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + } + } + } + + // Add config.xml edit-config and config-file munges + config_munge = self.generate_config_xml_munge(config, changes, 'config.xml'); + self = munge_helper(should_increment, self, platform_config, config_munge); + + // Move to installed/dependent_plugins + return self; +} + +function munge_helper (should_increment, self, platform_config, config_munge) { + // global munge looks at all changes to config files + + // TODO: The should_increment param is only used by cordova-cli and is going away soon. + // If should_increment is set to false, avoid modifying the global_munge (use clone) + // and apply the entire config_munge because it's already a proper subset of the global_munge. + var munge, global_munge; + if (should_increment) { + global_munge = platform_config.config_munge; + munge = mungeutil.increment_munge(global_munge, config_munge); + } else { + global_munge = mungeutil.clone_munge(platform_config.config_munge); + munge = config_munge; + } + + for (var file in munge.files) { + self.apply_file_munge(file, munge.files[file]); + } + + return self; +} + +// Load the global munge from platform json and apply all of it. +// Used by cordova prepare to re-generate some config file from platform +// defaults and the global munge. +PlatformMunger.prototype.reapply_global_munge = reapply_global_munge; +function reapply_global_munge () { + var self = this; + + var platform_config = self.platformJson.root; + var global_munge = platform_config.config_munge; + for (var file in global_munge.files) { + self.apply_file_munge(file, global_munge.files[file]); + } + + return self; +} + +// generate_plugin_config_munge +// Generate the munge object from config.xml +PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge; +function generate_config_xml_munge (config, config_changes, type) { + var munge = { files: {} }; + var id; + + if (!config_changes) { + return munge; + } + + if (type === 'config.xml') { + id = type; + } else { + id = config.id; + } + + config_changes.forEach(function (change) { + change.xmls.forEach(function (xml) { + // 1. stringify each xml + var stringified = (new et.ElementTree(xml)).write({xml_declaration: false}); + // 2. add into munge + if (change.mode) { + mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id }); + } else { + mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after }); + } + }); + }); + return munge; +} + +// generate_plugin_config_munge +// Generate the munge object from plugin.xml + vars +PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge; +function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) { + var self = this; + + vars = vars || {}; + var munge = { files: {} }; + var changes = pluginInfo.getConfigFiles(self.platform); + + if (edit_config_changes) { + Array.prototype.push.apply(changes, edit_config_changes); + } + + changes.forEach(function (change) { + change.xmls.forEach(function (xml) { + // 1. stringify each xml + var stringified = (new et.ElementTree(xml)).write({xml_declaration: false}); + // interp vars + if (vars) { + Object.keys(vars).forEach(function (key) { + var regExp = new RegExp('\\$' + key, 'g'); + stringified = stringified.replace(regExp, vars[key]); + }); + } + // 2. add into munge + if (change.mode) { + if (change.mode !== 'remove') { + mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id }); + } + } else { + mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after }); + } + }); + }); + return munge; +} + +function is_conflicting (editchanges, config_munge, self, force) { + var files = config_munge.files; + var conflictFound = false; + var conflictWithConfigxml = false; + var conflictingMunge = { files: {} }; + var configxmlMunge = { files: {} }; + var conflictingParent; + var conflictingPlugin; + + editchanges.forEach(function (editchange) { + if (files[editchange.file]) { + var parents = files[editchange.file].parents; + var target = parents[editchange.target]; + + // Check if the edit target will resolve to an existing target + if (!target || target.length === 0) { + var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data; + var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target); + var resolveTarget; + + if (resolveEditTarget) { + for (var parent in parents) { + resolveTarget = xml_helpers.resolveParent(file_xml, parent); + if (resolveEditTarget === resolveTarget) { + conflictingParent = parent; + target = parents[parent]; + break; + } + } + } + } else { + conflictingParent = editchange.target; + } + + if (target && target.length !== 0) { + // conflict has been found + conflictFound = true; + + if (editchange.id === 'config.xml') { + if (target[0].id === 'config.xml') { + // Keep track of config.xml/config.xml edit-config conflicts + mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]); + } else { + // Keep track of config.xml x plugin.xml edit-config conflicts + mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]); + } + } else { + if (target[0].id === 'config.xml') { + // plugin.xml cannot overwrite config.xml changes even if --force is used + conflictWithConfigxml = true; + return; + } + + if (force) { + // Need to find all conflicts when --force is used, track conflicting munges + mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]); + } else { + // plugin cannot overwrite other plugin changes without --force + conflictingPlugin = target[0].plugin; + + } + } + } + } + }); + + return {conflictFound: conflictFound, + conflictingPlugin: conflictingPlugin, + conflictingMunge: conflictingMunge, + configxmlMunge: configxmlMunge, + conflictWithConfigxml: conflictWithConfigxml}; +} + +// Go over the prepare queue and apply the config munges for each plugin +// that has been (un)installed. +PlatformMunger.prototype.process = PlatformMunger_process; +function PlatformMunger_process (plugins_dir) { + var self = this; + var platform_config = self.platformJson.root; + + // Uninstallation first + platform_config.prepare_queue.uninstalled.forEach(function (u) { + var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin)); + self.remove_plugin_changes(pluginInfo, u.topLevel); + }); + + // Now handle installation + platform_config.prepare_queue.installed.forEach(function (u) { + var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin)); + self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force); + }); + + // Empty out installed/ uninstalled queues. + platform_config.prepare_queue.uninstalled = []; + platform_config.prepare_queue.installed = []; +} +/** ** END of PlatformMunger ****/ diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js new file mode 100644 index 0000000..2e5ed5f --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js @@ -0,0 +1,259 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* eslint no-control-regex: 0 */ + +var fs = require('fs'); +var path = require('path'); + +var modules = {}; +var addProperty = require('../util/addProperty'); + +// Use delay loading to ensure plist and other node modules to not get loaded +// on Android, Windows platforms +addProperty(module, 'bplist', 'bplist-parser', modules); +addProperty(module, 'et', 'elementtree', modules); +addProperty(module, 'glob', 'glob', modules); +addProperty(module, 'plist', 'plist', modules); +addProperty(module, 'plist_helpers', '../util/plist-helpers', modules); +addProperty(module, 'xml_helpers', '../util/xml-helpers', modules); + +/****************************************************************************** +* ConfigFile class +* +* Can load and keep various types of config files. Provides some functionality +* specific to some file types such as grafting XML children. In most cases it +* should be instantiated by ConfigKeeper. +* +* For plugin.xml files use as: +* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml'); +* +* TODO: Consider moving it out to a separate file and maybe partially with +* overrides in platform handlers. +******************************************************************************/ +function ConfigFile (project_dir, platform, file_tag) { + this.project_dir = project_dir; + this.platform = platform; + this.file_tag = file_tag; + this.is_changed = false; + + this.load(); +} + +// ConfigFile.load() +ConfigFile.prototype.load = ConfigFile_load; +function ConfigFile_load () { + var self = this; + + // config file may be in a place not exactly specified in the target + var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag); + + if (!filepath || !fs.existsSync(filepath)) { + self.exists = false; + return; + } + self.exists = true; + self.mtime = fs.statSync(self.filepath).mtime; + + var ext = path.extname(filepath); + // Windows8 uses an appxmanifest, and wp8 will likely use + // the same in a future release + if (ext === '.xml' || ext === '.appxmanifest' || ext === '.storyboard') { + self.type = 'xml'; + self.data = modules.xml_helpers.parseElementtreeSync(filepath); + } else { + // plist file + self.type = 'plist'; + // TODO: isBinaryPlist() reads the file and then parse re-reads it again. + // We always write out text plist, not binary. + // Do we still need to support binary plist? + // If yes, use plist.parseStringSync() and read the file once. + self.data = isBinaryPlist(filepath) ? + modules.bplist.parseBuffer(fs.readFileSync(filepath))[0] : + modules.plist.parse(fs.readFileSync(filepath, 'utf8')); + } +} + +ConfigFile.prototype.save = function ConfigFile_save () { + var self = this; + if (self.type === 'xml') { + fs.writeFileSync(self.filepath, self.data.write({indent: 4}), 'utf-8'); + } else { + // plist + var regExp = new RegExp('[ \t\r\n]+?', 'g'); + fs.writeFileSync(self.filepath, modules.plist.build(self.data).replace(regExp, '')); + } + self.is_changed = false; +}; + +ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) { + var self = this; + var filepath = self.filepath; + var result; + if (self.type === 'xml') { + var xml_to_graft = [modules.et.XML(xml_child.xml)]; + switch (xml_child.mode) { + case 'merge': + result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child); + break; + case 'overwrite': + result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child); + break; + case 'remove': + result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft); + break; + default: + result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after); + } + if (!result) { + throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install'); + } + } else { + // plist file + result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector); + if (!result) { + throw new Error('Unable to graft plist "' + filepath + '" during config install'); + } + } + self.is_changed = true; +}; + +ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) { + var self = this; + var filepath = self.filepath; + var result; + if (self.type === 'xml') { + var xml_to_graft = [modules.et.XML(xml_child.xml)]; + switch (xml_child.mode) { + case 'merge': + case 'overwrite': + result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child); + break; + case 'remove': + result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft); + break; + default: + result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector); + } + } else { + // plist file + result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector); + } + if (!result) { + var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.'; + throw new Error(err_msg); + } + self.is_changed = true; +}; + +// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards. +// Resolve to a real path in this function. +// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project. +function resolveConfigFilePath (project_dir, platform, file) { + var filepath = path.join(project_dir, file); + var matches; + + file = path.normalize(file); + + if (file.indexOf('*') > -1) { + // handle wildcards in targets using glob. + matches = modules.glob.sync(path.join(project_dir, '**', file)); + if (matches.length) filepath = matches[0]; + + // [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist + if (matches.length > 1 && file.indexOf('-Info.plist') > -1) { + var plistName = getIOSProjectname(project_dir) + '-Info.plist'; + for (var i = 0; i < matches.length; i++) { + if (matches[i].indexOf(plistName) > -1) { + filepath = matches[i]; + break; + } + } + } + return filepath; + } + + // XXX this checks for android studio projects + // only if none of the options above are satisfied does this get called + // TODO: Move this out of cordova-common and into the platforms somehow + if (platform === 'android' && !fs.existsSync(filepath)) { + if (file === 'AndroidManifest.xml') { + filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml'); + } else if (file.endsWith('config.xml')) { + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml'); + } else if (file.endsWith('strings.xml')) { + // Plugins really shouldn't mess with strings.xml, since it's able to be localized + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml'); + } else if (file.includes(path.join('res', 'xml'))) { + // Catch-all for all other stored XML configuration in legacy plugins + var config_file = path.basename(file); + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file); + } + return filepath; + } + + // special-case config.xml target that is just "config.xml" for other platforms. This should + // be resolved to the real location of the file. + // TODO: Move this out of cordova-common into platforms + if (file === 'config.xml') { + if (platform === 'ubuntu') { + filepath = path.join(project_dir, 'config.xml'); + } else if (platform === 'ios') { + var iospath = module.exports.getIOSProjectname(project_dir); + filepath = path.join(project_dir, iospath, 'config.xml'); + } else { + matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml')); + if (matches.length) filepath = matches[0]; + } + return filepath; + } + + // None of the special cases matched, returning project_dir/file. + return filepath; +} + +// Find out the real name of an iOS project +// TODO: glob is slow, need a better way or caching, or avoid using more than once. +function getIOSProjectname (project_dir) { + var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj')); + var iospath; + if (matches.length === 1) { + iospath = path.basename(matches[0], '.xcodeproj'); + } else { + var msg; + if (matches.length === 0) { + msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir; + } else { + msg = 'There are multiple *.xcodeproj dirs in ' + project_dir; + } + throw new Error(msg); + } + return iospath; +} + +// determine if a plist file is binary +function isBinaryPlist (filename) { + // I wish there was a synchronous way to read only the first 6 bytes of a + // file. This is wasteful :/ + var buf = '' + fs.readFileSync(filename, 'utf8'); + // binary plists start with a magic header, "bplist" + return buf.substring(0, 6) === 'bplist'; +} + +module.exports = ConfigFile; +module.exports.isBinaryPlist = isBinaryPlist; +module.exports.getIOSProjectname = getIOSProjectname; +module.exports.resolveConfigFilePath = resolveConfigFilePath; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js new file mode 100644 index 0000000..0ef0435 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js @@ -0,0 +1,64 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +/* jshint sub:true */ + +var path = require('path'); +var ConfigFile = require('./ConfigFile'); + +/****************************************************************************** +* ConfigKeeper class +* +* Used to load and store config files to avoid re-parsing and writing them out +* multiple times. +* +* The config files are referred to by a fake path constructed as +* project_dir/platform/file +* where file is the name used for the file in config munges. +******************************************************************************/ +function ConfigKeeper (project_dir, plugins_dir) { + this.project_dir = project_dir; + this.plugins_dir = plugins_dir; + this._cached = {}; +} + +ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) { + var self = this; + + // This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml + // https://issues.apache.org/jira/browse/CB-6414 + if (file === 'config.xml' && platform === 'android') { + file = 'res/xml/config.xml'; + } + var fake_path = path.join(project_dir, platform, file); + + if (self._cached[fake_path]) { + return self._cached[fake_path]; + } + // File was not cached, need to load. + var config_file = new ConfigFile(project_dir, platform, file); + self._cached[fake_path] = config_file; + return config_file; +}; + +ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () { + var self = this; + Object.keys(self._cached).forEach(function (fake_path) { + var config_file = self._cached[fake_path]; + if (config_file.is_changed) config_file.save(); + }); +}; + +module.exports = ConfigKeeper; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/munge-util.js b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/munge-util.js new file mode 100644 index 0000000..62648d8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigChanges/munge-util.js @@ -0,0 +1,162 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +/* jshint sub:true */ + +var _ = require('underscore'); + +// add the count of [key1][key2]...[keyN] to obj +// return true if it didn't exist before +exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + return exports.process_munge(obj, true/* createParents */, function (parentArray, k) { + var found = _.find(parentArray, function (element) { + return element.xml === k.xml; + }); + if (found) { + found.after = found.after || k.after; + found.count += k.count; + } else { + parentArray.push(k); + } + return !found; + }, keys); +}; + +// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0 +// return true if it was removed or not found +exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) { + var index = -1; + var found = _.find(parentArray, function (element) { + index++; + return element.xml === k.xml; + }); + if (found) { + if (parentArray[index].oldAttrib) { + k.oldAttrib = _.extend({}, parentArray[index].oldAttrib); + } + found.count -= k.count; + if (found.count > 0) { + return false; + } else { + parentArray.splice(index, 1); + } + } + return undefined; + }, keys); + + return typeof result === 'undefined' ? true : result; +}; + +// search for [key1][key2]...[keyN] +// return the object or undefined if not found +exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) { + return _.find(parentArray, function (element) { + return element.xml === (k.xml || k); + }); + }, keys); +}; + +// Execute func passing it the parent array and the xmlChild key. +// When createParents is true, add the file and parent items they are missing +// When createParents is false, stop and return undefined if the file and/or parent items are missing + +exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + var k = keys[0]; + if (keys.length === 1) { + return func(obj, k); + } else if (keys.length === 2) { + if (!obj.parents[k] && !createParents) { + return undefined; + } + obj.parents[k] = obj.parents[k] || []; + return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1)); + } else if (keys.length === 3) { + if (!obj.files[k] && !createParents) { + return undefined; + } + obj.files[k] = obj.files[k] || { parents: {} }; + return exports.process_munge(obj.files[k], createParents, func, keys.slice(1)); + } else { + throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).'); + } +}; + +// All values from munge are added to base as +// base[file][selector][child] += munge[file][selector][child] +// Returns a munge object containing values that exist in munge +// but not in base. +exports.increment_munge = function increment_munge (base, munge) { + var diff = { files: {} }; + + for (var file in munge.files) { + for (var selector in munge.files[file].parents) { + for (var xml_child in munge.files[file].parents[selector]) { + var val = munge.files[file].parents[selector][xml_child]; + // if node not in base, add it to diff and base + // else increment it's value in base without adding to diff + var newlyAdded = exports.deep_add(base, [file, selector, val]); + if (newlyAdded) { + exports.deep_add(diff, file, selector, val); + } + } + } + } + return diff; +}; + +// Update the base munge object as +// base[file][selector][child] -= munge[file][selector][child] +// nodes that reached zero value are removed from base and added to the returned munge +// object. +exports.decrement_munge = function decrement_munge (base, munge) { + var zeroed = { files: {} }; + + for (var file in munge.files) { + for (var selector in munge.files[file].parents) { + for (var xml_child in munge.files[file].parents[selector]) { + var val = munge.files[file].parents[selector][xml_child]; + // if node not in base, add it to diff and base + // else increment it's value in base without adding to diff + var removed = exports.deep_remove(base, [file, selector, val]); + if (removed) { + exports.deep_add(zeroed, file, selector, val); + } + } + } + } + return zeroed; +}; + +// For better readability where used +exports.clone_munge = function clone_munge (munge) { + return exports.increment_munge({}, munge); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/ConfigParser/ConfigParser.js b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigParser/ConfigParser.js new file mode 100644 index 0000000..1a98c3a --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/ConfigParser/ConfigParser.js @@ -0,0 +1,602 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var et = require('elementtree'); +var xml = require('../util/xml-helpers'); +var CordovaError = require('../CordovaError/CordovaError'); +var fs = require('fs'); +var events = require('../events'); + +/** Wraps a config.xml file */ +function ConfigParser (path) { + this.path = path; + try { + this.doc = xml.parseElementtreeSync(path); + this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc); + et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0'); + } catch (e) { + events.emit('error', 'Parsing ' + path + ' failed'); + throw e; + } + var r = this.doc.getroot(); + if (r.tag !== 'widget') { + throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")'); + } +} + +function getNodeTextSafe (el) { + return el && el.text && el.text.trim(); +} + +function findOrCreate (doc, name) { + var ret = doc.find(name); + if (!ret) { + ret = new et.Element(name); + doc.getroot().append(ret); + } + return ret; +} + +function getCordovaNamespacePrefix (doc) { + var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib); + var prefix = 'cdv'; + for (var j = 0; j < rootAtribs.length; j++) { + if (rootAtribs[j].indexOf('xmlns:') === 0 && + doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') { + var strings = rootAtribs[j].split(':'); + prefix = strings[1]; + break; + } + } + return prefix; +} + +/** + * Finds the value of an element's attribute + * @param {String} attributeName Name of the attribute to search for + * @param {Array} elems An array of ElementTree nodes + * @return {String} + */ +function findElementAttributeValue (attributeName, elems) { + + elems = Array.isArray(elems) ? elems : [ elems ]; + + var value = elems.filter(function (elem) { + return elem.attrib.name.toLowerCase() === attributeName.toLowerCase(); + }).map(function (filteredElems) { + return filteredElems.attrib.value; + }).pop(); + + return value || ''; +} + +function removeChildren (el, selector) { + const matches = el.findall(selector); + matches.forEach(child => el.remove(child)); +} + +ConfigParser.prototype = { + getAttribute: function (attr) { + return this.doc.getroot().attrib[attr]; + }, + + packageName: function () { + return this.getAttribute('id'); + }, + setPackageName: function (id) { + this.doc.getroot().attrib['id'] = id; + }, + android_packageName: function () { + return this.getAttribute('android-packageName'); + }, + android_activityName: function () { + return this.getAttribute('android-activityName'); + }, + ios_CFBundleIdentifier: function () { + return this.getAttribute('ios-CFBundleIdentifier'); + }, + name: function () { + return getNodeTextSafe(this.doc.find('name')); + }, + setName: function (name) { + var el = findOrCreate(this.doc, 'name'); + el.text = name; + }, + shortName: function () { + return this.doc.find('name').attrib['short'] || this.name(); + }, + setShortName: function (shortname) { + var el = findOrCreate(this.doc, 'name'); + if (!el.text) { + el.text = shortname; + } + el.attrib['short'] = shortname; + }, + description: function () { + return getNodeTextSafe(this.doc.find('description')); + }, + setDescription: function (text) { + var el = findOrCreate(this.doc, 'description'); + el.text = text; + }, + version: function () { + return this.getAttribute('version'); + }, + windows_packageVersion: function () { + return this.getAttribute('windows-packageVersion'); + }, + android_versionCode: function () { + return this.getAttribute('android-versionCode'); + }, + ios_CFBundleVersion: function () { + return this.getAttribute('ios-CFBundleVersion'); + }, + setVersion: function (value) { + this.doc.getroot().attrib['version'] = value; + }, + author: function () { + return getNodeTextSafe(this.doc.find('author')); + }, + getGlobalPreference: function (name) { + return findElementAttributeValue(name, this.doc.findall('preference')); + }, + setGlobalPreference: function (name, value) { + var pref = this.doc.find('preference[@name="' + name + '"]'); + if (!pref) { + pref = new et.Element('preference'); + pref.attrib.name = name; + this.doc.getroot().append(pref); + } + pref.attrib.value = value; + }, + getPlatformPreference: function (name, platform) { + return findElementAttributeValue(name, this.doc.findall('./platform[@name="' + platform + '"]/preference')); + }, + getPreference: function (name, platform) { + + var platformPreference = ''; + + if (platform) { + platformPreference = this.getPlatformPreference(name, platform); + } + + return platformPreference || this.getGlobalPreference(name); + + }, + /** + * Returns all resources for the platform specified. + * @param {String} platform The platform. + * @param {string} resourceName Type of static resources to return. + * "icon" and "splash" currently supported. + * @return {Array} Resources for the platform specified. + */ + getStaticResources: function (platform, resourceName) { + var ret = []; + var staticResources = []; + if (platform) { // platform specific icons + this.doc.findall('./platform[@name="' + platform + '"]/' + resourceName).forEach(function (elt) { + elt.platform = platform; // mark as platform specific resource + staticResources.push(elt); + }); + } + // root level resources + staticResources = staticResources.concat(this.doc.findall(resourceName)); + // parse resource elements + var that = this; + staticResources.forEach(function (elt) { + var res = {}; + res.src = elt.attrib.src; + res.target = elt.attrib.target || undefined; + res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density']; + res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms) + res.width = +elt.attrib.width || undefined; + res.height = +elt.attrib.height || undefined; + + // default icon + if (!res.width && !res.height && !res.density) { + ret.defaultResource = res; + } + ret.push(res); + }); + + /** + * Returns resource with specified width and/or height. + * @param {number} width Width of resource. + * @param {number} height Height of resource. + * @return {Resource} Resource object or null if not found. + */ + ret.getBySize = function (width, height) { + return ret.filter(function (res) { + if (!res.width && !res.height) { + return false; + } + return ((!res.width || (width === res.width)) && + (!res.height || (height === res.height))); + })[0] || null; + }; + + /** + * Returns resource with specified density. + * @param {string} density Density of resource. + * @return {Resource} Resource object or null if not found. + */ + ret.getByDensity = function (density) { + return ret.filter(function (res) { + return res.density === density; + })[0] || null; + }; + + /** Returns default icons */ + ret.getDefault = function () { + return ret.defaultResource; + }; + + return ret; + }, + + /** + * Returns all icons for specific platform. + * @param {string} platform Platform name + * @return {Resource[]} Array of icon objects. + */ + getIcons: function (platform) { + return this.getStaticResources(platform, 'icon'); + }, + + /** + * Returns all splash images for specific platform. + * @param {string} platform Platform name + * @return {Resource[]} Array of Splash objects. + */ + getSplashScreens: function (platform) { + return this.getStaticResources(platform, 'splash'); + }, + + /** + * Returns all resource-files for a specific platform. + * @param {string} platform Platform name + * @param {boolean} includeGlobal Whether to return resource-files at the + * root level. + * @return {Resource[]} Array of resource file objects. + */ + getFileResources: function (platform, includeGlobal) { + var fileResources = []; + + if (platform) { // platform specific resources + fileResources = this.doc.findall('./platform[@name="' + platform + '"]/resource-file').map(function (tag) { + return { + platform: platform, + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch + }; + }); + } + + if (includeGlobal) { + this.doc.findall('resource-file').forEach(function (tag) { + fileResources.push({ + platform: platform || null, + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch + }); + }); + } + + return fileResources; + }, + + /** + * Returns all hook scripts for the hook type specified. + * @param {String} hook The hook type. + * @param {Array} platforms Platforms to look for scripts into (root scripts will be included as well). + * @return {Array} Script elements. + */ + getHookScripts: function (hook, platforms) { + var self = this; + var scriptElements = self.doc.findall('./hook'); + + if (platforms) { + platforms.forEach(function (platform) { + scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook')); + }); + } + + function filterScriptByHookType (el) { + return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook; + } + + return scriptElements.filter(filterScriptByHookType); + }, + /** + * Returns a list of plugin (IDs). + * + * This function also returns any plugin's that + * were defined using the legacy tags. + * @return {string[]} Array of plugin IDs + */ + getPluginIdList: function () { + var plugins = this.doc.findall('plugin'); + var result = plugins.map(function (plugin) { + return plugin.attrib.name; + }); + var features = this.doc.findall('feature'); + features.forEach(function (element) { + var idTag = element.find('./param[@name="id"]'); + if (idTag) { + result.push(idTag.attrib.value); + } + }); + return result; + }, + getPlugins: function () { + return this.getPluginIdList().map(function (pluginId) { + return this.getPlugin(pluginId); + }, this); + }, + /** + * Adds a plugin element. Does not check for duplicates. + * @name addPlugin + * @function + * @param {object} attributes name and spec are supported + * @param {Array|object} variables name, value or arbitary object + */ + addPlugin: function (attributes, variables) { + if (!attributes && !attributes.name) return; + var el = new et.Element('plugin'); + el.attrib.name = attributes.name; + if (attributes.spec) { + el.attrib.spec = attributes.spec; + } + + // support arbitrary object as variables source + if (variables && typeof variables === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables) + .map(function (variableName) { + return {name: variableName, value: variables[variableName]}; + }); + } + + if (variables) { + variables.forEach(function (variable) { + el.append(new et.Element('variable', { name: variable.name, value: variable.value })); + }); + } + this.doc.getroot().append(el); + }, + /** + * Retrives the plugin with the given id or null if not found. + * + * This function also returns any plugin's that + * were defined using the legacy tags. + * @name getPlugin + * @function + * @param {String} id + * @returns {object} plugin including any variables + */ + getPlugin: function (id) { + if (!id) { + return undefined; + } + var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]'); + if (pluginElement === null) { + var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..'); + if (legacyFeature) { + events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.'); + return featureToPlugin(legacyFeature); + } + return undefined; + } + var plugin = {}; + + plugin.name = pluginElement.attrib.name; + plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version; + plugin.variables = {}; + var variableElements = pluginElement.findall('variable'); + variableElements.forEach(function (varElement) { + var name = varElement.attrib.name; + var value = varElement.attrib.value; + if (name) { + plugin.variables[name] = value; + } + }); + return plugin; + }, + /** + * Remove the plugin entry with give name (id). + * + * This function also operates on any plugin's that + * were defined using the legacy tags. + * @name removePlugin + * @function + * @param id name of the plugin + */ + removePlugin: function (id) { + if (!id) return; + const root = this.doc.getroot(); + removeChildren(root, `./plugin/[@name="${id}"]`); + removeChildren(root, `./feature/param[@name="id"][@value="${id}"]/..`); + }, + + // Add any element to the root + addElement: function (name, attributes) { + var el = et.Element(name); + for (var a in attributes) { + el.attrib[a] = attributes[a]; + } + this.doc.getroot().append(el); + }, + + /** + * Adds an engine. Does not check for duplicates. + * @param {String} name the engine name + * @param {String} spec engine source location or version (optional) + */ + addEngine: function (name, spec) { + if (!name) return; + var el = et.Element('engine'); + el.attrib.name = name; + if (spec) { + el.attrib.spec = spec; + } + this.doc.getroot().append(el); + }, + /** + * Removes all the engines with given name + * @param {String} name the engine name. + */ + removeEngine: function (name) { + removeChildren(this.doc.getroot(), `./engine/[@name="${name}"]`); + }, + getEngines: function () { + var engines = this.doc.findall('./engine'); + return engines.map(function (engine) { + var spec = engine.attrib.spec || engine.attrib.version; + return { + 'name': engine.attrib.name, + 'spec': spec || null + }; + }); + }, + /* Get all the access tags */ + getAccesses: function () { + var accesses = this.doc.findall('./access'); + return accesses.map(function (access) { + var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */ + var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */ + var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */ + var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */ + var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */ + var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */ + var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */ + + return { + 'origin': access.attrib.origin, + 'minimum_tls_version': minimum_tls_version, + 'requires_forward_secrecy': requires_forward_secrecy, + 'requires_certificate_transparency': requires_certificate_transparency, + 'allows_arbitrary_loads_in_web_content': allows_arbitrary_loads_in_web_content, + 'allows_arbitrary_loads_in_media': allows_arbitrary_loads_in_media, + 'allows_arbitrary_loads_for_media': allows_arbitrary_loads_for_media, + 'allows_local_networking': allows_local_networking + }; + }); + }, + /* Get all the allow-navigation tags */ + getAllowNavigations: function () { + var allow_navigations = this.doc.findall('./allow-navigation'); + return allow_navigations.map(function (allow_navigation) { + var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */ + var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */ + var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */ + + return { + 'href': allow_navigation.attrib.href, + 'minimum_tls_version': minimum_tls_version, + 'requires_forward_secrecy': requires_forward_secrecy, + 'requires_certificate_transparency': requires_certificate_transparency + }; + }); + }, + /* Get all the allow-intent tags */ + getAllowIntents: function () { + var allow_intents = this.doc.findall('./allow-intent'); + return allow_intents.map(function (allow_intent) { + return { + 'href': allow_intent.attrib.href + }; + }); + }, + /* Get all edit-config tags */ + getEditConfigs: function (platform) { + var platform_edit_configs = this.doc.findall('./platform[@name="' + platform + '"]/edit-config'); + var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs); + + return edit_configs.map(function (tag) { + var editConfig = + { + file: tag.attrib['file'], + target: tag.attrib['target'], + mode: tag.attrib['mode'], + id: 'config.xml', + xmls: tag.getchildren() + }; + return editConfig; + }); + }, + + /* Get all config-file tags */ + getConfigFiles: function (platform) { + var platform_config_files = this.doc.findall('./platform[@name="' + platform + '"]/config-file'); + var config_files = this.doc.findall('config-file').concat(platform_config_files); + + return config_files.map(function (tag) { + var configFile = + { + target: tag.attrib['target'], + parent: tag.attrib['parent'], + after: tag.attrib['after'], + xmls: tag.getchildren(), + // To support demuxing via versions + versions: tag.attrib['versions'], + deviceTarget: tag.attrib['device-target'] + }; + return configFile; + }); + }, + + write: function () { + fs.writeFileSync(this.path, this.doc.write({indent: 4}), 'utf-8'); + } +}; + +function featureToPlugin (featureElement) { + var plugin = {}; + plugin.variables = []; + var pluginVersion, + pluginSrc; + + var nodes = featureElement.findall('param'); + nodes.forEach(function (element) { + var n = element.attrib.name; + var v = element.attrib.value; + if (n === 'id') { + plugin.name = v; + } else if (n === 'version') { + pluginVersion = v; + } else if (n === 'url' || n === 'installPath') { + pluginSrc = v; + } else { + plugin.variables[n] = v; + } + }); + + var spec = pluginSrc || pluginVersion; + if (spec) { + plugin.spec = spec; + } + + return plugin; +} +module.exports = ConfigParser; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/CordovaCheck.js b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaCheck.js new file mode 100644 index 0000000..28f629d --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaCheck.js @@ -0,0 +1,76 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var fs = require('fs'); +var path = require('path'); + +function isRootDir (dir) { + if (fs.existsSync(path.join(dir, 'www'))) { + if (fs.existsSync(path.join(dir, 'config.xml'))) { + // For sure is. + if (fs.existsSync(path.join(dir, 'platforms'))) { + return 2; + } else { + return 1; + } + } + // Might be (or may be under platforms/). + if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) { + return 1; + } + } + return 0; +} + +// Runs up the directory chain looking for a .cordova directory. +// IF it is found we are in a Cordova project. +// Omit argument to use CWD. +function isCordova (dir) { + if (!dir) { + // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687). + var pwd = process.env.PWD; + var cwd = process.cwd(); + if (pwd && pwd !== cwd && pwd !== 'undefined') { + return isCordova(pwd) || isCordova(cwd); + } + return isCordova(cwd); + } + var bestReturnValueSoFar = false; + for (var i = 0; i < 1000; ++i) { + var result = isRootDir(dir); + if (result === 2) { + return dir; + } + if (result === 1) { + bestReturnValueSoFar = dir; + } + var parentDir = path.normalize(path.join(dir, '..')); + // Detect fs root. + if (parentDir === dir) { + return bestReturnValueSoFar; + } + dir = parentDir; + } + console.error('Hit an unhandled case in CordovaCheck.isCordova'); + return false; +} + +module.exports = { + findProjectRoot: isCordova +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaError.js b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaError.js new file mode 100644 index 0000000..24de6af --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaError.js @@ -0,0 +1,92 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* eslint no-proto: 0 */ + +var EOL = require('os').EOL; + +/** + * A derived exception class. See usage example in cli.js + * Based on: + * stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753 + * @param {String} message Error message + * @param {Number} [code=0] Error code + * @param {CordovaExternalToolErrorContext} [context] External tool error context object + * @constructor + */ +function CordovaError (message, code, context) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.message = message; + this.code = code || CordovaError.UNKNOWN_ERROR; + this.context = context; +} +CordovaError.prototype.__proto__ = Error.prototype; + +// TODO: Extend error codes according the projects specifics +CordovaError.UNKNOWN_ERROR = 0; +CordovaError.EXTERNAL_TOOL_ERROR = 1; + +/** + * Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR + * @returns {string} Error code string name + */ +CordovaError.prototype.getErrorCodeName = function () { + for (var key in CordovaError) { + if (CordovaError.hasOwnProperty(key)) { + if (CordovaError[key] === this.code) { + return key; + } + } + } +}; + +/** + * Converts CordovaError instance to string representation + * @param {Boolean} [isVerbose] Set up verbose mode. Used to provide more + * details including information about error code name and context + * @return {String} Stringified error representation + */ +CordovaError.prototype.toString = function (isVerbose) { + var message = ''; + var codePrefix = ''; + + if (this.code !== CordovaError.UNKNOWN_ERROR) { + codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' '; + } + + if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) { + if (typeof this.context !== 'undefined') { + if (isVerbose) { + message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' + + this.message + EOL + 'Stack trace: ' + this.stack; + } else { + message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message; + } + } else { + message = 'External tool failed with an error: ' + this.message; + } + } else { + message = isVerbose ? codePrefix + this.stack : codePrefix + this.message; + } + + return message; +}; + +module.exports = CordovaError; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js new file mode 100644 index 0000000..30699b4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js @@ -0,0 +1,48 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +/* jshint proto:true */ + +var path = require('path'); + +/** + * @param {String} cmd Command full path + * @param {String[]} args Command args + * @param {String} [cwd] Command working directory + * @constructor + */ +function CordovaExternalToolErrorContext (cmd, args, cwd) { + this.cmd = cmd; + // Helper field for readability + this.cmdShortName = path.basename(cmd); + this.args = args; + this.cwd = cwd; +} + +CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) { + if (isVerbose) { + return 'External tool \'' + this.cmdShortName + '\'' + + '\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args + + (typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : ''); + } + + return this.cmdShortName; +}; + +module.exports = CordovaExternalToolErrorContext; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/CordovaLogger.js b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaLogger.js new file mode 100644 index 0000000..ea6e9ce --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/CordovaLogger.js @@ -0,0 +1,220 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +var ansi = require('ansi'); +var EventEmitter = require('events').EventEmitter; +var CordovaError = require('./CordovaError/CordovaError'); +var EOL = require('os').EOL; + +var INSTANCE; + +/** + * @class CordovaLogger + * + * Implements logging facility that anybody could use. Should not be + * instantiated directly, `CordovaLogger.get()` method should be used instead + * to acquire logger instance + */ +function CordovaLogger () { + this.levels = {}; + this.colors = {}; + this.stdout = process.stdout; + this.stderr = process.stderr; + + this.stdoutCursor = ansi(this.stdout); + this.stderrCursor = ansi(this.stderr); + + this.addLevel('verbose', 1000, 'grey'); + this.addLevel('normal', 2000); + this.addLevel('warn', 2000, 'yellow'); + this.addLevel('info', 3000, 'blue'); + this.addLevel('error', 5000, 'red'); + this.addLevel('results', 10000); + + this.setLevel('normal'); +} + +/** + * Static method to create new or acquire existing instance. + * + * @return {CordovaLogger} Logger instance + */ +CordovaLogger.get = function () { + return INSTANCE || (INSTANCE = new CordovaLogger()); +}; + +CordovaLogger.VERBOSE = 'verbose'; +CordovaLogger.NORMAL = 'normal'; +CordovaLogger.WARN = 'warn'; +CordovaLogger.INFO = 'info'; +CordovaLogger.ERROR = 'error'; +CordovaLogger.RESULTS = 'results'; + +/** + * Emits log message to process' stdout/stderr depending on message's severity + * and current log level. If severity is less than current logger's level, + * then the message is ignored. + * + * @param {String} logLevel The message's log level. The logger should have + * corresponding level added (via logger.addLevel), otherwise + * `CordovaLogger.NORMAL` level will be used. + * @param {String} message The message, that should be logged to process' + * stdio + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.log = function (logLevel, message) { + // if there is no such logLevel defined, or provided level has + // less severity than active level, then just ignore this call and return + if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) { + // return instance to allow to chain calls + return this; + } + + var isVerbose = this.logLevel === 'verbose'; + var cursor = this.stdoutCursor; + + if (message instanceof Error || logLevel === CordovaLogger.ERROR) { + message = formatError(message, isVerbose); + cursor = this.stderrCursor; + } + + var color = this.colors[logLevel]; + if (color) { + cursor.bold().fg[color](); + } + + cursor.write(message).reset().write(EOL); + + return this; +}; + +/** + * Adds a new level to logger instance. This method also creates a shortcut + * method to log events with the level provided (i.e. after adding new level + * 'debug', the method `debug(message)`, equal to logger.log('debug', message), + * will be added to logger instance) + * + * @param {String} level A log level name. The levels with the following + * names added by default to every instance: 'verbose', 'normal', 'warn', + * 'info', 'error', 'results' + * @param {Number} severity A number that represents level's severity. + * @param {String} color A valid color name, that will be used to log + * messages with this level. Any CSS color code or RGB value is allowed + * (according to ansi documentation: + * https://github.com/TooTallNate/ansi.js#features) + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.addLevel = function (level, severity, color) { + + this.levels[level] = severity; + + if (color) { + this.colors[level] = color; + } + + // Define own method with corresponding name + if (!this[level]) { + this[level] = this.log.bind(this, level); + } + + return this; +}; + +/** + * Sets the current logger level to provided value. If logger doesn't have level + * with this name, `CordovaLogger.NORMAL` will be used. + * + * @param {String} logLevel Level name. The level with this name should be + * added to logger before. + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.setLevel = function (logLevel) { + this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL; + + return this; +}; + +/** + * Adjusts the current logger level according to the passed options. + * + * @param {Object|Array} opts An object or args array with options + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.adjustLevel = function (opts) { + if (opts.verbose || (Array.isArray(opts) && opts.indexOf('--verbose') !== -1)) { + this.setLevel('verbose'); + } else if (opts.silent || (Array.isArray(opts) && opts.indexOf('--silent') !== -1)) { + this.setLevel('error'); + } + + return this; +}; + +/** + * Attaches logger to EventEmitter instance provided. + * + * @param {EventEmitter} eventEmitter An EventEmitter instance to attach + * logger to. + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.subscribe = function (eventEmitter) { + + if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Subscribe method only accepts an EventEmitter instance as argument'); } + + eventEmitter.on('verbose', this.verbose) + .on('log', this.normal) + .on('info', this.info) + .on('warn', this.warn) + .on('warning', this.warn) + // Set up event handlers for logging and results emitted as events. + .on('results', this.results); + + return this; +}; + +function formatError (error, isVerbose) { + var message = ''; + + if (error instanceof CordovaError) { + message = error.toString(isVerbose); + } else if (error instanceof Error) { + if (isVerbose) { + message = error.stack; + } else { + message = error.message; + } + } else { + // Plain text error message + message = error; + } + + if (typeof message === 'string' && message.toUpperCase().indexOf('ERROR:') !== 0) { + // Needed for backward compatibility with external tools + message = 'Error: ' + message; + } + + return message; +} + +module.exports = CordovaLogger; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/FileUpdater.js b/node_modules/cordova-android/node_modules/cordova-common/src/FileUpdater.js new file mode 100644 index 0000000..ea5d9e2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/FileUpdater.js @@ -0,0 +1,415 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var minimatch = require('minimatch'); + +/** + * Logging callback used in the FileUpdater methods. + * @callback loggingCallback + * @param {string} message A message describing a single file update operation. + */ + +/** + * Updates a target file or directory with a source file or directory. (Directory updates are + * not recursive.) Stats for target and source items must be passed in. This is an internal + * helper function used by other methods in this module. + * + * @param {?string} sourcePath Source file or directory to be used to update the + * destination. If the source is null, then the destination is deleted if it exists. + * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if + * the source does not exist. + * @param {string} targetPath Required destination file or directory to be updated. If it does + * not exist, it will be created. + * @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if + * the target does not exist. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) { + var updated = false; + + var rootDir = (options && options.rootDir) || ''; + var copyAll = (options && options.all) || false; + + var targetFullPath = path.join(rootDir || '', targetPath); + + if (sourceStats) { + var sourceFullPath = path.join(rootDir || '', sourcePath); + + if (targetStats) { + // The target exists. But if the directory status doesn't match the source, delete it. + if (targetStats.isDirectory() && !sourceStats.isDirectory()) { + log('rmdir ' + targetPath + ' (source is a file)'); + shell.rm('-rf', targetFullPath); + targetStats = null; + updated = true; + } else if (!targetStats.isDirectory() && sourceStats.isDirectory()) { + log('delete ' + targetPath + ' (source is a directory)'); + shell.rm('-f', targetFullPath); + targetStats = null; + updated = true; + } + } + + if (!targetStats) { + if (sourceStats.isDirectory()) { + // The target directory does not exist, so it should be created. + log('mkdir ' + targetPath); + shell.mkdir('-p', targetFullPath); + updated = true; + } else if (sourceStats.isFile()) { + // The target file does not exist, so it should be copied from the source. + log('copy ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)')); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } + } else if (sourceStats.isFile() && targetStats.isFile()) { + // The source and target paths both exist and are files. + if (copyAll) { + // The caller specified all files should be copied. + log('copy ' + sourcePath + ' ' + targetPath); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } else { + // Copy if the source has been modified since it was copied to the target, or if + // the file sizes are different. (The latter catches most cases in which something + // was done to the file after copying.) Comparison is >= rather than > to allow + // for timestamps lacking sub-second precision in some filesystems. + if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() || + sourceStats.size !== targetStats.size) { + log('copy ' + sourcePath + ' ' + targetPath + ' (updated file)'); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } + } + } + } else if (targetStats) { + // The target exists but the source is null, so the target should be deleted. + if (targetStats.isDirectory()) { + log('rmdir ' + targetPath + (copyAll ? '' : ' (no source)')); + shell.rm('-rf', targetFullPath); + } else { + log('delete ' + targetPath + (copyAll ? '' : ' (no source)')); + shell.rm('-f', targetFullPath); + } + updated = true; + } + + return updated; +} + +/** + * Helper for updatePath and updatePaths functions. Queries stats for source and target + * and ensures target directory exists before copying a file. + */ +function updatePathInternal (sourcePath, targetPath, options, log) { + var rootDir = (options && options.rootDir) || ''; + var targetFullPath = path.join(rootDir, targetPath); + var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null; + var sourceStats = null; + + if (sourcePath) { + // A non-null source path was specified. It should exist. + var sourceFullPath = path.join(rootDir, sourcePath); + if (!fs.existsSync(sourceFullPath)) { + throw new Error('Source path does not exist: ' + sourcePath); + } + + sourceStats = fs.statSync(sourceFullPath); + + // Create the target's parent directory if it doesn't exist. + var parentDir = path.dirname(targetFullPath); + if (!fs.existsSync(parentDir)) { + shell.mkdir('-p', parentDir); + } + } + + return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log); +} + +/** + * Updates a target file or directory with a source file or directory. (Directory updates are + * not recursive.) + * + * @param {?string} sourcePath Source file or directory to be used to update the + * destination. If the source is null, then the destination is deleted if it exists. + * @param {string} targetPath Required destination file or directory to be updated. If it does + * not exist, it will be created. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePath (sourcePath, targetPath, options, log) { + if (sourcePath !== null && typeof sourcePath !== 'string') { + throw new Error('A source path (or null) is required.'); + } + + if (!targetPath || typeof targetPath !== 'string') { + throw new Error('A target path is required.'); + } + + log = log || function () { }; + + return updatePathInternal(sourcePath, targetPath, options, log); +} + +/** + * Updates files and directories based on a mapping from target paths to source paths. Targets + * with null sources in the map are deleted. + * + * @param {Object} pathMap A dictionary mapping from target paths to source paths. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePaths (pathMap, options, log) { + if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) { + throw new Error('An object mapping from target paths to source paths is required.'); + } + + log = log || function () { }; + + var updated = false; + + // Iterate in sorted order to ensure directories are created before files under them. + Object.keys(pathMap).sort().forEach(function (targetPath) { + var sourcePath = pathMap[targetPath]; + updated = updatePathInternal(sourcePath, targetPath, options, log) || updated; + }); + + return updated; +} + +/** + * Updates a target directory with merged files and subdirectories from source directories. + * + * @param {string|string[]} sourceDirs Required source directory or array of source directories + * to be merged into the target. The directories are listed in order of precedence; files in + * directories later in the array supersede files in directories earlier in the array + * (regardless of timestamps). + * @param {string} targetDir Required destination directory to be updated. If it does not exist, + * it will be created. If it exists, newer files from source directories will be copied over, + * and files missing in the source directories will be deleted. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {string|string[]} [options.include] Optional glob string or array of glob strings that + * are tested against both target and source relative paths to determine if they are included + * in the merge-and-update. If unspecified, all items are included. + * @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that + * are tested against both target and source relative paths to determine if they are excluded + * from the merge-and-update. Exclusions override inclusions. If unspecified, no items are + * excluded. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function mergeAndUpdateDir (sourceDirs, targetDir, options, log) { + if (sourceDirs && typeof sourceDirs === 'string') { + sourceDirs = [ sourceDirs ]; + } else if (!Array.isArray(sourceDirs)) { + throw new Error('A source directory path or array of paths is required.'); + } + + if (!targetDir || typeof targetDir !== 'string') { + throw new Error('A target directory path is required.'); + } + + log = log || function () { }; + + var rootDir = (options && options.rootDir) || ''; + + var include = (options && options.include) || [ '**' ]; + if (typeof include === 'string') { + include = [ include ]; + } else if (!Array.isArray(include)) { + throw new Error('Include parameter must be a glob string or array of glob strings.'); + } + + var exclude = (options && options.exclude) || []; + if (typeof exclude === 'string') { + exclude = [ exclude ]; + } else if (!Array.isArray(exclude)) { + throw new Error('Exclude parameter must be a glob string or array of glob strings.'); + } + + // Scan the files in each of the source directories. + var sourceMaps = sourceDirs.map(function (sourceDir) { + return path.join(rootDir, sourceDir); + }).map(function (sourcePath) { + if (!fs.existsSync(sourcePath)) { + throw new Error('Source directory does not exist: ' + sourcePath); + } + return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude); + }); + + // Scan the files in the target directory, if it exists. + var targetMap = {}; + var targetFullPath = path.join(rootDir, targetDir); + if (fs.existsSync(targetFullPath)) { + targetMap = mapDirectory(rootDir, targetDir, include, exclude); + } + + var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir); + + var updated = false; + + // Iterate in sorted order to ensure directories are created before files under them. + Object.keys(pathMap).sort().forEach(function (subPath) { + var entry = pathMap[subPath]; + updated = updatePathWithStats( + entry.sourcePath, + entry.sourceStats, + entry.targetPath, + entry.targetStats, + options, + log) || updated; + }); + + return updated; +} + +/** + * Creates a dictionary map of all files and directories under a path. + */ +function mapDirectory (rootDir, subDir, include, exclude) { + var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } }; + mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap); + return dirMap; + + function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) { + var itemMapped = false; + var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir)); + + items.forEach(function (item) { + var relativePath = path.join(relativeDir, item); + if (!matchGlobArray(relativePath, exclude)) { + // Stats obtained here (required at least to know where to recurse in directories) + // are saved for later, where the modified times may also be used. This minimizes + // the number of file I/O operations performed. + var fullPath = path.join(rootDir, subDir, relativePath); + var stats = fs.statSync(fullPath); + + if (stats.isDirectory()) { + // Directories are included if either something under them is included or they + // match an include glob. + if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) || + matchGlobArray(relativePath, include)) { + dirMap[relativePath] = { subDir: subDir, stats: stats }; + itemMapped = true; + } + } else if (stats.isFile()) { + // Files are included only if they match an include glob. + if (matchGlobArray(relativePath, include)) { + dirMap[relativePath] = { subDir: subDir, stats: stats }; + itemMapped = true; + } + } + } + }); + return itemMapped; + } + + function matchGlobArray (path, globs) { + return globs.some(function (elem) { + return minimatch(path, elem, {dot: true}); + }); + } +} + +/** + * Merges together multiple source maps and a target map into a single mapping from + * relative paths to objects with target and source paths and stats. + */ +function mergePathMaps (sourceMaps, targetMap, targetDir) { + // Merge multiple source maps together, along with target path info. + // Entries in later source maps override those in earlier source maps. + // Target stats will be filled in below for targets that exist. + var pathMap = {}; + sourceMaps.forEach(function (sourceMap) { + Object.keys(sourceMap).forEach(function (sourceSubPath) { + var sourceEntry = sourceMap[sourceSubPath]; + pathMap[sourceSubPath] = { + targetPath: path.join(targetDir, sourceSubPath), + targetStats: null, + sourcePath: path.join(sourceEntry.subDir, sourceSubPath), + sourceStats: sourceEntry.stats + }; + }); + }); + + // Fill in target stats for targets that exist, and create entries + // for targets that don't have any corresponding sources. + Object.keys(targetMap).forEach(function (subPath) { + var entry = pathMap[subPath]; + if (entry) { + entry.targetStats = targetMap[subPath].stats; + } else { + pathMap[subPath] = { + targetPath: path.join(targetDir, subPath), + targetStats: targetMap[subPath].stats, + sourcePath: null, + sourceStats: null + }; + } + }); + + return pathMap; +} + +module.exports = { + updatePath: updatePath, + updatePaths: updatePaths, + mergeAndUpdateDir: mergeAndUpdateDir +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/PlatformJson.js b/node_modules/cordova-android/node_modules/cordova-common/src/PlatformJson.js new file mode 100644 index 0000000..7eaf1a2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/PlatformJson.js @@ -0,0 +1,277 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var fs = require('fs'); +var path = require('path'); +var shelljs = require('shelljs'); +var mungeutil = require('./ConfigChanges/munge-util'); +var pluginMappernto = require('cordova-registry-mapper').newToOld; +var pluginMapperotn = require('cordova-registry-mapper').oldToNew; + +function PlatformJson (filePath, platform, root) { + this.filePath = filePath; + this.platform = platform; + this.root = fix_munge(root || {}); +} + +PlatformJson.load = function (plugins_dir, platform) { + var filePath = path.join(plugins_dir, platform + '.json'); + var root = null; + if (fs.existsSync(filePath)) { + root = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + } + return new PlatformJson(filePath, platform, root); +}; + +PlatformJson.prototype.save = function () { + shelljs.mkdir('-p', path.dirname(this.filePath)); + fs.writeFileSync(this.filePath, JSON.stringify(this.root, null, 2), 'utf-8'); +}; + +/** + * Indicates whether the specified plugin is installed as a top-level (not as + * dependency to others) + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed as top-level, otherwise false. + */ +PlatformJson.prototype.isPluginTopLevel = function (pluginId) { + var installedPlugins = this.root.installed_plugins; + return installedPlugins[pluginId] || + installedPlugins[pluginMappernto[pluginId]] || + installedPlugins[pluginMapperotn[pluginId]]; +}; + +/** + * Indicates whether the specified plugin is installed as a dependency to other + * plugin. + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed as a dependency, otherwise false. + */ +PlatformJson.prototype.isPluginDependent = function (pluginId) { + var dependentPlugins = this.root.dependent_plugins; + return dependentPlugins[pluginId] || + dependentPlugins[pluginMappernto[pluginId]] || + dependentPlugins[pluginMapperotn[pluginId]]; +}; + +/** + * Indicates whether plugin is installed either as top-level or as dependency. + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed, otherwise false. + */ +PlatformJson.prototype.isPluginInstalled = function (pluginId) { + return this.isPluginTopLevel(pluginId) || + this.isPluginDependent(pluginId); +}; + +PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) { + var pluginsList = isTopLevel ? + this.root.installed_plugins : + this.root.dependent_plugins; + + pluginsList[pluginId] = variables; + + return this; +}; + +/** + * @chaining + * Generates and adds metadata for provided plugin into associated .json file + * + * @param {PluginInfo} pluginInfo A pluginInfo instance to add metadata from + * @returns {this} Current PlatformJson instance to allow calls chaining + */ +PlatformJson.prototype.addPluginMetadata = function (pluginInfo) { + + var installedModules = this.root.modules || []; + + var installedPaths = installedModules.map(function (installedModule) { + return installedModule.file; + }); + + var modulesToInstall = pluginInfo.getJsModules(this.platform) + .map(function (module) { + return new ModuleMetadata(pluginInfo.id, module); + }) + .filter(function (metadata) { + // Filter out modules which are already added to metadata + return installedPaths.indexOf(metadata.file) === -1; + }); + + this.root.modules = installedModules.concat(modulesToInstall); + + this.root.plugin_metadata = this.root.plugin_metadata || {}; + this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version; + + return this; +}; + +PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) { + var pluginsList = isTopLevel ? + this.root.installed_plugins : + this.root.dependent_plugins; + + delete pluginsList[pluginId]; + + return this; +}; + +/** + * @chaining + * Removes metadata for provided plugin from associated file + * + * @param {PluginInfo} pluginInfo A PluginInfo instance to which modules' metadata + * we need to remove + * + * @returns {this} Current PlatformJson instance to allow calls chaining + */ +PlatformJson.prototype.removePluginMetadata = function (pluginInfo) { + var modulesToRemove = pluginInfo.getJsModules(this.platform) + .map(function (jsModule) { + return ['plugins', pluginInfo.id, jsModule.src].join('/'); + }); + + var installedModules = this.root.modules || []; + this.root.modules = installedModules + .filter(function (installedModule) { + // Leave only those metadatas which 'file' is not in removed modules + return (modulesToRemove.indexOf(installedModule.file) === -1); + }); + + if (this.root.plugin_metadata) { + delete this.root.plugin_metadata[pluginInfo.id]; + } + + return this; +}; + +PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) { + this.root.prepare_queue.installed.push({'plugin': pluginDirName, 'vars': vars, 'topLevel': is_top_level, 'force': force}); +}; + +PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) { + this.root.prepare_queue.uninstalled.push({'plugin': pluginId, 'id': pluginId, 'topLevel': is_top_level}); +}; + +/** + * Moves plugin, specified by id to top-level plugins. If plugin is top-level + * already, then does nothing. + * @method function + * @param {String} pluginId A plugin id to make top-level. + * @return {PlatformJson} PlatformJson instance. + */ +PlatformJson.prototype.makeTopLevel = function (pluginId) { + var plugin = this.root.dependent_plugins[pluginId]; + if (plugin) { + delete this.root.dependent_plugins[pluginId]; + this.root.installed_plugins[pluginId] = plugin; + } + return this; +}; + +/** + * Generates a metadata for all installed plugins and js modules. The resultant + * string is ready to be written to 'cordova_plugins.js' + * + * @returns {String} cordova_plugins.js contents + */ +PlatformJson.prototype.generateMetadata = function () { + return [ + 'cordova.define(\'cordova/plugin_list\', function(require, exports, module) {', + 'module.exports = ' + JSON.stringify(this.root.modules, null, 2) + ';', + 'module.exports.metadata = ', + '// TOP OF METADATA', + JSON.stringify(this.root.plugin_metadata, null, 2) + ';', + '// BOTTOM OF METADATA', + '});' // Close cordova.define. + ].join('\n'); +}; + +/** + * @chaining + * Generates and then saves metadata to specified file. Doesn't check if file exists. + * + * @param {String} destination File metadata will be written to + * @return {PlatformJson} PlatformJson instance + */ +PlatformJson.prototype.generateAndSaveMetadata = function (destination) { + var meta = this.generateMetadata(); + shelljs.mkdir('-p', path.dirname(destination)); + fs.writeFileSync(destination, meta, 'utf-8'); + + return this; +}; + +// convert a munge from the old format ([file][parent][xml] = count) to the current one +function fix_munge (root) { + root.prepare_queue = root.prepare_queue || {installed: [], uninstalled: []}; + root.config_munge = root.config_munge || {files: {}}; + root.installed_plugins = root.installed_plugins || {}; + root.dependent_plugins = root.dependent_plugins || {}; + + var munge = root.config_munge; + if (!munge.files) { + var new_munge = { files: {} }; + for (var file in munge) { + for (var selector in munge[file]) { + for (var xml_child in munge[file][selector]) { + var val = parseInt(munge[file][selector][xml_child]); + for (var i = 0; i < val; i++) { + mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]); + } + } + } + } + root.config_munge = new_munge; + } + + return root; +} + +/** + * @constructor + * @class ModuleMetadata + * + * Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js' + * file at run time + * + * @param {String} pluginId Plugin id where this module installed from + * @param (JsModule|Object) jsModule A js-module entry from PluginInfo class to generate metadata for + */ +function ModuleMetadata (pluginId, jsModule) { + + if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id'); + if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties'); + + this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^\/]+)\.js/)[1]); /* eslint no-useless-escape: 0 */ + this.file = ['plugins', pluginId, jsModule.src].join('/'); + this.pluginId = pluginId; + + if (jsModule.clobbers && jsModule.clobbers.length > 0) { + this.clobbers = jsModule.clobbers.map(function (o) { return o.target; }); + } + if (jsModule.merges && jsModule.merges.length > 0) { + this.merges = jsModule.merges.map(function (o) { return o.target; }); + } + if (jsModule.runs) { + this.runs = true; + } +} + +module.exports = PlatformJson; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfo.js b/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfo.js new file mode 100644 index 0000000..7e9754d --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfo.js @@ -0,0 +1,439 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* +A class for holidng the information currently stored in plugin.xml +It should also be able to answer questions like whether the plugin +is compatible with a given engine version. + +TODO (kamrik): refactor this to not use sync functions and return promises. +*/ + +var path = require('path'); +var fs = require('fs'); +var xml_helpers = require('../util/xml-helpers'); +var CordovaError = require('../CordovaError/CordovaError'); + +function PluginInfo (dirname) { + var self = this; + + // METHODS + // Defined inside the constructor to avoid the "this" binding problems. + + // tag + // Example: + // Used to require a variable to be specified via --variable when installing the plugin. + // returns { key : default | null} + self.getPreferences = getPreferences; + function getPreferences (platform) { + return _getTags(self._et, 'preference', platform, _parsePreference) + .reduce(function (preferences, pref) { + preferences[pref.preference] = pref.default; + return preferences; + }, {}); + } + + function _parsePreference (prefTag) { + var name = prefTag.attrib.name.toUpperCase(); + var def = prefTag.attrib.default || null; + return {preference: name, default: def}; + } + + // + self.getAssets = getAssets; + function getAssets (platform) { + var assets = _getTags(self._et, 'asset', platform, _parseAsset); + return assets; + } + + function _parseAsset (tag) { + var src = tag.attrib.src; + var target = tag.attrib.target; + + if (!src || !target) { + var msg = + 'Malformed tag. Both "src" and "target" attributes' + + 'must be specified in\n' + + self.filepath + ; + throw new Error(msg); + } + + var asset = { + itemType: 'asset', + src: src, + target: target + }; + return asset; + } + + // + // Example: + // + self.getDependencies = getDependencies; + function getDependencies (platform) { + var deps = _getTags( + self._et, + 'dependency', + platform, + _parseDependency + ); + return deps; + } + + function _parseDependency (tag) { + var dep = + { id: tag.attrib.id, + version: tag.attrib.version || '', + url: tag.attrib.url || '', + subdir: tag.attrib.subdir || '', + commit: tag.attrib.commit + }; + + dep.git_ref = dep.commit; + + if (!dep.id) { + var msg = + ' tag is missing id attribute in ' + + self.filepath + ; + throw new CordovaError(msg); + } + return dep; + } + + // tag + self.getConfigFiles = getConfigFiles; + function getConfigFiles (platform) { + var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile); + return configFiles; + } + + function _parseConfigFile (tag) { + var configFile = + { target: tag.attrib['target'], + parent: tag.attrib['parent'], + after: tag.attrib['after'], + xmls: tag.getchildren(), + // To support demuxing via versions + versions: tag.attrib['versions'], + deviceTarget: tag.attrib['device-target'] + }; + return configFile; + } + + self.getEditConfigs = getEditConfigs; + function getEditConfigs (platform) { + var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs); + return editConfigs; + } + + function _parseEditConfigs (tag) { + var editConfig = + { file: tag.attrib['file'], + target: tag.attrib['target'], + mode: tag.attrib['mode'], + xmls: tag.getchildren() + }; + return editConfig; + } + + // tags, both global and within a + // TODO (kamrik): Do we ever use under ? Example wanted. + self.getInfo = getInfo; + function getInfo (platform) { + var infos = _getTags( + self._et, + 'info', + platform, + function (elem) { return elem.text; } + ); + // Filter out any undefined or empty strings. + infos = infos.filter(Boolean); + return infos; + } + + // + // Examples: + // + // + self.getSourceFiles = getSourceFiles; + function getSourceFiles (platform) { + var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile); + return sourceFiles; + } + + function _parseSourceFile (tag) { + return { + itemType: 'source-file', + src: tag.attrib.src, + framework: isStrTrue(tag.attrib.framework), + weak: isStrTrue(tag.attrib.weak), + compilerFlags: tag.attrib['compiler-flags'], + targetDir: tag.attrib['target-dir'] + }; + } + + // + // Example: + // + self.getHeaderFiles = getHeaderFiles; + function getHeaderFiles (platform) { + var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) { + return { + itemType: 'header-file', + src: tag.attrib.src, + targetDir: tag.attrib['target-dir'] + }; + }); + return headerFiles; + } + + // + // Example: + // + self.getResourceFiles = getResourceFiles; + function getResourceFiles (platform) { + var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) { + return { + itemType: 'resource-file', + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch, + reference: tag.attrib.reference + }; + }); + return resourceFiles; + } + + // + // Example: + // + self.getLibFiles = getLibFiles; + function getLibFiles (platform) { + var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) { + return { + itemType: 'lib-file', + src: tag.attrib.src, + arch: tag.attrib.arch, + Include: tag.attrib.Include, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'] || tag.attrib.target + }; + }); + return libFiles; + } + + // + // Example: + // + self.getHookScripts = getHookScripts; + function getHookScripts (hook, platforms) { + var scriptElements = self._et.findall('./hook'); + + if (platforms) { + platforms.forEach(function (platform) { + scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook')); + }); + } + + function filterScriptByHookType (el) { + return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook; + } + + return scriptElements.filter(filterScriptByHookType); + } + + self.getJsModules = getJsModules; + function getJsModules (platform) { + var modules = _getTags(self._et, 'js-module', platform, _parseJsModule); + return modules; + } + + function _parseJsModule (tag) { + var ret = { + itemType: 'js-module', + name: tag.attrib.name, + src: tag.attrib.src, + clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }), + merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }), + runs: tag.findall('runs').length > 0 + }; + + return ret; + } + + self.getEngines = function () { + return self._et.findall('engines/engine').map(function (n) { + return { + name: n.attrib.name, + version: n.attrib.version, + platform: n.attrib.platform, + scriptSrc: n.attrib.scriptSrc + }; + }); + }; + + self.getPlatforms = function () { + return self._et.findall('platform').map(function (n) { + return { name: n.attrib.name }; + }); + }; + + self.getPlatformsArray = function () { + return self._et.findall('platform').map(function (n) { + return n.attrib.name; + }); + }; + + self.getFrameworks = function (platform, options) { + return _getTags(self._et, 'framework', platform, function (el) { + var src = el.attrib.src; + if (options) { + var vars = options.cli_variables || {}; + + if (Object.keys(vars).length === 0) { + // get variable defaults from plugin.xml for removal + vars = self.getPreferences(platform); + } + var regExp; + // Iterate over plugin variables. + // Replace them in framework src if they exist + Object.keys(vars).forEach(function (name) { + if (vars[name]) { + regExp = new RegExp('\\$' + name, 'g'); + src = src.replace(regExp, vars[name]); + } + }); + } + var ret = { + itemType: 'framework', + type: el.attrib.type, + parent: el.attrib.parent, + custom: isStrTrue(el.attrib.custom), + embed: isStrTrue(el.attrib.embed), + src: src, + spec: el.attrib.spec, + weak: isStrTrue(el.attrib.weak), + versions: el.attrib.versions, + targetDir: el.attrib['target-dir'], + deviceTarget: el.attrib['device-target'] || el.attrib.target, + arch: el.attrib.arch, + implementation: el.attrib.implementation + }; + return ret; + }); + }; + + self.getFilesAndFrameworks = getFilesAndFrameworks; + function getFilesAndFrameworks (platform, options) { + // Please avoid changing the order of the calls below, files will be + // installed in this order. + var items = [].concat( + self.getSourceFiles(platform), + self.getHeaderFiles(platform), + self.getResourceFiles(platform), + self.getFrameworks(platform, options), + self.getLibFiles(platform) + ); + return items; + } + /// // End of PluginInfo methods ///// + + /// // PluginInfo Constructor logic ///// + self.filepath = path.join(dirname, 'plugin.xml'); + if (!fs.existsSync(self.filepath)) { + throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.'); + } + + self.dir = dirname; + var et = self._et = xml_helpers.parseElementtreeSync(self.filepath); + var pelem = et.getroot(); + self.id = pelem.attrib.id; + self.version = pelem.attrib.version; + + // Optional fields + self.name = pelem.findtext('name'); + self.description = pelem.findtext('description'); + self.license = pelem.findtext('license'); + self.repo = pelem.findtext('repo'); + self.issue = pelem.findtext('issue'); + self.keywords = pelem.findtext('keywords'); + self.info = pelem.findtext('info'); + if (self.keywords) { + self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); }); + } + self.getKeywordsAndPlatforms = function () { + var ret = self.keywords || []; + return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray())); + }; +} // End of PluginInfo constructor. + +// Helper function used to prefix every element of an array with cordova- +// Useful when we want to modify platforms to be cordova-platform +function addCordova (someArray) { + var newArray = someArray.map(function (element) { + return 'cordova-' + element; + }); + return newArray; +} + +// Helper function used by most of the getSomething methods of PluginInfo. +// Get all elements of a given name. Both in root and in platform sections +// for the given platform. If transform is given and is a function, it is +// applied to each element. +function _getTags (pelem, tag, platform, transform) { + var platformTag = pelem.find('./platform[@name="' + platform + '"]'); + var tagsInRoot = pelem.findall(tag); + tagsInRoot = tagsInRoot || []; + var tagsInPlatform = platformTag ? platformTag.findall(tag) : []; + var tags = tagsInRoot.concat(tagsInPlatform); + if (typeof transform === 'function') { + tags = tags.map(transform); + } + return tags; +} + +// Same as _getTags() but only looks inside a platform section. +function _getTagsInPlatform (pelem, tag, platform, transform) { + var platformTag = pelem.find('./platform[@name="' + platform + '"]'); + var tags = platformTag ? platformTag.findall(tag) : []; + if (typeof transform === 'function') { + tags = tags.map(transform); + } + return tags; +} + +// Check if x is a string 'true'. +function isStrTrue (x) { + return String(x).toLowerCase() === 'true'; +} + +module.exports = PluginInfo; +// Backwards compat: +PluginInfo.PluginInfo = PluginInfo; +PluginInfo.loadPluginsDir = function (dir) { + var PluginInfoProvider = require('./PluginInfoProvider'); + return new PluginInfoProvider().getAllWithinSearchPath(dir); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js b/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js new file mode 100644 index 0000000..5d3f329 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js @@ -0,0 +1,82 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/* jshint sub:true, laxcomma:true, laxbreak:true */ + +var fs = require('fs'); +var path = require('path'); +var PluginInfo = require('./PluginInfo'); +var events = require('../events'); + +function PluginInfoProvider () { + this._cache = {}; + this._getAllCache = {}; +} + +PluginInfoProvider.prototype.get = function (dirName) { + var absPath = path.resolve(dirName); + if (!this._cache[absPath]) { + this._cache[absPath] = new PluginInfo(dirName); + } + return this._cache[absPath]; +}; + +// Normally you don't need to put() entries, but it's used +// when copying plugins, and in unit tests. +PluginInfoProvider.prototype.put = function (pluginInfo) { + var absPath = path.resolve(pluginInfo.dir); + this._cache[absPath] = pluginInfo; +}; + +// Used for plugin search path processing. +// Given a dir containing multiple plugins, create a PluginInfo object for +// each of them and return as array. +// Should load them all in parallel and return a promise, but not yet. +PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) { + var absPath = path.resolve(dirName); + if (!this._getAllCache[absPath]) { + this._getAllCache[absPath] = getAllHelper(absPath, this); + } + return this._getAllCache[absPath]; +}; + +function getAllHelper (absPath, provider) { + if (!fs.existsSync(absPath)) { + return []; + } + // If dir itself is a plugin, return it in an array with one element. + if (fs.existsSync(path.join(absPath, 'plugin.xml'))) { + return [provider.get(absPath)]; + } + var subdirs = fs.readdirSync(absPath); + var plugins = []; + subdirs.forEach(function (subdir) { + var d = path.join(absPath, subdir); + if (fs.existsSync(path.join(d, 'plugin.xml'))) { + try { + plugins.push(provider.get(d)); + } catch (e) { + events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack)); + } + } + }); + return plugins; +} + +module.exports = PluginInfoProvider; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/PluginManager.js b/node_modules/cordova-android/node_modules/cordova-common/src/PluginManager.js new file mode 100644 index 0000000..0097db4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/PluginManager.js @@ -0,0 +1,149 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); + +var ActionStack = require('./ActionStack'); +var PlatformJson = require('./PlatformJson'); +var CordovaError = require('./CordovaError/CordovaError'); +var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger; +var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider'); + +/** + * @constructor + * @class PluginManager + * Represents an entity for adding/removing plugins for platforms + * + * @param {String} platform Platform name + * @param {Object} locations - Platform files and directories + * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from + */ +function PluginManager (platform, locations, ideProject) { + this.platform = platform; + this.locations = locations; + this.project = ideProject; + + var platformJson = PlatformJson.load(locations.root, platform); + this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider()); +} + +/** + * @constructs PluginManager + * A convenience shortcut to new PluginManager(...) + * + * @param {String} platform Platform name + * @param {Object} locations - Platform files and directories + * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from + * @returns new PluginManager instance + */ +PluginManager.get = function (platform, locations, ideProject) { + return new PluginManager(platform, locations, ideProject); +}; + +PluginManager.INSTALL = 'install'; +PluginManager.UNINSTALL = 'uninstall'; + +module.exports = PluginManager; + +/** + * Describes and implements common plugin installation/uninstallation routine. The flow is the following: + * * Validate and set defaults for options. Note that options are empty by default. Everything + * needed for platform IDE project must be passed from outside. Plugin variables (which + * are the part of the options) also must be already populated with 'PACKAGE_NAME' variable. + * * Collect all plugin's native and web files, get installers/uninstallers and process + * all these via ActionStack. + * * Save the IDE project, so the changes made by installers are persisted. + * * Generate config changes munge for plugin and apply it to all required files + * * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js' + * + * @param {PluginInfo} plugin A PluginInfo structure representing plugin to install + * @param {Object} [options={}] An installation options. It is expected but is not necessary + * that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller. + * + * @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise. + */ +PluginManager.prototype.doOperation = function (operation, plugin, options) { + if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); } + + if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); } + + // Set default to empty object to play safe when accesing properties + options = options || {}; + + var self = this; + var actions = new ActionStack(); + + // gather all files need to be handled during operation ... + plugin.getFilesAndFrameworks(this.platform, options) + .concat(plugin.getAssets(this.platform)) + .concat(plugin.getJsModules(this.platform)) + // ... put them into stack ... + .forEach(function (item) { + var installer = self.project.getInstaller(item.itemType); + var uninstaller = self.project.getUninstaller(item.itemType); + var actionArgs = [item, plugin, self.project, options]; + + var action; + if (operation === PluginManager.INSTALL) { + action = actions.createAction.apply(actions, [installer, actionArgs, uninstaller, actionArgs]); /* eslint no-useless-call: 0 */ + } else /* op === PluginManager.UNINSTALL */{ + action = actions.createAction.apply(actions, [uninstaller, actionArgs, installer, actionArgs]); /* eslint no-useless-call: 0 */ + } + actions.push(action); + }); + + // ... and run through the action stack + return actions.process(this.platform) + .then(function () { + if (self.project.write) { + self.project.write(); + } + + if (operation === PluginManager.INSTALL) { + // Ignore passed `is_top_level` option since platform itself doesn't know + // anything about managing dependencies - it's responsibility of caller. + self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force); + self.munger.platformJson.addPluginMetadata(plugin); + } else { + self.munger.remove_plugin_changes(plugin, /* is_top_level= */true); + self.munger.platformJson.removePluginMetadata(plugin); + } + + // Save everything (munge and plugin/modules metadata) + self.munger.save_all(); + + var metadata = self.munger.platformJson.generateMetadata(); + fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8'); + + // CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified + if (options.usePlatformWww) { + fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8'); + } + }); +}; + +PluginManager.prototype.addPlugin = function (plugin, installOptions) { + return this.doOperation(PluginManager.INSTALL, plugin, installOptions); +}; + +PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) { + return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/events.js b/node_modules/cordova-android/node_modules/cordova-common/src/events.js new file mode 100644 index 0000000..7038643 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/events.js @@ -0,0 +1,72 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var EventEmitter = require('events').EventEmitter; + +var INSTANCE = new EventEmitter(); +INSTANCE.setMaxListeners(20); +var EVENTS_RECEIVER; + +module.exports = INSTANCE; + +/** + * Sets up current instance to forward emitted events to another EventEmitter + * instance. + * + * @param {EventEmitter} [eventEmitter] The emitter instance to forward + * events to. Falsy value, when passed, disables forwarding. + */ +module.exports.forwardEventsTo = function (eventEmitter) { + + // If no argument is specified disable events forwarding + if (!eventEmitter) { + EVENTS_RECEIVER = undefined; + return; + } + + if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Cordova events can be redirected to another EventEmitter instance only'); } + + // CB-10940 Skipping forwarding to self to avoid infinite recursion. + // This is the case when the modules are npm-linked. + if (this !== eventEmitter) { + EVENTS_RECEIVER = eventEmitter; + } else { + // Reset forwarding if we are subscribing to self + EVENTS_RECEIVER = undefined; + } +}; + +var emit = INSTANCE.emit; + +/** + * This method replaces original 'emit' method to allow events forwarding. + * + * @return {eventEmitter} Current instance to allow calls chaining, as + * original 'emit' does + */ +module.exports.emit = function () { + + var args = Array.prototype.slice.call(arguments); + + if (EVENTS_RECEIVER) { + EVENTS_RECEIVER.emit.apply(EVENTS_RECEIVER, args); + } + + return emit.apply(this, args); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/superspawn.js b/node_modules/cordova-android/node_modules/cordova-common/src/superspawn.js new file mode 100644 index 0000000..424934e --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/superspawn.js @@ -0,0 +1,189 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var child_process = require('child_process'); +var fs = require('fs'); +var path = require('path'); +var _ = require('underscore'); +var Q = require('q'); +var shell = require('shelljs'); +var events = require('./events'); +var iswin32 = process.platform === 'win32'; + +// On Windows, spawn() for batch files requires absolute path & having the extension. +function resolveWindowsExe (cmd) { + var winExtensions = ['.exe', '.bat', '.cmd', '.js', '.vbs']; + function isValidExe (c) { + return winExtensions.indexOf(path.extname(c)) !== -1 && fs.existsSync(c); + } + if (isValidExe(cmd)) { + return cmd; + } + cmd = shell.which(cmd) || cmd; + if (!isValidExe(cmd)) { + winExtensions.some(function (ext) { + if (fs.existsSync(cmd + ext)) { + cmd = cmd + ext; + return true; + } + }); + } + return cmd; +} + +function maybeQuote (a) { + if (/^[^"].*[ &].*[^"]/.test(a)) return '"' + a + '"'; + return a; +} + +/** + * A special implementation for child_process.spawn that handles + * Windows-specific issues with batch files and spaces in paths. Returns a + * promise that succeeds only for return code 0. It is also possible to + * subscribe on spawned process' stdout and stderr streams using progress + * handler for resultant promise. + * + * @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){ + * if (stdio.stderr) { console.error(stdio.stderr); } }) + * .then(function(result){ // do other stuff }) + * + * @param {String} cmd A command to spawn + * @param {String[]} [args=[]] An array of arguments, passed to spawned + * process + * @param {Object} [opts={}] A configuration object + * @param {String|String[]|Object} opts.stdio Property that configures how + * spawned process' stdio will behave. Has the same meaning and possible + * values as 'stdio' options for child_process.spawn method + * (https://nodejs.org/api/child_process.html#child_process_options_stdio). + * @param {Object} [env={}] A map of extra environment variables + * @param {String} [cwd=process.cwd()] Working directory for the command + * @param {Boolean} [chmod=false] If truthy, will attempt to set the execute + * bit before executing on non-Windows platforms + * + * @return {Promise} A promise that is either fulfilled if the spawned + * process is exited with zero error code or rejected otherwise. If the + * 'stdio' option set to 'default' or 'pipe', the promise also emits progress + * messages with the following contents: + * { + * 'stdout': ..., + * 'stderr': ... + * } + */ +exports.spawn = function (cmd, args, opts) { + args = args || []; + opts = opts || {}; + var spawnOpts = {}; + var d = Q.defer(); + + if (iswin32) { + cmd = resolveWindowsExe(cmd); + // If we couldn't find the file, likely we'll end up failing, + // but for things like "del", cmd will do the trick. + if (path.extname(cmd) !== '.exe') { + var cmdArgs = '"' + [cmd].concat(args).map(maybeQuote).join(' ') + '"'; + // We need to use /s to ensure that spaces are parsed properly with cmd spawned content + args = [['/s', '/c', cmdArgs].join(' ')]; + cmd = 'cmd'; + spawnOpts.windowsVerbatimArguments = true; + } else if (!fs.existsSync(cmd)) { + // We need to use /s to ensure that spaces are parsed properly with cmd spawned content + args = ['/s', '/c', cmd].concat(args).map(maybeQuote); + } + } + + if (opts.stdio !== 'default') { + // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option + spawnOpts.stdio = opts.stdio; + } + + if (opts.cwd) { + spawnOpts.cwd = opts.cwd; + } + + if (opts.env) { + spawnOpts.env = _.extend(_.extend({}, process.env), opts.env); + } + + if (opts.chmod && !iswin32) { + try { + // This fails when module is installed in a system directory (e.g. via sudo npm install) + fs.chmodSync(cmd, '755'); + } catch (e) { + // If the perms weren't set right, then this will come as an error upon execution. + } + } + + events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' ')); + + var child = child_process.spawn(cmd, args, spawnOpts); + var capturedOut = ''; + var capturedErr = ''; + + if (child.stdout) { + child.stdout.setEncoding('utf8'); + child.stdout.on('data', function (data) { + capturedOut += data; + d.notify({'stdout': data}); + }); + } + + if (child.stderr) { + child.stderr.setEncoding('utf8'); + child.stderr.on('data', function (data) { + capturedErr += data; + d.notify({'stderr': data}); + }); + } + + child.on('close', whenDone); + child.on('error', whenDone); + function whenDone (arg) { + child.removeListener('close', whenDone); + child.removeListener('error', whenDone); + var code = typeof arg === 'number' ? arg : arg && arg.code; + + events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args); + if (code === 0) { + d.resolve(capturedOut.trim()); + } else { + var errMsg = cmd + ': Command failed with exit code ' + code; + if (capturedErr) { + errMsg += ' Error output:\n' + capturedErr.trim(); + } + var err = new Error(errMsg); + if (capturedErr) { + err.stderr = capturedErr; + } + if (capturedOut) { + err.stdout = capturedOut; + } + err.code = code; + d.reject(err); + } + } + + return d.promise; +}; + +exports.maybeSpawn = function (cmd, args, opts) { + if (fs.existsSync(cmd)) { + return exports.spawn(cmd, args, opts); + } + return Q(null); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/util/addProperty.js b/node_modules/cordova-android/node_modules/cordova-common/src/util/addProperty.js new file mode 100644 index 0000000..3e48174 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/util/addProperty.js @@ -0,0 +1,32 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +module.exports = function addProperty (module, property, modulePath, obj) { + + obj = obj || module.exports; + // Add properties as getter to delay load the modules on first invocation + Object.defineProperty(obj, property, { + configurable: true, + get: function () { + var delayLoadedModule = module.require(modulePath); + obj[property] = delayLoadedModule; + return delayLoadedModule; + } + }); +}; diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/util/plist-helpers.js b/node_modules/cordova-android/node_modules/cordova-common/src/util/plist-helpers.js new file mode 100644 index 0000000..5ec4c1d --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/util/plist-helpers.js @@ -0,0 +1,96 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +/* eslint no-useless-escape: 0 */ + +// contains PLIST utility functions +var __ = require('underscore'); +var plist = require('plist'); + +// adds node to doc at selector +module.exports.graftPLIST = graftPLIST; +function graftPLIST (doc, xml, selector) { + var obj = plist.parse('' + xml + ''); + + var node = doc[selector]; + if (node && Array.isArray(node) && Array.isArray(obj)) { + node = node.concat(obj); + for (var i = 0; i < node.length; i++) { + for (var j = i + 1; j < node.length; ++j) { + if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); } + } + } + doc[selector] = node; + } else { + // plist uses objects for . If we have two dicts we merge them instead of + // overriding the old one. See CB-6472 + if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above + __.extend(obj, node); + } + doc[selector] = obj; + } + + return true; +} + +// removes node from doc at selector +module.exports.prunePLIST = prunePLIST; +function prunePLIST (doc, xml, selector) { + var obj = plist.parse('' + xml + ''); + + pruneOBJECT(doc, selector, obj); + + return true; +} + +function pruneOBJECT (doc, selector, fragment) { + if (Array.isArray(fragment) && Array.isArray(doc[selector])) { + var empty = true; + for (var i in fragment) { + for (var j in doc[selector]) { + empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty; + } + } + if (empty) { + delete doc[selector]; + return true; + } + } else if (nodeEqual(doc[selector], fragment)) { + delete doc[selector]; + return true; + } + + return false; +} + +function nodeEqual (node1, node2) { + if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') { + node2 = escapeRE(node2).replace(/\\\$\S+/gm, '(.*?)'); + return new RegExp('^' + node2 + '$').test(node1); + } else { + for (var key in node2) { + if (!nodeEqual(node1[key], node2[key])) return false; + } + return true; + } +} + +// escape string for use in regex +function escapeRE (str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); +} diff --git a/node_modules/cordova-android/node_modules/cordova-common/src/util/xml-helpers.js b/node_modules/cordova-android/node_modules/cordova-common/src/util/xml-helpers.js new file mode 100644 index 0000000..6b5d70f --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-common/src/util/xml-helpers.js @@ -0,0 +1,365 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +/** + * contains XML utility functions, some of which are specific to elementtree + */ + +var fs = require('fs'); +var path = require('path'); +var _ = require('underscore'); +var et = require('elementtree'); + +/* eslint-disable no-useless-escape */ +var ROOT = /^\/([^\/]*)/; +var ABSOLUTE = /^\/([^\/]*)\/(.*)/; +/* eslint-enable no-useless-escape */ + +module.exports = { + // compare two et.XML nodes, see if they match + // compares tagName, text, attributes and children (recursively) + equalNodes: function (one, two) { + if (one.tag !== two.tag) { + return false; + } else if (one.text.trim() !== two.text.trim()) { + return false; + } else if (one._children.length !== two._children.length) { + return false; + } + + if (!attribMatch(one, two)) return false; + + for (var i = 0; i < one._children.length; i++) { + if (!module.exports.equalNodes(one._children[i], two._children[i])) { + return false; + } + } + + return true; + }, + + // adds node to doc at selector, creating parent if it doesn't exist + graftXML: function (doc, nodes, selector, after) { + var parent = module.exports.resolveParent(doc, selector); + if (!parent) { + // Try to create the parent recursively if necessary + try { + var parentToCreate = et.XML('<' + path.basename(selector) + '>'); + var parentSelector = path.dirname(selector); + + this.graftXML(doc, [parentToCreate], parentSelector); + } catch (e) { + return false; + } + parent = module.exports.resolveParent(doc, selector); + if (!parent) return false; + } + + nodes.forEach(function (node) { + // check if child is unique first + if (uniqueChild(node, parent)) { + var children = parent.getchildren(); + var insertIdx = after ? findInsertIdx(children, after) : children.length; + + // TODO: replace with parent.insert after the bug in ElementTree is fixed + parent.getchildren().splice(insertIdx, 0, node); + } + }); + + return true; + }, + + // adds new attributes to doc at selector + // Will only merge if attribute has not been modified already or --force is used + graftXMLMerge: function (doc, nodes, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + // saves the attributes of the original xml before making changes + xml.oldAttrib = _.extend({}, target.attrib); + + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + target.attrib[attribute] = node.attrib[attribute]; + } + }); + + return true; + }, + + // overwrite all attributes to doc at selector with new attributes + // Will only overwrite if attribute has not been modified already or --force is used + graftXMLOverwrite: function (doc, nodes, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + // saves the attributes of the original xml before making changes + xml.oldAttrib = _.extend({}, target.attrib); + + // remove old attributes from target + var targetAttributes = target.attrib; + for (var targetAttribute in targetAttributes) { + delete targetAttributes[targetAttribute]; + } + + // add new attributes to target + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + target.attrib[attribute] = node.attrib[attribute]; + } + }); + + return true; + }, + + // removes node from doc at selector + pruneXML: function (doc, nodes, selector) { + var parent = module.exports.resolveParent(doc, selector); + if (!parent) return false; + + nodes.forEach(function (node) { + var matchingKid = null; + if ((matchingKid = findChild(node, parent)) !== null) { + // stupid elementtree takes an index argument it doesn't use + // and does not conform to the python lib + parent.remove(matchingKid); + } + }); + + return true; + }, + + // restores attributes from doc at selector + pruneXMLRestore: function (doc, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + if (xml.oldAttrib) { + target.attrib = _.extend({}, xml.oldAttrib); + } + + return true; + }, + + pruneXMLRemove: function (doc, selector, nodes) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + if (target.attrib[attribute]) { + delete target.attrib[attribute]; + } + } + }); + + return true; + + }, + + parseElementtreeSync: function (filename) { + var contents = fs.readFileSync(filename, 'utf-8'); + if (contents) { + // Windows is the BOM. Skip the Byte Order Mark. + contents = contents.substring(contents.indexOf('<')); + } + return new et.ElementTree(et.XML(contents)); + }, + + resolveParent: function (doc, selector) { + var parent, tagName, subSelector; + + // handle absolute selector (which elementtree doesn't like) + if (ROOT.test(selector)) { + tagName = selector.match(ROOT)[1]; + // test for wildcard "any-tag" root selector + if (tagName === '*' || tagName === doc._root.tag) { + parent = doc._root; + + // could be an absolute path, but not selecting the root + if (ABSOLUTE.test(selector)) { + subSelector = selector.match(ABSOLUTE)[2]; + parent = parent.find(subSelector); + } + } else { + return false; + } + } else { + parent = doc.find(selector); + } + return parent; + } +}; + +function findChild (node, parent) { + var matchingKids = parent.findall(node.tag); + var i; + var j; + + for (i = 0, j = matchingKids.length; i < j; i++) { + if (module.exports.equalNodes(node, matchingKids[i])) { + return matchingKids[i]; + } + } + return null; +} + +function uniqueChild (node, parent) { + var matchingKids = parent.findall(node.tag); + var i = 0; + + if (matchingKids.length === 0) { + return true; + } else { + for (i; i < matchingKids.length; i++) { + if (module.exports.equalNodes(node, matchingKids[i])) { + return false; + } + } + return true; + } +} + +// Find the index at which to insert an entry. After is a ;-separated priority list +// of tags after which the insertion should be made. E.g. If we need to +// insert an element C, and the rule is that the order of children has to be +// As, Bs, Cs. After will be equal to "C;B;A". +function findInsertIdx (children, after) { + var childrenTags = children.map(function (child) { return child.tag; }); + var afters = after.split(';'); + var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); }); + var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; }); + + // add to the beginning if no matching nodes are found + return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1; +} + +var BLACKLIST = ['platform', 'feature', 'plugin', 'engine']; +var SINGLETONS = ['content', 'author', 'name']; +function mergeXml (src, dest, platform, clobber) { + // Do nothing for blacklisted tags. + if (BLACKLIST.indexOf(src.tag) !== -1) return; + + // Handle attributes + Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) { + if (clobber || !dest.attrib[attribute]) { + dest.attrib[attribute] = src.attrib[attribute]; + } + }); + // Handle text + if (src.text && (clobber || !dest.text)) { + dest.text = src.text; + } + // Handle children + src.getchildren().forEach(mergeChild); + + // Handle platform + if (platform) { + src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) { + platformElement.getchildren().forEach(mergeChild); + }); + } + + // Handle duplicate preference tags (by name attribute) + removeDuplicatePreferences(dest); + + function mergeChild (srcChild) { + var srcTag = srcChild.tag; + var destChild = new et.Element(srcTag); + var foundChild; + var query = srcTag + ''; + var shouldMerge = true; + + if (BLACKLIST.indexOf(srcTag) !== -1) return; + + if (SINGLETONS.indexOf(srcTag) !== -1) { + foundChild = dest.find(query); + if (foundChild) { + destChild = foundChild; + dest.remove(destChild); + } + } else { + // Check for an exact match and if you find one don't add + var mergeCandidates = dest.findall(query) + .filter(function (foundChild) { + return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild); + }); + + if (mergeCandidates.length > 0) { + destChild = mergeCandidates[0]; + dest.remove(destChild); + shouldMerge = false; + } + } + + mergeXml(srcChild, destChild, platform, clobber && shouldMerge); + dest.append(destChild); + } + + function removeDuplicatePreferences (xml) { + // reduce preference tags to a hashtable to remove dupes + var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) { + previousValue[ currentValue.attrib.name ] = currentValue.attrib.value; + return previousValue; + }, {}); + + // remove all preferences + xml.findall('preference[@name][@value]').forEach(function (pref) { + xml.remove(pref); + }); + + // write new preferences + Object.keys(prefHash).forEach(function (key) { + var element = et.SubElement(xml, 'preference'); + element.set('name', key); + element.set('value', this[key]); + }, prefHash); + } +} + +// Expose for testing. +module.exports.mergeXml = mergeXml; + +function textMatch (elm1, elm2) { + var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : ''; + var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : ''; + return (text1 === '' || text1 === text2); +} + +function attribMatch (one, two) { + var oneAttribKeys = Object.keys(one.attrib); + var twoAttribKeys = Object.keys(two.attrib); + + if (oneAttribKeys.length !== twoAttribKeys.length) { + return false; + } + + for (var i = 0; i < oneAttribKeys.length; i++) { + var attribName = oneAttribKeys[i]; + + if (one.attrib[attribName] !== two.attrib[attribName]) { + return false; + } + } + + return true; +} diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/.npmignore b/node_modules/cordova-android/node_modules/cordova-registry-mapper/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/.travis.yml b/node_modules/cordova-android/node_modules/cordova-registry-mapper/.travis.yml new file mode 100644 index 0000000..ae381fc --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +sudo: false +node_js: + - "0.10" +install: npm install +script: + - npm test diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/README.md b/node_modules/cordova-android/node_modules/cordova-registry-mapper/README.md new file mode 100644 index 0000000..3b93e5f --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/README.md @@ -0,0 +1,14 @@ +[![Build Status](https://travis-ci.org/stevengill/cordova-registry-mapper.svg?branch=master)](https://travis-ci.org/stevengill/cordova-registry-mapper) + +#Cordova Registry Mapper + +This module is used to map Cordova plugin ids to package names and vice versa. + +When Cordova users add plugins to their projects using ids +(e.g. `cordova plugin add org.apache.cordova.device`), +this module will map that id to the corresponding package name so `cordova-lib` knows what to fetch from **npm**. + +This module was created so the Apache Cordova project could migrate its plugins from +the [Cordova Registry](http://registry.cordova.io/) +to [npm](https://registry.npmjs.com/) +instead of having to maintain a registry. diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/index.js b/node_modules/cordova-android/node_modules/cordova-registry-mapper/index.js new file mode 100644 index 0000000..4550774 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/index.js @@ -0,0 +1,204 @@ +var map = { + 'org.apache.cordova.battery-status':'cordova-plugin-battery-status', + 'org.apache.cordova.camera':'cordova-plugin-camera', + 'org.apache.cordova.console':'cordova-plugin-console', + 'org.apache.cordova.contacts':'cordova-plugin-contacts', + 'org.apache.cordova.device':'cordova-plugin-device', + 'org.apache.cordova.device-motion':'cordova-plugin-device-motion', + 'org.apache.cordova.device-orientation':'cordova-plugin-device-orientation', + 'org.apache.cordova.dialogs':'cordova-plugin-dialogs', + 'org.apache.cordova.file':'cordova-plugin-file', + 'org.apache.cordova.file-transfer':'cordova-plugin-file-transfer', + 'org.apache.cordova.geolocation':'cordova-plugin-geolocation', + 'org.apache.cordova.globalization':'cordova-plugin-globalization', + 'org.apache.cordova.inappbrowser':'cordova-plugin-inappbrowser', + 'org.apache.cordova.media':'cordova-plugin-media', + 'org.apache.cordova.media-capture':'cordova-plugin-media-capture', + 'org.apache.cordova.network-information':'cordova-plugin-network-information', + 'org.apache.cordova.splashscreen':'cordova-plugin-splashscreen', + 'org.apache.cordova.statusbar':'cordova-plugin-statusbar', + 'org.apache.cordova.vibration':'cordova-plugin-vibration', + 'org.apache.cordova.test-framework':'cordova-plugin-test-framework', + 'com.msopentech.websql' : 'cordova-plugin-websql', + 'com.msopentech.indexeddb' : 'cordova-plugin-indexeddb', + 'com.microsoft.aad.adal' : 'cordova-plugin-ms-adal', + 'com.microsoft.capptain' : 'capptain-cordova', + 'com.microsoft.services.aadgraph' : 'cordova-plugin-ms-aad-graph', + 'com.microsoft.services.files' : 'cordova-plugin-ms-files', + 'om.microsoft.services.outlook' : 'cordova-plugin-ms-outlook', + 'com.pbakondy.sim' : 'cordova-plugin-sim', + 'android.support.v4' : 'cordova-plugin-android-support-v4', + 'android.support.v7-appcompat' : 'cordova-plugin-android-support-v7-appcompat', + 'com.google.playservices' : 'cordova-plugin-googleplayservices', + 'com.google.cordova.admob' : 'cordova-plugin-admobpro', + 'com.rjfun.cordova.extension' : 'cordova-plugin-extension', + 'com.rjfun.cordova.plugin.admob' : 'cordova-plugin-admob', + 'com.rjfun.cordova.flurryads' : 'cordova-plugin-flurry', + 'com.rjfun.cordova.facebookads' : 'cordova-plugin-facebookads', + 'com.rjfun.cordova.httpd' : 'cordova-plugin-httpd', + 'com.rjfun.cordova.iad' : 'cordova-plugin-iad', + 'com.rjfun.cordova.iflyspeech' : 'cordova-plugin-iflyspeech', + 'com.rjfun.cordova.lianlianpay' : 'cordova-plugin-lianlianpay', + 'com.rjfun.cordova.mobfox' : 'cordova-plugin-mobfox', + 'com.rjfun.cordova.mopub' : 'cordova-plugin-mopub', + 'com.rjfun.cordova.mmedia' : 'cordova-plugin-mmedia', + 'com.rjfun.cordova.nativeaudio' : 'cordova-plugin-nativeaudio', + 'com.rjfun.cordova.plugin.paypalmpl' : 'cordova-plugin-paypalmpl', + 'com.rjfun.cordova.smartadserver' : 'cordova-plugin-smartadserver', + 'com.rjfun.cordova.sms' : 'cordova-plugin-sms', + 'com.rjfun.cordova.wifi' : 'cordova-plugin-wifi', + 'com.ohh2ahh.plugins.appavailability' : 'cordova-plugin-appavailability', + 'org.adapt-it.cordova.fonts' : 'cordova-plugin-fonts', + 'de.martinreinhardt.cordova.plugins.barcodeScanner' : 'cordova-plugin-barcodescanner', + 'de.martinreinhardt.cordova.plugins.urlhandler' : 'cordova-plugin-urlhandler', + 'de.martinreinhardt.cordova.plugins.email' : 'cordova-plugin-email', + 'de.martinreinhardt.cordova.plugins.certificates' : 'cordova-plugin-certificates', + 'de.martinreinhardt.cordova.plugins.sqlite' : 'cordova-plugin-sqlite', + 'fr.smile.cordova.fileopener' : 'cordova-plugin-fileopener', + 'org.smile.websqldatabase.initializer' : 'cordova-plugin-websqldatabase-initializer', + 'org.smile.websqldatabase.wpdb' : 'cordova-plugin-websqldatabase', + 'org.jboss.aerogear.cordova.push' : 'aerogear-cordova-push', + 'org.jboss.aerogear.cordova.oauth2' : 'aerogear-cordova-oauth2', + 'org.jboss.aerogear.cordova.geo' : 'aerogear-cordova-geo', + 'org.jboss.aerogear.cordova.crypto' : 'aerogear-cordova-crypto', + 'org.jboss.aerogaer.cordova.otp' : 'aerogear-cordova-otp', + 'uk.co.ilee.applewatch' : 'cordova-plugin-apple-watch', + 'uk.co.ilee.directions' : 'cordova-plugin-directions', + 'uk.co.ilee.gamecenter' : 'cordova-plugin-game-center', + 'uk.co.ilee.jailbreakdetection' : 'cordova-plugin-jailbreak-detection', + 'uk.co.ilee.nativetransitions' : 'cordova-plugin-native-transitions', + 'uk.co.ilee.pedometer' : 'cordova-plugin-pedometer', + 'uk.co.ilee.shake' : 'cordova-plugin-shake', + 'uk.co.ilee.touchid' : 'cordova-plugin-touchid', + 'com.knowledgecode.cordova.websocket' : 'cordova-plugin-websocket', + 'com.elixel.plugins.settings' : 'cordova-plugin-settings', + 'com.cowbell.cordova.geofence' : 'cordova-plugin-geofence', + 'com.blackberry.community.preventsleep' : 'cordova-plugin-preventsleep', + 'com.blackberry.community.gamepad' : 'cordova-plugin-gamepad', + 'com.blackberry.community.led' : 'cordova-plugin-led', + 'com.blackberry.community.thumbnail' : 'cordova-plugin-thumbnail', + 'com.blackberry.community.mediakeys' : 'cordova-plugin-mediakeys', + 'com.blackberry.community.simplebtlehrplugin' : 'cordova-plugin-bluetoothheartmonitor', + 'com.blackberry.community.simplebeaconplugin' : 'cordova-plugin-bluetoothibeacon', + 'com.blackberry.community.simplebtsppplugin' : 'cordova-plugin-bluetoothspp', + 'com.blackberry.community.clipboard' : 'cordova-plugin-clipboard', + 'com.blackberry.community.curl' : 'cordova-plugin-curl', + 'com.blackberry.community.qt' : 'cordova-plugin-qtbridge', + 'com.blackberry.community.upnp' : 'cordova-plugin-upnp', + 'com.blackberry.community.PasswordCrypto' : 'cordova-plugin-password-crypto', + 'com.blackberry.community.deviceinfoplugin' : 'cordova-plugin-deviceinfo', + 'com.blackberry.community.gsecrypto' : 'cordova-plugin-bb-crypto', + 'com.blackberry.community.mongoose' : 'cordova-plugin-mongoose', + 'com.blackberry.community.sysdialog' : 'cordova-plugin-bb-sysdialog', + 'com.blackberry.community.screendisplay' : 'cordova-plugin-screendisplay', + 'com.blackberry.community.messageplugin' : 'cordova-plugin-bb-messageretrieve', + 'com.blackberry.community.emailsenderplugin' : 'cordova-plugin-emailsender', + 'com.blackberry.community.audiometadata' : 'cordova-plugin-audiometadata', + 'com.blackberry.community.deviceemails' : 'cordova-plugin-deviceemails', + 'com.blackberry.community.audiorecorder' : 'cordova-plugin-audiorecorder', + 'com.blackberry.community.vibration' : 'cordova-plugin-vibrate-intense', + 'com.blackberry.community.SMSPlugin' : 'cordova-plugin-bb-sms', + 'com.blackberry.community.extractZipFile' : 'cordova-plugin-bb-zip', + 'com.blackberry.community.lowlatencyaudio' : 'cordova-plugin-bb-nativeaudio', + 'com.blackberry.community.barcodescanner' : 'phonegap-plugin-barcodescanner', + 'com.blackberry.app' : 'cordova-plugin-bb-app', + 'com.blackberry.bbm.platform' : 'cordova-plugin-bbm', + 'com.blackberry.connection' : 'cordova-plugin-bb-connection', + 'com.blackberry.identity' : 'cordova-plugin-bb-identity', + 'com.blackberry.invoke.card' : 'cordova-plugin-bb-card', + 'com.blackberry.invoke' : 'cordova-plugin-bb-invoke', + 'com.blackberry.invoked' : 'cordova-plugin-bb-invoked', + 'com.blackberry.io.filetransfer' : 'cordova-plugin-bb-filetransfer', + 'com.blackberry.io' : 'cordova-plugin-bb-io', + 'com.blackberry.notification' : 'cordova-plugin-bb-notification', + 'com.blackberry.payment' : 'cordova-plugin-bb-payment', + 'com.blackberry.pim.calendar' : 'cordova-plugin-bb-calendar', + 'com.blackberry.pim.contacts' : 'cordova-plugin-bb-contacts', + 'com.blackberry.pim.lib' : 'cordova-plugin-bb-pimlib', + 'com.blackberry.push' : 'cordova-plugin-bb-push', + 'com.blackberry.screenshot' : 'cordova-plugin-screenshot', + 'com.blackberry.sensors' : 'cordova-plugin-bb-sensors', + 'com.blackberry.system' : 'cordova-plugin-bb-system', + 'com.blackberry.ui.contextmenu' : 'cordova-plugin-bb-ctxmenu', + 'com.blackberry.ui.cover' : 'cordova-plugin-bb-cover', + 'com.blackberry.ui.dialog' : 'cordova-plugin-bb-dialog', + 'com.blackberry.ui.input' : 'cordova-plugin-touch-keyboard', + 'com.blackberry.ui.toast' : 'cordova-plugin-toast', + 'com.blackberry.user.identity' : 'cordova-plugin-bb-idservice', + 'com.blackberry.utils' : 'cordova-plugin-bb-utils', + 'net.yoik.cordova.plugins.screenorientation' : 'cordova-plugin-screen-orientation', + 'com.phonegap.plugins.barcodescanner' : 'phonegap-plugin-barcodescanner', + 'com.manifoldjs.hostedwebapp' : 'cordova-plugin-hostedwebapp', + 'com.initialxy.cordova.themeablebrowser' : 'cordova-plugin-themeablebrowser', + 'gr.denton.photosphere' : 'cordova-plugin-panoramaviewer', + 'nl.x-services.plugins.actionsheet' : 'cordova-plugin-actionsheet', + 'nl.x-services.plugins.socialsharing' : 'cordova-plugin-x-socialsharing', + 'nl.x-services.plugins.googleplus' : 'cordova-plugin-googleplus', + 'nl.x-services.plugins.insomnia' : 'cordova-plugin-insomnia', + 'nl.x-services.plugins.toast' : 'cordova-plugin-x-toast', + 'nl.x-services.plugins.calendar' : 'cordova-plugin-calendar', + 'nl.x-services.plugins.launchmyapp' : 'cordova-plugin-customurlscheme', + 'nl.x-services.plugins.flashlight' : 'cordova-plugin-flashlight', + 'nl.x-services.plugins.sslcertificatechecker' : 'cordova-plugin-sslcertificatechecker', + 'com.bridge.open' : 'cordova-open', + 'com.bridge.safe' : 'cordova-safe', + 'com.disusered.open' : 'cordova-open', + 'com.disusered.safe' : 'cordova-safe', + 'me.apla.cordova.app-preferences' : 'cordova-plugin-app-preferences', + 'com.konotor.cordova' : 'cordova-plugin-konotor', + 'io.intercom.cordova' : 'cordova-plugin-intercom', + 'com.onesignal.plugins.onesignal' : 'onesignal-cordova-plugin', + 'com.danjarvis.document-contract': 'cordova-plugin-document-contract', + 'com.eface2face.iosrtc' : 'cordova-plugin-iosrtc', + 'com.mobileapptracking.matplugin' : 'cordova-plugin-tune', + 'com.marianhello.cordova.background-geolocation' : 'cordova-plugin-mauron85-background-geolocation', + 'fr.louisbl.cordova.locationservices' : 'cordova-plugin-locationservices', + 'fr.louisbl.cordova.gpslocation' : 'cordova-plugin-gpslocation', + 'com.hiliaox.weibo' : 'cordova-plugin-weibo', + 'com.uxcam.cordova.plugin' : 'cordova-uxcam', + 'de.fastr.phonegap.plugins.downloader' : 'cordova-plugin-fastrde-downloader', + 'de.fastr.phonegap.plugins.injectView' : 'cordova-plugin-fastrde-injectview', + 'de.fastr.phonegap.plugins.CheckGPS' : 'cordova-plugin-fastrde-checkgps', + 'de.fastr.phonegap.plugins.md5chksum' : 'cordova-plugin-fastrde-md5', + 'io.repro.cordova' : 'cordova-plugin-repro', + 're.notifica.cordova': 'cordova-plugin-notificare-push', + 'com.megster.cordova.ble': 'cordova-plugin-ble-central', + 'com.megster.cordova.bluetoothserial': 'cordova-plugin-bluetooth-serial', + 'com.megster.cordova.rfduino': 'cordova-plugin-rfduino', + 'cz.velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback', + 'cz.Velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback', + 'org.scriptotek.appinfo': 'cordova-plugin-appinfo', + 'com.yezhiming.cordova.appinfo': 'cordova-plugin-appinfo', + 'pl.makingwaves.estimotebeacons': 'cordova-plugin-estimote', + 'com.evothings.ble': 'cordova-plugin-ble', + 'com.appsee.plugin' : 'cordova-plugin-appsee', + 'am.armsoft.plugins.listpicker': 'cordova-plugin-listpicker', + 'com.pushbots.push': 'pushbots-cordova-plugin', + 'com.admob.google': 'cordova-admob', + 'admob.ads.google': 'cordova-admob-ads', + 'admob.google.plugin': 'admob-google', + 'com.admob.admobads': 'admob-ads', + 'com.connectivity.monitor': 'cordova-connectivity-monitor', + 'com.ios.libgoogleadmobads': 'cordova-libgoogleadmobads', + 'com.google.play.services': 'cordova-google-play-services', + 'android.support.v13': 'cordova-android-support-v13', + 'android.support.v4': 'cordova-android-support-v4', // Duplicated key ;) + 'com.analytics.google': 'cordova-plugin-analytics', + 'com.analytics.adid.google': 'cordova-plugin-analytics-adid', + 'com.chariotsolutions.nfc.plugin': 'phonegap-nfc', + 'com.samz.mixpanel': 'cordova-plugin-mixpanel', + 'de.appplant.cordova.common.RegisterUserNotificationSettings': 'cordova-plugin-registerusernotificationsettings', + 'plugin.google.maps': 'cordova-plugin-googlemaps', + 'xu.li.cordova.wechat': 'cordova-plugin-wechat', + 'es.keensoft.fullscreenimage': 'cordova-plugin-fullscreenimage', + 'com.arcoirislabs.plugin.mqtt' : 'cordova-plugin-mqtt' +}; + +module.exports.oldToNew = map; + +var reverseMap = {}; +Object.keys(map).forEach(function(elem){ + reverseMap[map[elem]] = elem; +}); + +module.exports.newToOld = reverseMap; diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/package.json b/node_modules/cordova-android/node_modules/cordova-registry-mapper/package.json new file mode 100644 index 0000000..180ffd6 --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/package.json @@ -0,0 +1,54 @@ +{ + "_from": "cordova-registry-mapper@^1.1.8", + "_id": "cordova-registry-mapper@1.1.15", + "_inBundle": true, + "_integrity": "sha1-4kS5GFuBdUc7/2B5MkkFEV+D3Hw=", + "_location": "/cordova-android/cordova-registry-mapper", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "cordova-registry-mapper@^1.1.8", + "name": "cordova-registry-mapper", + "escapedName": "cordova-registry-mapper", + "rawSpec": "^1.1.8", + "saveSpec": null, + "fetchSpec": "^1.1.8" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/cordova-registry-mapper/-/cordova-registry-mapper-1.1.15.tgz", + "_shasum": "e244b9185b8175473bff6079324905115f83dc7c", + "_spec": "cordova-registry-mapper@^1.1.8", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Steve Gill" + }, + "bugs": { + "url": "https://github.com/stevengill/cordova-registry-mapper/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Maps old plugin ids to new plugin names for fetching from npm", + "devDependencies": { + "tape": "^3.5.0" + }, + "homepage": "https://github.com/stevengill/cordova-registry-mapper#readme", + "keywords": [ + "cordova", + "plugins" + ], + "license": "Apache version 2.0", + "main": "index.js", + "name": "cordova-registry-mapper", + "repository": { + "type": "git", + "url": "git+https://github.com/stevengill/cordova-registry-mapper.git" + }, + "scripts": { + "test": "node tests/test.js" + }, + "version": "1.1.15" +} diff --git a/node_modules/cordova-android/node_modules/cordova-registry-mapper/tests/test.js b/node_modules/cordova-android/node_modules/cordova-registry-mapper/tests/test.js new file mode 100644 index 0000000..35343be --- /dev/null +++ b/node_modules/cordova-android/node_modules/cordova-registry-mapper/tests/test.js @@ -0,0 +1,11 @@ +var test = require('tape'); +var oldToNew = require('../index').oldToNew; +var newToOld = require('../index').newToOld; + +test('plugin mappings exist', function(t) { + t.plan(2); + + t.equal('cordova-plugin-device', oldToNew['org.apache.cordova.device']); + + t.equal('org.apache.cordova.device', newToOld['cordova-plugin-device']); +}) diff --git a/node_modules/cordova-android/node_modules/elementtree/.npmignore b/node_modules/cordova-android/node_modules/elementtree/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/cordova-android/node_modules/elementtree/.travis.yml b/node_modules/cordova-android/node_modules/elementtree/.travis.yml new file mode 100644 index 0000000..6f27c96 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/.travis.yml @@ -0,0 +1,10 @@ +language: node_js + +node_js: + - 0.6 + +script: make test + +notifications: + email: + - tomaz+travisci@tomaz.me diff --git a/node_modules/cordova-android/node_modules/elementtree/CHANGES.md b/node_modules/cordova-android/node_modules/elementtree/CHANGES.md new file mode 100644 index 0000000..50d415d --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/CHANGES.md @@ -0,0 +1,39 @@ +elementtree v0.1.6 (in development) + +* Add support for CData elements. (#14) + [hermannpencole] + +elementtree v0.1.5 - 2012-11-14 + +* Fix a bug in the find() and findtext() method which could manifest itself + under some conditions. + [metagriffin] + +elementtree v0.1.4 - 2012-10-15 + +* Allow user to use namespaced attributes when using find* functions. + [Andrew Lunny] + +elementtree v0.1.3 - 2012-09-21 + +* Improve the output of text content in the tags (strip unnecessary line break + characters). + +[Darryl Pogue] + +elementtree v0.1.2 - 2012-09-04 + + * Allow user to pass 'indent' option to ElementTree.write method. If this + option is specified (e.g. {'indent': 4}). XML will be pretty printed. + [Darryl Pogue, Tomaz Muraus] + + * Bump sax dependency version. + +elementtree v0.1.1 - 2011-09-23 + + * Improve special character escaping. + [Ryan Phillips] + +elementtree v0.1.0 - 2011-09-05 + + * Initial release. diff --git a/node_modules/cordova-android/node_modules/elementtree/LICENSE.txt b/node_modules/cordova-android/node_modules/elementtree/LICENSE.txt new file mode 100644 index 0000000..6b0b127 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/node_modules/cordova-android/node_modules/elementtree/Makefile b/node_modules/cordova-android/node_modules/elementtree/Makefile new file mode 100755 index 0000000..ab7c4e0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/Makefile @@ -0,0 +1,21 @@ +TESTS := \ + tests/test-simple.js + + + +PATH := ./node_modules/.bin:$(PATH) + +WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey') + +default: test + +test: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}" + +tap: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}" + +coverage: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}" + +.PHONY: default test coverage tap scope diff --git a/node_modules/cordova-android/node_modules/elementtree/NOTICE b/node_modules/cordova-android/node_modules/elementtree/NOTICE new file mode 100644 index 0000000..28ad70a --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/NOTICE @@ -0,0 +1,5 @@ +node-elementtree +Copyright (c) 2011, Rackspace, Inc. + +The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh + diff --git a/node_modules/cordova-android/node_modules/elementtree/README.md b/node_modules/cordova-android/node_modules/elementtree/README.md new file mode 100644 index 0000000..738420c --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/README.md @@ -0,0 +1,141 @@ +node-elementtree +==================== + +node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module. + +Installation +==================== + + $ npm install elementtree + +Using the library +==================== + +For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage). + +Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm). + +Example 1 – Creating An XML Document +==================== + +This example shows how to build a valid XML document that can be published to +Atom Hopper. Atom Hopper is used internally as a bridge from products all the +way to collecting revenue, called “Usage.” MaaS and other products send similar +events to it every time user performs an action on a resource +(e.g. creates,updates or deletes). Below is an example of leveraging the API +to create a new XML document. + +```javascript +var et = require('elementtree'); +var XML = et.XML; +var ElementTree = et.ElementTree; +var element = et.Element; +var subElement = et.SubElement; + +var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region, +checks, resourceId, category, startTime, resourceName, etree, xml; + +date = new Date(); + +root = element('entry'); +root.set('xmlns', 'http://www.w3.org/2005/Atom'); + +tenantId = subElement(root, 'TenantId'); +tenantId.text = '12345'; + +serviceName = subElement(root, 'ServiceName'); +serviceName.text = 'MaaS'; + +resourceId = subElement(root, 'ResourceID'); +resourceId.text = 'enAAAA'; + +usageId = subElement(root, 'UsageID'); +usageId.text = '550e8400-e29b-41d4-a716-446655440000'; + +eventType = subElement(root, 'EventType'); +eventType.text = 'create'; + +category = subElement(root, 'category'); +category.set('term', 'monitoring.entity.create'); + +dataCenter = subElement(root, 'DataCenter'); +dataCenter.text = 'global'; + +region = subElement(root, 'Region'); +region.text = 'global'; + +startTime = subElement(root, 'StartTime'); +startTime.text = date; + +resourceName = subElement(root, 'ResourceName'); +resourceName.text = 'entity'; + +etree = new ElementTree(root); +xml = etree.write({'xml_declaration': false}); +console.log(xml); +``` + +As you can see, both et.Element and et.SubElement are factory methods which +return a new instance of Element and SubElement class, respectively. +When you create a new element (tag) you can use set method to set an attribute. +To set the tag value, assign a value to the .text attribute. + +This example would output a document that looks like this: + +```xml + + 12345 + MaaS + enAAAA + 550e8400-e29b-41d4-a716-446655440000 + create + + global + global + Sun Apr 29 2012 16:37:32 GMT-0700 (PDT) + entity + +``` + +Example 2 – Parsing An XML Document +==================== + +This example shows how to parse an XML document and use simple XPath selectors. +For demonstration purposes, we will use the XML document located at +https://gist.github.com/2554343. + +Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML, +but the library has a concept of “parsers,” which means it’s pretty simple to +add support for a different parser. + +```javascript +var fs = require('fs'); + +var et = require('elementtree'); + +var XML = et.XML; +var ElementTree = et.ElementTree; +var element = et.Element; +var subElement = et.SubElement; + +var data, etree; + +data = fs.readFileSync('document.xml').toString(); +etree = et.parse(data); + +console.log(etree.findall('./entry/TenantId').length); // 2 +console.log(etree.findtext('./entry/ServiceName')); // MaaS +console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create +console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1 +``` + +Build status +==================== + +[![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree) + + +License +==================== + +node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html). diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/constants.js b/node_modules/cordova-android/node_modules/elementtree/lib/constants.js new file mode 100644 index 0000000..b057faf --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/constants.js @@ -0,0 +1,20 @@ +/* + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var DEFAULT_PARSER = 'sax'; + +exports.DEFAULT_PARSER = DEFAULT_PARSER; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/elementpath.js b/node_modules/cordova-android/node_modules/elementtree/lib/elementpath.js new file mode 100644 index 0000000..2e93f47 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/elementpath.js @@ -0,0 +1,343 @@ +/** + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var sprintf = require('./sprintf').sprintf; + +var utils = require('./utils'); +var SyntaxError = require('./errors').SyntaxError; + +var _cache = {}; + +var RE = new RegExp( + "(" + + "'[^']*'|\"[^\"]*\"|" + + "::|" + + "//?|" + + "\\.\\.|" + + "\\(\\)|" + + "[/.*:\\[\\]\\(\\)@=])|" + + "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" + + "\\s+", 'g' +); + +var xpath_tokenizer = utils.findall.bind(null, RE); + +function prepare_tag(next, token) { + var tag = token[0]; + + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem._children.forEach(function(e) { + if (e.tag === tag) { + rv.push(e); + } + }); + } + + return rv; + } + + return select; +} + +function prepare_star(next, token) { + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem._children.forEach(function(e) { + rv.push(e); + }); + } + + return rv; + } + + return select; +} + +function prepare_dot(next, token) { + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + rv.push(elem); + } + + return rv; + } + + return select; +} + +function prepare_iter(next, token) { + var tag; + token = next(); + + if (token[1] === '*') { + tag = '*'; + } + else if (!token[1]) { + tag = token[0] || ''; + } + else { + throw new SyntaxError(token); + } + + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem.iter(tag, function(e) { + if (e !== elem) { + rv.push(e); + } + }); + } + + return rv; + } + + return select; +} + +function prepare_dot_dot(next, token) { + function select(context, result) { + var i, len, elem, rv = [], parent_map = context.parent_map; + + if (!parent_map) { + context.parent_map = parent_map = {}; + + context.root.iter(null, function(p) { + p._children.forEach(function(e) { + parent_map[e] = p; + }); + }); + } + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (parent_map.hasOwnProperty(elem)) { + rv.push(parent_map[elem]); + } + } + + return rv; + } + + return select; +} + + +function prepare_predicate(next, token) { + var tag, key, value, select; + token = next(); + + if (token[1] === '@') { + // attribute + token = next(); + + if (token[1]) { + throw new SyntaxError(token, 'Invalid attribute predicate'); + } + + key = token[0]; + token = next(); + + if (token[1] === ']') { + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.get(key)) { + rv.push(elem); + } + } + + return rv; + }; + } + else if (token[1] === '=') { + value = next()[1]; + + if (value[0] === '"' || value[value.length - 1] === '\'') { + value = value.slice(1, value.length - 1); + } + else { + throw new SyntaxError(token, 'Ivalid comparison target'); + } + + token = next(); + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.get(key) === value) { + rv.push(elem); + } + } + + return rv; + }; + } + + if (token[1] !== ']') { + throw new SyntaxError(token, 'Invalid attribute predicate'); + } + } + else if (!token[1]) { + tag = token[0] || ''; + token = next(); + + if (token[1] !== ']') { + throw new SyntaxError(token, 'Invalid node predicate'); + } + + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.find(tag)) { + rv.push(elem); + } + } + + return rv; + }; + } + else { + throw new SyntaxError(null, 'Invalid predicate'); + } + + return select; +} + + + +var ops = { + "": prepare_tag, + "*": prepare_star, + ".": prepare_dot, + "..": prepare_dot_dot, + "//": prepare_iter, + "[": prepare_predicate, +}; + +function _SelectorContext(root) { + this.parent_map = null; + this.root = root; +} + +function findall(elem, path) { + var selector, result, i, len, token, value, select, context; + + if (_cache.hasOwnProperty(path)) { + selector = _cache[path]; + } + else { + // TODO: Use smarter cache purging approach + if (Object.keys(_cache).length > 100) { + _cache = {}; + } + + if (path.charAt(0) === '/') { + throw new SyntaxError(null, 'Cannot use absolute path on element'); + } + + result = xpath_tokenizer(path); + selector = []; + + function getToken() { + return result.shift(); + } + + token = getToken(); + while (true) { + var c = token[1] || ''; + value = ops[c](getToken, token); + + if (!value) { + throw new SyntaxError(null, sprintf('Invalid path: %s', path)); + } + + selector.push(value); + token = getToken(); + + if (!token) { + break; + } + else if (token[1] === '/') { + token = getToken(); + } + + if (!token) { + break; + } + } + + _cache[path] = selector; + } + + // Execute slector pattern + result = [elem]; + context = new _SelectorContext(elem); + + for (i = 0, len = selector.length; i < len; i++) { + select = selector[i]; + result = select(context, result); + } + + return result || []; +} + +function find(element, path) { + var resultElements = findall(element, path); + + if (resultElements && resultElements.length > 0) { + return resultElements[0]; + } + + return null; +} + +function findtext(element, path, defvalue) { + var resultElements = findall(element, path); + + if (resultElements && resultElements.length > 0) { + return resultElements[0].text; + } + + return defvalue; +} + + +exports.find = find; +exports.findall = findall; +exports.findtext = findtext; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/elementtree.js b/node_modules/cordova-android/node_modules/elementtree/lib/elementtree.js new file mode 100644 index 0000000..61d9276 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/elementtree.js @@ -0,0 +1,611 @@ +/** + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var sprintf = require('./sprintf').sprintf; + +var utils = require('./utils'); +var ElementPath = require('./elementpath'); +var TreeBuilder = require('./treebuilder').TreeBuilder; +var get_parser = require('./parser').get_parser; +var constants = require('./constants'); + +var element_ids = 0; + +function Element(tag, attrib) +{ + this._id = element_ids++; + this.tag = tag; + this.attrib = {}; + this.text = null; + this.tail = null; + this._children = []; + + if (attrib) { + this.attrib = utils.merge(this.attrib, attrib); + } +} + +Element.prototype.toString = function() +{ + return sprintf("", this.tag, this._id); +}; + +Element.prototype.makeelement = function(tag, attrib) +{ + return new Element(tag, attrib); +}; + +Element.prototype.len = function() +{ + return this._children.length; +}; + +Element.prototype.getItem = function(index) +{ + return this._children[index]; +}; + +Element.prototype.setItem = function(index, element) +{ + this._children[index] = element; +}; + +Element.prototype.delItem = function(index) +{ + this._children.splice(index, 1); +}; + +Element.prototype.getSlice = function(start, stop) +{ + return this._children.slice(start, stop); +}; + +Element.prototype.setSlice = function(start, stop, elements) +{ + var i; + var k = 0; + for (i = start; i < stop; i++, k++) { + this._children[i] = elements[k]; + } +}; + +Element.prototype.delSlice = function(start, stop) +{ + this._children.splice(start, stop - start); +}; + +Element.prototype.append = function(element) +{ + this._children.push(element); +}; + +Element.prototype.extend = function(elements) +{ + this._children.concat(elements); +}; + +Element.prototype.insert = function(index, element) +{ + this._children[index] = element; +}; + +Element.prototype.remove = function(element) +{ + this._children = this._children.filter(function(e) { + /* TODO: is this the right way to do this? */ + if (e._id === element._id) { + return false; + } + return true; + }); +}; + +Element.prototype.getchildren = function() { + return this._children; +}; + +Element.prototype.find = function(path) +{ + return ElementPath.find(this, path); +}; + +Element.prototype.findtext = function(path, defvalue) +{ + return ElementPath.findtext(this, path, defvalue); +}; + +Element.prototype.findall = function(path, defvalue) +{ + return ElementPath.findall(this, path, defvalue); +}; + +Element.prototype.clear = function() +{ + this.attrib = {}; + this._children = []; + this.text = null; + this.tail = null; +}; + +Element.prototype.get = function(key, defvalue) +{ + if (this.attrib[key] !== undefined) { + return this.attrib[key]; + } + else { + return defvalue; + } +}; + +Element.prototype.set = function(key, value) +{ + this.attrib[key] = value; +}; + +Element.prototype.keys = function() +{ + return Object.keys(this.attrib); +}; + +Element.prototype.items = function() +{ + return utils.items(this.attrib); +}; + +/* + * In python this uses a generator, but in v8 we don't have em, + * so we use a callback instead. + **/ +Element.prototype.iter = function(tag, callback) +{ + var self = this; + var i, child; + + if (tag === "*") { + tag = null; + } + + if (tag === null || this.tag === tag) { + callback(self); + } + + for (i = 0; i < this._children.length; i++) { + child = this._children[i]; + child.iter(tag, function(e) { + callback(e); + }); + } +}; + +Element.prototype.itertext = function(callback) +{ + this.iter(null, function(e) { + if (e.text) { + callback(e.text); + } + + if (e.tail) { + callback(e.tail); + } + }); +}; + + +function SubElement(parent, tag, attrib) { + var element = parent.makeelement(tag, attrib); + parent.append(element); + return element; +} + +function Comment(text) { + var element = new Element(Comment); + if (text) { + element.text = text; + } + return element; +} + +function CData(text) { + var element = new Element(CData); + if (text) { + element.text = text; + } + return element; +} + +function ProcessingInstruction(target, text) +{ + var element = new Element(ProcessingInstruction); + element.text = target; + if (text) { + element.text = element.text + " " + text; + } + return element; +} + +function QName(text_or_uri, tag) +{ + if (tag) { + text_or_uri = sprintf("{%s}%s", text_or_uri, tag); + } + this.text = text_or_uri; +} + +QName.prototype.toString = function() { + return this.text; +}; + +function ElementTree(element) +{ + this._root = element; +} + +ElementTree.prototype.getroot = function() { + return this._root; +}; + +ElementTree.prototype._setroot = function(element) { + this._root = element; +}; + +ElementTree.prototype.parse = function(source, parser) { + if (!parser) { + parser = get_parser(constants.DEFAULT_PARSER); + parser = new parser.XMLParser(new TreeBuilder()); + } + + parser.feed(source); + this._root = parser.close(); + return this._root; +}; + +ElementTree.prototype.iter = function(tag, callback) { + this._root.iter(tag, callback); +}; + +ElementTree.prototype.find = function(path) { + return this._root.find(path); +}; + +ElementTree.prototype.findtext = function(path, defvalue) { + return this._root.findtext(path, defvalue); +}; + +ElementTree.prototype.findall = function(path) { + return this._root.findall(path); +}; + +/** + * Unlike ElementTree, we don't write to a file, we return you a string. + */ +ElementTree.prototype.write = function(options) { + var sb = []; + options = utils.merge({ + encoding: 'utf-8', + xml_declaration: null, + default_namespace: null, + method: 'xml'}, options); + + if (options.xml_declaration !== false) { + sb.push("\n"); + } + + if (options.method === "text") { + _serialize_text(sb, self._root, encoding); + } + else { + var qnames, namespaces, indent, indent_string; + var x = _namespaces(this._root, options.encoding, options.default_namespace); + qnames = x[0]; + namespaces = x[1]; + + if (options.hasOwnProperty('indent')) { + indent = 0; + indent_string = new Array(options.indent + 1).join(' '); + } + else { + indent = false; + } + + if (options.method === "xml") { + _serialize_xml(function(data) { + sb.push(data); + }, this._root, options.encoding, qnames, namespaces, indent, indent_string); + } + else { + /* TODO: html */ + throw new Error("unknown serialization method "+ options.method); + } + } + + return sb.join(""); +}; + +var _namespace_map = { + /* "well-known" namespace prefixes */ + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", + /* xml schema */ + "http://www.w3.org/2001/XMLSchema": "xs", + "http://www.w3.org/2001/XMLSchema-instance": "xsi", + /* dublic core */ + "http://purl.org/dc/elements/1.1/": "dc", +}; + +function register_namespace(prefix, uri) { + if (/ns\d+$/.test(prefix)) { + throw new Error('Prefix format reserved for internal use'); + } + + if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) { + delete _namespace_map[uri]; + } + + _namespace_map[uri] = prefix; +} + + +function _escape(text, encoding, isAttribute, isText) { + if (text) { + text = text.toString(); + text = text.replace(/&/g, '&'); + text = text.replace(//g, '>'); + if (!isText) { + text = text.replace(/\n/g, ' '); + text = text.replace(/\r/g, ' '); + } + if (isAttribute) { + text = text.replace(/"/g, '"'); + } + } + return text; +} + +/* TODO: benchmark single regex */ +function _escape_attrib(text, encoding) { + return _escape(text, encoding, true); +} + +function _escape_cdata(text, encoding) { + return _escape(text, encoding, false); +} + +function _escape_text(text, encoding) { + return _escape(text, encoding, false, true); +} + +function _namespaces(elem, encoding, default_namespace) { + var qnames = {}; + var namespaces = {}; + + if (default_namespace) { + namespaces[default_namespace] = ""; + } + + function encode(text) { + return text; + } + + function add_qname(qname) { + if (qname[0] === "{") { + var tmp = qname.substring(1).split("}", 2); + var uri = tmp[0]; + var tag = tmp[1]; + var prefix = namespaces[uri]; + + if (prefix === undefined) { + prefix = _namespace_map[uri]; + if (prefix === undefined) { + prefix = "ns" + Object.keys(namespaces).length; + } + if (prefix !== "xml") { + namespaces[uri] = prefix; + } + } + + if (prefix) { + qnames[qname] = sprintf("%s:%s", prefix, tag); + } + else { + qnames[qname] = tag; + } + } + else { + if (default_namespace) { + throw new Error('cannot use non-qualified names with default_namespace option'); + } + + qnames[qname] = qname; + } + } + + + elem.iter(null, function(e) { + var i; + var tag = e.tag; + var text = e.text; + var items = e.items(); + + if (tag instanceof QName && qnames[tag.text] === undefined) { + add_qname(tag.text); + } + else if (typeof(tag) === "string") { + add_qname(tag); + } + else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) { + throw new Error('Invalid tag type for serialization: '+ tag); + } + + if (text instanceof QName && qnames[text.text] === undefined) { + add_qname(text.text); + } + + items.forEach(function(item) { + var key = item[0], + value = item[1]; + if (key instanceof QName) { + key = key.text; + } + + if (qnames[key] === undefined) { + add_qname(key); + } + + if (value instanceof QName && qnames[value.text] === undefined) { + add_qname(value.text); + } + }); + }); + return [qnames, namespaces]; +} + +function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) { + var tag = elem.tag; + var text = elem.text; + var items; + var i; + + var newlines = indent || (indent === 0); + write(Array(indent + 1).join(indent_string)); + + if (tag === Comment) { + write(sprintf("", _escape_cdata(text, encoding))); + } + else if (tag === ProcessingInstruction) { + write(sprintf("", _escape_cdata(text, encoding))); + } + else if (tag === CData) { + text = text || ''; + write(sprintf("", text)); + } + else { + tag = qnames[tag]; + if (tag === undefined) { + if (text) { + write(_escape_text(text, encoding)); + } + elem.iter(function(e) { + _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string); + }); + } + else { + write("<" + tag); + items = elem.items(); + + if (items || namespaces) { + items.sort(); // lexical order + + items.forEach(function(item) { + var k = item[0], + v = item[1]; + + if (k instanceof QName) { + k = k.text; + } + + if (v instanceof QName) { + v = qnames[v.text]; + } + else { + v = _escape_attrib(v, encoding); + } + write(sprintf(" %s=\"%s\"", qnames[k], v)); + }); + + if (namespaces) { + items = utils.items(namespaces); + items.sort(function(a, b) { return a[1] < b[1]; }); + + items.forEach(function(item) { + var k = item[1], + v = item[0]; + + if (k) { + k = ':' + k; + } + + write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding))); + }); + } + } + + if (text || elem.len()) { + if (text && text.toString().match(/^\s*$/)) { + text = null; + } + + write(">"); + if (!text && newlines) { + write("\n"); + } + + if (text) { + write(_escape_text(text, encoding)); + } + elem._children.forEach(function(e) { + _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string); + }); + + if (!text && indent) { + write(Array(indent + 1).join(indent_string)); + } + write(""); + } + else { + write(" />"); + } + } + } + + if (newlines) { + write("\n"); + } +} + +function parse(source, parser) { + var tree = new ElementTree(); + tree.parse(source, parser); + return tree; +} + +function tostring(element, options) { + return new ElementTree(element).write(options); +} + +exports.PI = ProcessingInstruction; +exports.Comment = Comment; +exports.CData = CData; +exports.ProcessingInstruction = ProcessingInstruction; +exports.SubElement = SubElement; +exports.QName = QName; +exports.ElementTree = ElementTree; +exports.ElementPath = ElementPath; +exports.Element = function(tag, attrib) { + return new Element(tag, attrib); +}; + +exports.XML = function(data) { + var et = new ElementTree(); + return et.parse(data); +}; + +exports.parse = parse; +exports.register_namespace = register_namespace; +exports.tostring = tostring; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/errors.js b/node_modules/cordova-android/node_modules/elementtree/lib/errors.js new file mode 100644 index 0000000..e8742be --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/errors.js @@ -0,0 +1,31 @@ +/** + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var util = require('util'); + +var sprintf = require('./sprintf').sprintf; + +function SyntaxError(token, msg) { + msg = msg || sprintf('Syntax Error at token %s', token.toString()); + this.token = token; + this.message = msg; + Error.call(this, msg); +} + +util.inherits(SyntaxError, Error); + +exports.SyntaxError = SyntaxError; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/parser.js b/node_modules/cordova-android/node_modules/elementtree/lib/parser.js new file mode 100644 index 0000000..7307ee4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/parser.js @@ -0,0 +1,33 @@ +/* + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* TODO: support node-expat C++ module optionally */ + +var util = require('util'); +var parsers = require('./parsers/index'); + +function get_parser(name) { + if (name === 'sax') { + return parsers.sax; + } + else { + throw new Error('Invalid parser: ' + name); + } +} + + +exports.get_parser = get_parser; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/parsers/index.js b/node_modules/cordova-android/node_modules/elementtree/lib/parsers/index.js new file mode 100644 index 0000000..5eac5c8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/parsers/index.js @@ -0,0 +1 @@ +exports.sax = require('./sax'); diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/parsers/sax.js b/node_modules/cordova-android/node_modules/elementtree/lib/parsers/sax.js new file mode 100644 index 0000000..69b0a59 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/parsers/sax.js @@ -0,0 +1,56 @@ +var util = require('util'); + +var sax = require('sax'); + +var TreeBuilder = require('./../treebuilder').TreeBuilder; + +function XMLParser(target) { + this.parser = sax.parser(true); + + this.target = (target) ? target : new TreeBuilder(); + + this.parser.onopentag = this._handleOpenTag.bind(this); + this.parser.ontext = this._handleText.bind(this); + this.parser.oncdata = this._handleCdata.bind(this); + this.parser.ondoctype = this._handleDoctype.bind(this); + this.parser.oncomment = this._handleComment.bind(this); + this.parser.onclosetag = this._handleCloseTag.bind(this); + this.parser.onerror = this._handleError.bind(this); +} + +XMLParser.prototype._handleOpenTag = function(tag) { + this.target.start(tag.name, tag.attributes); +}; + +XMLParser.prototype._handleText = function(text) { + this.target.data(text); +}; + +XMLParser.prototype._handleCdata = function(text) { + this.target.data(text); +}; + +XMLParser.prototype._handleDoctype = function(text) { +}; + +XMLParser.prototype._handleComment = function(comment) { +}; + +XMLParser.prototype._handleCloseTag = function(tag) { + this.target.end(tag); +}; + +XMLParser.prototype._handleError = function(err) { + throw err; +}; + +XMLParser.prototype.feed = function(chunk) { + this.parser.write(chunk); +}; + +XMLParser.prototype.close = function() { + this.parser.close(); + return this.target.close(); +}; + +exports.XMLParser = XMLParser; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/sprintf.js b/node_modules/cordova-android/node_modules/elementtree/lib/sprintf.js new file mode 100644 index 0000000..f802c1b --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/sprintf.js @@ -0,0 +1,86 @@ +/* + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var cache = {}; + + +// Do any others need escaping? +var TO_ESCAPE = { + '\'': '\\\'', + '\n': '\\n' +}; + + +function populate(formatter) { + var i, type, + key = formatter, + prev = 0, + arg = 1, + builder = 'return \''; + + for (i = 0; i < formatter.length; i++) { + if (formatter[i] === '%') { + type = formatter[i + 1]; + + switch (type) { + case 's': + builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \''; + prev = i + 2; + arg++; + break; + case 'j': + builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \''; + prev = i + 2; + arg++; + break; + case '%': + builder += formatter.slice(prev, i + 1); + prev = i + 2; + i++; + break; + } + + + } else if (TO_ESCAPE[formatter[i]]) { + builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]]; + prev = i + 1; + } + } + + builder += formatter.slice(prev) + '\';'; + cache[key] = new Function(builder); +} + + +/** + * A fast version of sprintf(), which currently only supports the %s and %j. + * This caches a formatting function for each format string that is used, so + * you should only use this sprintf() will be called many times with a single + * format string and a limited number of format strings will ever be used (in + * general this means that format strings should be string literals). + * + * @param {String} formatter A format string. + * @param {...String} var_args Values that will be formatted by %s and %j. + * @return {String} The formatted output. + */ +exports.sprintf = function(formatter, var_args) { + if (!cache[formatter]) { + populate(formatter); + } + + return cache[formatter].apply(null, arguments); +}; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/treebuilder.js b/node_modules/cordova-android/node_modules/elementtree/lib/treebuilder.js new file mode 100644 index 0000000..393a98f --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/treebuilder.js @@ -0,0 +1,60 @@ +function TreeBuilder(element_factory) { + this._data = []; + this._elem = []; + this._last = null; + this._tail = null; + if (!element_factory) { + /* evil circular dep */ + element_factory = require('./elementtree').Element; + } + this._factory = element_factory; +} + +TreeBuilder.prototype.close = function() { + return this._last; +}; + +TreeBuilder.prototype._flush = function() { + if (this._data) { + if (this._last !== null) { + var text = this._data.join(""); + if (this._tail) { + this._last.tail = text; + } + else { + this._last.text = text; + } + } + this._data = []; + } +}; + +TreeBuilder.prototype.data = function(data) { + this._data.push(data); +}; + +TreeBuilder.prototype.start = function(tag, attrs) { + this._flush(); + var elem = this._factory(tag, attrs); + this._last = elem; + + if (this._elem.length) { + this._elem[this._elem.length - 1].append(elem); + } + + this._elem.push(elem); + + this._tail = null; +}; + +TreeBuilder.prototype.end = function(tag) { + this._flush(); + this._last = this._elem.pop(); + if (this._last.tag !== tag) { + throw new Error("end tag mismatch"); + } + this._tail = 1; + return this._last; +}; + +exports.TreeBuilder = TreeBuilder; diff --git a/node_modules/cordova-android/node_modules/elementtree/lib/utils.js b/node_modules/cordova-android/node_modules/elementtree/lib/utils.js new file mode 100644 index 0000000..b08a670 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/lib/utils.js @@ -0,0 +1,72 @@ +/** + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/** + * @param {Object} hash. + * @param {Array} ignored. + */ +function items(hash, ignored) { + ignored = ignored || null; + var k, rv = []; + + function is_ignored(key) { + if (!ignored || ignored.length === 0) { + return false; + } + + return ignored.indexOf(key); + } + + for (k in hash) { + if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) { + rv.push([k, hash[k]]); + } + } + + return rv; +} + + +function findall(re, str) { + var match, matches = []; + + while ((match = re.exec(str))) { + matches.push(match); + } + + return matches; +} + +function merge(a, b) { + var c = {}, attrname; + + for (attrname in a) { + if (a.hasOwnProperty(attrname)) { + c[attrname] = a[attrname]; + } + } + for (attrname in b) { + if (b.hasOwnProperty(attrname)) { + c[attrname] = b[attrname]; + } + } + return c; +} + +exports.items = items; +exports.findall = findall; +exports.merge = merge; diff --git a/node_modules/cordova-android/node_modules/elementtree/package.json b/node_modules/cordova-android/node_modules/elementtree/package.json new file mode 100644 index 0000000..4dcc9d9 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/package.json @@ -0,0 +1,81 @@ +{ + "_from": "elementtree@0.1.6", + "_id": "elementtree@0.1.6", + "_inBundle": true, + "_integrity": "sha1-KsTEbqMFFsjEy9teOsdBjlkt4gw=", + "_location": "/cordova-android/elementtree", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "elementtree@0.1.6", + "name": "elementtree", + "escapedName": "elementtree", + "rawSpec": "0.1.6", + "saveSpec": null, + "fetchSpec": "0.1.6" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz", + "_shasum": "2ac4c46ea30516c8c4cbdb5e3ac7418e592de20c", + "_spec": "elementtree@0.1.6", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Rackspace US, Inc." + }, + "bugs": { + "url": "https://github.com/racker/node-elementtree/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Paul Querna", + "email": "paul.querna@rackspace.com" + }, + { + "name": "Tomaz Muraus", + "email": "tomaz.muraus@rackspace.com" + } + ], + "dependencies": { + "sax": "0.3.5" + }, + "deprecated": false, + "description": "XML Serialization and Parsing module based on Python's ElementTree.", + "devDependencies": { + "whiskey": "0.8.x" + }, + "directories": { + "lib": "lib" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/racker/node-elementtree", + "keywords": [ + "xml", + "sax", + "parser", + "seralization", + "elementtree" + ], + "licenses": [ + { + "type": "Apache", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + ], + "main": "lib/elementtree.js", + "name": "elementtree", + "repository": { + "type": "git", + "url": "git://github.com/racker/node-elementtree.git" + }, + "scripts": { + "test": "make test" + }, + "version": "0.1.6" +} diff --git a/node_modules/cordova-android/node_modules/elementtree/tests/data/xml1.xml b/node_modules/cordova-android/node_modules/elementtree/tests/data/xml1.xml new file mode 100644 index 0000000..72c33ae --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/tests/data/xml1.xml @@ -0,0 +1,17 @@ + + + dd + test_object_1 + 4281c348eaf83e70ddce0e07221c3d28 + 14 + application/octetstream + 2009-02-03T05:26:32.612278 + + + test_object_2 + b039efe731ad111bc1b0ef221c3849d0 + 64 + application/octetstream + 2009-02-03T05:26:32.612278 + + diff --git a/node_modules/cordova-android/node_modules/elementtree/tests/data/xml2.xml b/node_modules/cordova-android/node_modules/elementtree/tests/data/xml2.xml new file mode 100644 index 0000000..5f94bbd --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/tests/data/xml2.xml @@ -0,0 +1,14 @@ + + + + Hello World + + + + + + + + diff --git a/node_modules/cordova-android/node_modules/elementtree/tests/test-simple.js b/node_modules/cordova-android/node_modules/elementtree/tests/test-simple.js new file mode 100644 index 0000000..1fc04b8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/elementtree/tests/test-simple.js @@ -0,0 +1,339 @@ +/** + * Copyright 2011 Rackspace + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var fs = require('fs'); +var path = require('path'); + +var sprintf = require('./../lib/sprintf').sprintf; +var et = require('elementtree'); +var XML = et.XML; +var ElementTree = et.ElementTree; +var Element = et.Element; +var SubElement = et.SubElement; +var SyntaxError = require('./../lib/errors').SyntaxError; + +function readFile(name) { + return fs.readFileSync(path.join(__dirname, '/data/', name), 'utf8'); +} + +exports['test_simplest'] = function(test, assert) { + /* Ported from */ + var Element = et.Element; + var root = Element('root'); + root.append(Element('one')); + root.append(Element('two')); + root.append(Element('three')); + assert.equal(3, root.len()); + assert.equal('one', root.getItem(0).tag); + assert.equal('two', root.getItem(1).tag); + assert.equal('three', root.getItem(2).tag); + test.finish(); +}; + + +exports['test_attribute_values'] = function(test, assert) { + var XML = et.XML; + var root = XML(''); + assert.equal('Alpha', root.attrib['alpha']); + assert.equal('Beta', root.attrib['beta']); + assert.equal('Gamma', root.attrib['gamma']); + test.finish(); +}; + + +exports['test_findall'] = function(test, assert) { + var XML = et.XML; + var root = XML(''); + + assert.equal(root.findall("c").length, 1); + assert.equal(root.findall(".//c").length, 2); + assert.equal(root.findall(".//b").length, 3); + assert.equal(root.findall(".//b")[0]._children.length, 1); + assert.equal(root.findall(".//b")[1]._children.length, 0); + assert.equal(root.findall(".//b")[2]._children.length, 0); + assert.deepEqual(root.findall('.//b')[0], root.getchildren()[0]); + + test.finish(); +}; + +exports['test_find'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + var c = SubElement(a, 'c'); + + assert.deepEqual(a.find('./b/..'), a); + test.finish(); +}; + +exports['test_elementtree_find_qname'] = function(test, assert) { + var tree = new et.ElementTree(XML('')); + assert.deepEqual(tree.find(new et.QName('c')), tree.getroot()._children[2]); + test.finish(); +}; + +exports['test_attrib_ns_clear'] = function(test, assert) { + var attribNS = '{http://foo/bar}x'; + + var par = Element('par'); + par.set(attribNS, 'a'); + var child = SubElement(par, 'child'); + child.set(attribNS, 'b'); + + assert.equal('a', par.get(attribNS)); + assert.equal('b', child.get(attribNS)); + + par.clear(); + assert.equal(null, par.get(attribNS)); + assert.equal('b', child.get(attribNS)); + test.finish(); +}; + +exports['test_create_tree_and_parse_simple'] = function(test, assert) { + var i = 0; + var e = new Element('bar', {}); + var expected = "\n" + + 'ponies'; + + SubElement(e, "blah", {a: 11}); + SubElement(e, "blah", {a: 12}); + var se = et.SubElement(e, "gag", {a: '13', b: 'abc'}); + se.text = 'ponies'; + + se.itertext(function(text) { + assert.equal(text, 'ponies'); + i++; + }); + + assert.equal(i, 1); + var etree = new ElementTree(e); + var xml = etree.write(); + assert.equal(xml, expected); + test.finish(); +}; + +exports['test_write_with_options'] = function(test, assert) { + var i = 0; + var e = new Element('bar', {}); + var expected1 = "\n" + + '\n' + + ' \n' + + ' test\n' + + ' \n' + + ' \n' + + ' ponies\n' + + '\n'; + var expected2 = "\n" + + '\n' + + ' \n' + + ' test\n' + + ' \n' + + ' \n' + + ' ponies\n' + + '\n'; + + var expected3 = "\n" + + '\n' + + ' \n' + + ' Hello World\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' Test & Test & Test\n' + + ' \n' + + '\n'; + + var se1 = SubElement(e, "blah", {a: 11}); + var se2 = SubElement(se1, "baz", {d: 11}); + se2.text = 'test'; + SubElement(e, "blah", {a: 12}); + var se = et.SubElement(e, "gag", {a: '13', b: 'abc'}); + se.text = 'ponies'; + + se.itertext(function(text) { + assert.equal(text, 'ponies'); + i++; + }); + + assert.equal(i, 1); + var etree = new ElementTree(e); + var xml1 = etree.write({'indent': 4}); + var xml2 = etree.write({'indent': 2}); + assert.equal(xml1, expected1); + assert.equal(xml2, expected2); + + var file = readFile('xml2.xml'); + var etree2 = et.parse(file); + var xml3 = etree2.write({'indent': 4}); + assert.equal(xml3, expected3); + test.finish(); +}; + +exports['test_parse_and_find_2'] = function(test, assert) { + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + assert.equal(etree.findall('./object').length, 2); + assert.equal(etree.findall('[@name]').length, 1); + assert.equal(etree.findall('[@name="test_container_1"]').length, 1); + assert.equal(etree.findall('[@name=\'test_container_1\']').length, 1); + assert.equal(etree.findall('./object')[0].findtext('name'), 'test_object_1'); + assert.equal(etree.findtext('./object/name'), 'test_object_1'); + assert.equal(etree.findall('.//bytes').length, 2); + assert.equal(etree.findall('*/bytes').length, 2); + assert.equal(etree.findall('*/foobar').length, 0); + + test.finish(); +}; + +exports['test_namespaced_attribute'] = function(test, assert) { + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + assert.equal(etree.findall('*/bytes[@android:type="cool"]').length, 1); + + test.finish(); +} + +exports['test_syntax_errors'] = function(test, assert) { + var expressions = [ './/@bar', '[@bar', '[@foo=bar]', '[@', '/bar' ]; + var errCount = 0; + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + expressions.forEach(function(expression) { + try { + etree.findall(expression); + } + catch (err) { + errCount++; + } + }); + + assert.equal(errCount, expressions.length); + test.finish(); +}; + +exports['test_register_namespace'] = function(test, assert){ + var prefix = 'TESTPREFIX'; + var namespace = 'http://seriously.unknown/namespace/URI'; + var errCount = 0; + + var etree = Element(sprintf('{%s}test', namespace)); + assert.equal(et.tostring(etree, { 'xml_declaration': false}), + sprintf('', namespace)); + + et.register_namespace(prefix, namespace); + var etree = Element(sprintf('{%s}test', namespace)); + assert.equal(et.tostring(etree, { 'xml_declaration': false}), + sprintf('<%s:test xmlns:%s="%s" />', prefix, prefix, namespace)); + + try { + et.register_namespace('ns25', namespace); + } + catch (err) { + errCount++; + } + + assert.equal(errCount, 1, 'Reserved prefix used, but exception was not thrown'); + test.finish(); +}; + +exports['test_tostring'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + var c = SubElement(a, 'c'); + c.text = 543; + + assert.equal(et.tostring(a, { 'xml_declaration': false }), '543'); + assert.equal(et.tostring(c, { 'xml_declaration': false }), '543'); + test.finish(); +}; + +exports['test_escape'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + b.text = '&&&&<>"\n\r'; + + assert.equal(et.tostring(a, { 'xml_declaration': false }), '&&&&<>\"\n\r'); + test.finish(); +}; + +exports['test_find_null'] = function(test, assert) { + var root = Element('root'); + var node = SubElement(root, 'node'); + var leaf = SubElement(node, 'leaf'); + leaf.text = 'ipsum'; + + assert.equal(root.find('node/leaf'), leaf); + assert.equal(root.find('no-such-node/leaf'), null); + test.finish(); +}; + +exports['test_findtext_null'] = function(test, assert) { + var root = Element('root'); + var node = SubElement(root, 'node'); + var leaf = SubElement(node, 'leaf'); + leaf.text = 'ipsum'; + + assert.equal(root.findtext('node/leaf'), 'ipsum'); + assert.equal(root.findtext('no-such-node/leaf'), null); + test.finish(); +}; + +exports['test_remove'] = function(test, assert) { + var root = Element('root'); + var node1 = SubElement(root, 'node1'); + var node2 = SubElement(root, 'node2'); + var node3 = SubElement(root, 'node3'); + + assert.equal(root.len(), 3); + + root.remove(node2); + + assert.equal(root.len(), 2); + assert.equal(root.getItem(0).tag, 'node1') + assert.equal(root.getItem(1).tag, 'node3') + + test.finish(); +}; + +exports['test_cdata_write'] = function(test, assert) { + var root, etree, xml, values, value, i; + + values = [ + 'if(0>1) then true;', + 'ponies hello', + '' + ]; + + for (i = 0; i < values.length; i++) { + value = values[i]; + + root = Element('root'); + root.append(et.CData(value)); + etree = new ElementTree(root); + xml = etree.write({'xml_declaration': false}); + + assert.equal(xml, sprintf('', value)); + } + + test.finish(); +}; diff --git a/node_modules/cordova-android/node_modules/glob/LICENSE b/node_modules/cordova-android/node_modules/glob/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/glob/README.md b/node_modules/cordova-android/node_modules/glob/README.md new file mode 100644 index 0000000..063cf95 --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/README.md @@ -0,0 +1,377 @@ +[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) + +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +![](oh-my-glob.gif) + +## Usage + +```javascript +var glob = require("glob") + +// options is optional +glob("**/*.js", options, function (er, files) { + // files is an array of filenames. + // If the `nonull` option is set, and nothing + // was found, then files is ["**/*.js"] + // er is an error object or null. +}) +``` + +## Glob Primer + +"Globs" are the patterns you type when you do stuff like `ls *.js` on +the command line, or put `build/*` in a `.gitignore` file. + +Before parsing the path part patterns, braced sections are expanded +into a set. Braced sections start with `{` and end with `}`, with any +number of comma-delimited sections within. Braced sections may contain +slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. + +The following characters have special magic meaning when used in a +path portion: + +* `*` Matches 0 or more characters in a single path portion +* `?` Matches 1 character +* `[...]` Matches a range of characters, similar to a RegExp range. + If the first character of the range is `!` or `^` then it matches + any character not in the range. +* `!(pattern|pattern|pattern)` Matches anything that does not match + any of the patterns provided. +* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the + patterns provided. +* `+(pattern|pattern|pattern)` Matches one or more occurrences of the + patterns provided. +* `*(a|b|c)` Matches zero or more occurrences of the patterns provided +* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns + provided +* `**` If a "globstar" is alone in a path portion, then it matches + zero or more directories and subdirectories searching for matches. + It does not crawl symlinked directories. + +### Dots + +If a file or directory path portion has a `.` as the first character, +then it will not match any glob pattern unless that pattern's +corresponding path part also has a `.` as its first character. + +For example, the pattern `a/.*/c` would match the file at `a/.b/c`. +However the pattern `a/*/c` would not, because `*` does not start with +a dot character. + +You can make glob treat dots as normal characters by setting +`dot:true` in the options. + +### Basename Matching + +If you set `matchBase:true` in the options, and the pattern has no +slashes in it, then it will seek for any file anywhere in the tree +with a matching basename. For example, `*.js` would match +`test/simple/basic.js`. + +### Negation + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird, and for the time being, this should be +avoided. The behavior is deprecated in version 5, and will be removed +entirely in version 6. + +### Empty Sets + +If no matching files are found, then an empty array is returned. This +differs from the shell, where the pattern itself is returned. For +example: + + $ echo a*s*d*f + a*s*d*f + +To get the bash-style behavior, set the `nonull:true` in the options. + +### See Also: + +* `man sh` +* `man bash` (Search for "Pattern Matching") +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob.hasMagic(pattern, [options]) + +Returns `true` if there are any special characters in the pattern, and +`false` otherwise. + +Note that the options affect the results. If `noext:true` is set in +the options object, then `+(a|b)` will not be considered a magic +pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` +then that is considered magical, unless `nobrace:true` is set in the +options. + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instantiating the `glob.Glob` class. + +```javascript +var Glob = require("glob").Glob +var mg = new Glob(pattern, options, cb) +``` + +It's an EventEmitter, and starts walking the filesystem to find matches +immediately. + +### new glob.Glob(pattern, [options], [cb]) + +* `pattern` {String} pattern to search for +* `options` {Object} +* `cb` {Function} Called when an error occurs, or matches are found + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Note that if the `sync` flag is set in the options, then matches will +be immediately available on the `g.found` member. + +### Properties + +* `minimatch` The minimatch object that the glob uses. +* `options` The options object passed in. +* `aborted` Boolean which is set to true when calling `abort()`. There + is no way at this time to continue a glob search after aborting, but + you can re-use the statCache to avoid having to duplicate syscalls. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `'DIR'` - Path exists, and is not a directory + * `'FILE'` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` +* `statCache` Cache of `fs.stat` results, to prevent statting the same + path multiple times. +* `symlinks` A record of which paths are symbolic links, which is + relevant in resolving `**` patterns. +* `realpathCache` An optional object which is passed to `fs.realpath` + to minimize unnecessary syscalls. It is stored on the instantiated + Glob object, and may be re-used. + +### Events + +* `end` When the matching is finished, this is emitted with all the + matches found. If the `nonull` option is set, and no match was found, + then the `matches` list contains the original pattern. The matches + are sorted, unless the `nosort` flag is set. +* `match` Every time a match is found, this is emitted with the matched. +* `error` Emitted when an unexpected error is encountered, or whenever + any fs error occurs if `options.strict` is set. +* `abort` When `abort()` is called, this event is raised. + +### Methods + +* `pause` Temporarily stop the search +* `resume` Resume the search +* `abort` Stop the search forever + +### Options + +All the options that can be passed to Minimatch can also be passed to +Glob to change pattern matching behavior. Also, some have been added, +or have glob-specific ramifications. + +All options are false by default, unless otherwise noted. + +All options are added to the Glob object, as well. + +If you are running many `glob` operations, you can pass a Glob object +as the `options` argument to a subsequent operation to shortcut some +`stat` and `readdir` calls. At the very least, you may pass in shared +`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that +parallel glob operations will be sped up by sharing information about +the filesystem. + +* `cwd` The current working directory in which to search. Defaults + to `process.cwd()`. +* `root` The place where patterns starting with `/` will be mounted + onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix + systems, and `C:\` or some such on Windows.) +* `dot` Include `.dot` files in normal matches and `globstar` matches. + Note that an explicit dot in a portion of the pattern will always + match dot files. +* `nomount` By default, a pattern starting with a forward-slash will be + "mounted" onto the root setting, so that a valid filesystem path is + returned. Set this flag to disable that behavior. +* `mark` Add a `/` character to directory matches. Note that this + requires additional stat calls. +* `nosort` Don't sort the results. +* `stat` Set to true to stat *all* results. This reduces performance + somewhat, and is completely unnecessary, unless `readdir` is presumed + to be an untrustworthy indicator of file existence. +* `silent` When an unusual error is encountered when attempting to + read a directory, a warning will be printed to stderr. Set the + `silent` option to true to suppress these warnings. +* `strict` When an unusual error is encountered when attempting to + read a directory, the process will just continue on in search of + other matches. Set the `strict` option to raise an error in these + cases. +* `cache` See `cache` property above. Pass in a previously generated + cache object to save some fs calls. +* `statCache` A cache of results of filesystem information, to prevent + unnecessary stat calls. While it should not normally be necessary + to set this, you may pass the statCache from one glob() call to the + options object of another, if you know that the filesystem will not + change between calls. (See "Race Conditions" below.) +* `symlinks` A cache of known symbolic links. You may pass in a + previously generated `symlinks` object to save `lstat` calls when + resolving `**` matches. +* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. +* `nounique` In some cases, brace-expanded patterns can result in the + same file showing up multiple times in the result set. By default, + this implementation prevents duplicates in the result set. Set this + flag to disable that behavior. +* `nonull` Set to never return an empty set, instead returning a set + containing the pattern itself. This is the default in glob(3). +* `debug` Set to enable debug logging in minimatch and glob. +* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. +* `noglobstar` Do not match `**` against multiple filenames. (Ie, + treat it as a normal `*` instead.) +* `noext` Do not match `+(a|b)` "extglob" patterns. +* `nocase` Perform a case-insensitive match. Note: on + case-insensitive filesystems, non-magic patterns will match by + default, since `stat` and `readdir` will not raise errors. +* `matchBase` Perform a basename-only match if the pattern does not + contain any slash characters. That is, `*.js` would be treated as + equivalent to `**/*.js`, matching all js files in all directories. +* `nodir` Do not match directories, only files. (Note: to match + *only* directories, simply put a `/` at the end of the pattern.) +* `ignore` Add a pattern or an array of patterns to exclude matches. +* `follow` Follow symlinked directories when expanding `**` patterns. + Note that this can result in a lot of duplicate references in the + presence of cyclic links. +* `realpath` Set to true to call `fs.realpath` on all of the results. + In the case of a symlink that cannot be resolved, the full absolute + path to the matched entry is returned (though it will usually be a + broken symlink) +* `nonegate` Suppress deprecated `negate` behavior. (See below.) + Default=true +* `nocomment` Suppress deprecated `comment` behavior. (See below.) + Default=true + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between node-glob and other +implementations, and are intentional. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.3, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +Note that symlinked directories are not crawled as part of a `**`, +though their contents may match against subsequent portions of the +pattern. This prevents infinite loops and duplicates and the like. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then glob returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. + +### Comments and Negation + +**Note**: In version 5 of this module, negation and comments are +**disabled** by default. You can explicitly set `nonegate:false` or +`nocomment:false` to re-enable them. They are going away entirely in +version 6. + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird. It is better to use the `ignore` option +to set a pattern or set of patterns to exclude from matches. If you +want the "everything except *x*" type of behavior, you can use `**` as +the main pattern, and set an `ignore` for the things to exclude. + +The comments feature is added in minimatch, primarily to more easily +support use cases like ignore files, where a `#` at the start of a +line makes the pattern "empty". However, in the context of a +straightforward filesystem globber, "comments" don't make much sense. + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation. You must use +forward-slashes **only** in glob expressions. Back-slashes will always +be interpreted as escape characters, not path separators. + +Results from absolute patterns such as `/foo/*` are mounted onto the +root setting using `path.join`. On windows, this will by default result +in `/foo/*` matching `C:\foo\bar.txt`. + +## Race Conditions + +Glob searching, by its very nature, is susceptible to race conditions, +since it relies on directory walking and such. + +As a result, it is possible that a file that exists when glob looks for +it may have been deleted or modified by the time it returns the result. + +As part of its internal implementation, this program caches all stat +and readdir calls that it makes, in order to cut down on system +overhead. However, this also makes it even more susceptible to races, +especially if the cache or statCache objects are reused between glob +calls. + +Users are thus advised not to use a glob result as a guarantee of +filesystem state in the face of rapid changes. For the vast majority +of operations, this is never a problem. + +## Contributing + +Any change to behavior (including bugfixes) must come with a test. + +Patches that fail tests or reduce performance will be rejected. + +``` +# to run tests +npm test + +# to re-generate test fixtures +npm run test-regen + +# to benchmark against bash/zsh +npm run bench + +# to profile javascript +npm run prof +``` diff --git a/node_modules/cordova-android/node_modules/glob/common.js b/node_modules/cordova-android/node_modules/glob/common.js new file mode 100644 index 0000000..e36a631 --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/common.js @@ -0,0 +1,245 @@ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} diff --git a/node_modules/cordova-android/node_modules/glob/glob.js b/node_modules/cordova-android/node_modules/glob/glob.js new file mode 100644 index 0000000..022d2ac --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/glob.js @@ -0,0 +1,752 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} diff --git a/node_modules/cordova-android/node_modules/glob/package.json b/node_modules/cordova-android/node_modules/glob/package.json new file mode 100644 index 0000000..4f1aac1 --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/package.json @@ -0,0 +1,76 @@ +{ + "_from": "glob@^5.0.13", + "_id": "glob@5.0.15", + "_inBundle": true, + "_integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "_location": "/cordova-android/glob", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "glob@^5.0.13", + "name": "glob", + "escapedName": "glob", + "rawSpec": "^5.0.13", + "saveSpec": null, + "fetchSpec": "^5.0.13" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "_shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", + "_spec": "glob@^5.0.13", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "bundleDependencies": false, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "deprecated": false, + "description": "a little globber", + "devDependencies": { + "mkdirp": "0", + "rimraf": "^2.2.8", + "tap": "^1.1.4", + "tick": "0.0.6" + }, + "engines": { + "node": "*" + }, + "files": [ + "glob.js", + "sync.js", + "common.js" + ], + "homepage": "https://github.com/isaacs/node-glob#readme", + "license": "ISC", + "main": "glob.js", + "name": "glob", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "scripts": { + "bench": "bash benchmark.sh", + "benchclean": "node benchclean.js", + "prepublish": "npm run benchclean", + "prof": "bash prof.sh && cat profile.txt", + "profclean": "rm -f v8.log profile.txt", + "test": "tap test/*.js --cov", + "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js" + }, + "version": "5.0.15" +} diff --git a/node_modules/cordova-android/node_modules/glob/sync.js b/node_modules/cordova-android/node_modules/glob/sync.js new file mode 100644 index 0000000..09883d2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/glob/sync.js @@ -0,0 +1,460 @@ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} diff --git a/node_modules/cordova-android/node_modules/inflight/LICENSE b/node_modules/cordova-android/node_modules/inflight/LICENSE new file mode 100644 index 0000000..05eeeb8 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inflight/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/inflight/README.md b/node_modules/cordova-android/node_modules/inflight/README.md new file mode 100644 index 0000000..6dc8929 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inflight/README.md @@ -0,0 +1,37 @@ +# inflight + +Add callbacks to requests in flight to avoid async duplication + +## USAGE + +```javascript +var inflight = require('inflight') + +// some request that does some stuff +function req(key, callback) { + // key is any random string. like a url or filename or whatever. + // + // will return either a falsey value, indicating that the + // request for this key is already in flight, or a new callback + // which when called will call all callbacks passed to inflightk + // with the same key + callback = inflight(key, callback) + + // If we got a falsey value back, then there's already a req going + if (!callback) return + + // this is where you'd fetch the url or whatever + // callback is also once()-ified, so it can safely be assigned + // to multiple events etc. First call wins. + setTimeout(function() { + callback(null, key) + }, 100) +} + +// only assigns a single setTimeout +// when it dings, all cbs get called +req('foo', cb1) +req('foo', cb2) +req('foo', cb3) +req('foo', cb4) +``` diff --git a/node_modules/cordova-android/node_modules/inflight/inflight.js b/node_modules/cordova-android/node_modules/inflight/inflight.js new file mode 100644 index 0000000..48202b3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inflight/inflight.js @@ -0,0 +1,54 @@ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} diff --git a/node_modules/cordova-android/node_modules/inflight/package.json b/node_modules/cordova-android/node_modules/inflight/package.json new file mode 100644 index 0000000..6fb0823 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inflight/package.json @@ -0,0 +1,59 @@ +{ + "_from": "inflight@^1.0.4", + "_id": "inflight@1.0.6", + "_inBundle": true, + "_integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "_location": "/cordova-android/inflight", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "inflight@^1.0.4", + "name": "inflight", + "escapedName": "inflight", + "rawSpec": "^1.0.4", + "saveSpec": null, + "fetchSpec": "^1.0.4" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "_shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "_spec": "inflight@^1.0.4", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/inflight/issues" + }, + "bundleDependencies": false, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + }, + "deprecated": false, + "description": "Add callbacks to requests in flight to avoid async duplication", + "devDependencies": { + "tap": "^7.1.2" + }, + "files": [ + "inflight.js" + ], + "homepage": "https://github.com/isaacs/inflight", + "license": "ISC", + "main": "inflight.js", + "name": "inflight", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/inflight.git" + }, + "scripts": { + "test": "tap test.js --100" + }, + "version": "1.0.6" +} diff --git a/node_modules/cordova-android/node_modules/inherits/LICENSE b/node_modules/cordova-android/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/cordova-android/node_modules/inherits/README.md b/node_modules/cordova-android/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/cordova-android/node_modules/inherits/inherits.js b/node_modules/cordova-android/node_modules/inherits/inherits.js new file mode 100644 index 0000000..3b94763 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inherits/inherits.js @@ -0,0 +1,7 @@ +try { + var util = require('util'); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = require('./inherits_browser.js'); +} diff --git a/node_modules/cordova-android/node_modules/inherits/inherits_browser.js b/node_modules/cordova-android/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/cordova-android/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/cordova-android/node_modules/inherits/package.json b/node_modules/cordova-android/node_modules/inherits/package.json new file mode 100644 index 0000000..41a09ac --- /dev/null +++ b/node_modules/cordova-android/node_modules/inherits/package.json @@ -0,0 +1,62 @@ +{ + "_from": "inherits@2", + "_id": "inherits@2.0.3", + "_inBundle": true, + "_integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "_location": "/cordova-android/inherits", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "inherits@2", + "name": "inherits", + "escapedName": "inherits", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "_shasum": "633c2c83e3da42a502f52466022480f4208261de", + "_spec": "inherits@2", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "browser": "./inherits_browser.js", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "devDependencies": { + "tap": "^7.1.0" + }, + "files": [ + "inherits.js", + "inherits_browser.js" + ], + "homepage": "https://github.com/isaacs/inherits#readme", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "license": "ISC", + "main": "./inherits.js", + "name": "inherits", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits.git" + }, + "scripts": { + "test": "node test" + }, + "version": "2.0.3" +} diff --git a/node_modules/cordova-android/node_modules/minimatch/LICENSE b/node_modules/cordova-android/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/minimatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/minimatch/README.md b/node_modules/cordova-android/node_modules/minimatch/README.md new file mode 100644 index 0000000..ad72b81 --- /dev/null +++ b/node_modules/cordova-android/node_modules/minimatch/README.md @@ -0,0 +1,209 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/cordova-android/node_modules/minimatch/minimatch.js b/node_modules/cordova-android/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..5b5f8cf --- /dev/null +++ b/node_modules/cordova-android/node_modules/minimatch/minimatch.js @@ -0,0 +1,923 @@ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} diff --git a/node_modules/cordova-android/node_modules/minimatch/package.json b/node_modules/cordova-android/node_modules/minimatch/package.json new file mode 100644 index 0000000..4706bb5 --- /dev/null +++ b/node_modules/cordova-android/node_modules/minimatch/package.json @@ -0,0 +1,65 @@ +{ + "_from": "minimatch@^3.0.0", + "_id": "minimatch@3.0.4", + "_inBundle": true, + "_integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "_location": "/cordova-android/minimatch", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "minimatch@^3.0.0", + "name": "minimatch", + "escapedName": "minimatch", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "_shasum": "5166e286457f03306064be5497e8dbb0c3d32083", + "_spec": "minimatch@^3.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "bundleDependencies": false, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "deprecated": false, + "description": "a glob matcher in javascript", + "devDependencies": { + "tap": "^10.3.2" + }, + "engines": { + "node": "*" + }, + "files": [ + "minimatch.js" + ], + "homepage": "https://github.com/isaacs/minimatch#readme", + "license": "ISC", + "main": "minimatch.js", + "name": "minimatch", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --cov" + }, + "version": "3.0.4" +} diff --git a/node_modules/cordova-android/node_modules/nopt/.npmignore b/node_modules/cordova-android/node_modules/nopt/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/cordova-android/node_modules/nopt/LICENSE b/node_modules/cordova-android/node_modules/nopt/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/nopt/README.md b/node_modules/cordova-android/node_modules/nopt/README.md new file mode 100644 index 0000000..5aba088 --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/README.md @@ -0,0 +1,209 @@ +If you want to write an option parser, and have it be good, there are +two ways to do it. The Right Way, and the Wrong Way. + +The Wrong Way is to sit down and write an option parser. We've all done +that. + +The Right Way is to write some complex configurable program with so many +options that you go half-insane just trying to manage them all, and put +it off with duct-tape solutions until you see exactly to the core of the +problem, and finally snap and write an awesome option parser. + +If you want to write an option parser, don't write an option parser. +Write a package manager, or a source control system, or a service +restarter, or an operating system. You probably won't end up with a +good one of those, but if you don't give up, and you are relentless and +diligent enough in your procrastination, you may just end up with a very +nice option parser. + +## USAGE + + // my-program.js + var nopt = require("nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + , "many" : [String, Array] + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag"] + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + console.log(parsed) + +This would give you support for any of the following: + +```bash +$ node my-program.js --foo "blerp" --no-flag +{ "foo" : "blerp", "flag" : false } + +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag +{ bar: 7, foo: "Mr. Hand", flag: true } + +$ node my-program.js --foo "blerp" -f -----p +{ foo: "blerp", flag: true, pick: true } + +$ node my-program.js -fp --foofoo +{ foo: "Mr. Foo", flag: true, pick: true } + +$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } + +$ node my-program.js --blatzk -fp # unknown opts are ok. +{ blatzk: true, flag: true, pick: true } + +$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value +{ blatzk: 1000, flag: true, pick: true } + +$ node my-program.js --no-blatzk -fp # unless they start with "no-" +{ blatzk: false, flag: true, pick: true } + +$ node my-program.js --baz b/a/z # known paths are resolved. +{ baz: "/Users/isaacs/b/a/z" } + +# if Array is one of the types, then it can take many +# values, and will always be an array. The other types provided +# specify what types are allowed in the list. + +$ node my-program.js --many 1 --many null --many foo +{ many: ["1", "null", "foo"] } + +$ node my-program.js --many foo +{ many: ["foo"] } +``` + +Read the tests at the bottom of `lib/nopt.js` for more examples of +what this puppy can do. + +## Types + +The following types are supported, and defined on `nopt.typeDefs` + +* String: A normal string. No parsing is done. +* path: A file system path. Gets resolved against cwd if not absolute. +* url: A url. If it doesn't parse, it isn't accepted. +* Number: Must be numeric. +* Date: Must parse as a date. If it does, and `Date` is one of the options, + then it will return a Date object, not a string. +* Boolean: Must be either `true` or `false`. If an option is a boolean, + then it does not need a value, and its presence will imply `true` as + the value. To negate boolean flags, do `--no-whatever` or `--whatever + false` +* NaN: Means that the option is strictly not allowed. Any value will + fail. +* Stream: An object matching the "Stream" class in node. Valuable + for use when validating programmatically. (npm uses this to let you + supply any WriteStream on the `outfd` and `logfd` config options.) +* Array: If `Array` is specified as one of the types, then the value + will be parsed as a list of options. This means that multiple values + can be specified, and that the value will always be an array. + +If a type is an array of values not on this list, then those are +considered valid values. For instance, in the example above, the +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, +and any other value will be rejected. + +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be +interpreted as their JavaScript equivalents. + +You can also mix types and values, or multiple types, in a list. For +instance `{ blah: [Number, null] }` would allow a value to be set to +either a Number or null. When types are ordered, this implies a +preference, and the first type that can be used to properly interpret +the value will be used. + +To define a new type, add it to `nopt.typeDefs`. Each item in that +hash is an object with a `type` member and a `validate` method. The +`type` member is an object that matches what goes in the type list. The +`validate` method is a function that gets called with `validate(data, +key, val)`. Validate methods should assign `data[key]` to the valid +value of `val` if it can be handled properly, or return boolean +`false` if it cannot. + +You can also call `nopt.clean(data, types, typeDefs)` to clean up a +config object and remove its invalid properties. + +## Error Handling + +By default, nopt outputs a warning to standard error when invalid +options are found. You can change this behavior by assigning a method +to `nopt.invalidHandler`. This method will be called with +the offending `nopt.invalidHandler(key, val, types)`. + +If no `nopt.invalidHandler` is assigned, then it will console.error +its whining. If it is assigned to boolean `false` then the warning is +suppressed. + +## Abbreviations + +Yes, they are supported. If you define options like this: + +```javascript +{ "foolhardyelephants" : Boolean +, "pileofmonkeys" : Boolean } +``` + +Then this will work: + +```bash +node program.js --foolhar --pil +node program.js --no-f --pileofmon +# etc. +``` + +## Shorthands + +Shorthands are a hash of shorter option names to a snippet of args that +they expand to. + +If multiple one-character shorthands are all combined, and the +combination does not unambiguously match any other option or shorthand, +then they will be broken up into their constituent parts. For example: + +```json +{ "s" : ["--loglevel", "silent"] +, "g" : "--global" +, "f" : "--force" +, "p" : "--parseable" +, "l" : "--long" +} +``` + +```bash +npm ls -sgflp +# just like doing this: +npm ls --loglevel silent --global --force --long --parseable +``` + +## The Rest of the args + +The config object returned by nopt is given a special member called +`argv`, which is an object with the following fields: + +* `remain`: The remaining args after all the parsing has occurred. +* `original`: The args as they originally appeared. +* `cooked`: The args after flags and shorthands are expanded. + +## Slicing + +Node programs are called with more or less the exact argv as it appears +in C land, after the v8 and node-specific options have been plucked off. +As such, `argv[0]` is always `node` and `argv[1]` is always the +JavaScript program being run. + +That's usually not very useful to you. So they're sliced off by +default. If you want them, then you can pass in `0` as the last +argument, or any other number that you'd like to slice off the start of +the list. diff --git a/node_modules/cordova-android/node_modules/nopt/bin/nopt.js b/node_modules/cordova-android/node_modules/nopt/bin/nopt.js new file mode 100755 index 0000000..3232d4c --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/bin/nopt.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node +var nopt = require("../lib/nopt") + , path = require("path") + , types = { num: Number + , bool: Boolean + , help: Boolean + , list: Array + , "num-list": [Number, Array] + , "str-list": [String, Array] + , "bool-list": [Boolean, Array] + , str: String + , clear: Boolean + , config: Boolean + , length: Number + , file: path + } + , shorthands = { s: [ "--str", "astring" ] + , b: [ "--bool" ] + , nb: [ "--no-bool" ] + , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ] + , "?": ["--help"] + , h: ["--help"] + , H: ["--help"] + , n: [ "--num", "125" ] + , c: ["--config"] + , l: ["--length"] + , f: ["--file"] + } + , parsed = nopt( types + , shorthands + , process.argv + , 2 ) + +console.log("parsed", parsed) + +if (parsed.help) { + console.log("") + console.log("nopt cli tester") + console.log("") + console.log("types") + console.log(Object.keys(types).map(function M (t) { + var type = types[t] + if (Array.isArray(type)) { + return [t, type.map(function (type) { return type.name })] + } + return [t, type && type.name] + }).reduce(function (s, i) { + s[i[0]] = i[1] + return s + }, {})) + console.log("") + console.log("shorthands") + console.log(shorthands) +} diff --git a/node_modules/cordova-android/node_modules/nopt/examples/my-program.js b/node_modules/cordova-android/node_modules/nopt/examples/my-program.js new file mode 100755 index 0000000..142447e --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/examples/my-program.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +//process.env.DEBUG_NOPT = 1 + +// my-program.js +var nopt = require("../lib/nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag", "true"] + , "g" : ["--flag"] + , "s" : "--flag" + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + +console.log("parsed =\n"+ require("util").inspect(parsed)) diff --git a/node_modules/cordova-android/node_modules/nopt/lib/nopt.js b/node_modules/cordova-android/node_modules/nopt/lib/nopt.js new file mode 100644 index 0000000..5309a00 --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/lib/nopt.js @@ -0,0 +1,414 @@ +// info about each config option. + +var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG + ? function () { console.error.apply(console, arguments) } + : function () {} + +var url = require("url") + , path = require("path") + , Stream = require("stream").Stream + , abbrev = require("abbrev") + +module.exports = exports = nopt +exports.clean = clean + +exports.typeDefs = + { String : { type: String, validate: validateString } + , Boolean : { type: Boolean, validate: validateBoolean } + , url : { type: url, validate: validateUrl } + , Number : { type: Number, validate: validateNumber } + , path : { type: path, validate: validatePath } + , Stream : { type: Stream, validate: validateStream } + , Date : { type: Date, validate: validateDate } + } + +function nopt (types, shorthands, args, slice) { + args = args || process.argv + types = types || {} + shorthands = shorthands || {} + if (typeof slice !== "number") slice = 2 + + debug(types, shorthands, args, slice) + + args = args.slice(slice) + var data = {} + , key + , remain = [] + , cooked = args + , original = args.slice(0) + + parse(args, data, remain, types, shorthands) + // now data is full + clean(data, types, exports.typeDefs) + data.argv = {remain:remain,cooked:cooked,original:original} + Object.defineProperty(data.argv, 'toString', { value: function () { + return this.original.map(JSON.stringify).join(" ") + }, enumerable: false }) + return data +} + +function clean (data, types, typeDefs) { + typeDefs = typeDefs || exports.typeDefs + var remove = {} + , typeDefault = [false, true, null, String, Array] + + Object.keys(data).forEach(function (k) { + if (k === "argv") return + var val = data[k] + , isArray = Array.isArray(val) + , type = types[k] + if (!isArray) val = [val] + if (!type) type = typeDefault + if (type === Array) type = typeDefault.concat(Array) + if (!Array.isArray(type)) type = [type] + + debug("val=%j", val) + debug("types=", type) + val = val.map(function (val) { + // if it's an unknown value, then parse false/true/null/numbers/dates + if (typeof val === "string") { + debug("string %j", val) + val = val.trim() + if ((val === "null" && ~type.indexOf(null)) + || (val === "true" && + (~type.indexOf(true) || ~type.indexOf(Boolean))) + || (val === "false" && + (~type.indexOf(false) || ~type.indexOf(Boolean)))) { + val = JSON.parse(val) + debug("jsonable %j", val) + } else if (~type.indexOf(Number) && !isNaN(val)) { + debug("convert to number", val) + val = +val + } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) { + debug("convert to date", val) + val = new Date(val) + } + } + + if (!types.hasOwnProperty(k)) { + return val + } + + // allow `--no-blah` to set 'blah' to null if null is allowed + if (val === false && ~type.indexOf(null) && + !(~type.indexOf(false) || ~type.indexOf(Boolean))) { + val = null + } + + var d = {} + d[k] = val + debug("prevalidated val", d, val, types[k]) + if (!validate(d, k, val, types[k], typeDefs)) { + if (exports.invalidHandler) { + exports.invalidHandler(k, val, types[k], data) + } else if (exports.invalidHandler !== false) { + debug("invalid: "+k+"="+val, types[k]) + } + return remove + } + debug("validated val", d, val, types[k]) + return d[k] + }).filter(function (val) { return val !== remove }) + + if (!val.length) delete data[k] + else if (isArray) { + debug(isArray, data[k], val) + data[k] = val + } else data[k] = val[0] + + debug("k=%s val=%j", k, val, data[k]) + }) +} + +function validateString (data, k, val) { + data[k] = String(val) +} + +function validatePath (data, k, val) { + if (val === true) return false + if (val === null) return true + + val = String(val) + var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\// + if (val.match(homePattern) && process.env.HOME) { + val = path.resolve(process.env.HOME, val.substr(2)) + } + data[k] = path.resolve(String(val)) + return true +} + +function validateNumber (data, k, val) { + debug("validate Number %j %j %j", k, val, isNaN(val)) + if (isNaN(val)) return false + data[k] = +val +} + +function validateDate (data, k, val) { + debug("validate Date %j %j %j", k, val, Date.parse(val)) + var s = Date.parse(val) + if (isNaN(s)) return false + data[k] = new Date(val) +} + +function validateBoolean (data, k, val) { + if (val instanceof Boolean) val = val.valueOf() + else if (typeof val === "string") { + if (!isNaN(val)) val = !!(+val) + else if (val === "null" || val === "false") val = false + else val = true + } else val = !!val + data[k] = val +} + +function validateUrl (data, k, val) { + val = url.parse(String(val)) + if (!val.host) return false + data[k] = val.href +} + +function validateStream (data, k, val) { + if (!(val instanceof Stream)) return false + data[k] = val +} + +function validate (data, k, val, type, typeDefs) { + // arrays are lists of types. + if (Array.isArray(type)) { + for (var i = 0, l = type.length; i < l; i ++) { + if (type[i] === Array) continue + if (validate(data, k, val, type[i], typeDefs)) return true + } + delete data[k] + return false + } + + // an array of anything? + if (type === Array) return true + + // NaN is poisonous. Means that something is not allowed. + if (type !== type) { + debug("Poison NaN", k, val, type) + delete data[k] + return false + } + + // explicit list of values + if (val === type) { + debug("Explicitly allowed %j", val) + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + return true + } + + // now go through the list of typeDefs, validate against each one. + var ok = false + , types = Object.keys(typeDefs) + for (var i = 0, l = types.length; i < l; i ++) { + debug("test type %j %j %j", k, val, types[i]) + var t = typeDefs[types[i]] + if (t && type === t.type) { + var d = {} + ok = false !== t.validate(d, k, val) + val = d[k] + if (ok) { + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + break + } + } + } + debug("OK? %j (%j %j %j)", ok, k, val, types[i]) + + if (!ok) delete data[k] + return ok +} + +function parse (args, data, remain, types, shorthands) { + debug("parse", args, data, remain) + + var key = null + , abbrevs = abbrev(Object.keys(types)) + , shortAbbr = abbrev(Object.keys(shorthands)) + + for (var i = 0; i < args.length; i ++) { + var arg = args[i] + debug("arg", arg) + + if (arg.match(/^-{2,}$/)) { + // done with keys. + // the rest are args. + remain.push.apply(remain, args.slice(i + 1)) + args[i] = "--" + break + } + var hadEq = false + if (arg.charAt(0) === "-" && arg.length > 1) { + if (arg.indexOf("=") !== -1) { + hadEq = true + var v = arg.split("=") + arg = v.shift() + v = v.join("=") + args.splice.apply(args, [i, 1].concat([arg, v])) + } + + // see if it's a shorthand + // if so, splice and back up to re-parse it. + var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) + debug("arg=%j shRes=%j", arg, shRes) + if (shRes) { + debug(arg, shRes) + args.splice.apply(args, [i, 1].concat(shRes)) + if (arg !== shRes[0]) { + i -- + continue + } + } + arg = arg.replace(/^-+/, "") + var no = null + while (arg.toLowerCase().indexOf("no-") === 0) { + no = !no + arg = arg.substr(3) + } + + if (abbrevs[arg]) arg = abbrevs[arg] + + var isArray = types[arg] === Array || + Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 + + // allow unknown things to be arrays if specified multiple times. + if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) { + if (!Array.isArray(data[arg])) + data[arg] = [data[arg]] + isArray = true + } + + var val + , la = args[i + 1] + + var isBool = typeof no === 'boolean' || + types[arg] === Boolean || + Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || + (typeof types[arg] === 'undefined' && !hadEq) || + (la === "false" && + (types[arg] === null || + Array.isArray(types[arg]) && ~types[arg].indexOf(null))) + + if (isBool) { + // just set and move along + val = !no + // however, also support --bool true or --bool false + if (la === "true" || la === "false") { + val = JSON.parse(la) + la = null + if (no) val = !val + i ++ + } + + // also support "foo":[Boolean, "bar"] and "--foo bar" + if (Array.isArray(types[arg]) && la) { + if (~types[arg].indexOf(la)) { + // an explicit type + val = la + i ++ + } else if ( la === "null" && ~types[arg].indexOf(null) ) { + // null allowed + val = null + i ++ + } else if ( !la.match(/^-{2,}[^-]/) && + !isNaN(la) && + ~types[arg].indexOf(Number) ) { + // number + val = +la + i ++ + } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { + // string + val = la + i ++ + } + } + + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + continue + } + + if (types[arg] === String && la === undefined) + la = "" + + if (la && la.match(/^-{2,}$/)) { + la = undefined + i -- + } + + val = la === undefined ? true : la + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + i ++ + continue + } + remain.push(arg) + } +} + +function resolveShort (arg, shorthands, shortAbbr, abbrevs) { + // handle single-char shorthands glommed together, like + // npm ls -glp, but only if there is one dash, and only if + // all of the chars are single-char shorthands, and it's + // not a match to some other abbrev. + arg = arg.replace(/^-+/, '') + + // if it's an exact known option, then don't go any further + if (abbrevs[arg] === arg) + return null + + // if it's an exact known shortopt, same deal + if (shorthands[arg]) { + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] + } + + // first check to see if this arg is a set of single-char shorthands + var singles = shorthands.___singles + if (!singles) { + singles = Object.keys(shorthands).filter(function (s) { + return s.length === 1 + }).reduce(function (l,r) { + l[r] = true + return l + }, {}) + shorthands.___singles = singles + debug('shorthand singles', singles) + } + + var chrs = arg.split("").filter(function (c) { + return singles[c] + }) + + if (chrs.join("") === arg) return chrs.map(function (c) { + return shorthands[c] + }).reduce(function (l, r) { + return l.concat(r) + }, []) + + + // if it's an arg abbrev, and not a literal shorthand, then prefer the arg + if (abbrevs[arg] && !shorthands[arg]) + return null + + // if it's an abbr for a shorthand, then use that + if (shortAbbr[arg]) + arg = shortAbbr[arg] + + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] +} diff --git a/node_modules/cordova-android/node_modules/nopt/package.json b/node_modules/cordova-android/node_modules/nopt/package.json new file mode 100644 index 0000000..400a93b --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/package.json @@ -0,0 +1,60 @@ +{ + "_from": "nopt@3.0.1", + "_id": "nopt@3.0.1", + "_inBundle": true, + "_integrity": "sha1-vOXEJEajKR9HYio3CrvxWPu6y/0=", + "_location": "/cordova-android/nopt", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "nopt@3.0.1", + "name": "nopt", + "escapedName": "nopt", + "rawSpec": "3.0.1", + "saveSpec": null, + "fetchSpec": "3.0.1" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "_shasum": "bce5c42446a3291f47622a370abbf158fbbacbfd", + "_spec": "nopt@3.0.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "nopt": "./bin/nopt.js" + }, + "bugs": { + "url": "https://github.com/isaacs/nopt/issues" + }, + "bundleDependencies": false, + "dependencies": { + "abbrev": "1" + }, + "deprecated": false, + "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", + "devDependencies": { + "tap": "~0.4.8" + }, + "homepage": "https://github.com/isaacs/nopt#readme", + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/nopt/raw/master/LICENSE" + }, + "main": "lib/nopt.js", + "name": "nopt", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/nopt.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "3.0.1" +} diff --git a/node_modules/cordova-android/node_modules/nopt/test/basic.js b/node_modules/cordova-android/node_modules/nopt/test/basic.js new file mode 100644 index 0000000..2f9088c --- /dev/null +++ b/node_modules/cordova-android/node_modules/nopt/test/basic.js @@ -0,0 +1,251 @@ +var nopt = require("../") + , test = require('tap').test + + +test("passing a string results in a string", function (t) { + var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0) + t.same(parsed.key, "myvalue") + t.end() +}) + +// https://github.com/npm/nopt/issues/31 +test("Empty String results in empty string, not true", function (t) { + var parsed = nopt({ empty: String }, {}, ["--empty"], 0) + t.same(parsed.empty, "") + t.end() +}) + +test("~ path is resolved to $HOME", function (t) { + var path = require("path") + if (!process.env.HOME) process.env.HOME = "/tmp" + var parsed = nopt({key: path}, {}, ["--key=~/val"], 0) + t.same(parsed.key, path.resolve(process.env.HOME, "val")) + t.end() +}) + +// https://github.com/npm/nopt/issues/24 +test("Unknown options are not parsed as numbers", function (t) { + var parsed = nopt({"parse-me": Number}, null, ['--leave-as-is=1.20', '--parse-me=1.20'], 0) + t.equal(parsed['leave-as-is'], '1.20') + t.equal(parsed['parse-me'], 1.2) + t.end() +}); + +test("other tests", function (t) { + + var util = require("util") + , Stream = require("stream") + , path = require("path") + , url = require("url") + + , shorthands = + { s : ["--loglevel", "silent"] + , d : ["--loglevel", "info"] + , dd : ["--loglevel", "verbose"] + , ddd : ["--loglevel", "silly"] + , noreg : ["--no-registry"] + , reg : ["--registry"] + , "no-reg" : ["--no-registry"] + , silent : ["--loglevel", "silent"] + , verbose : ["--loglevel", "verbose"] + , h : ["--usage"] + , H : ["--usage"] + , "?" : ["--usage"] + , help : ["--usage"] + , v : ["--version"] + , f : ["--force"] + , desc : ["--description"] + , "no-desc" : ["--no-description"] + , "local" : ["--no-global"] + , l : ["--long"] + , p : ["--parseable"] + , porcelain : ["--parseable"] + , g : ["--global"] + } + + , types = + { aoa: Array + , nullstream: [null, Stream] + , date: Date + , str: String + , browser : String + , cache : path + , color : ["always", Boolean] + , depth : Number + , description : Boolean + , dev : Boolean + , editor : path + , force : Boolean + , global : Boolean + , globalconfig : path + , group : [String, Number] + , gzipbin : String + , logfd : [Number, Stream] + , loglevel : ["silent","win","error","warn","info","verbose","silly"] + , long : Boolean + , "node-version" : [false, String] + , npaturl : url + , npat : Boolean + , "onload-script" : [false, String] + , outfd : [Number, Stream] + , parseable : Boolean + , pre: Boolean + , prefix: path + , proxy : url + , "rebuild-bundle" : Boolean + , registry : url + , searchopts : String + , searchexclude: [null, String] + , shell : path + , t: [Array, String] + , tag : String + , tar : String + , tmp : path + , "unsafe-perm" : Boolean + , usage : Boolean + , user : String + , username : String + , userconfig : path + , version : Boolean + , viewer: path + , _exit : Boolean + , path: path + } + + ; [["-v", {version:true}, []] + ,["---v", {version:true}, []] + ,["ls -s --no-reg connect -d", + {loglevel:"info",registry:null},["ls","connect"]] + ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] + ,["ls --registry blargle", {}, ["ls"]] + ,["--no-registry", {registry:null}, []] + ,["--no-color true", {color:false}, []] + ,["--no-color false", {color:true}, []] + ,["--no-color", {color:false}, []] + ,["--color false", {color:false}, []] + ,["--color --logfd 7", {logfd:7,color:true}, []] + ,["--color=true", {color:true}, []] + ,["--logfd=10", {logfd:10}, []] + ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] + ,["--tmp=tmp -tar=gtar", + {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] + ,["--logfd x", {}, []] + ,["a -true -- -no-false", {true:true},["a","-no-false"]] + ,["a -no-false", {false:false},["a"]] + ,["a -no-no-true", {true:true}, ["a"]] + ,["a -no-no-no-false", {false:false}, ["a"]] + ,["---NO-no-No-no-no-no-nO-no-no"+ + "-No-no-no-no-no-no-no-no-no"+ + "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ + "-no-body-can-do-the-boogaloo-like-I-do" + ,{"body-can-do-the-boogaloo-like-I-do":false}, []] + ,["we are -no-strangers-to-love "+ + "--you-know=the-rules --and=so-do-i "+ + "---im-thinking-of=a-full-commitment "+ + "--no-you-would-get-this-from-any-other-guy "+ + "--no-gonna-give-you-up "+ + "-no-gonna-let-you-down=true "+ + "--no-no-gonna-run-around false "+ + "--desert-you=false "+ + "--make-you-cry false "+ + "--no-tell-a-lie "+ + "--no-no-and-hurt-you false" + ,{"strangers-to-love":false + ,"you-know":"the-rules" + ,"and":"so-do-i" + ,"you-would-get-this-from-any-other-guy":false + ,"gonna-give-you-up":false + ,"gonna-let-you-down":false + ,"gonna-run-around":false + ,"desert-you":false + ,"make-you-cry":false + ,"tell-a-lie":false + ,"and-hurt-you":false + },["we", "are"]] + ,["-t one -t two -t three" + ,{t: ["one", "two", "three"]} + ,[]] + ,["-t one -t null -t three four five null" + ,{t: ["one", "null", "three"]} + ,["four", "five", "null"]] + ,["-t foo" + ,{t:["foo"]} + ,[]] + ,["--no-t" + ,{t:["false"]} + ,[]] + ,["-no-no-t" + ,{t:["true"]} + ,[]] + ,["-aoa one -aoa null -aoa 100" + ,{aoa:["one", null, '100']} + ,[]] + ,["-str 100" + ,{str:"100"} + ,[]] + ,["--color always" + ,{color:"always"} + ,[]] + ,["--no-nullstream" + ,{nullstream:null} + ,[]] + ,["--nullstream false" + ,{nullstream:null} + ,[]] + ,["--notadate=2011-01-25" + ,{notadate: "2011-01-25"} + ,[]] + ,["--date 2011-01-25" + ,{date: new Date("2011-01-25")} + ,[]] + ,["-cl 1" + ,{config: true, length: 1} + ,[] + ,{config: Boolean, length: Number, clear: Boolean} + ,{c: "--config", l: "--length"}] + ,["--acount bla" + ,{"acount":true} + ,["bla"] + ,{account: Boolean, credentials: Boolean, options: String} + ,{a:"--account", c:"--credentials",o:"--options"}] + ,["--clear" + ,{clear:true} + ,[] + ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean} + ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}] + ,["--file -" + ,{"file":"-"} + ,[] + ,{file:String} + ,{}] + ,["--file -" + ,{"file":true} + ,["-"] + ,{file:Boolean} + ,{}] + ,["--path" + ,{"path":null} + ,[]] + ,["--path ." + ,{"path":process.cwd()} + ,[]] + ].forEach(function (test) { + var argv = test[0].split(/\s+/) + , opts = test[1] + , rem = test[2] + , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0) + , parsed = actual.argv + delete actual.argv + for (var i in opts) { + var e = JSON.stringify(opts[i]) + , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) + if (e && typeof e === "object") { + t.deepEqual(e, a) + } else { + t.equal(e, a) + } + } + t.deepEqual(rem, parsed.remain) + }) + t.end() +}) diff --git a/node_modules/cordova-android/node_modules/once/LICENSE b/node_modules/cordova-android/node_modules/once/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/once/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/once/README.md b/node_modules/cordova-android/node_modules/once/README.md new file mode 100644 index 0000000..1f1ffca --- /dev/null +++ b/node_modules/cordova-android/node_modules/once/README.md @@ -0,0 +1,79 @@ +# once + +Only call a function once. + +## usage + +```javascript +var once = require('once') + +function load (file, cb) { + cb = once(cb) + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Or add to the Function.prototype in a responsible way: + +```javascript +// only has to be done once +require('once').proto() + +function load (file, cb) { + cb = cb.once() + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Ironically, the prototype feature makes this module twice as +complicated as necessary. + +To check whether you function has been called, use `fn.called`. Once the +function is called for the first time the return value of the original +function is saved in `fn.value` and subsequent calls will continue to +return this value. + +```javascript +var once = require('once') + +function load (cb) { + cb = once(cb) + var stream = createStream() + stream.once('data', cb) + stream.once('end', function () { + if (!cb.called) cb(new Error('not found')) + }) +} +``` + +## `once.strict(func)` + +Throw an error if the function is called twice. + +Some functions are expected to be called only once. Using `once` for them would +potentially hide logical errors. + +In the example below, the `greet` function has to call the callback only once: + +```javascript +function greet (name, cb) { + // return is missing from the if statement + // when no name is passed, the callback is called twice + if (!name) cb('Hello anonymous') + cb('Hello ' + name) +} + +function log (msg) { + console.log(msg) +} + +// this will print 'Hello anonymous' but the logical error will be missed +greet(null, once(msg)) + +// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time +greet(null, once.strict(msg)) +``` diff --git a/node_modules/cordova-android/node_modules/once/once.js b/node_modules/cordova-android/node_modules/once/once.js new file mode 100644 index 0000000..2354067 --- /dev/null +++ b/node_modules/cordova-android/node_modules/once/once.js @@ -0,0 +1,42 @@ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} diff --git a/node_modules/cordova-android/node_modules/once/package.json b/node_modules/cordova-android/node_modules/once/package.json new file mode 100644 index 0000000..df50daa --- /dev/null +++ b/node_modules/cordova-android/node_modules/once/package.json @@ -0,0 +1,68 @@ +{ + "_from": "once@^1.3.0", + "_id": "once@1.4.0", + "_inBundle": true, + "_integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "_location": "/cordova-android/once", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "once@^1.3.0", + "name": "once", + "escapedName": "once", + "rawSpec": "^1.3.0", + "saveSpec": null, + "fetchSpec": "^1.3.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob", + "/cordova-android/inflight" + ], + "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "_spec": "once@^1.3.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/once/issues" + }, + "bundleDependencies": false, + "dependencies": { + "wrappy": "1" + }, + "deprecated": false, + "description": "Run a function exactly one time", + "devDependencies": { + "tap": "^7.0.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "once.js" + ], + "homepage": "https://github.com/isaacs/once#readme", + "keywords": [ + "once", + "function", + "one", + "single" + ], + "license": "ISC", + "main": "once.js", + "name": "once", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/once.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "1.4.0" +} diff --git a/node_modules/cordova-android/node_modules/path-is-absolute/index.js b/node_modules/cordova-android/node_modules/path-is-absolute/index.js new file mode 100644 index 0000000..22aa6c3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/path-is-absolute/index.js @@ -0,0 +1,20 @@ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; diff --git a/node_modules/cordova-android/node_modules/path-is-absolute/license b/node_modules/cordova-android/node_modules/path-is-absolute/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/cordova-android/node_modules/path-is-absolute/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/path-is-absolute/package.json b/node_modules/cordova-android/node_modules/path-is-absolute/package.json new file mode 100644 index 0000000..abaa590 --- /dev/null +++ b/node_modules/cordova-android/node_modules/path-is-absolute/package.json @@ -0,0 +1,76 @@ +{ + "_from": "path-is-absolute@^1.0.0", + "_id": "path-is-absolute@1.0.1", + "_inBundle": true, + "_integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "_location": "/cordova-android/path-is-absolute", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "path-is-absolute@^1.0.0", + "name": "path-is-absolute", + "escapedName": "path-is-absolute", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "_shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "_spec": "path-is-absolute@^1.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/path-is-absolute/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Node.js 0.12 path.isAbsolute() ponyfill", + "devDependencies": { + "xo": "^0.16.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/path-is-absolute#readme", + "keywords": [ + "path", + "paths", + "file", + "dir", + "absolute", + "isabsolute", + "is-absolute", + "built-in", + "util", + "utils", + "core", + "ponyfill", + "polyfill", + "shim", + "is", + "detect", + "check" + ], + "license": "MIT", + "name": "path-is-absolute", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/path-is-absolute.git" + }, + "scripts": { + "test": "xo && node test.js" + }, + "version": "1.0.1" +} diff --git a/node_modules/cordova-android/node_modules/path-is-absolute/readme.md b/node_modules/cordova-android/node_modules/path-is-absolute/readme.md new file mode 100644 index 0000000..8dbdf5f --- /dev/null +++ b/node_modules/cordova-android/node_modules/path-is-absolute/readme.md @@ -0,0 +1,59 @@ +# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) + +> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com) + + +## Install + +``` +$ npm install --save path-is-absolute +``` + + +## Usage + +```js +const pathIsAbsolute = require('path-is-absolute'); + +// Running on Linux +pathIsAbsolute('/home/foo'); +//=> true +pathIsAbsolute('C:/Users/foo'); +//=> false + +// Running on Windows +pathIsAbsolute('C:/Users/foo'); +//=> true +pathIsAbsolute('/home/foo'); +//=> false + +// Running on any OS +pathIsAbsolute.posix('/home/foo'); +//=> true +pathIsAbsolute.posix('C:/Users/foo'); +//=> false +pathIsAbsolute.win32('C:/Users/foo'); +//=> true +pathIsAbsolute.win32('/home/foo'); +//=> false +``` + + +## API + +See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). + +### pathIsAbsolute(path) + +### pathIsAbsolute.posix(path) + +POSIX specific version. + +### pathIsAbsolute.win32(path) + +Windows specific version. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/cordova-android/node_modules/plist/.jshintrc b/node_modules/cordova-android/node_modules/plist/.jshintrc new file mode 100644 index 0000000..3f42622 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/.jshintrc @@ -0,0 +1,4 @@ +{ + "laxbreak": true, + "laxcomma": true +} diff --git a/node_modules/cordova-android/node_modules/plist/.travis.yml b/node_modules/cordova-android/node_modules/plist/.travis.yml new file mode 100644 index 0000000..26e2bba --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/.travis.yml @@ -0,0 +1,43 @@ +sudo: false + +language: node_js + +node_js: +- '0.10' +- '0.12' +- '1' +- '2' +- '3' +- '4' +- '5' +- '6' + +env: + global: + - secure: xlLmWO7akYQjmDgrv6/b/ZMGILF8FReD+k6A/u8pYRD2JW29hhwvRwIQGcKp9+zmJdn4i5M4D1/qJkCeI3pdhAYBDHvzHOHSEwLJz1ESB2Crv6fa69CtpIufQkWvIxmZoU49tCaLpMBaIroGihJ4DAXdIVOIz6Ur9vXLDhGsE4c= + - secure: aQ46RdxL10xR5ZJJTMUKdH5k4tdrzgZ87nlwHC+pTr6bfRw3UKYC+6Rm7yQpg9wq0Io9O9dYCP007gQGSWstbjr1+jXNu/ubtNG+q5cpWBQZZZ013VHh9QJTf1MnetsZxbv8Yhrjg590s6vruT0oqesOnB2CizO/BsKxnY37Nos= + +matrix: + include: + - node_js: '0.10' + env: BROWSER_NAME=chrome BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=chrome BROWSER_VERSION=29 + - node_js: '0.10' + env: BROWSER_NAME=firefox BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=opera BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=7 + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=6 + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=5 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=11 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=10 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=9 diff --git a/node_modules/cordova-android/node_modules/plist/History.md b/node_modules/cordova-android/node_modules/plist/History.md new file mode 100644 index 0000000..1ce9406 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/History.md @@ -0,0 +1,149 @@ +2.1.0 / 2017-05-04 +================== + +* [[`e4f06669bb`]](https://github.com/TooTallNate/plist.js/commit/e4f06669bb51d2e65654df7c39aab52bc3bf4e8a) - update license (extend copyright term) (Mike Reinstein) +* [[`edc6e41035`]](https://github.com/TooTallNate/plist.js/commit/edc6e4103546b1d7518a577e7c202c305a8abec0) - update module deps (Mike Reinstein) +* [[`85d11c48ef`](https://github.com/TooTallNate/plist.js/commit/85d11c48eff02312cbdd67f46fd8e74b0d372ca1)] - Harden test-cases and implementation to align with other implementations (Björn Brauer) +* [[`7619537eaa`]](https://github.com/TooTallNate/plist.js/commit/7619537eaa9e3e5a80829e759c004d2e017a07d2) review feedback: early returns and constants for nodeTypes (Björn Brauer) + +2.0.1 / 2016-08-16 +================== + +* [[`de136c8388`](https://github.com/TooTallNate/plist/commit/de136c8388)] - bad npm release… (Nathan Rajlich) + +2.0.0 / 2016-08-16 +================== + +* [[`90deef5d43`](https://github.com/TooTallNate/plist/commit/90deef5d43)] - remove deprecated functions (Nathan Rajlich) +* [[`d475cd8ce9`](https://github.com/TooTallNate/plist/commit/d475cd8ce9)] - Added travis ci support for node 6 (Amila Welihinda) +* [[`04c8ee7646`](https://github.com/TooTallNate/plist/commit/04c8ee7646)] - update dependencies (Mitchell Hentges) +* [[`97c02b3f05`](https://github.com/TooTallNate/plist/commit/97c02b3f05)] - **travis**: add `sudo: false` and test more node versions (Nathan Rajlich) +* [[`54c821ec29`](https://github.com/TooTallNate/plist/commit/54c821ec29)] - #71 - fixed and added test (Andrew Goldis) +* [[`4afb7c5079`](https://github.com/TooTallNate/plist/commit/4afb7c5079)] - fix `Cannot read property 'nodeValue' of undefined exception` that is thrown when a `` construct appears in plist (Chris Kinsman) +* [[`f360d7d685`](https://github.com/TooTallNate/plist/commit/f360d7d685)] - #66 - fixed empty keys and added tests (Andrew Goldis) +* [[`421c7f26e9`](https://github.com/TooTallNate/plist/commit/421c7f26e9)] - #66 - fixed empty key (Andrew Goldis) +* [[`a88aa4dca7`](https://github.com/TooTallNate/plist/commit/a88aa4dca7)] - add verbose examples (mrzmyr) + +1.2.0 / 2015-11-10 +================== + + * package: update "browserify" to v12.0.1 + * package: update "zuul" to v3.7.2 + * package: update "xmlbuilder" to v4.0.0 + * package: update "util-deprecate" to v1.0.2 + * package: update "mocha" to v2.3.3 + * package: update "base64-js" to v0.0.8 + * build: omit undefined values + * travis: add node 4.0 and 4.1 to test matrix + +1.1.0 / 2014-08-27 +================== + + * package: update "browserify" to v5.10.1 + * package: update "zuul" to v1.10.2 + * README: add "Sauce Test Status" build badge + * travis: use new "plistjs" sauce credentials + * travis: set up zuul saucelabs automated testing + +1.0.1 / 2014-06-25 +================== + + * add .zuul.yml file for browser testing + * remove Testling stuff + * build: fix global variable `val` leak + * package: use --check-leaks when running mocha tests + * README: update examples to use preferred API + * package: add "browser" keyword + +1.0.0 / 2014-05-20 +================== + + * package: remove "android-browser" + * test: add build() test + * test: re-add the empty string build() test + * test: remove "fixtures" and legacy "tests" dir + * test: add some more build() tests + * test: add a parse() CDATA test + * test: starting on build() tests + * test: more parse() tests + * package: attempt to fix "android-browser" testling + * parse: better with newline handling + * README: add Testling badge + * test: add node tests + * test: add a parse() test + * travis: don't test node v0.6 or v0.8 + * test: some more parse() tests + * test: add simple parsing test + * build: add support for an optional "opts" object + * package: test mobile devices + * test: use multiline to inline the XML + * package: beautify + * package: fix "mocha" harness + * package: more testling browsers + * build: add the "version=1.0" attribute + * beginnings of "mocha" tests + * build: more JSDocs + * tests: add test that ensures that empty string conversion works + * build: update "xmlbuilder" to v2.2.1 + * parse: ignore comment and cdata nodes + * tests: make the "Newlines" test actually contain a newline + * parse: lint + * test travis + * README: add Travis CI badge + * add .travis.yml file + * build: updated DTD to reflect name change + * parse: return falsey values in an Array plist + * build: fix encoding a typed array in the browser + * build: add support for Typed Arrays and ArrayBuffers + * build: more lint + * build: slight cleanup and optimizations + * build: use .txt() for the "date" value + * parse: always return a Buffer for nodes + * build: don't interpret Strings as base64 + * dist: commit prebuilt plist*.js files + * parse: fix typo in deprecate message + * parse: fix parse() return value + * parse: add jsdoc comments for the deprecated APIs + * parse: add `parse()` function + * node, parse: use `util-deprecate` module + * re-implemented parseFile to be asynchronous + * node: fix jsdoc comment + * Makefile: fix "node" require stubbing + * examples: add "browser" example + * package: tweak "main" + * package: remove "engines" field + * Makefile: fix --exclude command for browserify + * package: update "description" + * lib: more styling + * Makefile: add -build.js and -parse.js dist files + * lib: separate out the parse and build logic into their own files + * Makefile: add makefile with browserify build rules + * package: add "browserify" as a dev dependency + * plist: tabs to spaces (again) + * add a .jshintrc file + * LICENSE: update + * node-webkit support + * Ignore tests/ in .npmignore file + * Remove duplicate devDependencies key + * Remove trailing whitespace + * adding recent contributors. Bumping npm package number (patch release) + * Fixed node.js string handling + * bumping version number + * Fixed global variable plist leak + * patch release 0.4.1 + * removed temporary debug output file + * flipping the cases for writing data and string elements in build(). removed the 125 length check. Added validation of base64 encoding for data fields when parsing. added unit tests. + * fixed syntax errors in README examples (issue #20) + * added Sync versions of calls. added deprecation warnings for old method calls. updated documentation. If the resulting object from parseStringSync is an array with 1 element, return just the element. If a plist string or file doesnt have a tag as the document root element, fail noisily (issue #15) + * incrementing package version + * added cross platform base64 encode/decode for data elements (issue #17.) Comments and hygiene. + * refactored the code to use a DOM parser instead of SAX. closes issues #5 and #16 + * rolling up package version + * updated base64 detection regexp. updated README. hygiene. + * refactored the build function. Fixes issue #14 + * refactored tests. Modified tests from issue #9. thanks @sylvinus + * upgrade xmlbuilder package version. this is why .end() was needed in last commit; breaking change to xmlbuilder lib. :/ + * bug fix in build function, forgot to call .end() Refactored tests to use nodeunit + * Implemented support for real, identity tests + * Refactored base64 detection - still sloppy, fixed date building. Passing tests OK. + * Implemented basic plist builder that turns an existing JS object into plist XML. date, real and data types still need to be implemented. diff --git a/node_modules/cordova-android/node_modules/plist/LICENSE b/node_modules/cordova-android/node_modules/plist/LICENSE new file mode 100644 index 0000000..92e3423 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2010-2017 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/plist/Makefile b/node_modules/cordova-android/node_modules/plist/Makefile new file mode 100644 index 0000000..62695e0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/Makefile @@ -0,0 +1,76 @@ + +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# applications +NODE ?= node +NPM ?= $(NODE) $(shell which npm) +BROWSERIFY ?= $(NODE) $(BIN)/browserify +MOCHA ?= $(NODE) $(BIN)/mocha +ZUUL ?= $(NODE) $(BIN)/zuul + +REPORTER ?= spec + +all: dist/plist.js dist/plist-build.js dist/plist-parse.js + +install: node_modules + +clean: + @rm -rf node_modules dist + +dist: + @mkdir -p $@ + +dist/plist-build.js: node_modules lib/build.js dist + @$(BROWSERIFY) \ + --standalone plist \ + lib/build.js > $@ + +dist/plist-parse.js: node_modules lib/parse.js dist + @$(BROWSERIFY) \ + --standalone plist \ + lib/parse.js > $@ + +dist/plist.js: node_modules lib/*.js dist + @$(BROWSERIFY) \ + --standalone plist \ + --ignore lib/node.js \ + lib/plist.js > $@ + +node_modules: package.json + @NODE_ENV= $(NPM) install + @touch node_modules + +test: + @if [ "x$(BROWSER_NAME)" = "x" ]; then \ + $(MAKE) test-node; \ + else \ + $(MAKE) test-zuul; \ + fi + +test-node: + @$(MOCHA) \ + --reporter $(REPORTER) \ + test/*.js + +test-zuul: + @if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \ + $(ZUUL) \ + --ui mocha-bdd \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + test/*.js; \ + else \ + $(ZUUL) \ + --ui mocha-bdd \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + --browser-platform "$(BROWSER_PLATFORM)" \ + test/*.js; \ + fi + +.PHONY: all install clean test test-node test-zuul diff --git a/node_modules/cordova-android/node_modules/plist/README.md b/node_modules/cordova-android/node_modules/plist/README.md new file mode 100644 index 0000000..81545ae --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/README.md @@ -0,0 +1,141 @@ +plist.js +======== +### Mac OS X Plist parser/builder for Node.js and browsers + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/plistjs.svg)](https://saucelabs.com/u/plistjs) + +[![Build Status](https://travis-ci.org/TooTallNate/plist.js.svg?branch=master)](https://travis-ci.org/TooTallNate/plist.js) + +Provides facilities for reading and writing Mac OS X Plist (property list) +files. These are often used in programming OS X and iOS applications, as +well as the iTunes configuration XML file. + +Plist files represent stored programming "object"s. They are very similar +to JSON. A valid Plist file is representable as a native JavaScript Object +and vice-versa. + + +## Usage + +### Node.js + +Install using `npm`: + +``` bash +$ npm install --save plist +``` + +Then `require()` the _plist_ module in your file: + +``` js +var plist = require('plist'); + +// now use the `parse()` and `build()` functions +var val = plist.parse('Hello World!'); +console.log(val); // "Hello World!" +``` + + +### Browser + +Include the `dist/plist.js` in a ` + +``` + + +## API + +### Parsing + +Parsing a plist from filename: + +``` javascript +var fs = require('fs'); +var plist = require('plist'); + +var obj = plist.parse(fs.readFileSync('myPlist.plist', 'utf8')); +console.log(JSON.stringify(obj)); +``` + +Parsing a plist from string payload: + +``` javascript +var plist = require('plist'); + +var xml = + '' + + '' + + '' + + 'metadata' + + '' + + 'bundle-identifier' + + 'com.company.app' + + 'bundle-version' + + '0.1.1' + + 'kind' + + 'software' + + 'title' + + 'AppName' + + '' + + ''; + +console.log(plist.parse(xml)); + +// [ +// "metadata", +// { +// "bundle-identifier": "com.company.app", +// "bundle-version": "0.1.1", +// "kind": "software", +// "title": "AppName" +// } +// ] +``` + +### Building + +Given an existing JavaScript Object, you can turn it into an XML document +that complies with the plist DTD: + +``` javascript +var plist = require('plist'); + +var json = [ + "metadata", + { + "bundle-identifier": "com.company.app", + "bundle-version": "0.1.1", + "kind": "software", + "title": "AppName" + } +]; + +console.log(plist.build(json)); + +// +// +// +// metadata +// +// bundle-identifier +// com.company.app +// bundle-version +// 0.1.1 +// kind +// software +// title +// AppName +// +// +``` + +## License + +[(The MIT License)](LICENSE) diff --git a/node_modules/cordova-android/node_modules/plist/dist/plist-build.js b/node_modules/cordova-android/node_modules/plist/dist/plist-build.js new file mode 100644 index 0000000..4fcd378 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/dist/plist-build.js @@ -0,0 +1,3982 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],3:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],4:[function(require,module,exports){ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; +} + +module.exports = last; + +},{}],5:[function(require,module,exports){ +var arrayEvery = require('../internal/arrayEvery'), + baseCallback = require('../internal/baseCallback'), + baseEvery = require('../internal/baseEvery'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = every; + +},{"../internal/arrayEvery":7,"../internal/baseCallback":11,"../internal/baseEvery":15,"../internal/isIterateeCall":40,"../lang/isArray":49}],6:[function(require,module,exports){ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ +function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; +} + +module.exports = restParam; + +},{}],7:[function(require,module,exports){ +/** + * A specialized version of `_.every` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +module.exports = arrayEvery; + +},{}],8:[function(require,module,exports){ +/** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; + +},{}],9:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + */ +function assignWith(object, source, customizer) { + var index = -1, + props = keys(source), + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; +} + +module.exports = assignWith; + +},{"../object/keys":58}],10:[function(require,module,exports){ +var baseCopy = require('./baseCopy'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} + +module.exports = baseAssign; + +},{"../object/keys":58,"./baseCopy":12}],11:[function(require,module,exports){ +var baseMatches = require('./baseMatches'), + baseMatchesProperty = require('./baseMatchesProperty'), + bindCallback = require('./bindCallback'), + identity = require('../utility/identity'), + property = require('../utility/property'); + +/** + * The base implementation of `_.callback` which supports specifying the + * number of arguments to provide to `func`. + * + * @private + * @param {*} [func=_.identity] The value to convert to a callback. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); +} + +module.exports = baseCallback; + +},{"../utility/identity":61,"../utility/property":62,"./baseMatches":22,"./baseMatchesProperty":23,"./bindCallback":28}],12:[function(require,module,exports){ +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; +} + +module.exports = baseCopy; + +},{}],13:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +module.exports = baseCreate; + +},{"../lang/isObject":53}],14:[function(require,module,exports){ +var baseForOwn = require('./baseForOwn'), + createBaseEach = require('./createBaseEach'); + +/** + * The base implementation of `_.forEach` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +module.exports = baseEach; + +},{"./baseForOwn":17,"./createBaseEach":30}],15:[function(require,module,exports){ +var baseEach = require('./baseEach'); + +/** + * The base implementation of `_.every` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +module.exports = baseEvery; + +},{"./baseEach":14}],16:[function(require,module,exports){ +var createBaseFor = require('./createBaseFor'); + +/** + * The base implementation of `baseForIn` and `baseForOwn` which iterates + * over `object` properties returned by `keysFunc` invoking `iteratee` for + * each property. Iteratee functions may exit iteration early by explicitly + * returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +module.exports = baseFor; + +},{"./createBaseFor":31}],17:[function(require,module,exports){ +var baseFor = require('./baseFor'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.forOwn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); +} + +module.exports = baseForOwn; + +},{"../object/keys":58,"./baseFor":16}],18:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; + +},{"./toObject":46}],19:[function(require,module,exports){ +var baseIsEqualDeep = require('./baseIsEqualDeep'), + isObject = require('../lang/isObject'), + isObjectLike = require('./isObjectLike'); + +/** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); +} + +module.exports = baseIsEqual; + +},{"../lang/isObject":53,"./baseIsEqualDeep":20,"./isObjectLike":43}],20:[function(require,module,exports){ +var equalArrays = require('./equalArrays'), + equalByTag = require('./equalByTag'), + equalObjects = require('./equalObjects'), + isArray = require('../lang/isArray'), + isTypedArray = require('../lang/isTypedArray'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; +} + +module.exports = baseIsEqualDeep; + +},{"../lang/isArray":49,"../lang/isTypedArray":55,"./equalArrays":32,"./equalByTag":33,"./equalObjects":34}],21:[function(require,module,exports){ +var baseIsEqual = require('./baseIsEqual'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.isMatch` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} matchData The propery names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparing objects. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; + } + } + } + return true; +} + +module.exports = baseIsMatch; + +},{"./baseIsEqual":19,"./toObject":46}],22:[function(require,module,exports){ +var baseIsMatch = require('./baseIsMatch'), + getMatchData = require('./getMatchData'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.matches` which does not clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; + + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + return function(object) { + return baseIsMatch(object, matchData); + }; +} + +module.exports = baseMatches; + +},{"./baseIsMatch":21,"./getMatchData":36,"./toObject":46}],23:[function(require,module,exports){ +var baseGet = require('./baseGet'), + baseIsEqual = require('./baseIsEqual'), + baseSlice = require('./baseSlice'), + isArray = require('../lang/isArray'), + isKey = require('./isKey'), + isStrictComparable = require('./isStrictComparable'), + last = require('../array/last'), + toObject = require('./toObject'), + toPath = require('./toPath'); + +/** + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. + * @returns {Function} Returns the new function. + */ +function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); + }; +} + +module.exports = baseMatchesProperty; + +},{"../array/last":4,"../lang/isArray":49,"./baseGet":18,"./baseIsEqual":19,"./baseSlice":26,"./isKey":41,"./isStrictComparable":44,"./toObject":46,"./toPath":47}],24:[function(require,module,exports){ +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = baseProperty; + +},{}],25:[function(require,module,exports){ +var baseGet = require('./baseGet'), + toPath = require('./toPath'); + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ +function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; +} + +module.exports = basePropertyDeep; + +},{"./baseGet":18,"./toPath":47}],26:[function(require,module,exports){ +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +module.exports = baseSlice; + +},{}],27:[function(require,module,exports){ +/** + * Converts `value` to a string if it's not one. An empty string is returned + * for `null` or `undefined` values. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + return value == null ? '' : (value + ''); +} + +module.exports = baseToString; + +},{}],28:[function(require,module,exports){ +var identity = require('../utility/identity'); + +/** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; +} + +module.exports = bindCallback; + +},{"../utility/identity":61}],29:[function(require,module,exports){ +var bindCallback = require('./bindCallback'), + isIterateeCall = require('./isIterateeCall'), + restParam = require('../function/restParam'); + +/** + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : undefined; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); +} + +module.exports = createAssigner; + +},{"../function/restParam":6,"./bindCallback":28,"./isIterateeCall":40}],30:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'), + toObject = require('./toObject'); + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +module.exports = createBaseEach; + +},{"./getLength":35,"./isLength":42,"./toObject":46}],31:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * Creates a base function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +module.exports = createBaseFor; + +},{"./toObject":46}],32:[function(require,module,exports){ +var arraySome = require('./arraySome'); + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; +} + +module.exports = equalArrays; + +},{"./arraySome":8}],33:[function(require,module,exports){ +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; +} + +module.exports = equalByTag; + +},{}],34:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; +} + +module.exports = equalObjects; + +},{"../object/keys":58}],35:[function(require,module,exports){ +var baseProperty = require('./baseProperty'); + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +module.exports = getLength; + +},{"./baseProperty":24}],36:[function(require,module,exports){ +var isStrictComparable = require('./isStrictComparable'), + pairs = require('../object/pairs'); + +/** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; +} + +module.exports = getMatchData; + +},{"../object/pairs":60,"./isStrictComparable":44}],37:[function(require,module,exports){ +var isNative = require('../lang/isNative'); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +module.exports = getNative; + +},{"../lang/isNative":52}],38:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +module.exports = isArrayLike; + +},{"./getLength":35,"./isLength":42}],39:[function(require,module,exports){ +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +module.exports = isIndex; + +},{}],40:[function(require,module,exports){ +var isArrayLike = require('./isArrayLike'), + isIndex = require('./isIndex'), + isObject = require('../lang/isObject'); + +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +module.exports = isIterateeCall; + +},{"../lang/isObject":53,"./isArrayLike":38,"./isIndex":39}],41:[function(require,module,exports){ +var isArray = require('../lang/isArray'), + toObject = require('./toObject'); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); +} + +module.exports = isKey; + +},{"../lang/isArray":49,"./toObject":46}],42:[function(require,module,exports){ +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; + +},{}],43:[function(require,module,exports){ +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isObjectLike; + +},{}],44:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +module.exports = isStrictComparable; + +},{"../lang/isObject":53}],45:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('./isIndex'), + isLength = require('./isLength'), + keysIn = require('../object/keysIn'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +module.exports = shimKeys; + +},{"../lang/isArguments":48,"../lang/isArray":49,"../object/keysIn":59,"./isIndex":39,"./isLength":42}],46:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Converts `value` to an object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Object} Returns the object. + */ +function toObject(value) { + return isObject(value) ? value : Object(value); +} + +module.exports = toObject; + +},{"../lang/isObject":53}],47:[function(require,module,exports){ +var baseToString = require('./baseToString'), + isArray = require('../lang/isArray'); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ +function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +} + +module.exports = toPath; + +},{"../lang/isArray":49,"./baseToString":27}],48:[function(require,module,exports){ +var isArrayLike = require('../internal/isArrayLike'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Native method references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); +} + +module.exports = isArguments; + +},{"../internal/isArrayLike":38,"../internal/isObjectLike":43}],49:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +module.exports = isArray; + +},{"../internal/getNative":37,"../internal/isLength":42,"../internal/isObjectLike":43}],50:[function(require,module,exports){ +var isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLike = require('../internal/isArrayLike'), + isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'), + isString = require('./isString'), + keys = require('../object/keys'); + +/** + * Checks if `value` is empty. A value is considered empty unless it's an + * `arguments` object, array, string, or jQuery-like collection with a length + * greater than `0` or an object with own enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {Array|Object|string} value The value to inspect. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !value.length; + } + return !keys(value).length; +} + +module.exports = isEmpty; + +},{"../internal/isArrayLike":38,"../internal/isObjectLike":43,"../object/keys":58,"./isArguments":48,"./isArray":49,"./isFunction":51,"./isString":54}],51:[function(require,module,exports){ +var isObject = require('./isObject'); + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 which returns 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +module.exports = isFunction; + +},{"./isObject":53}],52:[function(require,module,exports){ +var isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isNative; + +},{"../internal/isObjectLike":43,"./isFunction":51}],53:[function(require,module,exports){ +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = isObject; + +},{}],54:[function(require,module,exports){ +var isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); +} + +module.exports = isString; + +},{"../internal/isObjectLike":43}],55:[function(require,module,exports){ +var isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dateTag] = typedArrayTags[errorTag] = +typedArrayTags[funcTag] = typedArrayTags[mapTag] = +typedArrayTags[numberTag] = typedArrayTags[objectTag] = +typedArrayTags[regexpTag] = typedArrayTags[setTag] = +typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; +} + +module.exports = isTypedArray; + +},{"../internal/isLength":42,"../internal/isObjectLike":43}],56:[function(require,module,exports){ +var assignWith = require('../internal/assignWith'), + baseAssign = require('../internal/baseAssign'), + createAssigner = require('../internal/createAssigner'); + +/** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources overwrite property assignments of previous sources. + * If `customizer` is provided it's invoked to produce the assigned values. + * The `customizer` is bound to `thisArg` and invoked with five arguments: + * (objectValue, sourceValue, key, object, source). + * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * + * @static + * @memberOf _ + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); + * // => { 'user': 'fred', 'age': 40 } + * + * // using a customizer callback + * var defaults = _.partialRight(_.assign, function(value, other) { + * return _.isUndefined(value) ? other : value; + * }); + * + * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ +var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); +}); + +module.exports = assign; + +},{"../internal/assignWith":9,"../internal/baseAssign":10,"../internal/createAssigner":29}],57:[function(require,module,exports){ +var baseAssign = require('../internal/baseAssign'), + baseCreate = require('../internal/baseCreate'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} + +module.exports = create; + +},{"../internal/baseAssign":10,"../internal/baseCreate":13,"../internal/isIterateeCall":40}],58:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isArrayLike = require('../internal/isArrayLike'), + isObject = require('../lang/isObject'), + shimKeys = require('../internal/shimKeys'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +module.exports = keys; + +},{"../internal/getNative":37,"../internal/isArrayLike":38,"../internal/shimKeys":45,"../lang/isObject":53}],59:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('../internal/isIndex'), + isLength = require('../internal/isLength'), + isObject = require('../lang/isObject'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keysIn; + +},{"../internal/isIndex":39,"../internal/isLength":42,"../lang/isArguments":48,"../lang/isArray":49,"../lang/isObject":53}],60:[function(require,module,exports){ +var keys = require('./keys'), + toObject = require('../internal/toObject'); + +/** + * Creates a two dimensional array of the key-value pairs for `object`, + * e.g. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the new array of key-value pairs. + * @example + * + * _.pairs({ 'barney': 36, 'fred': 40 }); + * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) + */ +function pairs(object) { + object = toObject(object); + + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; +} + +module.exports = pairs; + +},{"../internal/toObject":46,"./keys":58}],61:[function(require,module,exports){ +/** + * This method returns the first argument provided to it. + * + * @static + * @memberOf _ + * @category Utility + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'user': 'fred' }; + * + * _.identity(object) === object; + * // => true + */ +function identity(value) { + return value; +} + +module.exports = identity; + +},{}],62:[function(require,module,exports){ +var baseProperty = require('../internal/baseProperty'), + basePropertyDeep = require('../internal/basePropertyDeep'), + isKey = require('../internal/isKey'); + +/** + * Creates a function that returns the property value at `path` on a + * given object. + * + * @static + * @memberOf _ + * @category Utility + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + * @example + * + * var objects = [ + * { 'a': { 'b': { 'c': 2 } } }, + * { 'a': { 'b': { 'c': 1 } } } + * ]; + * + * _.map(objects, _.property('a.b.c')); + * // => [2, 1] + * + * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); +} + +module.exports = property; + +},{"../internal/baseProperty":24,"../internal/basePropertyDeep":25,"../internal/isKey":41}],63:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, create; + + create = require('lodash/object/create'); + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return create(XMLAttribute.prototype, this); + }; + + XMLAttribute.prototype.toString = function(options, level) { + return ' ' + this.name + '="' + this.value + '"'; + }; + + return XMLAttribute; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],64:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier; + + XMLStringifier = require('./XMLStringifier'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLElement = require('./XMLElement'); + + module.exports = XMLBuilder = (function() { + function XMLBuilder(name, options) { + var root, temp; + if (name == null) { + throw new Error("Root element needs a name"); + } + if (options == null) { + options = {}; + } + this.options = options; + this.stringify = new XMLStringifier(options); + temp = new XMLElement(this, 'doc'); + root = temp.element(name); + root.isRoot = true; + root.documentObject = this; + this.rootObject = root; + if (!options.headless) { + root.declaration(options); + if ((options.pubID != null) || (options.sysID != null)) { + root.doctype(options); + } + } + } + + XMLBuilder.prototype.root = function() { + return this.rootObject; + }; + + XMLBuilder.prototype.end = function(options) { + return this.toString(options); + }; + + XMLBuilder.prototype.toString = function(options) { + var indent, newline, offset, pretty, r, ref, ref1, ref2; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + r = ''; + if (this.xmldec != null) { + r += this.xmldec.toString(options); + } + if (this.doctype != null) { + r += this.doctype.toString(options); + } + r += this.rootObject.toString(options); + if (pretty && r.slice(-newline.length) === newline) { + r = r.slice(0, -newline.length); + } + return r; + }; + + return XMLBuilder; + + })(); + +}).call(this); + +},{"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLStringifier":77}],65:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return create(XMLCData.prototype, this); + }; + + XMLCData.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],66:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLComment, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return create(XMLComment.prototype, this); + }; + + XMLComment.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],67:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDAttList, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDAttList = (function() { + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + this.stringify = parent.stringify; + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDAttList; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],68:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDElement, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDElement = (function() { + function XMLDTDElement(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDElement; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],69:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDEntity, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + module.exports = XMLDTDEntity = (function() { + function XMLDTDEntity(parent, pe, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDEntity; + + })(); + +}).call(this); + +},{"lodash/lang/isObject":53,"lodash/object/create":57}],70:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDNotation, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDNotation = (function() { + function XMLDTDNotation(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDNotation; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],71:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDeclaration, XMLNode, create, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/lang/isObject":53,"lodash/object/create":57}],72:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLDocType = (function() { + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + this.documentObject = parent; + this.stringify = this.documentObject.stringify; + this.children = []; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.instruction = function(target, value) { + var child; + child = new XMLProcessingInstruction(this, target, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.root = function() { + return this.documentObject.root(); + }; + + XMLDocType.prototype.document = function() { + return this.documentObject; + }; + + XMLDocType.prototype.toString = function(options, level) { + var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ' 0) { + r += ' ['; + if (pretty) { + r += newline; + } + ref3 = this.children; + for (i = 0, len = ref3.length; i < len; i++) { + child = ref3[i]; + r += child.toString(options, level + 1); + } + r += ']'; + } + r += '>'; + if (pretty) { + r += newline; + } + return r; + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocType.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocType.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocType.prototype.up = function() { + return this.root(); + }; + + XMLDocType.prototype.doc = function() { + return this.document(); + }; + + return XMLDocType; + + })(); + +}).call(this); + +},{"./XMLCData":65,"./XMLComment":66,"./XMLDTDAttList":67,"./XMLDTDElement":68,"./XMLDTDEntity":69,"./XMLDTDNotation":70,"./XMLProcessingInstruction":75,"lodash/lang/isObject":53,"lodash/object/create":57}],73:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + every = require('lodash/collection/every'); + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.children = []; + this.instructions = []; + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, i, len, pi, ref, ref1; + clonedSelf = create(XMLElement.prototype, this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref = this.attributes; + for (attName in ref) { + if (!hasProp.call(ref, attName)) continue; + att = ref[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.instructions = []; + ref1 = this.instructions; + for (i = 0, len = ref1.length; i < len; i++) { + pi = ref1[i]; + clonedSelf.instructions.push(pi.clone()); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.instruction = function(target, value) { + var i, insTarget, insValue, instruction, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.instructions.push(instruction); + } + return this; + }; + + XMLElement.prototype.toString = function(options, level) { + var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + ref3 = this.instructions; + for (i = 0, len = ref3.length; i < len; i++) { + instruction = ref3[i]; + r += instruction.toString(options, level); + } + if (pretty) { + r += space; + } + r += '<' + this.name; + ref4 = this.attributes; + for (name in ref4) { + if (!hasProp.call(ref4, name)) continue; + att = ref4[name]; + r += att.toString(options); + } + if (this.children.length === 0 || every(this.children, function(e) { + return e.value === ''; + })) { + r += '/>'; + if (pretty) { + r += newline; + } + } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) { + r += '>'; + r += this.children[0].value; + r += ''; + r += newline; + } else { + r += '>'; + if (pretty) { + r += newline; + } + ref5 = this.children; + for (j = 0, len1 = ref5.length; j < len1; j++) { + child = ref5[j]; + r += child.toString(options, level + 1); + } + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + } + return r; + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); + +},{"./XMLAttribute":63,"./XMLNode":74,"./XMLProcessingInstruction":75,"lodash/collection/every":5,"lodash/lang/isFunction":51,"lodash/lang/isObject":53,"lodash/object/create":57}],74:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject, + hasProp = {}.hasOwnProperty; + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + isEmpty = require('lodash/lang/isEmpty'); + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + this.options = this.parent.options; + this.stringify = this.parent.stringify; + if (XMLElement === null) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val); + } else if (Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref; + if (name != null) { + name = name.valueOf(); + } + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + doc.xmldec = xmldec; + return doc.root(); + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var doc, doctype; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + doc.doctype = doctype; + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var child; + if (this.isRoot) { + return this; + } + child = this.parent; + while (!child.isRoot) { + child = child.parent; + } + return child; + }; + + XMLNode.prototype.document = function() { + return this.root().documentObject; + }; + + XMLNode.prototype.end = function(options) { + return this.document().toString(options); + }; + + XMLNode.prototype.prev = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importXMLBuilder = function(xmlbuilder) { + var clonedRoot; + clonedRoot = xmlbuilder.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + return XMLNode; + + })(); + +}).call(this); + +},{"./XMLCData":65,"./XMLComment":66,"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLRaw":76,"./XMLText":78,"lodash/lang/isEmpty":50,"lodash/lang/isFunction":51,"lodash/lang/isObject":53}],75:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLProcessingInstruction, create; + + create = require('lodash/object/create'); + + module.exports = XMLProcessingInstruction = (function() { + function XMLProcessingInstruction(parent, target, value) { + this.stringify = parent.stringify; + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return create(XMLProcessingInstruction.prototype, this); + }; + + XMLProcessingInstruction.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLProcessingInstruction; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],76:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLNode, XMLRaw, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return create(XMLRaw.prototype, this); + }; + + XMLRaw.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += this.value; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],77:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLStringifier, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref, value; + this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0; + ref = (options != null ? options.stringify : void 0) || {}; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + if (val.match(/]]>/)) { + throw new Error("Invalid CDATA text: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.elEscape = function(str) { + return str.replace(/&/g, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + return str.replace(/&/g, '&').replace(/, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === 3 // text + || node.nodeType === 8 // comment + || node.nodeType === 4; // cdata +} + + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Parses a Plist XML string. Returns an Object. Takes a `callback` function. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated not actually async. use parse() instead + */ + +function parseString (xml, callback) { + var doc, error, plist; + try { + doc = new DOMParser().parseFromString(xml); + plist = parsePlistXML(doc.documentElement); + } catch(e) { + error = e; + } + callback(error, plist); +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated use parse() instead + */ + +function parseStringSync (xml) { + var doc = new DOMParser().parseFromString(xml); + var plist; + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + plist = parsePlistXML(doc.documentElement); + + // if the plist is an array with 1 element, pull it out of the array + if (plist.length == 1) { + plist = plist[0]; + } + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, d; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + if (key === null) { + key = parsePlistXML(node.childNodes[i]); + } else { + new_obj[key] = parsePlistXML(node.childNodes[i]); + key = null; + } + } + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + return node.childNodes[0].nodeValue; + + } else if (node.nodeName === 'string') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + res += node.childNodes[d].nodeValue; + } + return res; + + } else if (node.nodeName === 'integer') { + // parse as base 10 integer + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue.replace(/\s+/g, ''); + } + } + + // decode base64 data to a Buffer instance + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} + +}).call(this,require("buffer").Buffer) +},{"buffer":3,"util-deprecate":6,"xmldom":7}],2:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],3:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` is deprecated +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` is deprecated +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":2,"ieee754":4,"is-array":5}],4:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],5:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],6:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],7:[function(require,module,exports){ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid document source"); + } + return domBuilder.document; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn){ + if(isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + }else{ + var i=arguments.length; + while(--i){ + if(fn = errorImpl[arguments[i]]){ + break; + } + } + } + } + errorHandler[key] = fn && function(msg){ + fn(msg+_locator(locator)); + }||function(){}; + } + build('warning','warn'); + build('error','warn','warning'); + build('fatalError','warn','warning','error'); + return errorHandler; +} +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.document = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.document.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.document; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + if( attr.getOffset){ + position(attr.getOffset(1),attr) + } + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.document.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(this.currentElement && chars){ + if (this.cdata) { + var charNode = this.document.createCDATASection(chars); + this.currentElement.appendChild(charNode); + } else { + var charNode = this.document.createTextNode(chars); + this.currentElement.appendChild(charNode); + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.document.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.document.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.document.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn(error,_locator(this.locator)); + }, + error:function(error) { + console.error(error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error(error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.document.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +} + +},{"./dom":8,"./sax":9}],8:[function(require,module,exports){ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + } +}; +function LiveNodeList(node,refresh){ + this._node = node; + this._refresh = refresh + _updateLiveList(this); +} +function _updateLiveList(list){ + var inc = list._node._inc || list._node.ownerDocument._inc; + if(list._inc != inc){ + var ls = list._refresh(list._node); + //console.log(ls.length) + __set__(list,'length',ls.length); + copy(ls,list); + list._inc = inc; + } +} +LiveNodeList.prototype.item = function(i){ + _updateLiveList(this); + return this[i]; +} + +_extends(LiveNodeList,NodeList); +/** + * + * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes. + * NamedNodeMap objects in the DOM are live. + * used for attributes or DocumentType entities + */ +function NamedNodeMap() { +}; + +function _findNodeIndex(list,node){ + var i = list.length; + while(i--){ + if(list[i] === node){return i} + } +} + +function _addNamedNode(el,list,newAttr,oldAttr){ + if(oldAttr){ + list[_findNodeIndex(list,oldAttr)] = newAttr; + }else{ + list[list.length++] = newAttr; + } + if(el){ + newAttr.ownerElement = el; + var doc = el.ownerDocument; + if(doc){ + oldAttr && _onRemoveAttribute(doc,el,oldAttr); + _onAddAttribute(doc,el,newAttr); + } + } +} +function _removeNamedNode(el,list,attr){ + var i = _findNodeIndex(list,attr); + if(i>=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + var i = this.length; + while(i--){ + var attr = this[i]; + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + doc.implementation = this; + doc.childNodes = new NodeList(); + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == 1){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == 1){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + //if(!(newChild instanceof CharacterData)){ + throw new Error(ExceptionMessage[3]) + //} + return Node.prototype.appendChild.apply(this,arguments) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node){ + var buf = []; + serializeToString(node,buf); + return buf.join(''); +} +Node.prototype.toString =function(){ + return XMLSerializer.prototype.serializeToString(this); +} +function serializeToString(node,buf){ + switch(node.nodeType){ + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + var isHTML = htmlns === node.namespaceURI + buf.push('<',nodeName); + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + if(child){ + buf.push(child.data); + } + }else{ + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + function position(start,m){ + while(start>=endPos && (m = linePattern.exec(source))){ + startPos = m.index; + endPos = startPos + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = start-startPos+1; + } + var startPos = 0; + var endPos = 0; + var linePattern = /.+(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + var i = source.indexOf('<',start); + if(i<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.document; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(i>start){ + appendText(i); + } + switch(source.charAt(i+1)){ + case '/': + var end = source.indexOf('>',i+3); + var tagName = source.substring(i+2,end); + var config = parseStack.pop(); + var localNSMap = config.localNSMap; + + if(config.tagName != tagName){ + errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); + } + domBuilder.endElement(config.uri,config.localName,tagName); + if(localNSMap){ + for(var prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) ; + } + } + end++; + break; + // end elment + case '?':// + locator&&position(i); + end = parseInstruction(source,i,domBuilder); + break; + case '!':// 0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_E; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_V){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_E + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + s = S_C; + el.closed = true; + case S_V: + case S_ATTR: + case S_ATTR_S: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + break;//normal + case S_V://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_S: + if(s === S_ATTR_S){ + value = attrName; + } + if(s == S_V){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_S; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_S; + break; + case S_V: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_E: + s = S_S; + break; + //case S_S: + //case S_EQ: + //case S_ATTR_S: + // void();break; + //case S_C: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_V +//S_ATTR_S, S_E, S_S, S_C + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_V:void();break; + case S_ATTR_S: + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!') + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_E: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_S: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_V; + start = p; + break; + case S_C: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + } + p++; + } +} +/** + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function appendElement(el,domBuilder,parseStack){ + var tagName = el.tagName; + var localNSMap = null; + var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + parseStack.push(el); + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = closeMap[tagName] = source.lastIndexOf('') + } + return pos',start+4); + //append comment source.substring(4,end)//, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === 3 // text + || node.nodeType === 8 // comment + || node.nodeType === 4; // cdata +} + + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Parses a Plist XML string. Returns an Object. Takes a `callback` function. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated not actually async. use parse() instead + */ + +function parseString (xml, callback) { + var doc, error, plist; + try { + doc = new DOMParser().parseFromString(xml); + plist = parsePlistXML(doc.documentElement); + } catch(e) { + error = e; + } + callback(error, plist); +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated use parse() instead + */ + +function parseStringSync (xml) { + var doc = new DOMParser().parseFromString(xml); + var plist; + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + plist = parsePlistXML(doc.documentElement); + + // if the plist is an array with 1 element, pull it out of the array + if (plist.length == 1) { + plist = plist[0]; + } + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, d; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + if (key === null) { + key = parsePlistXML(node.childNodes[i]); + } else { + new_obj[key] = parsePlistXML(node.childNodes[i]); + key = null; + } + } + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + return node.childNodes[0].nodeValue; + + } else if (node.nodeName === 'string') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + res += node.childNodes[d].nodeValue; + } + return res; + + } else if (node.nodeName === 'integer') { + // parse as base 10 integer + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue.replace(/\s+/g, ''); + } + } + + // decode base64 data to a Buffer instance + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} + +}).call(this,require("buffer").Buffer) +},{"buffer":7,"util-deprecate":70,"xmldom":88}],4:[function(require,module,exports){ + +var i; + +/** + * Parser functions. + */ + +var parserFunctions = require('./parse'); +for (i in parserFunctions) exports[i] = parserFunctions[i]; + +/** + * Builder functions. + */ + +var builderFunctions = require('./build'); +for (i in builderFunctions) exports[i] = builderFunctions[i]; + +/** + * Add Node.js-specific functions (they're deprecated…). + */ + +var nodeFunctions = require('./node'); +for (i in nodeFunctions) exports[i] = nodeFunctions[i]; + +},{"./build":1,"./node":2,"./parse":3}],5:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],6:[function(require,module,exports){ + +},{}],7:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` is deprecated +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` is deprecated +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":5,"ieee754":8,"is-array":9}],8:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],9:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],10:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],11:[function(require,module,exports){ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; +} + +module.exports = last; + +},{}],12:[function(require,module,exports){ +var arrayEvery = require('../internal/arrayEvery'), + baseCallback = require('../internal/baseCallback'), + baseEvery = require('../internal/baseEvery'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = every; + +},{"../internal/arrayEvery":14,"../internal/baseCallback":18,"../internal/baseEvery":22,"../internal/isIterateeCall":47,"../lang/isArray":56}],13:[function(require,module,exports){ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ +function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; +} + +module.exports = restParam; + +},{}],14:[function(require,module,exports){ +/** + * A specialized version of `_.every` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +module.exports = arrayEvery; + +},{}],15:[function(require,module,exports){ +/** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; + +},{}],16:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + */ +function assignWith(object, source, customizer) { + var index = -1, + props = keys(source), + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; +} + +module.exports = assignWith; + +},{"../object/keys":65}],17:[function(require,module,exports){ +var baseCopy = require('./baseCopy'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} + +module.exports = baseAssign; + +},{"../object/keys":65,"./baseCopy":19}],18:[function(require,module,exports){ +var baseMatches = require('./baseMatches'), + baseMatchesProperty = require('./baseMatchesProperty'), + bindCallback = require('./bindCallback'), + identity = require('../utility/identity'), + property = require('../utility/property'); + +/** + * The base implementation of `_.callback` which supports specifying the + * number of arguments to provide to `func`. + * + * @private + * @param {*} [func=_.identity] The value to convert to a callback. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); +} + +module.exports = baseCallback; + +},{"../utility/identity":68,"../utility/property":69,"./baseMatches":29,"./baseMatchesProperty":30,"./bindCallback":35}],19:[function(require,module,exports){ +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; +} + +module.exports = baseCopy; + +},{}],20:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +module.exports = baseCreate; + +},{"../lang/isObject":60}],21:[function(require,module,exports){ +var baseForOwn = require('./baseForOwn'), + createBaseEach = require('./createBaseEach'); + +/** + * The base implementation of `_.forEach` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +module.exports = baseEach; + +},{"./baseForOwn":24,"./createBaseEach":37}],22:[function(require,module,exports){ +var baseEach = require('./baseEach'); + +/** + * The base implementation of `_.every` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +module.exports = baseEvery; + +},{"./baseEach":21}],23:[function(require,module,exports){ +var createBaseFor = require('./createBaseFor'); + +/** + * The base implementation of `baseForIn` and `baseForOwn` which iterates + * over `object` properties returned by `keysFunc` invoking `iteratee` for + * each property. Iteratee functions may exit iteration early by explicitly + * returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +module.exports = baseFor; + +},{"./createBaseFor":38}],24:[function(require,module,exports){ +var baseFor = require('./baseFor'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.forOwn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); +} + +module.exports = baseForOwn; + +},{"../object/keys":65,"./baseFor":23}],25:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; + +},{"./toObject":53}],26:[function(require,module,exports){ +var baseIsEqualDeep = require('./baseIsEqualDeep'), + isObject = require('../lang/isObject'), + isObjectLike = require('./isObjectLike'); + +/** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); +} + +module.exports = baseIsEqual; + +},{"../lang/isObject":60,"./baseIsEqualDeep":27,"./isObjectLike":50}],27:[function(require,module,exports){ +var equalArrays = require('./equalArrays'), + equalByTag = require('./equalByTag'), + equalObjects = require('./equalObjects'), + isArray = require('../lang/isArray'), + isTypedArray = require('../lang/isTypedArray'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; +} + +module.exports = baseIsEqualDeep; + +},{"../lang/isArray":56,"../lang/isTypedArray":62,"./equalArrays":39,"./equalByTag":40,"./equalObjects":41}],28:[function(require,module,exports){ +var baseIsEqual = require('./baseIsEqual'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.isMatch` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} matchData The propery names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparing objects. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; + } + } + } + return true; +} + +module.exports = baseIsMatch; + +},{"./baseIsEqual":26,"./toObject":53}],29:[function(require,module,exports){ +var baseIsMatch = require('./baseIsMatch'), + getMatchData = require('./getMatchData'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.matches` which does not clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; + + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + return function(object) { + return baseIsMatch(object, matchData); + }; +} + +module.exports = baseMatches; + +},{"./baseIsMatch":28,"./getMatchData":43,"./toObject":53}],30:[function(require,module,exports){ +var baseGet = require('./baseGet'), + baseIsEqual = require('./baseIsEqual'), + baseSlice = require('./baseSlice'), + isArray = require('../lang/isArray'), + isKey = require('./isKey'), + isStrictComparable = require('./isStrictComparable'), + last = require('../array/last'), + toObject = require('./toObject'), + toPath = require('./toPath'); + +/** + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. + * @returns {Function} Returns the new function. + */ +function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); + }; +} + +module.exports = baseMatchesProperty; + +},{"../array/last":11,"../lang/isArray":56,"./baseGet":25,"./baseIsEqual":26,"./baseSlice":33,"./isKey":48,"./isStrictComparable":51,"./toObject":53,"./toPath":54}],31:[function(require,module,exports){ +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = baseProperty; + +},{}],32:[function(require,module,exports){ +var baseGet = require('./baseGet'), + toPath = require('./toPath'); + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ +function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; +} + +module.exports = basePropertyDeep; + +},{"./baseGet":25,"./toPath":54}],33:[function(require,module,exports){ +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +module.exports = baseSlice; + +},{}],34:[function(require,module,exports){ +/** + * Converts `value` to a string if it's not one. An empty string is returned + * for `null` or `undefined` values. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + return value == null ? '' : (value + ''); +} + +module.exports = baseToString; + +},{}],35:[function(require,module,exports){ +var identity = require('../utility/identity'); + +/** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; +} + +module.exports = bindCallback; + +},{"../utility/identity":68}],36:[function(require,module,exports){ +var bindCallback = require('./bindCallback'), + isIterateeCall = require('./isIterateeCall'), + restParam = require('../function/restParam'); + +/** + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : undefined; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); +} + +module.exports = createAssigner; + +},{"../function/restParam":13,"./bindCallback":35,"./isIterateeCall":47}],37:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'), + toObject = require('./toObject'); + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +module.exports = createBaseEach; + +},{"./getLength":42,"./isLength":49,"./toObject":53}],38:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * Creates a base function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +module.exports = createBaseFor; + +},{"./toObject":53}],39:[function(require,module,exports){ +var arraySome = require('./arraySome'); + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; +} + +module.exports = equalArrays; + +},{"./arraySome":15}],40:[function(require,module,exports){ +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; +} + +module.exports = equalByTag; + +},{}],41:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; +} + +module.exports = equalObjects; + +},{"../object/keys":65}],42:[function(require,module,exports){ +var baseProperty = require('./baseProperty'); + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +module.exports = getLength; + +},{"./baseProperty":31}],43:[function(require,module,exports){ +var isStrictComparable = require('./isStrictComparable'), + pairs = require('../object/pairs'); + +/** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; +} + +module.exports = getMatchData; + +},{"../object/pairs":67,"./isStrictComparable":51}],44:[function(require,module,exports){ +var isNative = require('../lang/isNative'); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +module.exports = getNative; + +},{"../lang/isNative":59}],45:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +module.exports = isArrayLike; + +},{"./getLength":42,"./isLength":49}],46:[function(require,module,exports){ +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +module.exports = isIndex; + +},{}],47:[function(require,module,exports){ +var isArrayLike = require('./isArrayLike'), + isIndex = require('./isIndex'), + isObject = require('../lang/isObject'); + +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +module.exports = isIterateeCall; + +},{"../lang/isObject":60,"./isArrayLike":45,"./isIndex":46}],48:[function(require,module,exports){ +var isArray = require('../lang/isArray'), + toObject = require('./toObject'); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); +} + +module.exports = isKey; + +},{"../lang/isArray":56,"./toObject":53}],49:[function(require,module,exports){ +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; + +},{}],50:[function(require,module,exports){ +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isObjectLike; + +},{}],51:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +module.exports = isStrictComparable; + +},{"../lang/isObject":60}],52:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('./isIndex'), + isLength = require('./isLength'), + keysIn = require('../object/keysIn'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +module.exports = shimKeys; + +},{"../lang/isArguments":55,"../lang/isArray":56,"../object/keysIn":66,"./isIndex":46,"./isLength":49}],53:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Converts `value` to an object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Object} Returns the object. + */ +function toObject(value) { + return isObject(value) ? value : Object(value); +} + +module.exports = toObject; + +},{"../lang/isObject":60}],54:[function(require,module,exports){ +var baseToString = require('./baseToString'), + isArray = require('../lang/isArray'); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ +function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +} + +module.exports = toPath; + +},{"../lang/isArray":56,"./baseToString":34}],55:[function(require,module,exports){ +var isArrayLike = require('../internal/isArrayLike'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Native method references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); +} + +module.exports = isArguments; + +},{"../internal/isArrayLike":45,"../internal/isObjectLike":50}],56:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +module.exports = isArray; + +},{"../internal/getNative":44,"../internal/isLength":49,"../internal/isObjectLike":50}],57:[function(require,module,exports){ +var isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLike = require('../internal/isArrayLike'), + isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'), + isString = require('./isString'), + keys = require('../object/keys'); + +/** + * Checks if `value` is empty. A value is considered empty unless it's an + * `arguments` object, array, string, or jQuery-like collection with a length + * greater than `0` or an object with own enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {Array|Object|string} value The value to inspect. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !value.length; + } + return !keys(value).length; +} + +module.exports = isEmpty; + +},{"../internal/isArrayLike":45,"../internal/isObjectLike":50,"../object/keys":65,"./isArguments":55,"./isArray":56,"./isFunction":58,"./isString":61}],58:[function(require,module,exports){ +var isObject = require('./isObject'); + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 which returns 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +module.exports = isFunction; + +},{"./isObject":60}],59:[function(require,module,exports){ +var isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isNative; + +},{"../internal/isObjectLike":50,"./isFunction":58}],60:[function(require,module,exports){ +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = isObject; + +},{}],61:[function(require,module,exports){ +var isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); +} + +module.exports = isString; + +},{"../internal/isObjectLike":50}],62:[function(require,module,exports){ +var isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dateTag] = typedArrayTags[errorTag] = +typedArrayTags[funcTag] = typedArrayTags[mapTag] = +typedArrayTags[numberTag] = typedArrayTags[objectTag] = +typedArrayTags[regexpTag] = typedArrayTags[setTag] = +typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; +} + +module.exports = isTypedArray; + +},{"../internal/isLength":49,"../internal/isObjectLike":50}],63:[function(require,module,exports){ +var assignWith = require('../internal/assignWith'), + baseAssign = require('../internal/baseAssign'), + createAssigner = require('../internal/createAssigner'); + +/** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources overwrite property assignments of previous sources. + * If `customizer` is provided it's invoked to produce the assigned values. + * The `customizer` is bound to `thisArg` and invoked with five arguments: + * (objectValue, sourceValue, key, object, source). + * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * + * @static + * @memberOf _ + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); + * // => { 'user': 'fred', 'age': 40 } + * + * // using a customizer callback + * var defaults = _.partialRight(_.assign, function(value, other) { + * return _.isUndefined(value) ? other : value; + * }); + * + * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ +var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); +}); + +module.exports = assign; + +},{"../internal/assignWith":16,"../internal/baseAssign":17,"../internal/createAssigner":36}],64:[function(require,module,exports){ +var baseAssign = require('../internal/baseAssign'), + baseCreate = require('../internal/baseCreate'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} + +module.exports = create; + +},{"../internal/baseAssign":17,"../internal/baseCreate":20,"../internal/isIterateeCall":47}],65:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isArrayLike = require('../internal/isArrayLike'), + isObject = require('../lang/isObject'), + shimKeys = require('../internal/shimKeys'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +module.exports = keys; + +},{"../internal/getNative":44,"../internal/isArrayLike":45,"../internal/shimKeys":52,"../lang/isObject":60}],66:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('../internal/isIndex'), + isLength = require('../internal/isLength'), + isObject = require('../lang/isObject'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keysIn; + +},{"../internal/isIndex":46,"../internal/isLength":49,"../lang/isArguments":55,"../lang/isArray":56,"../lang/isObject":60}],67:[function(require,module,exports){ +var keys = require('./keys'), + toObject = require('../internal/toObject'); + +/** + * Creates a two dimensional array of the key-value pairs for `object`, + * e.g. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the new array of key-value pairs. + * @example + * + * _.pairs({ 'barney': 36, 'fred': 40 }); + * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) + */ +function pairs(object) { + object = toObject(object); + + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; +} + +module.exports = pairs; + +},{"../internal/toObject":53,"./keys":65}],68:[function(require,module,exports){ +/** + * This method returns the first argument provided to it. + * + * @static + * @memberOf _ + * @category Utility + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'user': 'fred' }; + * + * _.identity(object) === object; + * // => true + */ +function identity(value) { + return value; +} + +module.exports = identity; + +},{}],69:[function(require,module,exports){ +var baseProperty = require('../internal/baseProperty'), + basePropertyDeep = require('../internal/basePropertyDeep'), + isKey = require('../internal/isKey'); + +/** + * Creates a function that returns the property value at `path` on a + * given object. + * + * @static + * @memberOf _ + * @category Utility + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + * @example + * + * var objects = [ + * { 'a': { 'b': { 'c': 2 } } }, + * { 'a': { 'b': { 'c': 1 } } } + * ]; + * + * _.map(objects, _.property('a.b.c')); + * // => [2, 1] + * + * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); +} + +module.exports = property; + +},{"../internal/baseProperty":31,"../internal/basePropertyDeep":32,"../internal/isKey":48}],70:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],71:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, create; + + create = require('lodash/object/create'); + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return create(XMLAttribute.prototype, this); + }; + + XMLAttribute.prototype.toString = function(options, level) { + return ' ' + this.name + '="' + this.value + '"'; + }; + + return XMLAttribute; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],72:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier; + + XMLStringifier = require('./XMLStringifier'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLElement = require('./XMLElement'); + + module.exports = XMLBuilder = (function() { + function XMLBuilder(name, options) { + var root, temp; + if (name == null) { + throw new Error("Root element needs a name"); + } + if (options == null) { + options = {}; + } + this.options = options; + this.stringify = new XMLStringifier(options); + temp = new XMLElement(this, 'doc'); + root = temp.element(name); + root.isRoot = true; + root.documentObject = this; + this.rootObject = root; + if (!options.headless) { + root.declaration(options); + if ((options.pubID != null) || (options.sysID != null)) { + root.doctype(options); + } + } + } + + XMLBuilder.prototype.root = function() { + return this.rootObject; + }; + + XMLBuilder.prototype.end = function(options) { + return this.toString(options); + }; + + XMLBuilder.prototype.toString = function(options) { + var indent, newline, offset, pretty, r, ref, ref1, ref2; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + r = ''; + if (this.xmldec != null) { + r += this.xmldec.toString(options); + } + if (this.doctype != null) { + r += this.doctype.toString(options); + } + r += this.rootObject.toString(options); + if (pretty && r.slice(-newline.length) === newline) { + r = r.slice(0, -newline.length); + } + return r; + }; + + return XMLBuilder; + + })(); + +}).call(this); + +},{"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLStringifier":85}],73:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return create(XMLCData.prototype, this); + }; + + XMLCData.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],74:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLComment, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return create(XMLComment.prototype, this); + }; + + XMLComment.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],75:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDAttList, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDAttList = (function() { + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + this.stringify = parent.stringify; + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDAttList; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],76:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDElement, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDElement = (function() { + function XMLDTDElement(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDElement; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],77:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDEntity, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + module.exports = XMLDTDEntity = (function() { + function XMLDTDEntity(parent, pe, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDEntity; + + })(); + +}).call(this); + +},{"lodash/lang/isObject":60,"lodash/object/create":64}],78:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDNotation, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDNotation = (function() { + function XMLDTDNotation(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDNotation; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],79:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDeclaration, XMLNode, create, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/lang/isObject":60,"lodash/object/create":64}],80:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLDocType = (function() { + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + this.documentObject = parent; + this.stringify = this.documentObject.stringify; + this.children = []; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.instruction = function(target, value) { + var child; + child = new XMLProcessingInstruction(this, target, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.root = function() { + return this.documentObject.root(); + }; + + XMLDocType.prototype.document = function() { + return this.documentObject; + }; + + XMLDocType.prototype.toString = function(options, level) { + var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ' 0) { + r += ' ['; + if (pretty) { + r += newline; + } + ref3 = this.children; + for (i = 0, len = ref3.length; i < len; i++) { + child = ref3[i]; + r += child.toString(options, level + 1); + } + r += ']'; + } + r += '>'; + if (pretty) { + r += newline; + } + return r; + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocType.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocType.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocType.prototype.up = function() { + return this.root(); + }; + + XMLDocType.prototype.doc = function() { + return this.document(); + }; + + return XMLDocType; + + })(); + +}).call(this); + +},{"./XMLCData":73,"./XMLComment":74,"./XMLDTDAttList":75,"./XMLDTDElement":76,"./XMLDTDEntity":77,"./XMLDTDNotation":78,"./XMLProcessingInstruction":83,"lodash/lang/isObject":60,"lodash/object/create":64}],81:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + every = require('lodash/collection/every'); + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.children = []; + this.instructions = []; + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, i, len, pi, ref, ref1; + clonedSelf = create(XMLElement.prototype, this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref = this.attributes; + for (attName in ref) { + if (!hasProp.call(ref, attName)) continue; + att = ref[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.instructions = []; + ref1 = this.instructions; + for (i = 0, len = ref1.length; i < len; i++) { + pi = ref1[i]; + clonedSelf.instructions.push(pi.clone()); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.instruction = function(target, value) { + var i, insTarget, insValue, instruction, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.instructions.push(instruction); + } + return this; + }; + + XMLElement.prototype.toString = function(options, level) { + var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + ref3 = this.instructions; + for (i = 0, len = ref3.length; i < len; i++) { + instruction = ref3[i]; + r += instruction.toString(options, level); + } + if (pretty) { + r += space; + } + r += '<' + this.name; + ref4 = this.attributes; + for (name in ref4) { + if (!hasProp.call(ref4, name)) continue; + att = ref4[name]; + r += att.toString(options); + } + if (this.children.length === 0 || every(this.children, function(e) { + return e.value === ''; + })) { + r += '/>'; + if (pretty) { + r += newline; + } + } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) { + r += '>'; + r += this.children[0].value; + r += ''; + r += newline; + } else { + r += '>'; + if (pretty) { + r += newline; + } + ref5 = this.children; + for (j = 0, len1 = ref5.length; j < len1; j++) { + child = ref5[j]; + r += child.toString(options, level + 1); + } + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + } + return r; + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); + +},{"./XMLAttribute":71,"./XMLNode":82,"./XMLProcessingInstruction":83,"lodash/collection/every":12,"lodash/lang/isFunction":58,"lodash/lang/isObject":60,"lodash/object/create":64}],82:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject, + hasProp = {}.hasOwnProperty; + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + isEmpty = require('lodash/lang/isEmpty'); + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + this.options = this.parent.options; + this.stringify = this.parent.stringify; + if (XMLElement === null) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val); + } else if (Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref; + if (name != null) { + name = name.valueOf(); + } + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + doc.xmldec = xmldec; + return doc.root(); + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var doc, doctype; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + doc.doctype = doctype; + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var child; + if (this.isRoot) { + return this; + } + child = this.parent; + while (!child.isRoot) { + child = child.parent; + } + return child; + }; + + XMLNode.prototype.document = function() { + return this.root().documentObject; + }; + + XMLNode.prototype.end = function(options) { + return this.document().toString(options); + }; + + XMLNode.prototype.prev = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importXMLBuilder = function(xmlbuilder) { + var clonedRoot; + clonedRoot = xmlbuilder.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + return XMLNode; + + })(); + +}).call(this); + +},{"./XMLCData":73,"./XMLComment":74,"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLRaw":84,"./XMLText":86,"lodash/lang/isEmpty":57,"lodash/lang/isFunction":58,"lodash/lang/isObject":60}],83:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLProcessingInstruction, create; + + create = require('lodash/object/create'); + + module.exports = XMLProcessingInstruction = (function() { + function XMLProcessingInstruction(parent, target, value) { + this.stringify = parent.stringify; + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return create(XMLProcessingInstruction.prototype, this); + }; + + XMLProcessingInstruction.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLProcessingInstruction; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],84:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLNode, XMLRaw, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return create(XMLRaw.prototype, this); + }; + + XMLRaw.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += this.value; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],85:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLStringifier, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref, value; + this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0; + ref = (options != null ? options.stringify : void 0) || {}; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + if (val.match(/]]>/)) { + throw new Error("Invalid CDATA text: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.elEscape = function(str) { + return str.replace(/&/g, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + return str.replace(/&/g, '&').replace(/','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid document source"); + } + return domBuilder.document; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn){ + if(isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + }else{ + var i=arguments.length; + while(--i){ + if(fn = errorImpl[arguments[i]]){ + break; + } + } + } + } + errorHandler[key] = fn && function(msg){ + fn(msg+_locator(locator)); + }||function(){}; + } + build('warning','warn'); + build('error','warn','warning'); + build('fatalError','warn','warning','error'); + return errorHandler; +} +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.document = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.document.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.document; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + if( attr.getOffset){ + position(attr.getOffset(1),attr) + } + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.document.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(this.currentElement && chars){ + if (this.cdata) { + var charNode = this.document.createCDATASection(chars); + this.currentElement.appendChild(charNode); + } else { + var charNode = this.document.createTextNode(chars); + this.currentElement.appendChild(charNode); + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.document.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.document.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.document.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn(error,_locator(this.locator)); + }, + error:function(error) { + console.error(error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error(error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.document.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +} + +},{"./dom":89,"./sax":90}],89:[function(require,module,exports){ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + } +}; +function LiveNodeList(node,refresh){ + this._node = node; + this._refresh = refresh + _updateLiveList(this); +} +function _updateLiveList(list){ + var inc = list._node._inc || list._node.ownerDocument._inc; + if(list._inc != inc){ + var ls = list._refresh(list._node); + //console.log(ls.length) + __set__(list,'length',ls.length); + copy(ls,list); + list._inc = inc; + } +} +LiveNodeList.prototype.item = function(i){ + _updateLiveList(this); + return this[i]; +} + +_extends(LiveNodeList,NodeList); +/** + * + * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes. + * NamedNodeMap objects in the DOM are live. + * used for attributes or DocumentType entities + */ +function NamedNodeMap() { +}; + +function _findNodeIndex(list,node){ + var i = list.length; + while(i--){ + if(list[i] === node){return i} + } +} + +function _addNamedNode(el,list,newAttr,oldAttr){ + if(oldAttr){ + list[_findNodeIndex(list,oldAttr)] = newAttr; + }else{ + list[list.length++] = newAttr; + } + if(el){ + newAttr.ownerElement = el; + var doc = el.ownerDocument; + if(doc){ + oldAttr && _onRemoveAttribute(doc,el,oldAttr); + _onAddAttribute(doc,el,newAttr); + } + } +} +function _removeNamedNode(el,list,attr){ + var i = _findNodeIndex(list,attr); + if(i>=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + var i = this.length; + while(i--){ + var attr = this[i]; + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + doc.implementation = this; + doc.childNodes = new NodeList(); + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == 1){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == 1){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + //if(!(newChild instanceof CharacterData)){ + throw new Error(ExceptionMessage[3]) + //} + return Node.prototype.appendChild.apply(this,arguments) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node){ + var buf = []; + serializeToString(node,buf); + return buf.join(''); +} +Node.prototype.toString =function(){ + return XMLSerializer.prototype.serializeToString(this); +} +function serializeToString(node,buf){ + switch(node.nodeType){ + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + var isHTML = htmlns === node.namespaceURI + buf.push('<',nodeName); + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + if(child){ + buf.push(child.data); + } + }else{ + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + function position(start,m){ + while(start>=endPos && (m = linePattern.exec(source))){ + startPos = m.index; + endPos = startPos + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = start-startPos+1; + } + var startPos = 0; + var endPos = 0; + var linePattern = /.+(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + var i = source.indexOf('<',start); + if(i<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.document; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(i>start){ + appendText(i); + } + switch(source.charAt(i+1)){ + case '/': + var end = source.indexOf('>',i+3); + var tagName = source.substring(i+2,end); + var config = parseStack.pop(); + var localNSMap = config.localNSMap; + + if(config.tagName != tagName){ + errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); + } + domBuilder.endElement(config.uri,config.localName,tagName); + if(localNSMap){ + for(var prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) ; + } + } + end++; + break; + // end elment + case '?':// + locator&&position(i); + end = parseInstruction(source,i,domBuilder); + break; + case '!':// 0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_E; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_V){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_E + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + s = S_C; + el.closed = true; + case S_V: + case S_ATTR: + case S_ATTR_S: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + break;//normal + case S_V://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_S: + if(s === S_ATTR_S){ + value = attrName; + } + if(s == S_V){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_S; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_S; + break; + case S_V: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_E: + s = S_S; + break; + //case S_S: + //case S_EQ: + //case S_ATTR_S: + // void();break; + //case S_C: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_V +//S_ATTR_S, S_E, S_S, S_C + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_V:void();break; + case S_ATTR_S: + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!') + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_E: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_S: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_V; + start = p; + break; + case S_C: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + } + p++; + } +} +/** + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function appendElement(el,domBuilder,parseStack){ + var tagName = el.tagName; + var localNSMap = null; + var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + parseStack.push(el); + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = closeMap[tagName] = source.lastIndexOf('') + } + return pos',start+4); + //append comment source.substring(4,end)//, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === TEXT_NODE + || node.nodeType === COMMENT_NODE + || node.nodeType === CDATA_NODE; +} + +/** + * Check if the node is empty. Some plist file has such node: + * + * this node shoud be ignored. + * + * @see https://github.com/TooTallNate/plist.js/issues/66 + * @param {Element} node + * @returns {Boolean} + * @api private + */ +function isEmptyNode(node){ + if(!node.childNodes || node.childNodes.length === 0) { + return true; + } else { + return false; + } +} + +function invariant(test, message) { + if (!test) { + throw new Error(message); + } +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + invariant( + doc.documentElement.nodeName === 'plist', + 'malformed document. First element should be ' + ); + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, counter, type; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + if (isEmptyNode(node)) { + return new_arr; + } + for (i=0; i < node.childNodes.length; i++) { + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + counter = 0; + if (isEmptyNode(node)) { + return new_obj; + } + for (i=0; i < node.childNodes.length; i++) { + if (shouldIgnoreNode(node.childNodes[i])) continue; + if (counter % 2 === 0) { + invariant( + node.childNodes[i].nodeName === 'key', + 'Missing key while parsing .' + ); + key = parsePlistXML(node.childNodes[i]); + } else { + invariant( + node.childNodes[i].nodeName !== 'key', + 'Unexpected key "' + + parsePlistXML(node.childNodes[i]) + + '" while parsing .' + ); + new_obj[key] = parsePlistXML(node.childNodes[i]); + } + counter += 1; + } + if (counter % 2 === 1) { + throw new Error('Missing value for "' + key + '" while parsing '); + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + if (isEmptyNode(node)) { + return new_arr; + } + for (i=0; i < node.childNodes.length; i++) { + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + if (isEmptyNode(node)) { + return ''; + } + return node.childNodes[0].nodeValue; + } else if (node.nodeName === 'string') { + res = ''; + if (isEmptyNode(node)) { + return res; + } + for (i=0; i < node.childNodes.length; i++) { + var type = node.childNodes[i].nodeType; + if (type === TEXT_NODE || type === CDATA_NODE) { + res += node.childNodes[i].nodeValue; + } + } + return res; + + } else if (node.nodeName === 'integer') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as integer.' + ); + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as real.' + ); + res = ''; + for (i=0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeType === TEXT_NODE) { + res += node.childNodes[i].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + if (isEmptyNode(node)) { + return new Buffer(res, 'base64'); + } + for (i=0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeType === TEXT_NODE) { + res += node.childNodes[i].nodeValue.replace(/\s+/g, ''); + } + } + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as Date.' + ) + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} diff --git a/node_modules/cordova-android/node_modules/plist/package.json b/node_modules/cordova-android/node_modules/plist/package.json new file mode 100644 index 0000000..39545b7 --- /dev/null +++ b/node_modules/cordova-android/node_modules/plist/package.json @@ -0,0 +1,86 @@ +{ + "_from": "plist@^2.1.0", + "_id": "plist@2.1.0", + "_inBundle": true, + "_integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "_location": "/cordova-android/plist", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "plist@^2.1.0", + "name": "plist", + "escapedName": "plist", + "rawSpec": "^2.1.0", + "saveSpec": null, + "fetchSpec": "^2.1.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "_shasum": "57ccdb7a0821df21831217a3cad54e3e146a1025", + "_spec": "plist@^2.1.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net" + }, + "bugs": { + "url": "https://github.com/TooTallNate/node-plist/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Hans Huebner", + "email": "hans.huebner@gmail.com" + }, + { + "name": "Pierre Metrailler" + }, + { + "name": "Mike Reinstein", + "email": "reinstein.mike@gmail.com" + }, + { + "name": "Vladimir Tsvang" + }, + { + "name": "Mathieu D'Amours" + } + ], + "dependencies": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + }, + "deprecated": false, + "description": "Mac OS X Plist parser/builder for Node.js and browsers", + "devDependencies": { + "browserify": "^14.3.0", + "mocha": "^3.3.0", + "multiline": "^1.0.2", + "zuul": "^3.10.1" + }, + "homepage": "https://github.com/TooTallNate/node-plist#readme", + "keywords": [ + "apple", + "browser", + "mac", + "plist", + "parser", + "xml" + ], + "license": "MIT", + "main": "index.js", + "name": "plist", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-plist.git" + }, + "scripts": { + "test": "make test" + }, + "version": "2.1.0" +} diff --git a/node_modules/cordova-android/node_modules/properties-parser/README.markdown b/node_modules/cordova-android/node_modules/properties-parser/README.markdown new file mode 100644 index 0000000..3a808ba --- /dev/null +++ b/node_modules/cordova-android/node_modules/properties-parser/README.markdown @@ -0,0 +1,48 @@ +# node-properties-parser + +A parser for [.properties](http://en.wikipedia.org/wiki/.properties) files written in javascript. Properties files store key-value pairs. They are typically used for configuration and internationalization in Java applications as well as in Actionscript projects. Here's an example of the format: + + # You are reading the ".properties" entry. + ! The exclamation mark can also mark text as comments. + website = http://en.wikipedia.org/ + language = English + # The backslash below tells the application to continue reading + # the value onto the next line. + message = Welcome to \ + Wikipedia! + # Add spaces to the key + key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". + # Unicode + tab : \u0009 +*(taken from [Wikipedia](http://en.wikipedia.org/wiki/.properties#Format))* + +Currently works with any version of node.js. + +## The API + +- `parse(text)`: Parses `text` into key-value pairs. Returns an object containing the key-value pairs. +- `read(path[, callback])`: Opens the file specified by `path` and calls `parse` on its content. If the optional `callback` parameter is provided, the result is then passed to it as the second parameter. If an error occurs, the error object is passed to `callback` as the first parameter. If `callback` is not provided, the file specified by `path` is synchronously read and calls `parse` on its contents. The resulting object is immediately returned. +- `createEditor([path[, callback]])`: If neither `path` or `callback` are provided an empty editor object is returned synchronously. If only `path` is provided, the file specified by `path` is synchronously read and parsed. An editor object with the results in then immediately returned. If both `path` and `callback` are provided, the file specified by `path` is read and parsed asynchronously. An editor object with the results are then passed to `callback` as the second parameters. If an error occurs, the error object is passed to `callback` as the first parameter. +- `Editor`: The editor object is returned by `createEditor`. Has the following API: + - `get(key)`: Returns the value currently associated with `key`. + - `set(key, [value[, comment]])`: Associates `key` with `value`. An optional comment can be provided. If `value` is not specified or is `null`, then `key` is unset. + - `unset(key)`: Unsets the specified `key`. + - `save([path][, callback]])`: Writes the current contents of this editor object to a file specified by `path`. If `path` is not provided, then it'll be defaulted to the `path` value passed to `createEditor`. The `callback` parameter is called when the file has been written to disk. + - `addHeadComment`: Added a comment to the head of the file. + - `toString`: Returns the string representation of this properties editor object. This string will be written to a file if `save` is called. + +## Getting node-properties-parser + +The easiest way to get node-properties-parser is with [npm](http://npmjs.org/): + + npm install properties-parser + +Alternatively you can clone this git repository: + + git://github.com/xavi-/node-properties-parser.git + +## Developed by +* Xavi Ramirez + +## License +This project is released under [The MIT License](http://www.opensource.org/licenses/mit-license.php). \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/properties-parser/index.js b/node_modules/cordova-android/node_modules/properties-parser/index.js new file mode 100644 index 0000000..b103ad0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/properties-parser/index.js @@ -0,0 +1,354 @@ +var fs = require("fs"); + +function Iterator(text) { + var pos = 0, length = text.length; + + this.peek = function(num) { + num = num || 0; + if(pos + num >= length) { return null; } + + return text.charAt(pos + num); + }; + this.next = function(inc) { + inc = inc || 1; + + if(pos >= length) { return null; } + + return text.charAt((pos += inc) - inc); + }; + this.pos = function() { + return pos; + }; +} + +var rWhitespace = /\s/; +function isWhitespace(chr) { + return rWhitespace.test(chr); +} +function consumeWhiteSpace(iter) { + var start = iter.pos(); + + while(isWhitespace(iter.peek())) { iter.next(); } + + return { type: "whitespace", start: start, end: iter.pos() }; +} + +function startsComment(chr) { + return chr === "!" || chr === "#"; +} +function isEOL(chr) { + return chr == null || chr === "\n" || chr === "\r"; +} +function consumeComment(iter) { + var start = iter.pos(); + + while(!isEOL(iter.peek())) { iter.next(); } + + return { type: "comment", start: start, end: iter.pos() }; +} + +function startsKeyVal(chr) { + return !isWhitespace(chr) && !startsComment(chr); +} +function startsSeparator(chr) { + return chr === "=" || chr === ":" || isWhitespace(chr); +} +function startsEscapedVal(chr) { + return chr === "\\"; +} +function consumeEscapedVal(iter) { + var start = iter.pos(); + + iter.next(); // move past "\" + var curChar = iter.next(); + if(curChar === "u") { // encoded unicode char + iter.next(4); // Read in the 4 hex values + } + + return { type: "escaped-value", start: start, end: iter.pos() }; +} +function consumeKey(iter) { + var start = iter.pos(), children = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(startsSeparator(curChar)) { break; } + if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; } + + iter.next(); + } + + return { type: "key", start: start, end: iter.pos(), children: children }; +} +function consumeKeyValSeparator(iter) { + var start = iter.pos(); + + var seenHardSep = false, curChar; + while((curChar = iter.peek()) !== null) { + if(isEOL(curChar)) { break; } + + if(isWhitespace(curChar)) { iter.next(); continue; } + + if(seenHardSep) { break; } + + seenHardSep = (curChar === ":" || curChar === "="); + if(seenHardSep) { iter.next(); continue; } + + break; // curChar is a non-separtor char + } + + return { type: "key-value-separator", start: start, end: iter.pos() }; +} +function startsLineBreak(iter) { + return iter.peek() === "\\" && isEOL(iter.peek(1)); +} +function consumeLineBreak(iter) { + var start = iter.pos(); + + iter.next(); // consume \ + if(iter.peek() === "\r") { iter.next(); } + iter.next(); // consume \n + + var curChar; + while((curChar = iter.peek()) !== null) { + if(isEOL(curChar)) { break; } + if(!isWhitespace(curChar)) { break; } + + iter.next(); + } + + return { type: "line-break", start: start, end: iter.pos() }; +} +function consumeVal(iter) { + var start = iter.pos(), children = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(startsLineBreak(iter)) { children.push(consumeLineBreak(iter)); continue; } + if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; } + if(isEOL(curChar)) { break; } + + iter.next(); + } + + return { type: "value", start: start, end: iter.pos(), children: children }; +} +function consumeKeyVal(iter) { + return { + type: "key-value", + start: iter.pos(), + children: [ + consumeKey(iter), + consumeKeyValSeparator(iter), + consumeVal(iter) + ], + end: iter.pos() + }; +} + +var renderChild = { + "escaped-value": function(child, text) { + var type = text.charAt(child.start + 1); + + if(type === "t") { return "\t"; } + if(type === "r") { return "\r"; } + if(type === "n") { return "\n"; } + if(type === "f") { return "\f"; } + if(type !== "u") { return type; } + + return String.fromCharCode(parseInt(text.substr(child.start + 2, 4), 16)); + }, + "line-break": function (child, text) { + return ""; + } +}; +function rangeToBuffer(range, text) { + var start = range.start, buffer = []; + + for(var i = 0; i < range.children.length; i++) { + var child = range.children[i]; + + buffer.push(text.substring(start, child.start)); + buffer.push(renderChild[child.type](child, text)); + start = child.end; + } + buffer.push(text.substring(start, range.end)); + + return buffer; +} +function rangesToObject(ranges, text) { + var obj = Object.create(null); // Creates to a true hash map + + for(var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + + if(range.type !== "key-value") { continue; } + + var key = rangeToBuffer(range.children[0], text).join(""); + var val = rangeToBuffer(range.children[2], text).join(""); + obj[key] = val; + } + + return obj; +} + +function stringToRanges(text) { + var iter = new Iterator(text), ranges = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(isWhitespace(curChar)) { ranges.push(consumeWhiteSpace(iter)); continue; } + if(startsComment(curChar)) { ranges.push(consumeComment(iter)); continue; } + if(startsKeyVal(curChar)) { ranges.push(consumeKeyVal(iter)); continue; } + + throw Error("Something crazy happened. text: '" + text + "'; curChar: '" + curChar + "'"); + } + + return ranges; +} + +function isNewLineRange(range) { + if(!range) { return false; } + + if(range.type === "whitespace") { return true; } + + if(range.type === "literal") { + return isWhitespace(range.text) && range.text.indexOf("\n") > -1; + } + + return false; +} + +function Editor(text, path) { + text = text || ""; + + var ranges = stringToRanges(text); + var obj = rangesToObject(ranges, text); + var keyRange = Object.create(null); // Creates to a true hash map + + for(var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + + if(range.type !== "key-value") { continue; } + + var key = rangeToBuffer(range.children[0], text).join(""); + keyRange[key] = range; + } + + this.addHeadComment = function(comment) { + if(comment == null) { return; } + + ranges.unshift({ type: "literal", text: "# " + comment.replace(/\n/g, "\n# ") + "\n" }); + }; + + this.get = function(key) { return obj[key]; }; + this.set = function(key, val, comment) { + if(val == null) { this.unset(key); return; } + + obj[key] = val; + + var range = keyRange[key]; + if(!range) { + keyRange[key] = range = { type: "literal", text: key + "=" + val }; + + var prevRange = ranges[ranges.length - 1]; + if(prevRange != null && !isNewLineRange(prevRange)) { + ranges.push({ type: "literal", text: "\n" }); + } + ranges.push(range); + } + + // comment === null deletes comment. if comment === undefined, it's left alone + if(comment !== undefined) { + range.comment = comment && "# " + comment.replace(/\n/g, "\n# ") + "\n"; + } + + if(range.type === "literal") { + range.text = key + "=" + val; + if(range.comment != null) { range.text = range.comment + range.text; } + } else if(range.type === "key-value") { + range.children[2] = { type: "literal", text: val }; + } else { + throw "Unknown node type: " + range.type; + } + }; + this.unset = function(key) { + if(!(key in obj)) { return; } + + var range = keyRange[key]; + var idx = ranges.indexOf(range); + + ranges.splice(idx, (isNewLineRange(ranges[idx + 1]) ? 2 : 1)); + + delete keyRange[key]; + delete obj[key]; + }; + this.valueOf = this.toString = function() { + var buffer = [], stack = [].concat(ranges); + + var node; + while((node = stack.shift()) != null) { + switch(node.type) { + case "literal": + buffer.push(node.text); + break; + case "key": + case "value": + case "comment": + case "whitespace": + case "key-value-separator": + case "escaped-value": + case "line-break": + buffer.push(text.substring(node.start, node.end)); + break; + case "key-value": + Array.prototype.unshift.apply(stack, node.children); + if(node.comment) { stack.unshift({ type: "literal", text: node.comment }); } + break; + } + } + + return buffer.join(""); + }; + this.save = function(newPath, callback) { + if(typeof newPath === 'function') { + callback = newPath; + newPath = path; + } + newPath = newPath || path; + + if(!newPath) { callback("Unknown path"); } + + fs.writeFile(newPath, this.toString(), callback || function() {}); + }; +} +function createEditor(path, callback) { + if(!path) { return new Editor(); } + + if(!callback) { return new Editor(fs.readFileSync(path).toString(), path); } + + return fs.readFile(path, function(err, text) { + if(err) { return callback(err, null); } + + text = text.toString(); + return callback(null, new Editor(text, path)); + }); +} + +function parse(text) { + text = text.toString(); + var ranges = stringToRanges(text); + return rangesToObject(ranges, text); +} + +function read(path, callback) { + if(!callback) { return parse(fs.readFileSync(path)); } + + return fs.readFile(path, function(err, data) { + if(err) { return callback(err, null); } + + return callback(null, parse(data)); + }); +} + +module.exports = { parse: parse, read: read, createEditor: createEditor }; diff --git a/node_modules/cordova-android/node_modules/properties-parser/package.json b/node_modules/cordova-android/node_modules/properties-parser/package.json new file mode 100644 index 0000000..8488866 --- /dev/null +++ b/node_modules/cordova-android/node_modules/properties-parser/package.json @@ -0,0 +1,57 @@ +{ + "_from": "properties-parser@0.2.3", + "_id": "properties-parser@0.2.3", + "_inBundle": true, + "_integrity": "sha1-91kSVfcHq7/yJ8e1a2N9uwNzoQ8=", + "_location": "/cordova-android/properties-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "properties-parser@0.2.3", + "name": "properties-parser", + "escapedName": "properties-parser", + "rawSpec": "0.2.3", + "saveSpec": null, + "fetchSpec": "0.2.3" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.2.3.tgz", + "_shasum": "f7591255f707abbff227c7b56b637dbb0373a10f", + "_spec": "properties-parser@0.2.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "bugs": { + "url": "https://github.com/xavi-/node-properties-parser/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A parser for .properties files written in javascript", + "engines": { + "node": ">= 0.3.1" + }, + "homepage": "https://github.com/xavi-/node-properties-parser#readme", + "keywords": [ + "parser", + ".properties", + "properties", + "java", + "file parser", + "actionscript" + ], + "main": "./index.js", + "maintainers": [ + { + "name": "Xavi", + "email": "xavi.rmz@gmail.com", + "url": "http://xavi.co" + } + ], + "name": "properties-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/xavi-/node-properties-parser.git" + }, + "version": "0.2.3" +} diff --git a/node_modules/cordova-android/node_modules/properties-parser/play-ground.js b/node_modules/cordova-android/node_modules/properties-parser/play-ground.js new file mode 100644 index 0000000..ffbcf62 --- /dev/null +++ b/node_modules/cordova-android/node_modules/properties-parser/play-ground.js @@ -0,0 +1,17 @@ +var parser = require("./"); +var editor = parser.createEditor(); + +editor.set("ok", "hi"); +editor.set("hi", "ok"); + +console.log(editor.toString()); + +editor.unset("hi"); + +console.log("==================="); +console.log(editor.toString()); + +editor.unset("ok"); + +console.log("==================="); +console.log(editor.toString()); diff --git a/node_modules/cordova-android/node_modules/q/CHANGES.md b/node_modules/cordova-android/node_modules/q/CHANGES.md new file mode 100644 index 0000000..cd351fd --- /dev/null +++ b/node_modules/cordova-android/node_modules/q/CHANGES.md @@ -0,0 +1,786 @@ + +## 1.4.1 + + - Address an issue that prevented Q from being used as a ` + + diff --git a/node_modules/cordova-android/node_modules/sax/examples/test.xml b/node_modules/cordova-android/node_modules/sax/examples/test.xml new file mode 100644 index 0000000..801292d --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/examples/test.xml @@ -0,0 +1,1254 @@ + + +]> + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/sax/lib/sax.js b/node_modules/cordova-android/node_modules/sax/lib/sax.js new file mode 100644 index 0000000..17fb08e --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/lib/sax.js @@ -0,0 +1,1006 @@ +// wrapper for non-node envs +;(function (sax) { + +sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +sax.SAXParser = SAXParser +sax.SAXStream = SAXStream +sax.createStream = createStream + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +sax.MAX_BUFFER_LENGTH = 64 * 1024 + +var buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", "script" +] + +sax.EVENTS = // for discoverability. + [ "text" + , "processinginstruction" + , "sgmldeclaration" + , "doctype" + , "comment" + , "attribute" + , "opentag" + , "closetag" + , "opencdata" + , "cdata" + , "closecdata" + , "error" + , "end" + , "ready" + , "script" + , "opennamespace" + , "closenamespace" + ] + +function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) + + var parser = this + clearBuffers(parser) + parser.q = parser.c = "" + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.tagCase = parser.opt.lowercasetags ? "toLowerCase" : "toUpperCase" + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.ENTITIES = Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) parser.ns = Object.create(rootNS) + + // mostly just for error reporting + parser.position = parser.line = parser.column = 0 + emit(parser, "onready") +} + +if (!Object.create) Object.create = function (o) { + function f () { this.__proto__ = o } + f.prototype = o + return new f +} + +if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { + return o.__proto__ +} + +if (!Object.keys) Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a +} + +function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + , maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i ++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case "textNode": + closeText(parser) + break + + case "cdata": + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + break + + case "script": + emitNode(parser, "onscript", parser.script) + parser.script = "" + break + + default: + error(parser, "Max buffer length exceeded: "+buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) + + parser.position +} + +function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i ++) { + parser[buffers[i]] = "" + } +} + +SAXParser.prototype = + { end: function () { end(this) } + , write: write + , resume: function () { this.error = null; return this } + , close: function () { return this.write(null) } + , end: function () { return this.write(null) } + } + +try { + var Stream = require("stream").Stream +} catch (ex) { + var Stream = function () {} +} + + +var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== "error" && ev !== "end" +}) + +function createStream (strict, opt) { + return new SAXStream(strict, opt) +} + +function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) + + Stream.apply(me) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + + var me = this + + this._parser.onend = function () { + me.emit("end") + } + + this._parser.onerror = function (er) { + me.emit("error", er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, "on" + ev, { + get: function () { return me._parser["on" + ev] }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + return me._parser["on"+ev] = h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) +} + +SAXStream.prototype = Object.create(Stream.prototype, + { constructor: { value: SAXStream } }) + +SAXStream.prototype.write = function (data) { + this._parser.write(data.toString()) + this.emit("data", data) + return true +} + +SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) this._parser.write(chunk.toString()) + this._parser.end() + return true +} + +SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { + me._parser["on"+ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] + : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) +} + + + +// character classes and tokens +var whitespace = "\r\n\t " + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + , number = "0124356789" + , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // (Letter | "_" | ":") + , nameStart = letter+"_:" + , nameBody = nameStart+number+"-." + , quote = "'\"" + , entity = number+letter+"#" + , attribEnd = whitespace + ">" + , CDATA = "[CDATA[" + , DOCTYPE = "DOCTYPE" + , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" + , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + +// turn all the string character sets into character class objects. +whitespace = charClass(whitespace) +number = charClass(number) +letter = charClass(letter) +nameStart = charClass(nameStart) +nameBody = charClass(nameBody) +quote = charClass(quote) +entity = charClass(entity) +attribEnd = charClass(attribEnd) + +function charClass (str) { + return str.split("").reduce(function (s, c) { + s[c] = true + return s + }, {}) +} + +function is (charclass, c) { + return charclass[c] +} + +function not (charclass, c) { + return !charclass[c] +} + +var S = 0 +sax.STATE = +{ BEGIN : S++ +, TEXT : S++ // general stuff +, TEXT_ENTITY : S++ // & and such. +, OPEN_WAKA : S++ // < +, SGML_DECL : S++ // +, SCRIPT : S++ // " + , expect : + [ [ "opentag", { name: "xml", attributes: {} } ] + , [ "opentag", { name: "script", attributes: {} } ] + , [ "text", "hello world" ] + , [ "closetag", "script" ] + , [ "closetag", "xml" ] + ] + , strict : false + , opt : { lowercasetags: true, noscript: true } + } + ) + +require(__dirname).test + ( { xml : "" + , expect : + [ [ "opentag", { name: "xml", attributes: {} } ] + , [ "opentag", { name: "script", attributes: {} } ] + , [ "opencdata", undefined ] + , [ "cdata", "hello world" ] + , [ "closecdata", undefined ] + , [ "closetag", "script" ] + , [ "closetag", "xml" ] + ] + , strict : false + , opt : { lowercasetags: true, noscript: true } + } + ) + diff --git a/node_modules/cordova-android/node_modules/sax/test/parser-position.js b/node_modules/cordova-android/node_modules/sax/test/parser-position.js new file mode 100644 index 0000000..e4a68b1 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/parser-position.js @@ -0,0 +1,28 @@ +var sax = require("../lib/sax"), + assert = require("assert") + +function testPosition(chunks, expectedEvents) { + var parser = sax.parser(); + expectedEvents.forEach(function(expectation) { + parser['on' + expectation[0]] = function() { + for (var prop in expectation[1]) { + assert.equal(parser[prop], expectation[1][prop]); + } + } + }); + chunks.forEach(function(chunk) { + parser.write(chunk); + }); +}; + +testPosition(['
    abcdefgh
    '], + [ ['opentag', { position: 5, startTagPosition: 1 }] + , ['text', { position: 19, startTagPosition: 14 }] + , ['closetag', { position: 19, startTagPosition: 14 }] + ]); + +testPosition(['
    abcde','fgh
    '], + [ ['opentag', { position: 5, startTagPosition: 1 }] + , ['text', { position: 19, startTagPosition: 14 }] + , ['closetag', { position: 19, startTagPosition: 14 }] + ]); diff --git a/node_modules/cordova-android/node_modules/sax/test/script.js b/node_modules/cordova-android/node_modules/sax/test/script.js new file mode 100644 index 0000000..464c051 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/script.js @@ -0,0 +1,12 @@ +require(__dirname).test({ + xml : "", + expect : [ + ["opentag", {"name": "HTML","attributes": {}}], + ["opentag", {"name": "HEAD","attributes": {}}], + ["opentag", {"name": "SCRIPT","attributes": {}}], + ["script", "if (1 < 0) { console.log('elo there'); }"], + ["closetag", "SCRIPT"], + ["closetag", "HEAD"], + ["closetag", "HTML"] + ] +}); diff --git a/node_modules/cordova-android/node_modules/sax/test/self-closing-child-strict.js b/node_modules/cordova-android/node_modules/sax/test/self-closing-child-strict.js new file mode 100644 index 0000000..ce9c045 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/self-closing-child-strict.js @@ -0,0 +1,40 @@ + +require(__dirname).test({ + xml : + ""+ + "" + + "" + + "" + + "" + + "=(|)" + + "" + + "", + expect : [ + ["opentag", { + "name": "root", + "attributes": {} + }], + ["opentag", { + "name": "child", + "attributes": {} + }], + ["opentag", { + "name": "haha", + "attributes": {} + }], + ["closetag", "haha"], + ["closetag", "child"], + ["opentag", { + "name": "monkey", + "attributes": {} + }], + ["text", "=(|)"], + ["closetag", "monkey"], + ["closetag", "root"], + ["end"], + ["ready"] + ], + strict : true, + opt : {} +}); + diff --git a/node_modules/cordova-android/node_modules/sax/test/self-closing-child.js b/node_modules/cordova-android/node_modules/sax/test/self-closing-child.js new file mode 100644 index 0000000..bc6b52b --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/self-closing-child.js @@ -0,0 +1,40 @@ + +require(__dirname).test({ + xml : + ""+ + "" + + "" + + "" + + "" + + "=(|)" + + "" + + "", + expect : [ + ["opentag", { + "name": "ROOT", + "attributes": {} + }], + ["opentag", { + "name": "CHILD", + "attributes": {} + }], + ["opentag", { + "name": "HAHA", + "attributes": {} + }], + ["closetag", "HAHA"], + ["closetag", "CHILD"], + ["opentag", { + "name": "MONKEY", + "attributes": {} + }], + ["text", "=(|)"], + ["closetag", "MONKEY"], + ["closetag", "ROOT"], + ["end"], + ["ready"] + ], + strict : false, + opt : {} +}); + diff --git a/node_modules/cordova-android/node_modules/sax/test/self-closing-tag.js b/node_modules/cordova-android/node_modules/sax/test/self-closing-tag.js new file mode 100644 index 0000000..b2c5736 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/self-closing-tag.js @@ -0,0 +1,25 @@ + +require(__dirname).test({ + xml : + " "+ + " "+ + " "+ + " "+ + "=(|) "+ + ""+ + " ", + expect : [ + ["opentag", {name:"ROOT", attributes:{}}], + ["opentag", {name:"HAHA", attributes:{}}], + ["closetag", "HAHA"], + ["opentag", {name:"HAHA", attributes:{}}], + ["closetag", "HAHA"], + // ["opentag", {name:"HAHA", attributes:{}}], + // ["closetag", "HAHA"], + ["opentag", {name:"MONKEY", attributes:{}}], + ["text", "=(|)"], + ["closetag", "MONKEY"], + ["closetag", "ROOT"] + ], + opt : { trim : true } +}); \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/sax/test/stray-ending.js b/node_modules/cordova-android/node_modules/sax/test/stray-ending.js new file mode 100644 index 0000000..6b0aa7f --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/stray-ending.js @@ -0,0 +1,17 @@ +// stray ending tags should just be ignored in non-strict mode. +// https://github.com/isaacs/sax-js/issues/32 +require(__dirname).test + ( { xml : + "" + , expect : + [ [ "opentag", { name: "A", attributes: {} } ] + , [ "opentag", { name: "B", attributes: {} } ] + , [ "text", "" ] + , [ "closetag", "B" ] + , [ "closetag", "A" ] + ] + , strict : false + , opt : {} + } + ) + diff --git a/node_modules/cordova-android/node_modules/sax/test/trailing-non-whitespace.js b/node_modules/cordova-android/node_modules/sax/test/trailing-non-whitespace.js new file mode 100644 index 0000000..3e1fb2e --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/trailing-non-whitespace.js @@ -0,0 +1,17 @@ + +require(__dirname).test({ + xml : "Welcome, to monkey land", + expect : [ + ["opentag", { + "name": "SPAN", + "attributes": {} + }], + ["text", "Welcome,"], + ["closetag", "SPAN"], + ["text", " to monkey land"], + ["end"], + ["ready"] + ], + strict : false, + opt : {} +}); diff --git a/node_modules/cordova-android/node_modules/sax/test/unquoted.js b/node_modules/cordova-android/node_modules/sax/test/unquoted.js new file mode 100644 index 0000000..79f1d0b --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/unquoted.js @@ -0,0 +1,17 @@ +// unquoted attributes should be ok in non-strict mode +// https://github.com/isaacs/sax-js/issues/31 +require(__dirname).test + ( { xml : + "" + , expect : + [ [ "attribute", { name: "class", value: "test" } ] + , [ "attribute", { name: "hello", value: "world" } ] + , [ "opentag", { name: "SPAN", + attributes: { class: "test", hello: "world" } } ] + , [ "closetag", "SPAN" ] + ] + , strict : false + , opt : {} + } + ) + diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-issue-41.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-issue-41.js new file mode 100644 index 0000000..596d82b --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-issue-41.js @@ -0,0 +1,67 @@ +var t = require(__dirname) + + , xmls = // should be the same both ways. + [ "" + , "" ] + + , ex1 = + [ [ "opennamespace" + , { prefix: "a" + , uri: "http://ATTRIBUTE" + } + ] + , [ "attribute" + , { name: "xmlns:a" + , value: "http://ATTRIBUTE" + , prefix: "xmlns" + , local: "a" + , uri: "http://www.w3.org/2000/xmlns/" + } + ] + , [ "attribute" + , { name: "a:attr" + , local: "attr" + , prefix: "a" + , uri: "http://ATTRIBUTE" + , value: "value" + } + ] + , [ "opentag" + , { name: "parent" + , uri: "" + , prefix: "" + , local: "parent" + , attributes: + { "a:attr": + { name: "a:attr" + , local: "attr" + , prefix: "a" + , uri: "http://ATTRIBUTE" + , value: "value" + } + , "xmlns:a": + { name: "xmlns:a" + , local: "a" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "http://ATTRIBUTE" + } + } + , ns: {"a": "http://ATTRIBUTE"} + } + ] + , ["closetag", "parent"] + , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }] + ] + + // swap the order of elements 2 and 1 + , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3)) + , expected = [ex1, ex2] + +xmls.forEach(function (x, i) { + t.test({ xml: x + , expect: expected[i] + , strict: true + , opt: { xmlns: true } + }) +}) diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-rebinding.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-rebinding.js new file mode 100644 index 0000000..f464876 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-rebinding.js @@ -0,0 +1,59 @@ + +require(__dirname).test + ( { xml : + ""+ + ""+ + ""+ + ""+ + ""+ + "" + + , expect : + [ [ "opennamespace", { prefix: "x", uri: "x1" } ] + , [ "opennamespace", { prefix: "y", uri: "y1" } ] + , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ] + , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ] + , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "root", uri: "", prefix: "", local: "root", + attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } + , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } + , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x1', y: 'y1' } } ] + + , [ "opennamespace", { prefix: "x", uri: "x2" } ] + , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ] + , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind", + attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } }, + ns: { x: 'x2' } } ] + + , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "check", uri: "", prefix: "", local: "check", + attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x2' } } ] + + , [ "closetag", "check" ] + + , [ "closetag", "rebind" ] + , [ "closenamespace", { prefix: "x", uri: "x2" } ] + + , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "check", uri: "", prefix: "", local: "check", + attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x1', y: 'y1' } } ] + , [ "closetag", "check" ] + + , [ "closetag", "root" ] + , [ "closenamespace", { prefix: "x", uri: "x1" } ] + , [ "closenamespace", { prefix: "y", uri: "y1" } ] + ] + , strict : true + , opt : { xmlns: true } + } + ) + diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-strict.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-strict.js new file mode 100644 index 0000000..4ad615b --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-strict.js @@ -0,0 +1,71 @@ + +require(__dirname).test + ( { xml : + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + "" + + , expect : + [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "", + attributes: {}, ns: {} } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "", + attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } }, + ns: {} } ] + , [ "closetag", "plain" ] + + , [ "opennamespace", { prefix: "", uri: "uri:default" } ] + + , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ] + , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default", + attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } }, + ns: { "": "uri:default" } } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' }, + attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } } } ] + , [ "closetag", "plain" ] + + , [ "closetag", "ns1" ] + + , [ "closenamespace", { prefix: "", uri: "uri:default" } ] + + , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ] + + , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ] + + , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "", + attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } }, + ns: { a: "uri:nsa" } } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "", + attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } }, + ns: { a: 'uri:nsa' } } ] + , [ "closetag", "plain" ] + + , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ] + , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa", + attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } }, + ns: { a: 'uri:nsa' } } ] + , [ "closetag", "a:ns" ] + + , [ "closetag", "ns2" ] + + , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ] + + , [ "closetag", "root" ] + ] + , strict : true + , opt : { xmlns: true } + } + ) + diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-unbound.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-unbound.js new file mode 100644 index 0000000..2944b87 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-unbound.js @@ -0,0 +1,15 @@ + +require(__dirname).test( + { strict : true + , opt : { xmlns: true } + , expect : + [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"] + + , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ] + , [ "opentag", { name: "root", uri: "", prefix: "", local: "root", + attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } }, + ns: {} } ] + , [ "closetag", "root" ] + ] + } +).write("") diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js new file mode 100644 index 0000000..16da771 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js @@ -0,0 +1,35 @@ +require(__dirname).test( + { xml : "" + , expect : + [ [ "attribute" + , { name: "xml:lang" + , local: "lang" + , prefix: "xml" + , uri: "http://www.w3.org/XML/1998/namespace" + , value: "en" + } + ] + , [ "opentag" + , { name: "root" + , uri: "" + , prefix: "" + , local: "root" + , attributes: + { "xml:lang": + { name: "xml:lang" + , local: "lang" + , prefix: "xml" + , uri: "http://www.w3.org/XML/1998/namespace" + , value: "en" + } + } + , ns: {} + } + ] + , ["closetag", "root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix.js new file mode 100644 index 0000000..9a1ce1b --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-prefix.js @@ -0,0 +1,20 @@ +require(__dirname).test( + { xml : "" + , expect : + [ + [ "opentag" + , { name: "xml:root" + , uri: "http://www.w3.org/XML/1998/namespace" + , prefix: "xml" + , local: "root" + , attributes: {} + , ns: {} + } + ] + , ["closetag", "xml:root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-redefine.js b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-redefine.js new file mode 100644 index 0000000..1eba9c7 --- /dev/null +++ b/node_modules/cordova-android/node_modules/sax/test/xmlns-xml-default-redefine.js @@ -0,0 +1,40 @@ +require(__dirname).test( + { xml : "" + , expect : + [ ["error" + , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n" + + "Actual: ERROR\n" + + "Line: 0\nColumn: 27\nChar: '" + ] + , [ "attribute" + , { name: "xmlns:xml" + , local: "xml" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "ERROR" + } + ] + , [ "opentag" + , { name: "xml:root" + , uri: "http://www.w3.org/XML/1998/namespace" + , prefix: "xml" + , local: "root" + , attributes: + { "xmlns:xml": + { name: "xmlns:xml" + , local: "xml" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "ERROR" + } + } + , ns: {} + } + ] + , ["closetag", "xml:root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/node_modules/cordova-android/node_modules/semver/LICENSE b/node_modules/cordova-android/node_modules/semver/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/semver/README.md b/node_modules/cordova-android/node_modules/semver/README.md new file mode 100644 index 0000000..951c539 --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/README.md @@ -0,0 +1,388 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install --save semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +SemVer 5.3.0 + +A JavaScript implementation of the http://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `loose` boolean argument that, if +true, will be more forgiving about not-quite-valid semver strings. +The resulting output will always be 100% strict, of course. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver +string to semver. It looks for the first digit in a string, and +consumes all remaining characters which satisfy at least a partial semver +(e.g., `1`, `1.2`, `1.2.3`) up to the max permitted length (256 characters). +Longer versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). +All surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes `3.4.0`). +Only text which lacks digits will fail coercion (`version one` is not valid). +The maximum length for any semver component considered for coercion is 16 characters; +longer components will be ignored (`10000000000000000.4.7.4` becomes `4.7.4`). +The maximum value for any semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; +higher value components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/cordova-android/node_modules/semver/bin/semver b/node_modules/cordova-android/node_modules/semver/bin/semver new file mode 100755 index 0000000..dddbcdf --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/bin/semver @@ -0,0 +1,143 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + , versions = [] + , range = [] + , gt = [] + , lt = [] + , eq = [] + , inc = null + , version = require("../package.json").version + , loose = false + , coerce = false + , identifier = undefined + , semver = require("../semver") + , reverse = false + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var i = a.indexOf('=') + if (i !== -1) { + a = a.slice(0, i) + argv.unshift(a.slice(i + 1)) + } + switch (a) { + case "-rv": case "-rev": case "--rev": case "--reverse": + reverse = true + break + case "-l": case "--loose": + loose = true + break + case "-v": case "--version": + versions.push(argv.shift()) + break + case "-i": case "--inc": case "--increment": + switch (argv[0]) { + case "major": case "minor": case "patch": case "prerelease": + case "premajor": case "preminor": case "prepatch": + inc = argv.shift() + break + default: + inc = "patch" + break + } + break + case "--preid": + identifier = argv.shift() + break + case "-r": case "--range": + range.push(argv.shift()) + break + case "-c": case "--coerce": + coerce = true + break + case "-h": case "--help": case "-?": + return help() + default: + versions.push(a) + break + } + } + + versions = versions.map(function (v) { + return coerce ? (semver.coerce(v) || {version: v}).version : v + }).filter(function (v) { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) + return failInc() + + for (var i = 0, l = range.length; i < l ; i ++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], loose) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error("--inc can only be used on a single version with no range") + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? "rcompare" : "compare" + versions.sort(function (a, b) { + return semver[compare](a, b, loose) + }).map(function (v) { + return semver.clean(v, loose) + }).map(function (v) { + return inc ? semver.inc(v, inc, loose, identifier) : v + }).forEach(function (v,i,_) { console.log(v) }) +} + +function help () { + console.log(["SemVer " + version + ,"" + ,"A JavaScript implementation of the http://semver.org/ specification" + ,"Copyright Isaac Z. Schlueter" + ,"" + ,"Usage: semver [options] [ [...]]" + ,"Prints valid versions sorted by SemVer precedence" + ,"" + ,"Options:" + ,"-r --range " + ," Print versions that match the specified range." + ,"" + ,"-i --increment []" + ," Increment a version by the specified level. Level can" + ," be one of: major, minor, patch, premajor, preminor," + ," prepatch, or prerelease. Default level is 'patch'." + ," Only one version may be specified." + ,"" + ,"--preid " + ," Identifier to be used to prefix premajor, preminor," + ," prepatch or prerelease version increments." + ,"" + ,"-l --loose" + ," Interpret versions and ranges loosely" + ,"" + ,"-c --coerce" + ," Coerce a string into SemVer if possible" + ," (does not imply --loose)" + ,"" + ,"Program exits successfully if any valid version satisfies" + ,"all supplied ranges, and prints all satisfying versions." + ,"" + ,"If no satisfying versions are found, then exits failure." + ,"" + ,"Versions are printed in ascending order, so supplying" + ,"multiple versions to the utility will just sort them." + ].join("\n")) +} diff --git a/node_modules/cordova-android/node_modules/semver/package.json b/node_modules/cordova-android/node_modules/semver/package.json new file mode 100644 index 0000000..070e2f6 --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/package.json @@ -0,0 +1,55 @@ +{ + "_from": "semver@^5.4.1", + "_id": "semver@5.5.0", + "_inBundle": true, + "_integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "_location": "/cordova-android/semver", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "semver@^5.4.1", + "name": "semver", + "escapedName": "semver", + "rawSpec": "^5.4.1", + "saveSpec": null, + "fetchSpec": "^5.4.1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/android-versions" + ], + "_resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "_shasum": "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab", + "_spec": "semver@^5.4.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/android-versions", + "bin": { + "semver": "./bin/semver" + }, + "bugs": { + "url": "https://github.com/npm/node-semver/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The semantic version parser used by npm.", + "devDependencies": { + "tap": "^10.7.0" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ], + "homepage": "https://github.com/npm/node-semver#readme", + "license": "ISC", + "main": "semver.js", + "name": "semver", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "scripts": { + "test": "tap test/*.js --cov -J" + }, + "version": "5.5.0" +} diff --git a/node_modules/cordova-android/node_modules/semver/range.bnf b/node_modules/cordova-android/node_modules/semver/range.bnf new file mode 100644 index 0000000..d4c6ae0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/cordova-android/node_modules/semver/semver.js b/node_modules/cordova-android/node_modules/semver/semver.js new file mode 100644 index 0000000..9cf9f6e --- /dev/null +++ b/node_modules/cordova-android/node_modules/semver/semver.js @@ -0,0 +1,1324 @@ +exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +var MAX_LENGTH = 256; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++; +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + if (version.length > MAX_LENGTH) + return null; + + var r = loose ? re[LOOSE] : re[FULL]; + if (!r.test(version)) + return null; + + try { + return new SemVer(version, loose); + } catch (er) { + return null; + } +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (version.length > MAX_LENGTH) + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) + throw new TypeError('Invalid major version') + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) + throw new TypeError('Invalid minor version') + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) + throw new TypeError('Invalid patch version') + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) + return num; + } + return id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break; + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) + this.prerelease = [identifier, 0]; + } else + this.prerelease = [identifier, 0]; + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + this.raw = this.version; + return this; +}; + +exports.inc = inc; +function inc(version, release, loose, identifier) { + if (typeof(loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version; + } catch (er) { + return null; + } +} + +exports.diff = diff; +function diff(version1, version2) { + if (eq(version1, version2)) { + return null; + } else { + var v1 = parse(version1); + var v2 = parse(version2); + if (v1.prerelease.length || v2.prerelease.length) { + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return 'pre'+key; + } + } + } + return 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return key; + } + } + } + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.major = major; +function major(a, loose) { + return new SemVer(a, loose).major; +} + +exports.minor = minor; +function minor(a, loose) { + return new SemVer(a, loose).minor; +} + +exports.patch = patch; +function patch(a, loose) { + return new SemVer(a, loose).patch; +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; + + debug('comp', this); +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else + this.semver = new SemVer(m[2], this.loose); +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); +}; + +Comparator.prototype.intersects = function(comp, loose) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required'); + } + + var rangeTmp; + + if (this.operator === '') { + rangeTmp = new Range(comp.value, loose); + return satisfies(this.value, rangeTmp, loose); + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, loose); + return satisfies(comp.semver, rangeTmp, loose); + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>'); + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<'); + var sameSemVer = this.semver.version === comp.semver.version; + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<='); + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, loose) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')); + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, loose) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')); + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; +}; + + +exports.Range = Range; +function Range(range, loose) { + if (range instanceof Range) { + if (range.loose === loose) { + return range; + } else { + return new Range(range.raw, loose); + } + } + + if (range instanceof Comparator) { + return new Range(range.value, loose); + } + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +Range.prototype.intersects = function(range, loose) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required'); + } + + return this.set.some(function(thisComparators) { + return thisComparators.every(function(thisComparator) { + return range.set.some(function(rangeComparators) { + return rangeComparators.every(function(rangeComparator) { + return thisComparator.intersects(rangeComparator, loose); + }); + }); + }); + }); +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + debug('caret', comp, loose); + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } else if (pr) { + debug('replaceCaret pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0'; + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // replace X with 0 + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) + M = +M + 1; + else + m = +m + 1; + } + + ret = gtlt + M + '.' + m + '.' + p; + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + continue; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + var max = null; + var maxSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) + max = v; + maxSV = new SemVer(max, loose); + } + } + }) + return max; +} + +exports.minSatisfying = minSatisfying; +function minSatisfying(versions, range, loose) { + var min = null; + var minSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!min || minSV.compare(v) === 1) { // compare(min, v, true) + min = v; + minSV = new SemVer(min, loose); + } + } + }) + return min; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +exports.prerelease = prerelease; +function prerelease(version, loose) { + var parsed = parse(version, loose); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; +} + +exports.intersects = intersects; +function intersects(r1, r2, loose) { + r1 = new Range(r1, loose) + r2 = new Range(r2, loose) + return r1.intersects(r2) +} + +exports.coerce = coerce; +function coerce(version) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + var match = version.match(re[COERCE]); + + if (match == null) + return null; + + return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); +} diff --git a/node_modules/cordova-android/node_modules/shelljs/.documentup.json b/node_modules/cordova-android/node_modules/shelljs/.documentup.json new file mode 100644 index 0000000..57fe301 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/.documentup.json @@ -0,0 +1,6 @@ +{ + "name": "ShellJS", + "twitter": [ + "r2r" + ] +} diff --git a/node_modules/cordova-android/node_modules/shelljs/.jshintrc b/node_modules/cordova-android/node_modules/shelljs/.jshintrc new file mode 100644 index 0000000..a80c559 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/.jshintrc @@ -0,0 +1,7 @@ +{ + "loopfunc": true, + "sub": true, + "undef": true, + "unused": true, + "node": true +} \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/shelljs/.npmignore b/node_modules/cordova-android/node_modules/shelljs/.npmignore new file mode 100644 index 0000000..6b20c38 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/.npmignore @@ -0,0 +1,2 @@ +test/ +tmp/ \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/shelljs/.travis.yml b/node_modules/cordova-android/node_modules/shelljs/.travis.yml new file mode 100644 index 0000000..1b3280a --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.10" + - "0.11" + - "0.12" + diff --git a/node_modules/cordova-android/node_modules/shelljs/LICENSE b/node_modules/cordova-android/node_modules/shelljs/LICENSE new file mode 100644 index 0000000..1b35ee9 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/cordova-android/node_modules/shelljs/README.md b/node_modules/cordova-android/node_modules/shelljs/README.md new file mode 100644 index 0000000..d08d13e --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/README.md @@ -0,0 +1,579 @@ +# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs) + +ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! + +The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like: + ++ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader ++ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger ++ [JSHint](http://jshint.com) - Most popular JavaScript linter ++ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers ++ [Yeoman](http://yeoman.io/) - Web application stack and development tool ++ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation + +and [many more](https://npmjs.org/browse/depended/shelljs). + +Connect with [@r2r](http://twitter.com/r2r) on Twitter for questions, suggestions, etc. + +## Installing + +Via npm: + +```bash +$ npm install [-g] shelljs +``` + +If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to +run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: + +```bash +$ shjs my_script +``` + +You can also just copy `shell.js` into your project's directory, and `require()` accordingly. + + +## Examples + +### JavaScript + +```javascript +require('shelljs/global'); + +if (!which('git')) { + echo('Sorry, this script requires git'); + exit(1); +} + +// Copy files to release dir +mkdir('-p', 'out/Release'); +cp('-R', 'stuff/*', 'out/Release'); + +// Replace macros in each .js file +cd('lib'); +ls('*.js').forEach(function(file) { + sed('-i', 'BUILD_VERSION', 'v0.1.2', file); + sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); + sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); +}); +cd('..'); + +// Run external tool synchronously +if (exec('git commit -am "Auto-commit"').code !== 0) { + echo('Error: Git commit failed'); + exit(1); +} +``` + +### CoffeeScript + +```coffeescript +require 'shelljs/global' + +if not which 'git' + echo 'Sorry, this script requires git' + exit 1 + +# Copy files to release dir +mkdir '-p', 'out/Release' +cp '-R', 'stuff/*', 'out/Release' + +# Replace macros in each .js file +cd 'lib' +for file in ls '*.js' + sed '-i', 'BUILD_VERSION', 'v0.1.2', file + sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file + sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file +cd '..' + +# Run external tool synchronously +if (exec 'git commit -am "Auto-commit"').code != 0 + echo 'Error: Git commit failed' + exit 1 +``` + +## Global vs. Local + +The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. + +Example: + +```javascript +var shell = require('shelljs'); +shell.echo('hello world'); +``` + +## Make tool + +A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script. + +Example (CoffeeScript): + +```coffeescript +require 'shelljs/make' + +target.all = -> + target.bundle() + target.docs() + +target.bundle = -> + cd __dirname + mkdir 'build' + cd 'lib' + (cat '*.js').to '../build/output.js' + +target.docs = -> + cd __dirname + mkdir 'docs' + cd 'lib' + for file in ls '*.js' + text = grep '//@', file # extract special comments + text.replace '//@', '' # remove comment tags + text.to 'docs/my_docs.md' +``` + +To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`. + +You can also pass arguments to your targets by using the `--` separator. For example, to pass `arg1` and `arg2` to a target `bundle`, do `$ node make bundle -- arg1 arg2`: + +```javascript +require('shelljs/make'); + +target.bundle = function(argsArray) { + // argsArray = ['arg1', 'arg2'] + /* ... */ +} +``` + + + + + +## Command reference + + +All commands run synchronously, unless otherwise stated. + + +### cd('dir') +Changes to directory `dir` for the duration of the script + + +### pwd() +Returns the current directory. + + +### ls([options ,] path [,path ...]) +### ls([options ,] path_array) +Available options: + ++ `-R`: recursive ++ `-A`: all files (include files beginning with `.`, except for `.` and `..`) + +Examples: + +```javascript +ls('projs/*.js'); +ls('-R', '/users/me', '/tmp'); +ls('-R', ['/users/me', '/tmp']); // same as above +``` + +Returns array of files in the given path, or in current directory if no path provided. + + +### find(path [,path ...]) +### find(path_array) +Examples: + +```javascript +find('src', 'lib'); +find(['src', 'lib']); // same as above +find('.').filter(function(file) { return file.match(/\.js$/); }); +``` + +Returns array of all files (however deep) in the given paths. + +The main difference from `ls('-R', path)` is that the resulting file names +include the base directories, e.g. `lib/resources/file1` instead of just `file1`. + + +### cp([options ,] source [,source ...], dest) +### cp([options ,] source_array, dest) +Available options: + ++ `-f`: force ++ `-r, -R`: recursive + +Examples: + +```javascript +cp('file1', 'dir1'); +cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); +cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above +``` + +Copies files. The wildcard `*` is accepted. + + +### rm([options ,] file [, file ...]) +### rm([options ,] file_array) +Available options: + ++ `-f`: force ++ `-r, -R`: recursive + +Examples: + +```javascript +rm('-rf', '/tmp/*'); +rm('some_file.txt', 'another_file.txt'); +rm(['some_file.txt', 'another_file.txt']); // same as above +``` + +Removes files. The wildcard `*` is accepted. + + +### mv(source [, source ...], dest') +### mv(source_array, dest') +Available options: + ++ `f`: force + +Examples: + +```javascript +mv('-f', 'file', 'dir/'); +mv('file1', 'file2', 'dir/'); +mv(['file1', 'file2'], 'dir/'); // same as above +``` + +Moves files. The wildcard `*` is accepted. + + +### mkdir([options ,] dir [, dir ...]) +### mkdir([options ,] dir_array) +Available options: + ++ `p`: full path (will create intermediate dirs if necessary) + +Examples: + +```javascript +mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); +mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above +``` + +Creates directories. + + +### test(expression) +Available expression primaries: + ++ `'-b', 'path'`: true if path is a block device ++ `'-c', 'path'`: true if path is a character device ++ `'-d', 'path'`: true if path is a directory ++ `'-e', 'path'`: true if path exists ++ `'-f', 'path'`: true if path is a regular file ++ `'-L', 'path'`: true if path is a symbolic link ++ `'-p', 'path'`: true if path is a pipe (FIFO) ++ `'-S', 'path'`: true if path is a socket + +Examples: + +```javascript +if (test('-d', path)) { /* do something with dir */ }; +if (!test('-f', path)) continue; // skip if it's a regular file +``` + +Evaluates expression using the available primaries and returns corresponding value. + + +### cat(file [, file ...]) +### cat(file_array) + +Examples: + +```javascript +var str = cat('file*.txt'); +var str = cat('file1', 'file2'); +var str = cat(['file1', 'file2']); // same as above +``` + +Returns a string containing the given file, or a concatenated string +containing the files if more than one file is given (a new line character is +introduced between each file). Wildcard `*` accepted. + + +### 'string'.to(file) + +Examples: + +```javascript +cat('input.txt').to('output.txt'); +``` + +Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as +those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ + + +### 'string'.toEnd(file) + +Examples: + +```javascript +cat('input.txt').toEnd('output.txt'); +``` + +Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as +those returned by `cat`, `grep`, etc). + + +### sed([options ,] search_regex, replacement, file) +Available options: + ++ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ + +Examples: + +```javascript +sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); +sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); +``` + +Reads an input string from `file` and performs a JavaScript `replace()` on the input +using the given search regex and replacement string or function. Returns the new string after replacement. + + +### grep([options ,] regex_filter, file [, file ...]) +### grep([options ,] regex_filter, file_array) +Available options: + ++ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. + +Examples: + +```javascript +grep('-v', 'GLOBAL_VARIABLE', '*.js'); +grep('GLOBAL_VARIABLE', '*.js'); +``` + +Reads input string from given files and returns a string containing all lines of the +file that match the given `regex_filter`. Wildcard `*` accepted. + + +### which(command) + +Examples: + +```javascript +var nodeExec = which('node'); +``` + +Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. +Returns string containing the absolute path to the command. + + +### echo(string [,string ...]) + +Examples: + +```javascript +echo('hello world'); +var str = echo('hello world'); +``` + +Prints string to stdout, and returns string with additional utility methods +like `.to()`. + + +### pushd([options,] [dir | '-N' | '+N']) + +Available options: + ++ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. + +Arguments: + ++ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. ++ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. ++ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. + +Examples: + +```javascript +// process.cwd() === '/usr' +pushd('/etc'); // Returns /etc /usr +pushd('+1'); // Returns /usr /etc +``` + +Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. + +### popd([options,] ['-N' | '+N']) + +Available options: + ++ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. + +Arguments: + ++ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. ++ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. + +Examples: + +```javascript +echo(process.cwd()); // '/usr' +pushd('/etc'); // '/etc /usr' +echo(process.cwd()); // '/etc' +popd(); // '/usr' +echo(process.cwd()); // '/usr' +``` + +When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. + +### dirs([options | '+N' | '-N']) + +Available options: + ++ `-c`: Clears the directory stack by deleting all of the elements. + +Arguments: + ++ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. ++ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. + +Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. + +See also: pushd, popd + + +### ln(options, source, dest) +### ln(source, dest) +Available options: + ++ `s`: symlink ++ `f`: force + +Examples: + +```javascript +ln('file', 'newlink'); +ln('-sf', 'file', 'existing'); +``` + +Links source to dest. Use -f to force the link, should dest already exist. + + +### exit(code) +Exits the current process with the given exit code. + +### env['VAR_NAME'] +Object containing environment variables (both getter and setter). Shortcut to process.env. + +### exec(command [, options] [, callback]) +Available options (all `false` by default): + ++ `async`: Asynchronous execution. Defaults to true if a callback is provided. ++ `silent`: Do not echo program output to console. + +Examples: + +```javascript +var version = exec('node --version', {silent:true}).output; + +var child = exec('some_long_running_process', {async:true}); +child.stdout.on('data', function(data) { + /* ... do something with data ... */ +}); + +exec('some_long_running_process', function(code, output) { + console.log('Exit code:', code); + console.log('Program output:', output); +}); +``` + +Executes the given `command` _synchronously_, unless otherwise specified. +When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's +`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and +the `callback` gets the arguments `(code, output)`. + +**Note:** For long-lived processes, it's best to run `exec()` asynchronously as +the current synchronous implementation uses a lot of CPU. This should be getting +fixed soon. + + +### chmod(octal_mode || octal_string, file) +### chmod(symbolic_mode, file) + +Available options: + ++ `-v`: output a diagnostic for every file processed ++ `-c`: like verbose but report only when a change is made ++ `-R`: change files and directories recursively + +Examples: + +```javascript +chmod(755, '/Users/brandon'); +chmod('755', '/Users/brandon'); // same as above +chmod('u+x', '/Users/brandon'); +``` + +Alters the permissions of a file or directory by either specifying the +absolute permissions in octal form or expressing the changes in symbols. +This command tries to mimic the POSIX behavior as much as possible. +Notable exceptions: + ++ In symbolic modes, 'a-r' and '-r' are identical. No consideration is + given to the umask. ++ There is no "quiet" option since default behavior is to run silent. + + +## Non-Unix commands + + +### tempdir() + +Examples: + +```javascript +var tmp = tempdir(); // "/tmp" for most *nix platforms +``` + +Searches and returns string containing a writeable, platform-dependent temporary directory. +Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). + + +### error() +Tests if error occurred in the last command. Returns `null` if no error occurred, +otherwise returns string explaining the error + + +## Configuration + + +### config.silent +Example: + +```javascript +var sh = require('shelljs'); +var silentState = sh.config.silent; // save old silent state +sh.config.silent = true; +/* ... */ +sh.config.silent = silentState; // restore old silent state +``` + +Suppresses all command output if `true`, except for `echo()` calls. +Default is `false`. + +### config.fatal +Example: + +```javascript +require('shelljs/global'); +config.fatal = true; +cp('this_file_does_not_exist', '/dev/null'); // dies here +/* more commands... */ +``` + +If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/cordova-android/node_modules/shelljs/RELEASE.md b/node_modules/cordova-android/node_modules/shelljs/RELEASE.md new file mode 100644 index 0000000..69ef3fb --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/RELEASE.md @@ -0,0 +1,9 @@ +# Release steps + +* Ensure master passes CI tests +* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch. +* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js` +* Commit +* `$ git tag ` (see `git tag -l` for latest) +* `$ git push origin master --tags` +* `$ npm publish .` diff --git a/node_modules/cordova-android/node_modules/shelljs/bin/shjs b/node_modules/cordova-android/node_modules/shelljs/bin/shjs new file mode 100755 index 0000000..d239a7a --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/bin/shjs @@ -0,0 +1,51 @@ +#!/usr/bin/env node +require('../global'); + +if (process.argv.length < 3) { + console.log('ShellJS: missing argument (script name)'); + console.log(); + process.exit(1); +} + +var args, + scriptName = process.argv[2]; +env['NODE_PATH'] = __dirname + '/../..'; + +if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { + if (test('-f', scriptName + '.js')) + scriptName += '.js'; + if (test('-f', scriptName + '.coffee')) + scriptName += '.coffee'; +} + +if (!test('-f', scriptName)) { + console.log('ShellJS: script not found ('+scriptName+')'); + console.log(); + process.exit(1); +} + +args = process.argv.slice(3); + +for (var i = 0, l = args.length; i < l; i++) { + if (args[i][0] !== "-"){ + args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words + } +} + +if (scriptName.match(/\.coffee$/)) { + // + // CoffeeScript + // + if (which('coffee')) { + exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true }); + } else { + console.log('ShellJS: CoffeeScript interpreter not found'); + console.log(); + process.exit(1); + } +} else { + // + // JavaScript + // + exec('node ' + scriptName + ' ' + args.join(' '), { async: true }); +} diff --git a/node_modules/cordova-android/node_modules/shelljs/global.js b/node_modules/cordova-android/node_modules/shelljs/global.js new file mode 100644 index 0000000..97f0033 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/global.js @@ -0,0 +1,3 @@ +var shell = require('./shell.js'); +for (var cmd in shell) + global[cmd] = shell[cmd]; diff --git a/node_modules/cordova-android/node_modules/shelljs/make.js b/node_modules/cordova-android/node_modules/shelljs/make.js new file mode 100644 index 0000000..f78b4cf --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/make.js @@ -0,0 +1,56 @@ +require('./global'); + +global.config.fatal = true; +global.target = {}; + +var args = process.argv.slice(2), + targetArgs, + dashesLoc = args.indexOf('--'); + +// split args, everything after -- if only for targets +if (dashesLoc > -1) { + targetArgs = args.slice(dashesLoc + 1, args.length); + args = args.slice(0, dashesLoc); +} + +// This ensures we only execute the script targets after the entire script has +// been evaluated +setTimeout(function() { + var t; + + if (args.length === 1 && args[0] === '--help') { + console.log('Available targets:'); + for (t in global.target) + console.log(' ' + t); + return; + } + + // Wrap targets to prevent duplicate execution + for (t in global.target) { + (function(t, oldTarget){ + + // Wrap it + global.target[t] = function() { + if (oldTarget.done) + return; + oldTarget.done = true; + return oldTarget.apply(oldTarget, arguments); + }; + + })(t, global.target[t]); + } + + // Execute desired targets + if (args.length > 0) { + args.forEach(function(arg) { + if (arg in global.target) + global.target[arg](targetArgs); + else { + console.log('no such target: ' + arg); + } + }); + } else if ('all' in global.target) { + global.target.all(targetArgs); + } + +}, 0); diff --git a/node_modules/cordova-android/node_modules/shelljs/package.json b/node_modules/cordova-android/node_modules/shelljs/package.json new file mode 100644 index 0000000..e9fa4e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/package.json @@ -0,0 +1,67 @@ +{ + "_from": "shelljs@0.5.3", + "_id": "shelljs@0.5.3", + "_inBundle": true, + "_integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=", + "_location": "/cordova-android/shelljs", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "shelljs@0.5.3", + "name": "shelljs", + "escapedName": "shelljs", + "rawSpec": "0.5.3", + "saveSpec": null, + "fetchSpec": "0.5.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", + "_shasum": "c54982b996c76ef0c1e6b59fbdc5825f5b713113", + "_spec": "shelljs@0.5.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Artur Adib", + "email": "arturadib@gmail.com" + }, + "bin": { + "shjs": "./bin/shjs" + }, + "bugs": { + "url": "https://github.com/arturadib/shelljs/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Portable Unix shell commands for Node.js", + "devDependencies": { + "jshint": "~2.1.11" + }, + "engines": { + "node": ">=0.8.0" + }, + "homepage": "http://github.com/arturadib/shelljs", + "keywords": [ + "unix", + "shell", + "makefile", + "make", + "jake", + "synchronous" + ], + "license": "BSD*", + "main": "./shell.js", + "name": "shelljs", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git://github.com/arturadib/shelljs.git" + }, + "scripts": { + "test": "node scripts/run-tests" + }, + "version": "0.5.3" +} diff --git a/node_modules/cordova-android/node_modules/shelljs/scripts/generate-docs.js b/node_modules/cordova-android/node_modules/shelljs/scripts/generate-docs.js new file mode 100755 index 0000000..532fed9 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/scripts/generate-docs.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node +require('../global'); + +echo('Appending docs to README.md'); + +cd(__dirname + '/..'); + +// Extract docs from shell.js +var docs = grep('//@', 'shell.js'); + +docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) { + var file = path.match('.js$') ? path : path+'.js'; + return grep('//@', file); +}); + +// Remove '//@' +docs = docs.replace(/\/\/\@ ?/g, ''); +// Append docs to README +sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md'); + +echo('All done.'); diff --git a/node_modules/cordova-android/node_modules/shelljs/scripts/run-tests.js b/node_modules/cordova-android/node_modules/shelljs/scripts/run-tests.js new file mode 100755 index 0000000..f9d31e0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/scripts/run-tests.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node +require('../global'); + +var path = require('path'); + +var failed = false; + +// +// Lint +// +JSHINT_BIN = './node_modules/jshint/bin/jshint'; +cd(__dirname + '/..'); + +if (!test('-f', JSHINT_BIN)) { + echo('JSHint not found. Run `npm install` in the root dir first.'); + exit(1); +} + +if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) { + failed = true; + echo('*** JSHINT FAILED! (return code != 0)'); + echo(); +} else { + echo('All JSHint tests passed'); + echo(); +} + +// +// Unit tests +// +cd(__dirname + '/../test'); +ls('*.js').forEach(function(file) { + echo('Running test:', file); + if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) + failed = true; + echo('*** TEST FAILED! (missing exit code "123")'); + echo(); + } +}); + +if (failed) { + echo(); + echo('*******************************************************'); + echo('WARNING: Some tests did not pass!'); + echo('*******************************************************'); + exit(1); +} else { + echo(); + echo('All tests passed.'); +} diff --git a/node_modules/cordova-android/node_modules/shelljs/shell.js b/node_modules/cordova-android/node_modules/shelljs/shell.js new file mode 100644 index 0000000..bdeb559 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/shell.js @@ -0,0 +1,159 @@ +// +// ShellJS +// Unix shell commands on top of Node's API +// +// Copyright (c) 2012 Artur Adib +// http://github.com/arturadib/shelljs +// + +var common = require('./src/common'); + + +//@ +//@ All commands run synchronously, unless otherwise stated. +//@ + +//@include ./src/cd +var _cd = require('./src/cd'); +exports.cd = common.wrap('cd', _cd); + +//@include ./src/pwd +var _pwd = require('./src/pwd'); +exports.pwd = common.wrap('pwd', _pwd); + +//@include ./src/ls +var _ls = require('./src/ls'); +exports.ls = common.wrap('ls', _ls); + +//@include ./src/find +var _find = require('./src/find'); +exports.find = common.wrap('find', _find); + +//@include ./src/cp +var _cp = require('./src/cp'); +exports.cp = common.wrap('cp', _cp); + +//@include ./src/rm +var _rm = require('./src/rm'); +exports.rm = common.wrap('rm', _rm); + +//@include ./src/mv +var _mv = require('./src/mv'); +exports.mv = common.wrap('mv', _mv); + +//@include ./src/mkdir +var _mkdir = require('./src/mkdir'); +exports.mkdir = common.wrap('mkdir', _mkdir); + +//@include ./src/test +var _test = require('./src/test'); +exports.test = common.wrap('test', _test); + +//@include ./src/cat +var _cat = require('./src/cat'); +exports.cat = common.wrap('cat', _cat); + +//@include ./src/to +var _to = require('./src/to'); +String.prototype.to = common.wrap('to', _to); + +//@include ./src/toEnd +var _toEnd = require('./src/toEnd'); +String.prototype.toEnd = common.wrap('toEnd', _toEnd); + +//@include ./src/sed +var _sed = require('./src/sed'); +exports.sed = common.wrap('sed', _sed); + +//@include ./src/grep +var _grep = require('./src/grep'); +exports.grep = common.wrap('grep', _grep); + +//@include ./src/which +var _which = require('./src/which'); +exports.which = common.wrap('which', _which); + +//@include ./src/echo +var _echo = require('./src/echo'); +exports.echo = _echo; // don't common.wrap() as it could parse '-options' + +//@include ./src/dirs +var _dirs = require('./src/dirs').dirs; +exports.dirs = common.wrap("dirs", _dirs); +var _pushd = require('./src/dirs').pushd; +exports.pushd = common.wrap('pushd', _pushd); +var _popd = require('./src/dirs').popd; +exports.popd = common.wrap("popd", _popd); + +//@include ./src/ln +var _ln = require('./src/ln'); +exports.ln = common.wrap('ln', _ln); + +//@ +//@ ### exit(code) +//@ Exits the current process with the given exit code. +exports.exit = process.exit; + +//@ +//@ ### env['VAR_NAME'] +//@ Object containing environment variables (both getter and setter). Shortcut to process.env. +exports.env = process.env; + +//@include ./src/exec +var _exec = require('./src/exec'); +exports.exec = common.wrap('exec', _exec, {notUnix:true}); + +//@include ./src/chmod +var _chmod = require('./src/chmod'); +exports.chmod = common.wrap('chmod', _chmod); + + + +//@ +//@ ## Non-Unix commands +//@ + +//@include ./src/tempdir +var _tempDir = require('./src/tempdir'); +exports.tempdir = common.wrap('tempdir', _tempDir); + + +//@include ./src/error +var _error = require('./src/error'); +exports.error = _error; + + + +//@ +//@ ## Configuration +//@ + +exports.config = common.config; + +//@ +//@ ### config.silent +//@ Example: +//@ +//@ ```javascript +//@ var sh = require('shelljs'); +//@ var silentState = sh.config.silent; // save old silent state +//@ sh.config.silent = true; +//@ /* ... */ +//@ sh.config.silent = silentState; // restore old silent state +//@ ``` +//@ +//@ Suppresses all command output if `true`, except for `echo()` calls. +//@ Default is `false`. + +//@ +//@ ### config.fatal +//@ Example: +//@ +//@ ```javascript +//@ require('shelljs/global'); +//@ config.fatal = true; +//@ cp('this_file_does_not_exist', '/dev/null'); // dies here +//@ /* more commands... */ +//@ ``` +//@ +//@ If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/cordova-android/node_modules/shelljs/src/cat.js b/node_modules/cordova-android/node_modules/shelljs/src/cat.js new file mode 100644 index 0000000..f6f4d25 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/cat.js @@ -0,0 +1,43 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### cat(file [, file ...]) +//@ ### cat(file_array) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var str = cat('file*.txt'); +//@ var str = cat('file1', 'file2'); +//@ var str = cat(['file1', 'file2']); // same as above +//@ ``` +//@ +//@ Returns a string containing the given file, or a concatenated string +//@ containing the files if more than one file is given (a new line character is +//@ introduced between each file). Wildcard `*` accepted. +function _cat(options, files) { + var cat = ''; + + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 1); + // if it's array leave it as it is + + files = common.expand(files); + + files.forEach(function(file) { + if (!fs.existsSync(file)) + common.error('no such file or directory: ' + file); + + cat += fs.readFileSync(file, 'utf8') + '\n'; + }); + + if (cat[cat.length-1] === '\n') + cat = cat.substring(0, cat.length-1); + + return common.ShellString(cat); +} +module.exports = _cat; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/cd.js b/node_modules/cordova-android/node_modules/shelljs/src/cd.js new file mode 100644 index 0000000..230f432 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/cd.js @@ -0,0 +1,19 @@ +var fs = require('fs'); +var common = require('./common'); + +//@ +//@ ### cd('dir') +//@ Changes to directory `dir` for the duration of the script +function _cd(options, dir) { + if (!dir) + common.error('directory not specified'); + + if (!fs.existsSync(dir)) + common.error('no such file or directory: ' + dir); + + if (!fs.statSync(dir).isDirectory()) + common.error('not a directory: ' + dir); + + process.chdir(dir); +} +module.exports = _cd; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/chmod.js b/node_modules/cordova-android/node_modules/shelljs/src/chmod.js new file mode 100644 index 0000000..f288893 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/chmod.js @@ -0,0 +1,208 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +var PERMS = (function (base) { + return { + OTHER_EXEC : base.EXEC, + OTHER_WRITE : base.WRITE, + OTHER_READ : base.READ, + + GROUP_EXEC : base.EXEC << 3, + GROUP_WRITE : base.WRITE << 3, + GROUP_READ : base.READ << 3, + + OWNER_EXEC : base.EXEC << 6, + OWNER_WRITE : base.WRITE << 6, + OWNER_READ : base.READ << 6, + + // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is + // the preferred way, else a jshint warning is thrown. + STICKY : parseInt('01000', 8), + SETGID : parseInt('02000', 8), + SETUID : parseInt('04000', 8), + + TYPE_MASK : parseInt('0770000', 8) + }; +})({ + EXEC : 1, + WRITE : 2, + READ : 4 +}); + +//@ +//@ ### chmod(octal_mode || octal_string, file) +//@ ### chmod(symbolic_mode, file) +//@ +//@ Available options: +//@ +//@ + `-v`: output a diagnostic for every file processed//@ +//@ + `-c`: like verbose but report only when a change is made//@ +//@ + `-R`: change files and directories recursively//@ +//@ +//@ Examples: +//@ +//@ ```javascript +//@ chmod(755, '/Users/brandon'); +//@ chmod('755', '/Users/brandon'); // same as above +//@ chmod('u+x', '/Users/brandon'); +//@ ``` +//@ +//@ Alters the permissions of a file or directory by either specifying the +//@ absolute permissions in octal form or expressing the changes in symbols. +//@ This command tries to mimic the POSIX behavior as much as possible. +//@ Notable exceptions: +//@ +//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is +//@ given to the umask. +//@ + There is no "quiet" option since default behavior is to run silent. +function _chmod(options, mode, filePattern) { + if (!filePattern) { + if (options.length > 0 && options.charAt(0) === '-') { + // Special case where the specified file permissions started with - to subtract perms, which + // get picked up by the option parser as command flags. + // If we are down by one argument and options starts with -, shift everything over. + filePattern = mode; + mode = options; + options = ''; + } + else { + common.error('You must specify a file.'); + } + } + + options = common.parseOptions(options, { + 'R': 'recursive', + 'c': 'changes', + 'v': 'verbose' + }); + + if (typeof filePattern === 'string') { + filePattern = [ filePattern ]; + } + + var files; + + if (options.recursive) { + files = []; + common.expand(filePattern).forEach(function addFile(expandedFile) { + var stat = fs.lstatSync(expandedFile); + + if (!stat.isSymbolicLink()) { + files.push(expandedFile); + + if (stat.isDirectory()) { // intentionally does not follow symlinks. + fs.readdirSync(expandedFile).forEach(function (child) { + addFile(expandedFile + '/' + child); + }); + } + } + }); + } + else { + files = common.expand(filePattern); + } + + files.forEach(function innerChmod(file) { + file = path.resolve(file); + if (!fs.existsSync(file)) { + common.error('File not found: ' + file); + } + + // When recursing, don't follow symlinks. + if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { + return; + } + + var perms = fs.statSync(file).mode; + var type = perms & PERMS.TYPE_MASK; + + var newPerms = perms; + + if (isNaN(parseInt(mode, 8))) { + // parse options + mode.split(',').forEach(function (symbolicMode) { + /*jshint regexdash:true */ + var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; + var matches = pattern.exec(symbolicMode); + + if (matches) { + var applyTo = matches[1]; + var operator = matches[2]; + var change = matches[3]; + + var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; + var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; + var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; + + var changeRead = change.indexOf('r') != -1; + var changeWrite = change.indexOf('w') != -1; + var changeExec = change.indexOf('x') != -1; + var changeSticky = change.indexOf('t') != -1; + var changeSetuid = change.indexOf('s') != -1; + + var mask = 0; + if (changeOwner) { + mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); + } + if (changeGroup) { + mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); + } + if (changeOther) { + mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); + } + + // Sticky bit is special - it's not tied to user, group or other. + if (changeSticky) { + mask |= PERMS.STICKY; + } + + switch (operator) { + case '+': + newPerms |= mask; + break; + + case '-': + newPerms &= ~mask; + break; + + case '=': + newPerms = type + mask; + + // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. + if (fs.statSync(file).isDirectory()) { + newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; + } + break; + } + + if (options.verbose) { + log(file + ' -> ' + newPerms.toString(8)); + } + + if (perms != newPerms) { + if (!options.verbose && options.changes) { + log(file + ' -> ' + newPerms.toString(8)); + } + fs.chmodSync(file, newPerms); + } + } + else { + common.error('Invalid symbolic mode change: ' + symbolicMode); + } + }); + } + else { + // they gave us a full number + newPerms = type + parseInt(mode, 8); + + // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. + if (fs.statSync(file).isDirectory()) { + newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; + } + + fs.chmodSync(file, newPerms); + } + }); +} +module.exports = _chmod; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/common.js b/node_modules/cordova-android/node_modules/shelljs/src/common.js new file mode 100644 index 0000000..d8c2312 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/common.js @@ -0,0 +1,203 @@ +var os = require('os'); +var fs = require('fs'); +var _ls = require('./ls'); + +// Module globals +var config = { + silent: false, + fatal: false +}; +exports.config = config; + +var state = { + error: null, + currentCmd: 'shell.js', + tempDir: null +}; +exports.state = state; + +var platform = os.type().match(/^Win/) ? 'win' : 'unix'; +exports.platform = platform; + +function log() { + if (!config.silent) + console.log.apply(this, arguments); +} +exports.log = log; + +// Shows error message. Throws unless _continue or config.fatal are true +function error(msg, _continue) { + if (state.error === null) + state.error = ''; + state.error += state.currentCmd + ': ' + msg + '\n'; + + if (msg.length > 0) + log(state.error); + + if (config.fatal) + process.exit(1); + + if (!_continue) + throw ''; +} +exports.error = error; + +// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings. +// For now, this is a dummy function to bookmark places we need such strings +function ShellString(str) { + return str; +} +exports.ShellString = ShellString; + +// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.: +// parseOptions('-a', {'a':'alice', 'b':'bob'}); +function parseOptions(str, map) { + if (!map) + error('parseOptions() internal error: no map given'); + + // All options are false by default + var options = {}; + for (var letter in map) + options[map[letter]] = false; + + if (!str) + return options; // defaults + + if (typeof str !== 'string') + error('parseOptions() internal error: wrong str'); + + // e.g. match[1] = 'Rf' for str = '-Rf' + var match = str.match(/^\-(.+)/); + if (!match) + return options; + + // e.g. chars = ['R', 'f'] + var chars = match[1].split(''); + + chars.forEach(function(c) { + if (c in map) + options[map[c]] = true; + else + error('option not recognized: '+c); + }); + + return options; +} +exports.parseOptions = parseOptions; + +// Expands wildcards with matching (ie. existing) file names. +// For example: +// expand(['file*.js']) = ['file1.js', 'file2.js', ...] +// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) +function expand(list) { + var expanded = []; + list.forEach(function(listEl) { + // Wildcard present on directory names ? + if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) { + var match = listEl.match(/^([^*]+\/|)(.*)/); + var root = match[1]; + var rest = match[2]; + var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*"); + restRegex = new RegExp(restRegex); + + _ls('-R', root).filter(function (e) { + return restRegex.test(e); + }).forEach(function(file) { + expanded.push(file); + }); + } + // Wildcard present on file names ? + else if (listEl.search(/\*/) > -1) { + _ls('', listEl).forEach(function(file) { + expanded.push(file); + }); + } else { + expanded.push(listEl); + } + }); + return expanded; +} +exports.expand = expand; + +// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. +// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 +function unlinkSync(file) { + try { + fs.unlinkSync(file); + } catch(e) { + // Try to override file permission + if (e.code === 'EPERM') { + fs.chmodSync(file, '0666'); + fs.unlinkSync(file); + } else { + throw e; + } + } +} +exports.unlinkSync = unlinkSync; + +// e.g. 'shelljs_a5f185d0443ca...' +function randomFileName() { + function randomHash(count) { + if (count === 1) + return parseInt(16*Math.random(), 10).toString(16); + else { + var hash = ''; + for (var i=0; i and/or '); + } else if (arguments.length > 3) { + sources = [].slice.call(arguments, 1, arguments.length - 1); + dest = arguments[arguments.length - 1]; + } else if (typeof sources === 'string') { + sources = [sources]; + } else if ('length' in sources) { + sources = sources; // no-op for array + } else { + common.error('invalid arguments'); + } + + var exists = fs.existsSync(dest), + stats = exists && fs.statSync(dest); + + // Dest is not existing dir, but multiple sources given + if ((!exists || !stats.isDirectory()) && sources.length > 1) + common.error('dest is not a directory (too many sources)'); + + // Dest is an existing file, but no -f given + if (exists && stats.isFile() && !options.force) + common.error('dest file already exists: ' + dest); + + if (options.recursive) { + // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*" + // (see Github issue #15) + sources.forEach(function(src, i) { + if (src[src.length - 1] === '/') + sources[i] += '*'; + }); + + // Create dest + try { + fs.mkdirSync(dest, parseInt('0777', 8)); + } catch (e) { + // like Unix's cp, keep going even if we can't create dest dir + } + } + + sources = common.expand(sources); + + sources.forEach(function(src) { + if (!fs.existsSync(src)) { + common.error('no such file or directory: '+src, true); + return; // skip file + } + + // If here, src exists + if (fs.statSync(src).isDirectory()) { + if (!options.recursive) { + // Non-Recursive + common.log(src + ' is a directory (not copied)'); + } else { + // Recursive + // 'cp /a/source dest' should create 'source' in 'dest' + var newDest = path.join(dest, path.basename(src)), + checkDir = fs.statSync(src); + try { + fs.mkdirSync(newDest, checkDir.mode); + } catch (e) { + //if the directory already exists, that's okay + if (e.code !== 'EEXIST') { + common.error('dest file no such file or directory: ' + newDest, true); + throw e; + } + } + + cpdirSyncRecursive(src, newDest, {force: options.force}); + } + return; // done with dir + } + + // If here, src is a file + + // When copying to '/path/dir': + // thisDest = '/path/dir/file1' + var thisDest = dest; + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) + thisDest = path.normalize(dest + '/' + path.basename(src)); + + if (fs.existsSync(thisDest) && !options.force) { + common.error('dest file already exists: ' + thisDest, true); + return; // skip file + } + + copyFileSync(src, thisDest); + }); // forEach(src) +} +module.exports = _cp; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/dirs.js b/node_modules/cordova-android/node_modules/shelljs/src/dirs.js new file mode 100644 index 0000000..58fae8b --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/dirs.js @@ -0,0 +1,191 @@ +var common = require('./common'); +var _cd = require('./cd'); +var path = require('path'); + +// Pushd/popd/dirs internals +var _dirStack = []; + +function _isStackIndex(index) { + return (/^[\-+]\d+$/).test(index); +} + +function _parseStackIndex(index) { + if (_isStackIndex(index)) { + if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd + return (/^-/).test(index) ? Number(index) - 1 : Number(index); + } else { + common.error(index + ': directory stack index out of range'); + } + } else { + common.error(index + ': invalid number'); + } +} + +function _actualDirStack() { + return [process.cwd()].concat(_dirStack); +} + +//@ +//@ ### pushd([options,] [dir | '-N' | '+N']) +//@ +//@ Available options: +//@ +//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. +//@ +//@ Arguments: +//@ +//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. +//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. +//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ // process.cwd() === '/usr' +//@ pushd('/etc'); // Returns /etc /usr +//@ pushd('+1'); // Returns /usr /etc +//@ ``` +//@ +//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +function _pushd(options, dir) { + if (_isStackIndex(options)) { + dir = options; + options = ''; + } + + options = common.parseOptions(options, { + 'n' : 'no-cd' + }); + + var dirs = _actualDirStack(); + + if (dir === '+0') { + return dirs; // +0 is a noop + } else if (!dir) { + if (dirs.length > 1) { + dirs = dirs.splice(1, 1).concat(dirs); + } else { + return common.error('no other directory'); + } + } else if (_isStackIndex(dir)) { + var n = _parseStackIndex(dir); + dirs = dirs.slice(n).concat(dirs.slice(0, n)); + } else { + if (options['no-cd']) { + dirs.splice(1, 0, dir); + } else { + dirs.unshift(dir); + } + } + + if (options['no-cd']) { + dirs = dirs.slice(1); + } else { + dir = path.resolve(dirs.shift()); + _cd('', dir); + } + + _dirStack = dirs; + return _dirs(''); +} +exports.pushd = _pushd; + +//@ +//@ ### popd([options,] ['-N' | '+N']) +//@ +//@ Available options: +//@ +//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. +//@ +//@ Arguments: +//@ +//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. +//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ echo(process.cwd()); // '/usr' +//@ pushd('/etc'); // '/etc /usr' +//@ echo(process.cwd()); // '/etc' +//@ popd(); // '/usr' +//@ echo(process.cwd()); // '/usr' +//@ ``` +//@ +//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +function _popd(options, index) { + if (_isStackIndex(options)) { + index = options; + options = ''; + } + + options = common.parseOptions(options, { + 'n' : 'no-cd' + }); + + if (!_dirStack.length) { + return common.error('directory stack empty'); + } + + index = _parseStackIndex(index || '+0'); + + if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { + index = index > 0 ? index - 1 : index; + _dirStack.splice(index, 1); + } else { + var dir = path.resolve(_dirStack.shift()); + _cd('', dir); + } + + return _dirs(''); +} +exports.popd = _popd; + +//@ +//@ ### dirs([options | '+N' | '-N']) +//@ +//@ Available options: +//@ +//@ + `-c`: Clears the directory stack by deleting all of the elements. +//@ +//@ Arguments: +//@ +//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. +//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. +//@ +//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +//@ +//@ See also: pushd, popd +function _dirs(options, index) { + if (_isStackIndex(options)) { + index = options; + options = ''; + } + + options = common.parseOptions(options, { + 'c' : 'clear' + }); + + if (options['clear']) { + _dirStack = []; + return _dirStack; + } + + var stack = _actualDirStack(); + + if (index) { + index = _parseStackIndex(index); + + if (index < 0) { + index = stack.length + index; + } + + common.log(stack[index]); + return stack[index]; + } + + common.log(stack.join(' ')); + + return stack; +} +exports.dirs = _dirs; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/echo.js b/node_modules/cordova-android/node_modules/shelljs/src/echo.js new file mode 100644 index 0000000..760ea84 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/echo.js @@ -0,0 +1,20 @@ +var common = require('./common'); + +//@ +//@ ### echo(string [,string ...]) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ echo('hello world'); +//@ var str = echo('hello world'); +//@ ``` +//@ +//@ Prints string to stdout, and returns string with additional utility methods +//@ like `.to()`. +function _echo() { + var messages = [].slice.call(arguments, 0); + console.log.apply(this, messages); + return common.ShellString(messages.join(' ')); +} +module.exports = _echo; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/error.js b/node_modules/cordova-android/node_modules/shelljs/src/error.js new file mode 100644 index 0000000..cca3efb --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/error.js @@ -0,0 +1,10 @@ +var common = require('./common'); + +//@ +//@ ### error() +//@ Tests if error occurred in the last command. Returns `null` if no error occurred, +//@ otherwise returns string explaining the error +function error() { + return common.state.error; +}; +module.exports = error; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/exec.js b/node_modules/cordova-android/node_modules/shelljs/src/exec.js new file mode 100644 index 0000000..d259a9f --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/exec.js @@ -0,0 +1,216 @@ +var common = require('./common'); +var _tempDir = require('./tempdir'); +var _pwd = require('./pwd'); +var path = require('path'); +var fs = require('fs'); +var child = require('child_process'); + +// Hack to run child_process.exec() synchronously (sync avoids callback hell) +// Uses a custom wait loop that checks for a flag file, created when the child process is done. +// (Can't do a wait loop that checks for internal Node variables/messages as +// Node is single-threaded; callbacks and other internal state changes are done in the +// event loop). +function execSync(cmd, opts) { + var tempDir = _tempDir(); + var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()), + codeFile = path.resolve(tempDir+'/'+common.randomFileName()), + scriptFile = path.resolve(tempDir+'/'+common.randomFileName()), + sleepFile = path.resolve(tempDir+'/'+common.randomFileName()); + + var options = common.extend({ + silent: common.config.silent + }, opts); + + var previousStdoutContent = ''; + // Echoes stdout changes from running process, if not silent + function updateStdout() { + if (options.silent || !fs.existsSync(stdoutFile)) + return; + + var stdoutContent = fs.readFileSync(stdoutFile, 'utf8'); + // No changes since last time? + if (stdoutContent.length <= previousStdoutContent.length) + return; + + process.stdout.write(stdoutContent.substr(previousStdoutContent.length)); + previousStdoutContent = stdoutContent; + } + + function escape(str) { + return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0"); + } + + if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); + if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); + if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); + + var execCommand = '"'+process.execPath+'" '+scriptFile; + var execOptions = { + env: process.env, + cwd: _pwd(), + maxBuffer: 20*1024*1024 + }; + + if (typeof child.execSync === 'function') { + var script = [ + "var child = require('child_process')", + " , fs = require('fs');", + "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", + " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", + "});", + "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');", + "childProcess.stdout.pipe(stdoutStream, {end: false});", + "childProcess.stderr.pipe(stdoutStream, {end: false});", + "childProcess.stdout.pipe(process.stdout);", + "childProcess.stderr.pipe(process.stderr);", + "var stdoutEnded = false, stderrEnded = false;", + "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }", + "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });", + "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });" + ].join('\n'); + + fs.writeFileSync(scriptFile, script); + + if (options.silent) { + execOptions.stdio = 'ignore'; + } else { + execOptions.stdio = [0, 1, 2]; + } + + // Welcome to the future + child.execSync(execCommand, execOptions); + } else { + cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix + + var script = [ + "var child = require('child_process')", + " , fs = require('fs');", + "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", + " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", + "});" + ].join('\n'); + + fs.writeFileSync(scriptFile, script); + + child.exec(execCommand, execOptions); + + // The wait loop + // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage + // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing + // CPU usage, though apparently not so much on Windows) + while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } + while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } + } + + // At this point codeFile exists, but it's not necessarily flushed yet. + // Keep reading it until it is. + var code = parseInt('', 10); + while (isNaN(code)) { + code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); + } + + var stdout = fs.readFileSync(stdoutFile, 'utf8'); + + // No biggie if we can't erase the files now -- they're in a temp dir anyway + try { common.unlinkSync(scriptFile); } catch(e) {} + try { common.unlinkSync(stdoutFile); } catch(e) {} + try { common.unlinkSync(codeFile); } catch(e) {} + try { common.unlinkSync(sleepFile); } catch(e) {} + + // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html + if (code === 1 || code === 2 || code >= 126) { + common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes + } + // True if successful, false if not + var obj = { + code: code, + output: stdout + }; + return obj; +} // execSync() + +// Wrapper around exec() to enable echoing output to console in real time +function execAsync(cmd, opts, callback) { + var output = ''; + + var options = common.extend({ + silent: common.config.silent + }, opts); + + var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) { + if (callback) + callback(err ? err.code : 0, output); + }); + + c.stdout.on('data', function(data) { + output += data; + if (!options.silent) + process.stdout.write(data); + }); + + c.stderr.on('data', function(data) { + output += data; + if (!options.silent) + process.stdout.write(data); + }); + + return c; +} + +//@ +//@ ### exec(command [, options] [, callback]) +//@ Available options (all `false` by default): +//@ +//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided. +//@ + `silent`: Do not echo program output to console. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var version = exec('node --version', {silent:true}).output; +//@ +//@ var child = exec('some_long_running_process', {async:true}); +//@ child.stdout.on('data', function(data) { +//@ /* ... do something with data ... */ +//@ }); +//@ +//@ exec('some_long_running_process', function(code, output) { +//@ console.log('Exit code:', code); +//@ console.log('Program output:', output); +//@ }); +//@ ``` +//@ +//@ Executes the given `command` _synchronously_, unless otherwise specified. +//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's +//@ `output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and +//@ the `callback` gets the arguments `(code, output)`. +//@ +//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as +//@ the current synchronous implementation uses a lot of CPU. This should be getting +//@ fixed soon. +function _exec(command, options, callback) { + if (!command) + common.error('must specify command'); + + // Callback is defined instead of options. + if (typeof options === 'function') { + callback = options; + options = { async: true }; + } + + // Callback is defined with options. + if (typeof options === 'object' && typeof callback === 'function') { + options.async = true; + } + + options = common.extend({ + silent: common.config.silent, + async: false + }, options); + + if (options.async) + return execAsync(command, options, callback); + else + return execSync(command, options); +} +module.exports = _exec; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/find.js b/node_modules/cordova-android/node_modules/shelljs/src/find.js new file mode 100644 index 0000000..d9eeec2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/find.js @@ -0,0 +1,51 @@ +var fs = require('fs'); +var common = require('./common'); +var _ls = require('./ls'); + +//@ +//@ ### find(path [,path ...]) +//@ ### find(path_array) +//@ Examples: +//@ +//@ ```javascript +//@ find('src', 'lib'); +//@ find(['src', 'lib']); // same as above +//@ find('.').filter(function(file) { return file.match(/\.js$/); }); +//@ ``` +//@ +//@ Returns array of all files (however deep) in the given paths. +//@ +//@ The main difference from `ls('-R', path)` is that the resulting file names +//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. +function _find(options, paths) { + if (!paths) + common.error('no path specified'); + else if (typeof paths === 'object') + paths = paths; // assume array + else if (typeof paths === 'string') + paths = [].slice.call(arguments, 1); + + var list = []; + + function pushFile(file) { + if (common.platform === 'win') + file = file.replace(/\\/g, '/'); + list.push(file); + } + + // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs + // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory + + paths.forEach(function(file) { + pushFile(file); + + if (fs.statSync(file).isDirectory()) { + _ls('-RA', file+'/*').forEach(function(subfile) { + pushFile(subfile); + }); + } + }); + + return list; +} +module.exports = _find; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/grep.js b/node_modules/cordova-android/node_modules/shelljs/src/grep.js new file mode 100644 index 0000000..00c7d6a --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/grep.js @@ -0,0 +1,52 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### grep([options ,] regex_filter, file [, file ...]) +//@ ### grep([options ,] regex_filter, file_array) +//@ Available options: +//@ +//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); +//@ grep('GLOBAL_VARIABLE', '*.js'); +//@ ``` +//@ +//@ Reads input string from given files and returns a string containing all lines of the +//@ file that match the given `regex_filter`. Wildcard `*` accepted. +function _grep(options, regex, files) { + options = common.parseOptions(options, { + 'v': 'inverse' + }); + + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 2); + // if it's array leave it as it is + + files = common.expand(files); + + var grep = ''; + files.forEach(function(file) { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, true); + return; + } + + var contents = fs.readFileSync(file, 'utf8'), + lines = contents.split(/\r*\n/); + lines.forEach(function(line) { + var matched = line.match(regex); + if ((options.inverse && !matched) || (!options.inverse && matched)) + grep += line + '\n'; + }); + }); + + return common.ShellString(grep); +} +module.exports = _grep; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/ln.js b/node_modules/cordova-android/node_modules/shelljs/src/ln.js new file mode 100644 index 0000000..a7b9701 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/ln.js @@ -0,0 +1,53 @@ +var fs = require('fs'); +var path = require('path'); +var common = require('./common'); +var os = require('os'); + +//@ +//@ ### ln(options, source, dest) +//@ ### ln(source, dest) +//@ Available options: +//@ +//@ + `s`: symlink +//@ + `f`: force +//@ +//@ Examples: +//@ +//@ ```javascript +//@ ln('file', 'newlink'); +//@ ln('-sf', 'file', 'existing'); +//@ ``` +//@ +//@ Links source to dest. Use -f to force the link, should dest already exist. +function _ln(options, source, dest) { + options = common.parseOptions(options, { + 's': 'symlink', + 'f': 'force' + }); + + if (!source || !dest) { + common.error('Missing and/or '); + } + + source = path.resolve(process.cwd(), String(source)); + dest = path.resolve(process.cwd(), String(dest)); + + if (!fs.existsSync(source)) { + common.error('Source file does not exist', true); + } + + if (fs.existsSync(dest)) { + if (!options.force) { + common.error('Destination file exists', true); + } + + fs.unlinkSync(dest); + } + + if (options.symlink) { + fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null); + } else { + fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null); + } +} +module.exports = _ln; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/ls.js b/node_modules/cordova-android/node_modules/shelljs/src/ls.js new file mode 100644 index 0000000..3345db4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/ls.js @@ -0,0 +1,126 @@ +var path = require('path'); +var fs = require('fs'); +var common = require('./common'); +var _cd = require('./cd'); +var _pwd = require('./pwd'); + +//@ +//@ ### ls([options ,] path [,path ...]) +//@ ### ls([options ,] path_array) +//@ Available options: +//@ +//@ + `-R`: recursive +//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ ls('projs/*.js'); +//@ ls('-R', '/users/me', '/tmp'); +//@ ls('-R', ['/users/me', '/tmp']); // same as above +//@ ``` +//@ +//@ Returns array of files in the given path, or in current directory if no path provided. +function _ls(options, paths) { + options = common.parseOptions(options, { + 'R': 'recursive', + 'A': 'all', + 'a': 'all_deprecated' + }); + + if (options.all_deprecated) { + // We won't support the -a option as it's hard to image why it's useful + // (it includes '.' and '..' in addition to '.*' files) + // For backwards compatibility we'll dump a deprecated message and proceed as before + common.log('ls: Option -a is deprecated. Use -A instead'); + options.all = true; + } + + if (!paths) + paths = ['.']; + else if (typeof paths === 'object') + paths = paths; // assume array + else if (typeof paths === 'string') + paths = [].slice.call(arguments, 1); + + var list = []; + + // Conditionally pushes file to list - returns true if pushed, false otherwise + // (e.g. prevents hidden files to be included unless explicitly told so) + function pushFile(file, query) { + // hidden file? + if (path.basename(file)[0] === '.') { + // not explicitly asking for hidden files? + if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1)) + return false; + } + + if (common.platform === 'win') + file = file.replace(/\\/g, '/'); + + list.push(file); + return true; + } + + paths.forEach(function(p) { + if (fs.existsSync(p)) { + var stats = fs.statSync(p); + // Simple file? + if (stats.isFile()) { + pushFile(p, p); + return; // continue + } + + // Simple dir? + if (stats.isDirectory()) { + // Iterate over p contents + fs.readdirSync(p).forEach(function(file) { + if (!pushFile(file, p)) + return; + + // Recursive? + if (options.recursive) { + var oldDir = _pwd(); + _cd('', p); + if (fs.statSync(file).isDirectory()) + list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*')); + _cd('', oldDir); + } + }); + return; // continue + } + } + + // p does not exist - possible wildcard present + + var basename = path.basename(p); + var dirname = path.dirname(p); + // Wildcard present on an existing dir? (e.g. '/tmp/*.js') + if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) { + // Escape special regular expression chars + var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1'); + // Translates wildcard into regex + regexp = '^' + regexp.replace(/\*/g, '.*') + '$'; + // Iterate over directory contents + fs.readdirSync(dirname).forEach(function(file) { + if (file.match(new RegExp(regexp))) { + if (!pushFile(path.normalize(dirname+'/'+file), basename)) + return; + + // Recursive? + if (options.recursive) { + var pp = dirname + '/' + file; + if (fs.lstatSync(pp).isDirectory()) + list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*')); + } // recursive + } // if file matches + }); // forEach + return; + } + + common.error('no such file or directory: ' + p, true); + }); + + return list; +} +module.exports = _ls; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/mkdir.js b/node_modules/cordova-android/node_modules/shelljs/src/mkdir.js new file mode 100644 index 0000000..5a7088f --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/mkdir.js @@ -0,0 +1,68 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +// Recursively creates 'dir' +function mkdirSyncRecursive(dir) { + var baseDir = path.dirname(dir); + + // Base dir exists, no recursion necessary + if (fs.existsSync(baseDir)) { + fs.mkdirSync(dir, parseInt('0777', 8)); + return; + } + + // Base dir does not exist, go recursive + mkdirSyncRecursive(baseDir); + + // Base dir created, can create dir + fs.mkdirSync(dir, parseInt('0777', 8)); +} + +//@ +//@ ### mkdir([options ,] dir [, dir ...]) +//@ ### mkdir([options ,] dir_array) +//@ Available options: +//@ +//@ + `p`: full path (will create intermediate dirs if necessary) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); +//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above +//@ ``` +//@ +//@ Creates directories. +function _mkdir(options, dirs) { + options = common.parseOptions(options, { + 'p': 'fullpath' + }); + if (!dirs) + common.error('no paths given'); + + if (typeof dirs === 'string') + dirs = [].slice.call(arguments, 1); + // if it's array leave it as it is + + dirs.forEach(function(dir) { + if (fs.existsSync(dir)) { + if (!options.fullpath) + common.error('path already exists: ' + dir, true); + return; // skip dir + } + + // Base dir does not exist, and no -p option given + var baseDir = path.dirname(dir); + if (!fs.existsSync(baseDir) && !options.fullpath) { + common.error('no such file or directory: ' + baseDir, true); + return; // skip dir + } + + if (options.fullpath) + mkdirSyncRecursive(dir); + else + fs.mkdirSync(dir, parseInt('0777', 8)); + }); +} // mkdir +module.exports = _mkdir; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/mv.js b/node_modules/cordova-android/node_modules/shelljs/src/mv.js new file mode 100644 index 0000000..11f9607 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/mv.js @@ -0,0 +1,80 @@ +var fs = require('fs'); +var path = require('path'); +var common = require('./common'); + +//@ +//@ ### mv(source [, source ...], dest') +//@ ### mv(source_array, dest') +//@ Available options: +//@ +//@ + `f`: force +//@ +//@ Examples: +//@ +//@ ```javascript +//@ mv('-f', 'file', 'dir/'); +//@ mv('file1', 'file2', 'dir/'); +//@ mv(['file1', 'file2'], 'dir/'); // same as above +//@ ``` +//@ +//@ Moves files. The wildcard `*` is accepted. +function _mv(options, sources, dest) { + options = common.parseOptions(options, { + 'f': 'force' + }); + + // Get sources, dest + if (arguments.length < 3) { + common.error('missing and/or '); + } else if (arguments.length > 3) { + sources = [].slice.call(arguments, 1, arguments.length - 1); + dest = arguments[arguments.length - 1]; + } else if (typeof sources === 'string') { + sources = [sources]; + } else if ('length' in sources) { + sources = sources; // no-op for array + } else { + common.error('invalid arguments'); + } + + sources = common.expand(sources); + + var exists = fs.existsSync(dest), + stats = exists && fs.statSync(dest); + + // Dest is not existing dir, but multiple sources given + if ((!exists || !stats.isDirectory()) && sources.length > 1) + common.error('dest is not a directory (too many sources)'); + + // Dest is an existing file, but no -f given + if (exists && stats.isFile() && !options.force) + common.error('dest file already exists: ' + dest); + + sources.forEach(function(src) { + if (!fs.existsSync(src)) { + common.error('no such file or directory: '+src, true); + return; // skip file + } + + // If here, src exists + + // When copying to '/path/dir': + // thisDest = '/path/dir/file1' + var thisDest = dest; + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) + thisDest = path.normalize(dest + '/' + path.basename(src)); + + if (fs.existsSync(thisDest) && !options.force) { + common.error('dest file already exists: ' + thisDest, true); + return; // skip file + } + + if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { + common.error('cannot move to self: '+src, true); + return; // skip file + } + + fs.renameSync(src, thisDest); + }); // forEach(src) +} // mv +module.exports = _mv; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/popd.js b/node_modules/cordova-android/node_modules/shelljs/src/popd.js new file mode 100644 index 0000000..11ea24f --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/popd.js @@ -0,0 +1 @@ +// see dirs.js \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/shelljs/src/pushd.js b/node_modules/cordova-android/node_modules/shelljs/src/pushd.js new file mode 100644 index 0000000..11ea24f --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/pushd.js @@ -0,0 +1 @@ +// see dirs.js \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/shelljs/src/pwd.js b/node_modules/cordova-android/node_modules/shelljs/src/pwd.js new file mode 100644 index 0000000..41727bb --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/pwd.js @@ -0,0 +1,11 @@ +var path = require('path'); +var common = require('./common'); + +//@ +//@ ### pwd() +//@ Returns the current directory. +function _pwd(options) { + var pwd = path.resolve(process.cwd()); + return common.ShellString(pwd); +} +module.exports = _pwd; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/rm.js b/node_modules/cordova-android/node_modules/shelljs/src/rm.js new file mode 100644 index 0000000..bd608cb --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/rm.js @@ -0,0 +1,163 @@ +var common = require('./common'); +var fs = require('fs'); + +// Recursively removes 'dir' +// Adapted from https://github.com/ryanmcgrath/wrench-js +// +// Copyright (c) 2010 Ryan McGrath +// Copyright (c) 2012 Artur Adib +// +// Licensed under the MIT License +// http://www.opensource.org/licenses/mit-license.php +function rmdirSyncRecursive(dir, force) { + var files; + + files = fs.readdirSync(dir); + + // Loop through and delete everything in the sub-tree after checking it + for(var i = 0; i < files.length; i++) { + var file = dir + "/" + files[i], + currFile = fs.lstatSync(file); + + if(currFile.isDirectory()) { // Recursive function back to the beginning + rmdirSyncRecursive(file, force); + } + + else if(currFile.isSymbolicLink()) { // Unlink symlinks + if (force || isWriteable(file)) { + try { + common.unlinkSync(file); + } catch (e) { + common.error('could not remove file (code '+e.code+'): ' + file, true); + } + } + } + + else // Assume it's a file - perhaps a try/catch belongs here? + if (force || isWriteable(file)) { + try { + common.unlinkSync(file); + } catch (e) { + common.error('could not remove file (code '+e.code+'): ' + file, true); + } + } + } + + // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. + // Huzzah for the shopkeep. + + var result; + try { + // Retry on windows, sometimes it takes a little time before all the files in the directory are gone + var start = Date.now(); + while (true) { + try { + result = fs.rmdirSync(dir); + if (fs.existsSync(dir)) throw { code: "EAGAIN" } + break; + } catch(er) { + // In addition to error codes, also check if the directory still exists and loop again if true + if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) { + if (Date.now() - start > 1000) throw er; + } else if (er.code === "ENOENT") { + // Directory did not exist, deletion was successful + break; + } else { + throw er; + } + } + } + } catch(e) { + common.error('could not remove directory (code '+e.code+'): ' + dir, true); + } + + return result; +} // rmdirSyncRecursive + +// Hack to determine if file has write permissions for current user +// Avoids having to check user, group, etc, but it's probably slow +function isWriteable(file) { + var writePermission = true; + try { + var __fd = fs.openSync(file, 'a'); + fs.closeSync(__fd); + } catch(e) { + writePermission = false; + } + + return writePermission; +} + +//@ +//@ ### rm([options ,] file [, file ...]) +//@ ### rm([options ,] file_array) +//@ Available options: +//@ +//@ + `-f`: force +//@ + `-r, -R`: recursive +//@ +//@ Examples: +//@ +//@ ```javascript +//@ rm('-rf', '/tmp/*'); +//@ rm('some_file.txt', 'another_file.txt'); +//@ rm(['some_file.txt', 'another_file.txt']); // same as above +//@ ``` +//@ +//@ Removes files. The wildcard `*` is accepted. +function _rm(options, files) { + options = common.parseOptions(options, { + 'f': 'force', + 'r': 'recursive', + 'R': 'recursive' + }); + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 1); + // if it's array leave it as it is + + files = common.expand(files); + + files.forEach(function(file) { + if (!fs.existsSync(file)) { + // Path does not exist, no force flag given + if (!options.force) + common.error('no such file or directory: '+file, true); + + return; // skip file + } + + // If here, path exists + + var stats = fs.lstatSync(file); + if (stats.isFile() || stats.isSymbolicLink()) { + + // Do not check for file writing permissions + if (options.force) { + common.unlinkSync(file); + return; + } + + if (isWriteable(file)) + common.unlinkSync(file); + else + common.error('permission denied: '+file, true); + + return; + } // simple file + + // Path is an existing directory, but no -r flag given + if (stats.isDirectory() && !options.recursive) { + common.error('path is a directory', true); + return; // skip path + } + + // Recursively remove existing directory + if (stats.isDirectory() && options.recursive) { + rmdirSyncRecursive(file, options.force); + } + }); // forEach(file) +} // rm +module.exports = _rm; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/sed.js b/node_modules/cordova-android/node_modules/shelljs/src/sed.js new file mode 100644 index 0000000..65f7cb4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/sed.js @@ -0,0 +1,43 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### sed([options ,] search_regex, replacement, file) +//@ Available options: +//@ +//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ +//@ +//@ Examples: +//@ +//@ ```javascript +//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); +//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); +//@ ``` +//@ +//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input +//@ using the given search regex and replacement string or function. Returns the new string after replacement. +function _sed(options, regex, replacement, file) { + options = common.parseOptions(options, { + 'i': 'inplace' + }); + + if (typeof replacement === 'string' || typeof replacement === 'function') + replacement = replacement; // no-op + else if (typeof replacement === 'number') + replacement = replacement.toString(); // fallback + else + common.error('invalid replacement string'); + + if (!file) + common.error('no file given'); + + if (!fs.existsSync(file)) + common.error('no such file or directory: ' + file); + + var result = fs.readFileSync(file, 'utf8').replace(regex, replacement); + if (options.inplace) + fs.writeFileSync(file, result, 'utf8'); + + return common.ShellString(result); +} +module.exports = _sed; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/tempdir.js b/node_modules/cordova-android/node_modules/shelljs/src/tempdir.js new file mode 100644 index 0000000..45953c2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/tempdir.js @@ -0,0 +1,56 @@ +var common = require('./common'); +var os = require('os'); +var fs = require('fs'); + +// Returns false if 'dir' is not a writeable directory, 'dir' otherwise +function writeableDir(dir) { + if (!dir || !fs.existsSync(dir)) + return false; + + if (!fs.statSync(dir).isDirectory()) + return false; + + var testFile = dir+'/'+common.randomFileName(); + try { + fs.writeFileSync(testFile, ' '); + common.unlinkSync(testFile); + return dir; + } catch (e) { + return false; + } +} + + +//@ +//@ ### tempdir() +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var tmp = tempdir(); // "/tmp" for most *nix platforms +//@ ``` +//@ +//@ Searches and returns string containing a writeable, platform-dependent temporary directory. +//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). +function _tempDir() { + var state = common.state; + if (state.tempDir) + return state.tempDir; // from cache + + state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+ + writeableDir(process.env['TMPDIR']) || + writeableDir(process.env['TEMP']) || + writeableDir(process.env['TMP']) || + writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS + writeableDir('C:\\TEMP') || // Windows + writeableDir('C:\\TMP') || // Windows + writeableDir('\\TEMP') || // Windows + writeableDir('\\TMP') || // Windows + writeableDir('/tmp') || + writeableDir('/var/tmp') || + writeableDir('/usr/tmp') || + writeableDir('.'); // last resort + + return state.tempDir; +} +module.exports = _tempDir; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/test.js b/node_modules/cordova-android/node_modules/shelljs/src/test.js new file mode 100644 index 0000000..8a4ac7d --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/test.js @@ -0,0 +1,85 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### test(expression) +//@ Available expression primaries: +//@ +//@ + `'-b', 'path'`: true if path is a block device +//@ + `'-c', 'path'`: true if path is a character device +//@ + `'-d', 'path'`: true if path is a directory +//@ + `'-e', 'path'`: true if path exists +//@ + `'-f', 'path'`: true if path is a regular file +//@ + `'-L', 'path'`: true if path is a symboilc link +//@ + `'-p', 'path'`: true if path is a pipe (FIFO) +//@ + `'-S', 'path'`: true if path is a socket +//@ +//@ Examples: +//@ +//@ ```javascript +//@ if (test('-d', path)) { /* do something with dir */ }; +//@ if (!test('-f', path)) continue; // skip if it's a regular file +//@ ``` +//@ +//@ Evaluates expression using the available primaries and returns corresponding value. +function _test(options, path) { + if (!path) + common.error('no path given'); + + // hack - only works with unary primaries + options = common.parseOptions(options, { + 'b': 'block', + 'c': 'character', + 'd': 'directory', + 'e': 'exists', + 'f': 'file', + 'L': 'link', + 'p': 'pipe', + 'S': 'socket' + }); + + var canInterpret = false; + for (var key in options) + if (options[key] === true) { + canInterpret = true; + break; + } + + if (!canInterpret) + common.error('could not interpret expression'); + + if (options.link) { + try { + return fs.lstatSync(path).isSymbolicLink(); + } catch(e) { + return false; + } + } + + if (!fs.existsSync(path)) + return false; + + if (options.exists) + return true; + + var stats = fs.statSync(path); + + if (options.block) + return stats.isBlockDevice(); + + if (options.character) + return stats.isCharacterDevice(); + + if (options.directory) + return stats.isDirectory(); + + if (options.file) + return stats.isFile(); + + if (options.pipe) + return stats.isFIFO(); + + if (options.socket) + return stats.isSocket(); +} // test +module.exports = _test; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/to.js b/node_modules/cordova-android/node_modules/shelljs/src/to.js new file mode 100644 index 0000000..f029999 --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/to.js @@ -0,0 +1,29 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +//@ +//@ ### 'string'.to(file) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ cat('input.txt').to('output.txt'); +//@ ``` +//@ +//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as +//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ +function _to(options, file) { + if (!file) + common.error('wrong arguments'); + + if (!fs.existsSync( path.dirname(file) )) + common.error('no such file or directory: ' + path.dirname(file)); + + try { + fs.writeFileSync(file, this.toString(), 'utf8'); + } catch(e) { + common.error('could not write to file (code '+e.code+'): '+file, true); + } +} +module.exports = _to; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/toEnd.js b/node_modules/cordova-android/node_modules/shelljs/src/toEnd.js new file mode 100644 index 0000000..f6d099d --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/toEnd.js @@ -0,0 +1,29 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +//@ +//@ ### 'string'.toEnd(file) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ cat('input.txt').toEnd('output.txt'); +//@ ``` +//@ +//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as +//@ those returned by `cat`, `grep`, etc). +function _toEnd(options, file) { + if (!file) + common.error('wrong arguments'); + + if (!fs.existsSync( path.dirname(file) )) + common.error('no such file or directory: ' + path.dirname(file)); + + try { + fs.appendFileSync(file, this.toString(), 'utf8'); + } catch(e) { + common.error('could not append to file (code '+e.code+'): '+file, true); + } +} +module.exports = _toEnd; diff --git a/node_modules/cordova-android/node_modules/shelljs/src/which.js b/node_modules/cordova-android/node_modules/shelljs/src/which.js new file mode 100644 index 0000000..2822ecf --- /dev/null +++ b/node_modules/cordova-android/node_modules/shelljs/src/which.js @@ -0,0 +1,83 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +// Cross-platform method for splitting environment PATH variables +function splitPath(p) { + for (i=1;i<2;i++) {} + + if (!p) + return []; + + if (common.platform === 'win') + return p.split(';'); + else + return p.split(':'); +} + +function checkPath(path) { + return fs.existsSync(path) && fs.statSync(path).isDirectory() == false; +} + +//@ +//@ ### which(command) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var nodeExec = which('node'); +//@ ``` +//@ +//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. +//@ Returns string containing the absolute path to the command. +function _which(options, cmd) { + if (!cmd) + common.error('must specify command'); + + var pathEnv = process.env.path || process.env.Path || process.env.PATH, + pathArray = splitPath(pathEnv), + where = null; + + // No relative/absolute paths provided? + if (cmd.search(/\//) === -1) { + // Search for command in PATH + pathArray.forEach(function(dir) { + if (where) + return; // already found it + + var attempt = path.resolve(dir + '/' + cmd); + if (checkPath(attempt)) { + where = attempt; + return; + } + + if (common.platform === 'win') { + var baseAttempt = attempt; + attempt = baseAttempt + '.exe'; + if (checkPath(attempt)) { + where = attempt; + return; + } + attempt = baseAttempt + '.cmd'; + if (checkPath(attempt)) { + where = attempt; + return; + } + attempt = baseAttempt + '.bat'; + if (checkPath(attempt)) { + where = attempt; + return; + } + } // if 'win' + }); + } + + // Command not found anywhere? + if (!checkPath(cmd) && !where) + return null; + + where = where || path.resolve(cmd); + + return common.ShellString(where); +} +module.exports = _which; diff --git a/node_modules/cordova-android/node_modules/underscore/LICENSE b/node_modules/cordova-android/node_modules/underscore/LICENSE new file mode 100644 index 0000000..dd25d80 --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/underscore/README.md b/node_modules/cordova-android/node_modules/underscore/README.md new file mode 100644 index 0000000..69e8b56 --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/README.md @@ -0,0 +1,28 @@ + __ + /\ \ __ + __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ + /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ + \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ + \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ + \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ + \ \____/ + \/___/ + +Underscore.js is a utility-belt library for JavaScript that provides +support for the usual functional suspects (each, map, reduce, filter...) +without extending any core JavaScript objects. + +For Docs, License, Tests, and pre-packed downloads, see: +http://underscorejs.org + +For support and questions, please use +[the gitter channel](https://gitter.im/jashkenas/underscore) +or [stackoverflow](http://stackoverflow.com/search?q=underscore.js) + +Underscore is an open-sourced component of DocumentCloud: +https://github.com/documentcloud + +Many thanks to our contributors: +https://github.com/jashkenas/underscore/contributors + +This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. diff --git a/node_modules/cordova-android/node_modules/underscore/package.json b/node_modules/cordova-android/node_modules/underscore/package.json new file mode 100644 index 0000000..98f85cb --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/package.json @@ -0,0 +1,82 @@ +{ + "_from": "underscore@^1.8.3", + "_id": "underscore@1.9.1", + "_inBundle": true, + "_integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "_location": "/cordova-android/underscore", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "underscore@^1.8.3", + "name": "underscore", + "escapedName": "underscore", + "rawSpec": "^1.8.3", + "saveSpec": null, + "fetchSpec": "^1.8.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "_shasum": "06dce34a0e68a7babc29b365b8e74b8925203961", + "_spec": "underscore@^1.8.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Jeremy Ashkenas", + "email": "jeremy@documentcloud.org" + }, + "bugs": { + "url": "https://github.com/jashkenas/underscore/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "JavaScript's functional programming helper library.", + "devDependencies": { + "coveralls": "^2.11.2", + "docco": "*", + "eslint": "1.10.x", + "gzip-size-cli": "^1.0.0", + "karma": "^0.13.13", + "karma-qunit": "~2.0.1", + "nyc": "^2.1.3", + "pretty-bytes-cli": "^1.0.0", + "qunit": "^2.6.0", + "qunit-cli": "~0.2.0", + "uglify-js": "3.3.21" + }, + "files": [ + "underscore.js", + "underscore-min.js", + "underscore-min.js.map" + ], + "homepage": "http://underscorejs.org", + "keywords": [ + "util", + "functional", + "server", + "client", + "browser" + ], + "license": "MIT", + "main": "underscore.js", + "name": "underscore", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/underscore.git" + }, + "scripts": { + "build": "npm run minify -- --source-map --source-map-url \" \" -o underscore-min.js", + "coverage": "nyc npm run test-node && nyc report", + "coveralls": "nyc npm run test-node && nyc report --reporter=text-lcov | coveralls", + "doc": "docco underscore.js", + "lint": "eslint underscore.js test/*.js", + "minify": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "test": "npm run lint && npm run test-node", + "test-browser": "npm i karma-phantomjs-launcher && karma start", + "test-node": "qunit-cli test/*.js", + "weight": "npm run minify | gzip-size | pretty-bytes" + }, + "version": "1.9.1" +} diff --git a/node_modules/cordova-android/node_modules/underscore/underscore-min.js b/node_modules/cordova-android/node_modules/underscore/underscore-min.js new file mode 100644 index 0000000..f2a20a5 --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/underscore-min.js @@ -0,0 +1,5 @@ +// Underscore.js 1.9.1 +// http://underscorejs.org +// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +!function(){var n="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},r=n._,e=Array.prototype,o=Object.prototype,s="undefined"!=typeof Symbol?Symbol.prototype:null,u=e.push,c=e.slice,p=o.toString,i=o.hasOwnProperty,t=Array.isArray,a=Object.keys,l=Object.create,f=function(){},h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"==typeof exports||exports.nodeType?n._=h:("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=h),exports._=h),h.VERSION="1.9.1";var v,y=function(u,i,n){if(void 0===i)return u;switch(null==n?3:n){case 1:return function(n){return u.call(i,n)};case 3:return function(n,r,t){return u.call(i,n,r,t)};case 4:return function(n,r,t,e){return u.call(i,n,r,t,e)}}return function(){return u.apply(i,arguments)}},d=function(n,r,t){return h.iteratee!==v?h.iteratee(n,r):null==n?h.identity:h.isFunction(n)?y(n,r,t):h.isObject(n)&&!h.isArray(n)?h.matcher(n):h.property(n)};h.iteratee=v=function(n,r){return d(n,r,1/0)};var g=function(u,i){return i=null==i?u.length-1:+i,function(){for(var n=Math.max(arguments.length-i,0),r=Array(n),t=0;t":">",'"':""","'":"'","`":"`"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}(); \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/underscore/underscore-min.js.map b/node_modules/cordova-android/node_modules/underscore/underscore-min.js.map new file mode 100644 index 0000000..3b6056b --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/underscore-min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["underscore.js"],"names":["root","self","global","this","previousUnderscore","_","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","Ctor","obj","_wrapped","exports","nodeType","module","VERSION","builtinIteratee","optimizeCb","func","context","argCount","value","call","index","collection","accumulator","apply","arguments","cb","iteratee","identity","isFunction","isObject","matcher","property","Infinity","restArguments","startIndex","length","Math","max","rest","args","baseCreate","result","shallowProperty","key","has","path","deepGet","i","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","each","forEach","map","collect","results","currentKey","createReduce","dir","memo","initial","reducer","reduce","foldl","inject","reduceRight","foldr","find","detect","predicate","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","contains","includes","include","item","fromIndex","guard","values","indexOf","invoke","contextPath","method","pluck","where","attrs","findWhere","computed","lastComputed","v","min","shuffle","sample","n","random","clone","last","rand","temp","sortBy","criteria","sort","left","right","a","b","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","toArray","isString","match","size","pass","first","head","take","array","tail","drop","compact","Boolean","flatten","input","shallow","strict","output","idx","isArguments","j","len","without","otherArrays","difference","uniq","unique","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","object","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","floor","createIndexFinder","predicateFind","isNaN","lastIndexOf","range","start","stop","step","ceil","chunk","count","executeBound","sourceFunc","boundFunc","callingContext","bind","TypeError","bound","callArgs","concat","partial","boundArgs","placeholder","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","throttled","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","constructor","proto","prop","allKeys","mapObject","pairs","invert","functions","methods","names","createAssigner","keysFunc","defaults","source","l","extend","extendOwn","assign","eq","deepEq","keyInObj","pick","omit","String","props","tap","interceptor","isMatch","aStack","bStack","type","className","valueOf","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isElement","name","nodelist","document","childNodes","Int8Array","isFinite","isSymbol","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","template","text","settings","oldSettings","render","offset","variable","Function","e","data","argument","chain","instance","_chain","chainResult","mixin","toJSON","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/underscore/underscore.js b/node_modules/cordova-android/node_modules/underscore/underscore.js new file mode 100644 index 0000000..8219dc5 --- /dev/null +++ b/node_modules/cordova-android/node_modules/underscore/underscore.js @@ -0,0 +1,1692 @@ +// Underscore.js 1.9.1 +// http://underscorejs.org +// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + this || + {}; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for their old module API. If we're in + // the browser, add `_` as a global object. + // (`nodeType` is checked to ensure that `module` + // and `exports` are not HTML elements.) + if (typeof exports != 'undefined' && !exports.nodeType) { + if (typeof module != 'undefined' && !module.nodeType && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.9.1'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + var builtinIteratee; + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `identity`, + // an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (_.iteratee !== builtinIteratee) return _.iteratee(value, context); + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value) && !_.isArray(value)) return _.matcher(value); + return _.property(value); + }; + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only argCount argument. + _.iteratee = builtinIteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + var restArguments = function(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var shallowProperty = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + var has = function(obj, path) { + return obj != null && hasOwnProperty.call(obj, path); + } + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = shallowProperty('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + var createReduce = function(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + }; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (_.isFunction(path)) { + func = path; + } else if (_.isArray(path)) { + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return _.map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection. + _.shuffle = function(obj) { + return _.sample(obj, Infinity); + }; + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = _.random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (has(result, key)) result[key]++; else result[key] = 1; + }); + + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (_.isString(obj)) { + // Keep surrogate pair characters together + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null || array.length < 1) return n == null ? void 0 : []; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null || array.length < 1) return n == null ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, Boolean); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, output) { + output = output || []; + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + // Flatten current level of array or arguments object. + if (shallow) { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } else { + flatten(value, shallow, strict, output); + idx = output.length; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = restArguments(function(array, otherArrays) { + return _.difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = restArguments(function(arrays) { + return _.uniq(flatten(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = restArguments(function(array, rest) { + rest = flatten(rest, true, true); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }); + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = restArguments(_.unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of _.pairs. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions. + var createPredicateIndexFinder = function(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + }; + + // Returns the first index on an array-like that passes a predicate test. + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions. + var createIndexFinder = function(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + }; + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + _.chunk = function(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments. + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = restArguments(function(func, context, args) { + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + _.partial = restArguments(function(func, boundArgs) { + var placeholder = _.partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + _.partial.placeholder = _; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = restArguments(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = _.bind(obj[key], obj); + } + }); + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, result; + + var later = function(context, args) { + timeout = null; + if (args) result = func.apply(context, args); + }; + + var debounced = restArguments(function(args) { + if (timeout) clearTimeout(timeout); + if (immediate) { + var callNow = !timeout; + timeout = setTimeout(later, wait); + if (callNow) result = func.apply(this, args); + } else { + timeout = _.delay(later, wait, this, args); + } + + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = null; + }; + + return debounced; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + _.restArguments = restArguments; + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + var collectNonEnumProps = function(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + }; + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object. + // In contrast to _.map it returns an object. + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of _.object. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods`. + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test. + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Internal pick helper function to determine if `obj` has key `key`. + var keyInObj = function(value, key, obj) { + return key in obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (_.isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = _.allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the blacklisted properties. + _.omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = _.map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }); + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq, deepEq; + eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + }; + + // Internal recursive comparison function for `isEqual`. + deepEq = function(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? + _.isNaN = function(obj) { + return _.isNumber(obj) && isNaN(obj); + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, path) { + if (!_.isArray(path)) { + return has(obj, path); + } + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (obj == null || !hasOwnProperty.call(obj, key)) { + return false; + } + obj = obj[key]; + } + return !!length; + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indexes. + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + }; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + if (obj == null) { + return function(){}; + } + return function(path) { + return !_.isArray(path) ? obj[path] : deepGet(obj, path); + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + _.result = function(obj, path, fallback) { + if (!_.isArray(path)) path = [path]; + var length = path.length; + if (!length) { + return _.isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = _.isFunction(prop) ? prop.call(obj) : prop; + } + return obj; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var chainResult = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return chainResult(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return chainResult(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return String(this._wrapped); + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define == 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}()); diff --git a/node_modules/cordova-android/node_modules/unorm/LICENSE.md b/node_modules/cordova-android/node_modules/unorm/LICENSE.md new file mode 100644 index 0000000..ed1d4f3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/unorm/LICENSE.md @@ -0,0 +1,42 @@ +The software dual licensed under the MIT and GPL licenses. MIT license: + + Copyright (c) 2008-2013 Matsuza , Bjarke Walling + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + +GPL notice (please read the [full GPL license] online): + + Copyright (C) 2008-2013 Matsuza , Bjarke Walling + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +[full GPL license]: http://www.gnu.org/licenses/gpl-2.0-standalone.html diff --git a/node_modules/cordova-android/node_modules/unorm/README.md b/node_modules/cordova-android/node_modules/unorm/README.md new file mode 100644 index 0000000..6ff6420 --- /dev/null +++ b/node_modules/cordova-android/node_modules/unorm/README.md @@ -0,0 +1,118 @@ +This is [Unicode Normalizer] in a Common JS module. I'm not affiliated with Matsuza, the original author of Unicode Normalizer. + +[![Build Status](https://travis-ci.org/walling/unorm.png?branch=master)](https://travis-ci.org/walling/unorm) + + +Installation +------------ + +```bash +npm install unorm +``` + +Polyfill +-------- + +You can use this module as a polyfill for [String.prototype.normalize], for example: + +```javascript +console.log('æøåäüö'.normalize('NFKD')); +``` + +The module uses some [EcmaScript 5](http://kangax.github.io/es5-compat-table/) features. Other browsers should use a compability shim, e.g. [es5-shim](https://github.com/kriskowal/es5-shim). + +Functions +--------- + +This module exports four functions: `nfc`, `nfd`, `nfkc`, and `nfkd`; one for each Unicode normalization. In the browser the functions are exported in the `unorm` global. In CommonJS environments you just require the module. Functions: + + * `unorm.nfd(str)` – Canonical Decomposition + * `unorm.nfc(str)` – Canonical Decomposition, followed by Canonical Composition + * `unorm.nfkd(str)` – Compatibility Decomposition + * `unorm.nfkc(str)` – Compatibility Decomposition, followed by Canonical Composition + + +Node.JS example +--------------- + +For a longer example, see `examples` directory. + +```javascript +var unorm = require('unorm'); + +var text = + 'The \u212B symbol invented by A. J. \u00C5ngstr\u00F6m ' + + '(1814, L\u00F6gd\u00F6, \u2013 1874) denotes the length ' + + '10\u207B\u00B9\u2070 m.'; + +var combining = /[\u0300-\u036F]/g; // Use XRegExp('\\p{M}', 'g'); see example.js. + +console.log('Regular: ' + text); +console.log('NFC: ' + unorm.nfc(text)); +console.log('NFD: ' + unorm.nfd(text)); +console.log('NFKC: ' + unorm.nfkc(text)); +console.log('NFKD: * ' + unorm.nfkd(text).replace(combining, '')); +console.log(' * = Combining characters removed from decomposed form.'); +``` + + +Road map +-------- + +As of November 2013. Longer term: + +- Look at possible optimizations (speed primarely, module size secondarily) +- Adding functions to quick check normalizations: `is_nfc`, `is_nfd`, etc. + + +Contributers +------------ + + - **Oleg Grenrus** is helping to maintain this library. He cleaned up the code base, fixed JSHint errors, created a test suite and updated the normalization data to Unicode 6.3. + + +Development notes +----------------- + +- [Unicode normalization forms report](http://www.unicode.org/reports/tr15/) +- Unicode data can be found from http://www.unicode.org/Public/UCD/latest/ucd + +To generate new unicode data, run: +```sh +cd src/data/src +javac UnormNormalizerBuilder.java +java UnormNormalizerBuilder +``` +produced `unormdata.js` contains needed table + +Execute `node benchmark/benchmark.js` to run simple benchmarks, if you do any changes which may affect performance. + +License +------- + +This project includes the software package **Unicode Normalizer 1.0.0**. The +software dual licensed under the MIT and GPL licenses. Here is the MIT license: + + Copyright (c) 2008-2013 Matsuza , Bjarke Walling + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + + +[Unicode Normalizer]: http://coderepos.org/share/browser/lang/javascript/UnicodeNormalizer +[String.prototype.normalize]: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.5.3.26 diff --git a/node_modules/cordova-android/node_modules/unorm/lib/unorm.js b/node_modules/cordova-android/node_modules/unorm/lib/unorm.js new file mode 100644 index 0000000..92d3699 --- /dev/null +++ b/node_modules/cordova-android/node_modules/unorm/lib/unorm.js @@ -0,0 +1,442 @@ +(function (root) { + "use strict"; + +/***** unorm.js *****/ + +/* + * UnicodeNormalizer 1.0.0 + * Copyright (c) 2008 Matsuza + * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. + * $Date: 2008-06-05 16:44:17 +0200 (Thu, 05 Jun 2008) $ + * $Rev: 13309 $ + */ + + var DEFAULT_FEATURE = [null, 0, {}]; + var CACHE_THRESHOLD = 10; + var SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28; + var NCount = VCount * TCount; // 588 + var SCount = LCount * NCount; // 11172 + + var UChar = function(cp, feature){ + this.codepoint = cp; + this.feature = feature; + }; + + // Strategies + var cache = {}; + var cacheCounter = []; + for (var i = 0; i <= 0xFF; ++i){ + cacheCounter[i] = 0; + } + + function fromCache(next, cp, needFeature){ + var ret = cache[cp]; + if(!ret){ + ret = next(cp, needFeature); + if(!!ret.feature && ++cacheCounter[(cp >> 8) & 0xFF] > CACHE_THRESHOLD){ + cache[cp] = ret; + } + } + return ret; + } + + function fromData(next, cp, needFeature){ + var hash = cp & 0xFF00; + var dunit = UChar.udata[hash] || {}; + var f = dunit[cp]; + return f ? new UChar(cp, f) : new UChar(cp, DEFAULT_FEATURE); + } + function fromCpOnly(next, cp, needFeature){ + return !!needFeature ? next(cp, needFeature) : new UChar(cp, null); + } + function fromRuleBasedJamo(next, cp, needFeature){ + var j; + if(cp < LBase || (LBase + LCount <= cp && cp < SBase) || (SBase + SCount < cp)){ + return next(cp, needFeature); + } + if(LBase <= cp && cp < LBase + LCount){ + var c = {}; + var base = (cp - LBase) * VCount; + for (j = 0; j < VCount; ++j){ + c[VBase + j] = SBase + TCount * (j + base); + } + return new UChar(cp, [,,c]); + } + + var SIndex = cp - SBase; + var TIndex = SIndex % TCount; + var feature = []; + if(TIndex !== 0){ + feature[0] = [SBase + SIndex - TIndex, TBase + TIndex]; + } else { + feature[0] = [LBase + Math.floor(SIndex / NCount), VBase + Math.floor((SIndex % NCount) / TCount)]; + feature[2] = {}; + for (j = 1; j < TCount; ++j){ + feature[2][TBase + j] = cp + j; + } + } + return new UChar(cp, feature); + } + function fromCpFilter(next, cp, needFeature){ + return cp < 60 || 13311 < cp && cp < 42607 ? new UChar(cp, DEFAULT_FEATURE) : next(cp, needFeature); + } + + var strategies = [fromCpFilter, fromCache, fromCpOnly, fromRuleBasedJamo, fromData]; + + UChar.fromCharCode = strategies.reduceRight(function (next, strategy) { + return function (cp, needFeature) { + return strategy(next, cp, needFeature); + }; + }, null); + + UChar.isHighSurrogate = function(cp){ + return cp >= 0xD800 && cp <= 0xDBFF; + }; + UChar.isLowSurrogate = function(cp){ + return cp >= 0xDC00 && cp <= 0xDFFF; + }; + + UChar.prototype.prepFeature = function(){ + if(!this.feature){ + this.feature = UChar.fromCharCode(this.codepoint, true).feature; + } + }; + + UChar.prototype.toString = function(){ + if(this.codepoint < 0x10000){ + return String.fromCharCode(this.codepoint); + } else { + var x = this.codepoint - 0x10000; + return String.fromCharCode(Math.floor(x / 0x400) + 0xD800, x % 0x400 + 0xDC00); + } + }; + + UChar.prototype.getDecomp = function(){ + this.prepFeature(); + return this.feature[0] || null; + }; + + UChar.prototype.isCompatibility = function(){ + this.prepFeature(); + return !!this.feature[1] && (this.feature[1] & (1 << 8)); + }; + UChar.prototype.isExclude = function(){ + this.prepFeature(); + return !!this.feature[1] && (this.feature[1] & (1 << 9)); + }; + UChar.prototype.getCanonicalClass = function(){ + this.prepFeature(); + return !!this.feature[1] ? (this.feature[1] & 0xff) : 0; + }; + UChar.prototype.getComposite = function(following){ + this.prepFeature(); + if(!this.feature[2]){ + return null; + } + var cp = this.feature[2][following.codepoint]; + return cp ? UChar.fromCharCode(cp) : null; + }; + + var UCharIterator = function(str){ + this.str = str; + this.cursor = 0; + }; + UCharIterator.prototype.next = function(){ + if(!!this.str && this.cursor < this.str.length){ + var cp = this.str.charCodeAt(this.cursor++); + var d; + if(UChar.isHighSurrogate(cp) && this.cursor < this.str.length && UChar.isLowSurrogate((d = this.str.charCodeAt(this.cursor)))){ + cp = (cp - 0xD800) * 0x400 + (d -0xDC00) + 0x10000; + ++this.cursor; + } + return UChar.fromCharCode(cp); + } else { + this.str = null; + return null; + } + }; + + var RecursDecompIterator = function(it, cano){ + this.it = it; + this.canonical = cano; + this.resBuf = []; + }; + + RecursDecompIterator.prototype.next = function(){ + function recursiveDecomp(cano, uchar){ + var decomp = uchar.getDecomp(); + if(!!decomp && !(cano && uchar.isCompatibility())){ + var ret = []; + for(var i = 0; i < decomp.length; ++i){ + var a = recursiveDecomp(cano, UChar.fromCharCode(decomp[i])); + ret = ret.concat(a); + } + return ret; + } else { + return [uchar]; + } + } + if(this.resBuf.length === 0){ + var uchar = this.it.next(); + if(!uchar){ + return null; + } + this.resBuf = recursiveDecomp(this.canonical, uchar); + } + return this.resBuf.shift(); + }; + + var DecompIterator = function(it){ + this.it = it; + this.resBuf = []; + }; + + DecompIterator.prototype.next = function(){ + var cc; + if(this.resBuf.length === 0){ + do{ + var uchar = this.it.next(); + if(!uchar){ + break; + } + cc = uchar.getCanonicalClass(); + var inspt = this.resBuf.length; + if(cc !== 0){ + for(; inspt > 0; --inspt){ + var uchar2 = this.resBuf[inspt - 1]; + var cc2 = uchar2.getCanonicalClass(); + if(cc2 <= cc){ + break; + } + } + } + this.resBuf.splice(inspt, 0, uchar); + } while(cc !== 0); + } + return this.resBuf.shift(); + }; + + var CompIterator = function(it){ + this.it = it; + this.procBuf = []; + this.resBuf = []; + this.lastClass = null; + }; + + CompIterator.prototype.next = function(){ + while(this.resBuf.length === 0){ + var uchar = this.it.next(); + if(!uchar){ + this.resBuf = this.procBuf; + this.procBuf = []; + break; + } + if(this.procBuf.length === 0){ + this.lastClass = uchar.getCanonicalClass(); + this.procBuf.push(uchar); + } else { + var starter = this.procBuf[0]; + var composite = starter.getComposite(uchar); + var cc = uchar.getCanonicalClass(); + if(!!composite && (this.lastClass < cc || this.lastClass === 0)){ + this.procBuf[0] = composite; + } else { + if(cc === 0){ + this.resBuf = this.procBuf; + this.procBuf = []; + } + this.lastClass = cc; + this.procBuf.push(uchar); + } + } + } + return this.resBuf.shift(); + }; + + var createIterator = function(mode, str){ + switch(mode){ + case "NFD": + return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true)); + case "NFKD": + return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false)); + case "NFC": + return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true))); + case "NFKC": + return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false))); + } + throw mode + " is invalid"; + }; + var normalize = function(mode, str){ + var it = createIterator(mode, str); + var ret = ""; + var uchar; + while(!!(uchar = it.next())){ + ret += uchar.toString(); + } + return ret; + }; + + /* API functions */ + function nfd(str){ + return normalize("NFD", str); + } + + function nfkd(str){ + return normalize("NFKD", str); + } + + function nfc(str){ + return normalize("NFC", str); + } + + function nfkc(str){ + return normalize("NFKC", str); + } + +/* Unicode data */ +UChar.udata={ +0:{60:[,,{824:8814}],61:[,,{824:8800}],62:[,,{824:8815}],65:[,,{768:192,769:193,770:194,771:195,772:256,774:258,775:550,776:196,777:7842,778:197,780:461,783:512,785:514,803:7840,805:7680,808:260}],66:[,,{775:7682,803:7684,817:7686}],67:[,,{769:262,770:264,775:266,780:268,807:199}],68:[,,{775:7690,780:270,803:7692,807:7696,813:7698,817:7694}],69:[,,{768:200,769:201,770:202,771:7868,772:274,774:276,775:278,776:203,777:7866,780:282,783:516,785:518,803:7864,807:552,808:280,813:7704,816:7706}],70:[,,{775:7710}],71:[,,{769:500,770:284,772:7712,774:286,775:288,780:486,807:290}],72:[,,{770:292,775:7714,776:7718,780:542,803:7716,807:7720,814:7722}],73:[,,{768:204,769:205,770:206,771:296,772:298,774:300,775:304,776:207,777:7880,780:463,783:520,785:522,803:7882,808:302,816:7724}],74:[,,{770:308}],75:[,,{769:7728,780:488,803:7730,807:310,817:7732}],76:[,,{769:313,780:317,803:7734,807:315,813:7740,817:7738}],77:[,,{769:7742,775:7744,803:7746}],78:[,,{768:504,769:323,771:209,775:7748,780:327,803:7750,807:325,813:7754,817:7752}],79:[,,{768:210,769:211,770:212,771:213,772:332,774:334,775:558,776:214,777:7886,779:336,780:465,783:524,785:526,795:416,803:7884,808:490}],80:[,,{769:7764,775:7766}],82:[,,{769:340,775:7768,780:344,783:528,785:530,803:7770,807:342,817:7774}],83:[,,{769:346,770:348,775:7776,780:352,803:7778,806:536,807:350}],84:[,,{775:7786,780:356,803:7788,806:538,807:354,813:7792,817:7790}],85:[,,{768:217,769:218,770:219,771:360,772:362,774:364,776:220,777:7910,778:366,779:368,780:467,783:532,785:534,795:431,803:7908,804:7794,808:370,813:7798,816:7796}],86:[,,{771:7804,803:7806}],87:[,,{768:7808,769:7810,770:372,775:7814,776:7812,803:7816}],88:[,,{775:7818,776:7820}],89:[,,{768:7922,769:221,770:374,771:7928,772:562,775:7822,776:376,777:7926,803:7924}],90:[,,{769:377,770:7824,775:379,780:381,803:7826,817:7828}],97:[,,{768:224,769:225,770:226,771:227,772:257,774:259,775:551,776:228,777:7843,778:229,780:462,783:513,785:515,803:7841,805:7681,808:261}],98:[,,{775:7683,803:7685,817:7687}],99:[,,{769:263,770:265,775:267,780:269,807:231}],100:[,,{775:7691,780:271,803:7693,807:7697,813:7699,817:7695}],101:[,,{768:232,769:233,770:234,771:7869,772:275,774:277,775:279,776:235,777:7867,780:283,783:517,785:519,803:7865,807:553,808:281,813:7705,816:7707}],102:[,,{775:7711}],103:[,,{769:501,770:285,772:7713,774:287,775:289,780:487,807:291}],104:[,,{770:293,775:7715,776:7719,780:543,803:7717,807:7721,814:7723,817:7830}],105:[,,{768:236,769:237,770:238,771:297,772:299,774:301,776:239,777:7881,780:464,783:521,785:523,803:7883,808:303,816:7725}],106:[,,{770:309,780:496}],107:[,,{769:7729,780:489,803:7731,807:311,817:7733}],108:[,,{769:314,780:318,803:7735,807:316,813:7741,817:7739}],109:[,,{769:7743,775:7745,803:7747}],110:[,,{768:505,769:324,771:241,775:7749,780:328,803:7751,807:326,813:7755,817:7753}],111:[,,{768:242,769:243,770:244,771:245,772:333,774:335,775:559,776:246,777:7887,779:337,780:466,783:525,785:527,795:417,803:7885,808:491}],112:[,,{769:7765,775:7767}],114:[,,{769:341,775:7769,780:345,783:529,785:531,803:7771,807:343,817:7775}],115:[,,{769:347,770:349,775:7777,780:353,803:7779,806:537,807:351}],116:[,,{775:7787,776:7831,780:357,803:7789,806:539,807:355,813:7793,817:7791}],117:[,,{768:249,769:250,770:251,771:361,772:363,774:365,776:252,777:7911,778:367,779:369,780:468,783:533,785:535,795:432,803:7909,804:7795,808:371,813:7799,816:7797}],118:[,,{771:7805,803:7807}],119:[,,{768:7809,769:7811,770:373,775:7815,776:7813,778:7832,803:7817}],120:[,,{775:7819,776:7821}],121:[,,{768:7923,769:253,770:375,771:7929,772:563,775:7823,776:255,777:7927,778:7833,803:7925}],122:[,,{769:378,770:7825,775:380,780:382,803:7827,817:7829}],160:[[32],256],168:[[32,776],256,{768:8173,769:901,834:8129}],170:[[97],256],175:[[32,772],256],178:[[50],256],179:[[51],256],180:[[32,769],256],181:[[956],256],184:[[32,807],256],185:[[49],256],186:[[111],256],188:[[49,8260,52],256],189:[[49,8260,50],256],190:[[51,8260,52],256],192:[[65,768]],193:[[65,769]],194:[[65,770],,{768:7846,769:7844,771:7850,777:7848}],195:[[65,771]],196:[[65,776],,{772:478}],197:[[65,778],,{769:506}],198:[,,{769:508,772:482}],199:[[67,807],,{769:7688}],200:[[69,768]],201:[[69,769]],202:[[69,770],,{768:7872,769:7870,771:7876,777:7874}],203:[[69,776]],204:[[73,768]],205:[[73,769]],206:[[73,770]],207:[[73,776],,{769:7726}],209:[[78,771]],210:[[79,768]],211:[[79,769]],212:[[79,770],,{768:7890,769:7888,771:7894,777:7892}],213:[[79,771],,{769:7756,772:556,776:7758}],214:[[79,776],,{772:554}],216:[,,{769:510}],217:[[85,768]],218:[[85,769]],219:[[85,770]],220:[[85,776],,{768:475,769:471,772:469,780:473}],221:[[89,769]],224:[[97,768]],225:[[97,769]],226:[[97,770],,{768:7847,769:7845,771:7851,777:7849}],227:[[97,771]],228:[[97,776],,{772:479}],229:[[97,778],,{769:507}],230:[,,{769:509,772:483}],231:[[99,807],,{769:7689}],232:[[101,768]],233:[[101,769]],234:[[101,770],,{768:7873,769:7871,771:7877,777:7875}],235:[[101,776]],236:[[105,768]],237:[[105,769]],238:[[105,770]],239:[[105,776],,{769:7727}],241:[[110,771]],242:[[111,768]],243:[[111,769]],244:[[111,770],,{768:7891,769:7889,771:7895,777:7893}],245:[[111,771],,{769:7757,772:557,776:7759}],246:[[111,776],,{772:555}],248:[,,{769:511}],249:[[117,768]],250:[[117,769]],251:[[117,770]],252:[[117,776],,{768:476,769:472,772:470,780:474}],253:[[121,769]],255:[[121,776]]}, +256:{256:[[65,772]],257:[[97,772]],258:[[65,774],,{768:7856,769:7854,771:7860,777:7858}],259:[[97,774],,{768:7857,769:7855,771:7861,777:7859}],260:[[65,808]],261:[[97,808]],262:[[67,769]],263:[[99,769]],264:[[67,770]],265:[[99,770]],266:[[67,775]],267:[[99,775]],268:[[67,780]],269:[[99,780]],270:[[68,780]],271:[[100,780]],274:[[69,772],,{768:7700,769:7702}],275:[[101,772],,{768:7701,769:7703}],276:[[69,774]],277:[[101,774]],278:[[69,775]],279:[[101,775]],280:[[69,808]],281:[[101,808]],282:[[69,780]],283:[[101,780]],284:[[71,770]],285:[[103,770]],286:[[71,774]],287:[[103,774]],288:[[71,775]],289:[[103,775]],290:[[71,807]],291:[[103,807]],292:[[72,770]],293:[[104,770]],296:[[73,771]],297:[[105,771]],298:[[73,772]],299:[[105,772]],300:[[73,774]],301:[[105,774]],302:[[73,808]],303:[[105,808]],304:[[73,775]],306:[[73,74],256],307:[[105,106],256],308:[[74,770]],309:[[106,770]],310:[[75,807]],311:[[107,807]],313:[[76,769]],314:[[108,769]],315:[[76,807]],316:[[108,807]],317:[[76,780]],318:[[108,780]],319:[[76,183],256],320:[[108,183],256],323:[[78,769]],324:[[110,769]],325:[[78,807]],326:[[110,807]],327:[[78,780]],328:[[110,780]],329:[[700,110],256],332:[[79,772],,{768:7760,769:7762}],333:[[111,772],,{768:7761,769:7763}],334:[[79,774]],335:[[111,774]],336:[[79,779]],337:[[111,779]],340:[[82,769]],341:[[114,769]],342:[[82,807]],343:[[114,807]],344:[[82,780]],345:[[114,780]],346:[[83,769],,{775:7780}],347:[[115,769],,{775:7781}],348:[[83,770]],349:[[115,770]],350:[[83,807]],351:[[115,807]],352:[[83,780],,{775:7782}],353:[[115,780],,{775:7783}],354:[[84,807]],355:[[116,807]],356:[[84,780]],357:[[116,780]],360:[[85,771],,{769:7800}],361:[[117,771],,{769:7801}],362:[[85,772],,{776:7802}],363:[[117,772],,{776:7803}],364:[[85,774]],365:[[117,774]],366:[[85,778]],367:[[117,778]],368:[[85,779]],369:[[117,779]],370:[[85,808]],371:[[117,808]],372:[[87,770]],373:[[119,770]],374:[[89,770]],375:[[121,770]],376:[[89,776]],377:[[90,769]],378:[[122,769]],379:[[90,775]],380:[[122,775]],381:[[90,780]],382:[[122,780]],383:[[115],256,{775:7835}],416:[[79,795],,{768:7900,769:7898,771:7904,777:7902,803:7906}],417:[[111,795],,{768:7901,769:7899,771:7905,777:7903,803:7907}],431:[[85,795],,{768:7914,769:7912,771:7918,777:7916,803:7920}],432:[[117,795],,{768:7915,769:7913,771:7919,777:7917,803:7921}],439:[,,{780:494}],452:[[68,381],256],453:[[68,382],256],454:[[100,382],256],455:[[76,74],256],456:[[76,106],256],457:[[108,106],256],458:[[78,74],256],459:[[78,106],256],460:[[110,106],256],461:[[65,780]],462:[[97,780]],463:[[73,780]],464:[[105,780]],465:[[79,780]],466:[[111,780]],467:[[85,780]],468:[[117,780]],469:[[220,772]],470:[[252,772]],471:[[220,769]],472:[[252,769]],473:[[220,780]],474:[[252,780]],475:[[220,768]],476:[[252,768]],478:[[196,772]],479:[[228,772]],480:[[550,772]],481:[[551,772]],482:[[198,772]],483:[[230,772]],486:[[71,780]],487:[[103,780]],488:[[75,780]],489:[[107,780]],490:[[79,808],,{772:492}],491:[[111,808],,{772:493}],492:[[490,772]],493:[[491,772]],494:[[439,780]],495:[[658,780]],496:[[106,780]],497:[[68,90],256],498:[[68,122],256],499:[[100,122],256],500:[[71,769]],501:[[103,769]],504:[[78,768]],505:[[110,768]],506:[[197,769]],507:[[229,769]],508:[[198,769]],509:[[230,769]],510:[[216,769]],511:[[248,769]],66045:[,220]}, +512:{512:[[65,783]],513:[[97,783]],514:[[65,785]],515:[[97,785]],516:[[69,783]],517:[[101,783]],518:[[69,785]],519:[[101,785]],520:[[73,783]],521:[[105,783]],522:[[73,785]],523:[[105,785]],524:[[79,783]],525:[[111,783]],526:[[79,785]],527:[[111,785]],528:[[82,783]],529:[[114,783]],530:[[82,785]],531:[[114,785]],532:[[85,783]],533:[[117,783]],534:[[85,785]],535:[[117,785]],536:[[83,806]],537:[[115,806]],538:[[84,806]],539:[[116,806]],542:[[72,780]],543:[[104,780]],550:[[65,775],,{772:480}],551:[[97,775],,{772:481}],552:[[69,807],,{774:7708}],553:[[101,807],,{774:7709}],554:[[214,772]],555:[[246,772]],556:[[213,772]],557:[[245,772]],558:[[79,775],,{772:560}],559:[[111,775],,{772:561}],560:[[558,772]],561:[[559,772]],562:[[89,772]],563:[[121,772]],658:[,,{780:495}],688:[[104],256],689:[[614],256],690:[[106],256],691:[[114],256],692:[[633],256],693:[[635],256],694:[[641],256],695:[[119],256],696:[[121],256],728:[[32,774],256],729:[[32,775],256],730:[[32,778],256],731:[[32,808],256],732:[[32,771],256],733:[[32,779],256],736:[[611],256],737:[[108],256],738:[[115],256],739:[[120],256],740:[[661],256],66272:[,220]}, +768:{768:[,230],769:[,230],770:[,230],771:[,230],772:[,230],773:[,230],774:[,230],775:[,230],776:[,230,{769:836}],777:[,230],778:[,230],779:[,230],780:[,230],781:[,230],782:[,230],783:[,230],784:[,230],785:[,230],786:[,230],787:[,230],788:[,230],789:[,232],790:[,220],791:[,220],792:[,220],793:[,220],794:[,232],795:[,216],796:[,220],797:[,220],798:[,220],799:[,220],800:[,220],801:[,202],802:[,202],803:[,220],804:[,220],805:[,220],806:[,220],807:[,202],808:[,202],809:[,220],810:[,220],811:[,220],812:[,220],813:[,220],814:[,220],815:[,220],816:[,220],817:[,220],818:[,220],819:[,220],820:[,1],821:[,1],822:[,1],823:[,1],824:[,1],825:[,220],826:[,220],827:[,220],828:[,220],829:[,230],830:[,230],831:[,230],832:[[768],230],833:[[769],230],834:[,230],835:[[787],230],836:[[776,769],230],837:[,240],838:[,230],839:[,220],840:[,220],841:[,220],842:[,230],843:[,230],844:[,230],845:[,220],846:[,220],848:[,230],849:[,230],850:[,230],851:[,220],852:[,220],853:[,220],854:[,220],855:[,230],856:[,232],857:[,220],858:[,220],859:[,230],860:[,233],861:[,234],862:[,234],863:[,233],864:[,234],865:[,234],866:[,233],867:[,230],868:[,230],869:[,230],870:[,230],871:[,230],872:[,230],873:[,230],874:[,230],875:[,230],876:[,230],877:[,230],878:[,230],879:[,230],884:[[697]],890:[[32,837],256],894:[[59]],900:[[32,769],256],901:[[168,769]],902:[[913,769]],903:[[183]],904:[[917,769]],905:[[919,769]],906:[[921,769]],908:[[927,769]],910:[[933,769]],911:[[937,769]],912:[[970,769]],913:[,,{768:8122,769:902,772:8121,774:8120,787:7944,788:7945,837:8124}],917:[,,{768:8136,769:904,787:7960,788:7961}],919:[,,{768:8138,769:905,787:7976,788:7977,837:8140}],921:[,,{768:8154,769:906,772:8153,774:8152,776:938,787:7992,788:7993}],927:[,,{768:8184,769:908,787:8008,788:8009}],929:[,,{788:8172}],933:[,,{768:8170,769:910,772:8169,774:8168,776:939,788:8025}],937:[,,{768:8186,769:911,787:8040,788:8041,837:8188}],938:[[921,776]],939:[[933,776]],940:[[945,769],,{837:8116}],941:[[949,769]],942:[[951,769],,{837:8132}],943:[[953,769]],944:[[971,769]],945:[,,{768:8048,769:940,772:8113,774:8112,787:7936,788:7937,834:8118,837:8115}],949:[,,{768:8050,769:941,787:7952,788:7953}],951:[,,{768:8052,769:942,787:7968,788:7969,834:8134,837:8131}],953:[,,{768:8054,769:943,772:8145,774:8144,776:970,787:7984,788:7985,834:8150}],959:[,,{768:8056,769:972,787:8000,788:8001}],961:[,,{787:8164,788:8165}],965:[,,{768:8058,769:973,772:8161,774:8160,776:971,787:8016,788:8017,834:8166}],969:[,,{768:8060,769:974,787:8032,788:8033,834:8182,837:8179}],970:[[953,776],,{768:8146,769:912,834:8151}],971:[[965,776],,{768:8162,769:944,834:8167}],972:[[959,769]],973:[[965,769]],974:[[969,769],,{837:8180}],976:[[946],256],977:[[952],256],978:[[933],256,{769:979,776:980}],979:[[978,769]],980:[[978,776]],981:[[966],256],982:[[960],256],1008:[[954],256],1009:[[961],256],1010:[[962],256],1012:[[920],256],1013:[[949],256],1017:[[931],256],66422:[,230],66423:[,230],66424:[,230],66425:[,230],66426:[,230]}, +1024:{1024:[[1045,768]],1025:[[1045,776]],1027:[[1043,769]],1030:[,,{776:1031}],1031:[[1030,776]],1036:[[1050,769]],1037:[[1048,768]],1038:[[1059,774]],1040:[,,{774:1232,776:1234}],1043:[,,{769:1027}],1045:[,,{768:1024,774:1238,776:1025}],1046:[,,{774:1217,776:1244}],1047:[,,{776:1246}],1048:[,,{768:1037,772:1250,774:1049,776:1252}],1049:[[1048,774]],1050:[,,{769:1036}],1054:[,,{776:1254}],1059:[,,{772:1262,774:1038,776:1264,779:1266}],1063:[,,{776:1268}],1067:[,,{776:1272}],1069:[,,{776:1260}],1072:[,,{774:1233,776:1235}],1075:[,,{769:1107}],1077:[,,{768:1104,774:1239,776:1105}],1078:[,,{774:1218,776:1245}],1079:[,,{776:1247}],1080:[,,{768:1117,772:1251,774:1081,776:1253}],1081:[[1080,774]],1082:[,,{769:1116}],1086:[,,{776:1255}],1091:[,,{772:1263,774:1118,776:1265,779:1267}],1095:[,,{776:1269}],1099:[,,{776:1273}],1101:[,,{776:1261}],1104:[[1077,768]],1105:[[1077,776]],1107:[[1075,769]],1110:[,,{776:1111}],1111:[[1110,776]],1116:[[1082,769]],1117:[[1080,768]],1118:[[1091,774]],1140:[,,{783:1142}],1141:[,,{783:1143}],1142:[[1140,783]],1143:[[1141,783]],1155:[,230],1156:[,230],1157:[,230],1158:[,230],1159:[,230],1217:[[1046,774]],1218:[[1078,774]],1232:[[1040,774]],1233:[[1072,774]],1234:[[1040,776]],1235:[[1072,776]],1238:[[1045,774]],1239:[[1077,774]],1240:[,,{776:1242}],1241:[,,{776:1243}],1242:[[1240,776]],1243:[[1241,776]],1244:[[1046,776]],1245:[[1078,776]],1246:[[1047,776]],1247:[[1079,776]],1250:[[1048,772]],1251:[[1080,772]],1252:[[1048,776]],1253:[[1080,776]],1254:[[1054,776]],1255:[[1086,776]],1256:[,,{776:1258}],1257:[,,{776:1259}],1258:[[1256,776]],1259:[[1257,776]],1260:[[1069,776]],1261:[[1101,776]],1262:[[1059,772]],1263:[[1091,772]],1264:[[1059,776]],1265:[[1091,776]],1266:[[1059,779]],1267:[[1091,779]],1268:[[1063,776]],1269:[[1095,776]],1272:[[1067,776]],1273:[[1099,776]]}, +1280:{1415:[[1381,1410],256],1425:[,220],1426:[,230],1427:[,230],1428:[,230],1429:[,230],1430:[,220],1431:[,230],1432:[,230],1433:[,230],1434:[,222],1435:[,220],1436:[,230],1437:[,230],1438:[,230],1439:[,230],1440:[,230],1441:[,230],1442:[,220],1443:[,220],1444:[,220],1445:[,220],1446:[,220],1447:[,220],1448:[,230],1449:[,230],1450:[,220],1451:[,230],1452:[,230],1453:[,222],1454:[,228],1455:[,230],1456:[,10],1457:[,11],1458:[,12],1459:[,13],1460:[,14],1461:[,15],1462:[,16],1463:[,17],1464:[,18],1465:[,19],1466:[,19],1467:[,20],1468:[,21],1469:[,22],1471:[,23],1473:[,24],1474:[,25],1476:[,230],1477:[,220],1479:[,18]}, +1536:{1552:[,230],1553:[,230],1554:[,230],1555:[,230],1556:[,230],1557:[,230],1558:[,230],1559:[,230],1560:[,30],1561:[,31],1562:[,32],1570:[[1575,1619]],1571:[[1575,1620]],1572:[[1608,1620]],1573:[[1575,1621]],1574:[[1610,1620]],1575:[,,{1619:1570,1620:1571,1621:1573}],1608:[,,{1620:1572}],1610:[,,{1620:1574}],1611:[,27],1612:[,28],1613:[,29],1614:[,30],1615:[,31],1616:[,32],1617:[,33],1618:[,34],1619:[,230],1620:[,230],1621:[,220],1622:[,220],1623:[,230],1624:[,230],1625:[,230],1626:[,230],1627:[,230],1628:[,220],1629:[,230],1630:[,230],1631:[,220],1648:[,35],1653:[[1575,1652],256],1654:[[1608,1652],256],1655:[[1735,1652],256],1656:[[1610,1652],256],1728:[[1749,1620]],1729:[,,{1620:1730}],1730:[[1729,1620]],1746:[,,{1620:1747}],1747:[[1746,1620]],1749:[,,{1620:1728}],1750:[,230],1751:[,230],1752:[,230],1753:[,230],1754:[,230],1755:[,230],1756:[,230],1759:[,230],1760:[,230],1761:[,230],1762:[,230],1763:[,220],1764:[,230],1767:[,230],1768:[,230],1770:[,220],1771:[,230],1772:[,230],1773:[,220]}, +1792:{1809:[,36],1840:[,230],1841:[,220],1842:[,230],1843:[,230],1844:[,220],1845:[,230],1846:[,230],1847:[,220],1848:[,220],1849:[,220],1850:[,230],1851:[,220],1852:[,220],1853:[,230],1854:[,220],1855:[,230],1856:[,230],1857:[,230],1858:[,220],1859:[,230],1860:[,220],1861:[,230],1862:[,220],1863:[,230],1864:[,220],1865:[,230],1866:[,230],2027:[,230],2028:[,230],2029:[,230],2030:[,230],2031:[,230],2032:[,230],2033:[,230],2034:[,220],2035:[,230]}, +2048:{2070:[,230],2071:[,230],2072:[,230],2073:[,230],2075:[,230],2076:[,230],2077:[,230],2078:[,230],2079:[,230],2080:[,230],2081:[,230],2082:[,230],2083:[,230],2085:[,230],2086:[,230],2087:[,230],2089:[,230],2090:[,230],2091:[,230],2092:[,230],2093:[,230],2137:[,220],2138:[,220],2139:[,220],2276:[,230],2277:[,230],2278:[,220],2279:[,230],2280:[,230],2281:[,220],2282:[,230],2283:[,230],2284:[,230],2285:[,220],2286:[,220],2287:[,220],2288:[,27],2289:[,28],2290:[,29],2291:[,230],2292:[,230],2293:[,230],2294:[,220],2295:[,230],2296:[,230],2297:[,220],2298:[,220],2299:[,230],2300:[,230],2301:[,230],2302:[,230],2303:[,230]}, +2304:{2344:[,,{2364:2345}],2345:[[2344,2364]],2352:[,,{2364:2353}],2353:[[2352,2364]],2355:[,,{2364:2356}],2356:[[2355,2364]],2364:[,7],2381:[,9],2385:[,230],2386:[,220],2387:[,230],2388:[,230],2392:[[2325,2364],512],2393:[[2326,2364],512],2394:[[2327,2364],512],2395:[[2332,2364],512],2396:[[2337,2364],512],2397:[[2338,2364],512],2398:[[2347,2364],512],2399:[[2351,2364],512],2492:[,7],2503:[,,{2494:2507,2519:2508}],2507:[[2503,2494]],2508:[[2503,2519]],2509:[,9],2524:[[2465,2492],512],2525:[[2466,2492],512],2527:[[2479,2492],512]}, +2560:{2611:[[2610,2620],512],2614:[[2616,2620],512],2620:[,7],2637:[,9],2649:[[2582,2620],512],2650:[[2583,2620],512],2651:[[2588,2620],512],2654:[[2603,2620],512],2748:[,7],2765:[,9],68109:[,220],68111:[,230],68152:[,230],68153:[,1],68154:[,220],68159:[,9],68325:[,230],68326:[,220]}, +2816:{2876:[,7],2887:[,,{2878:2891,2902:2888,2903:2892}],2888:[[2887,2902]],2891:[[2887,2878]],2892:[[2887,2903]],2893:[,9],2908:[[2849,2876],512],2909:[[2850,2876],512],2962:[,,{3031:2964}],2964:[[2962,3031]],3014:[,,{3006:3018,3031:3020}],3015:[,,{3006:3019}],3018:[[3014,3006]],3019:[[3015,3006]],3020:[[3014,3031]],3021:[,9]}, +3072:{3142:[,,{3158:3144}],3144:[[3142,3158]],3149:[,9],3157:[,84],3158:[,91],3260:[,7],3263:[,,{3285:3264}],3264:[[3263,3285]],3270:[,,{3266:3274,3285:3271,3286:3272}],3271:[[3270,3285]],3272:[[3270,3286]],3274:[[3270,3266],,{3285:3275}],3275:[[3274,3285]],3277:[,9]}, +3328:{3398:[,,{3390:3402,3415:3404}],3399:[,,{3390:3403}],3402:[[3398,3390]],3403:[[3399,3390]],3404:[[3398,3415]],3405:[,9],3530:[,9],3545:[,,{3530:3546,3535:3548,3551:3550}],3546:[[3545,3530]],3548:[[3545,3535],,{3530:3549}],3549:[[3548,3530]],3550:[[3545,3551]]}, +3584:{3635:[[3661,3634],256],3640:[,103],3641:[,103],3642:[,9],3656:[,107],3657:[,107],3658:[,107],3659:[,107],3763:[[3789,3762],256],3768:[,118],3769:[,118],3784:[,122],3785:[,122],3786:[,122],3787:[,122],3804:[[3755,3737],256],3805:[[3755,3745],256]}, +3840:{3852:[[3851],256],3864:[,220],3865:[,220],3893:[,220],3895:[,220],3897:[,216],3907:[[3906,4023],512],3917:[[3916,4023],512],3922:[[3921,4023],512],3927:[[3926,4023],512],3932:[[3931,4023],512],3945:[[3904,4021],512],3953:[,129],3954:[,130],3955:[[3953,3954],512],3956:[,132],3957:[[3953,3956],512],3958:[[4018,3968],512],3959:[[4018,3969],256],3960:[[4019,3968],512],3961:[[4019,3969],256],3962:[,130],3963:[,130],3964:[,130],3965:[,130],3968:[,130],3969:[[3953,3968],512],3970:[,230],3971:[,230],3972:[,9],3974:[,230],3975:[,230],3987:[[3986,4023],512],3997:[[3996,4023],512],4002:[[4001,4023],512],4007:[[4006,4023],512],4012:[[4011,4023],512],4025:[[3984,4021],512],4038:[,220]}, +4096:{4133:[,,{4142:4134}],4134:[[4133,4142]],4151:[,7],4153:[,9],4154:[,9],4237:[,220],4348:[[4316],256],69702:[,9],69759:[,9],69785:[,,{69818:69786}],69786:[[69785,69818]],69787:[,,{69818:69788}],69788:[[69787,69818]],69797:[,,{69818:69803}],69803:[[69797,69818]],69817:[,9],69818:[,7]}, +4352:{69888:[,230],69889:[,230],69890:[,230],69934:[[69937,69927]],69935:[[69938,69927]],69937:[,,{69927:69934}],69938:[,,{69927:69935}],69939:[,9],69940:[,9],70003:[,7],70080:[,9]}, +4608:{70197:[,9],70198:[,7],70377:[,7],70378:[,9]}, +4864:{4957:[,230],4958:[,230],4959:[,230],70460:[,7],70471:[,,{70462:70475,70487:70476}],70475:[[70471,70462]],70476:[[70471,70487]],70477:[,9],70502:[,230],70503:[,230],70504:[,230],70505:[,230],70506:[,230],70507:[,230],70508:[,230],70512:[,230],70513:[,230],70514:[,230],70515:[,230],70516:[,230]}, +5120:{70841:[,,{70832:70844,70842:70843,70845:70846}],70843:[[70841,70842]],70844:[[70841,70832]],70846:[[70841,70845]],70850:[,9],70851:[,7]}, +5376:{71096:[,,{71087:71098}],71097:[,,{71087:71099}],71098:[[71096,71087]],71099:[[71097,71087]],71103:[,9],71104:[,7]}, +5632:{71231:[,9],71350:[,9],71351:[,7]}, +5888:{5908:[,9],5940:[,9],6098:[,9],6109:[,230]}, +6144:{6313:[,228]}, +6400:{6457:[,222],6458:[,230],6459:[,220]}, +6656:{6679:[,230],6680:[,220],6752:[,9],6773:[,230],6774:[,230],6775:[,230],6776:[,230],6777:[,230],6778:[,230],6779:[,230],6780:[,230],6783:[,220],6832:[,230],6833:[,230],6834:[,230],6835:[,230],6836:[,230],6837:[,220],6838:[,220],6839:[,220],6840:[,220],6841:[,220],6842:[,220],6843:[,230],6844:[,230],6845:[,220]}, +6912:{6917:[,,{6965:6918}],6918:[[6917,6965]],6919:[,,{6965:6920}],6920:[[6919,6965]],6921:[,,{6965:6922}],6922:[[6921,6965]],6923:[,,{6965:6924}],6924:[[6923,6965]],6925:[,,{6965:6926}],6926:[[6925,6965]],6929:[,,{6965:6930}],6930:[[6929,6965]],6964:[,7],6970:[,,{6965:6971}],6971:[[6970,6965]],6972:[,,{6965:6973}],6973:[[6972,6965]],6974:[,,{6965:6976}],6975:[,,{6965:6977}],6976:[[6974,6965]],6977:[[6975,6965]],6978:[,,{6965:6979}],6979:[[6978,6965]],6980:[,9],7019:[,230],7020:[,220],7021:[,230],7022:[,230],7023:[,230],7024:[,230],7025:[,230],7026:[,230],7027:[,230],7082:[,9],7083:[,9],7142:[,7],7154:[,9],7155:[,9]}, +7168:{7223:[,7],7376:[,230],7377:[,230],7378:[,230],7380:[,1],7381:[,220],7382:[,220],7383:[,220],7384:[,220],7385:[,220],7386:[,230],7387:[,230],7388:[,220],7389:[,220],7390:[,220],7391:[,220],7392:[,230],7394:[,1],7395:[,1],7396:[,1],7397:[,1],7398:[,1],7399:[,1],7400:[,1],7405:[,220],7412:[,230],7416:[,230],7417:[,230]}, +7424:{7468:[[65],256],7469:[[198],256],7470:[[66],256],7472:[[68],256],7473:[[69],256],7474:[[398],256],7475:[[71],256],7476:[[72],256],7477:[[73],256],7478:[[74],256],7479:[[75],256],7480:[[76],256],7481:[[77],256],7482:[[78],256],7484:[[79],256],7485:[[546],256],7486:[[80],256],7487:[[82],256],7488:[[84],256],7489:[[85],256],7490:[[87],256],7491:[[97],256],7492:[[592],256],7493:[[593],256],7494:[[7426],256],7495:[[98],256],7496:[[100],256],7497:[[101],256],7498:[[601],256],7499:[[603],256],7500:[[604],256],7501:[[103],256],7503:[[107],256],7504:[[109],256],7505:[[331],256],7506:[[111],256],7507:[[596],256],7508:[[7446],256],7509:[[7447],256],7510:[[112],256],7511:[[116],256],7512:[[117],256],7513:[[7453],256],7514:[[623],256],7515:[[118],256],7516:[[7461],256],7517:[[946],256],7518:[[947],256],7519:[[948],256],7520:[[966],256],7521:[[967],256],7522:[[105],256],7523:[[114],256],7524:[[117],256],7525:[[118],256],7526:[[946],256],7527:[[947],256],7528:[[961],256],7529:[[966],256],7530:[[967],256],7544:[[1085],256],7579:[[594],256],7580:[[99],256],7581:[[597],256],7582:[[240],256],7583:[[604],256],7584:[[102],256],7585:[[607],256],7586:[[609],256],7587:[[613],256],7588:[[616],256],7589:[[617],256],7590:[[618],256],7591:[[7547],256],7592:[[669],256],7593:[[621],256],7594:[[7557],256],7595:[[671],256],7596:[[625],256],7597:[[624],256],7598:[[626],256],7599:[[627],256],7600:[[628],256],7601:[[629],256],7602:[[632],256],7603:[[642],256],7604:[[643],256],7605:[[427],256],7606:[[649],256],7607:[[650],256],7608:[[7452],256],7609:[[651],256],7610:[[652],256],7611:[[122],256],7612:[[656],256],7613:[[657],256],7614:[[658],256],7615:[[952],256],7616:[,230],7617:[,230],7618:[,220],7619:[,230],7620:[,230],7621:[,230],7622:[,230],7623:[,230],7624:[,230],7625:[,230],7626:[,220],7627:[,230],7628:[,230],7629:[,234],7630:[,214],7631:[,220],7632:[,202],7633:[,230],7634:[,230],7635:[,230],7636:[,230],7637:[,230],7638:[,230],7639:[,230],7640:[,230],7641:[,230],7642:[,230],7643:[,230],7644:[,230],7645:[,230],7646:[,230],7647:[,230],7648:[,230],7649:[,230],7650:[,230],7651:[,230],7652:[,230],7653:[,230],7654:[,230],7655:[,230],7656:[,230],7657:[,230],7658:[,230],7659:[,230],7660:[,230],7661:[,230],7662:[,230],7663:[,230],7664:[,230],7665:[,230],7666:[,230],7667:[,230],7668:[,230],7669:[,230],7676:[,233],7677:[,220],7678:[,230],7679:[,220]}, +7680:{7680:[[65,805]],7681:[[97,805]],7682:[[66,775]],7683:[[98,775]],7684:[[66,803]],7685:[[98,803]],7686:[[66,817]],7687:[[98,817]],7688:[[199,769]],7689:[[231,769]],7690:[[68,775]],7691:[[100,775]],7692:[[68,803]],7693:[[100,803]],7694:[[68,817]],7695:[[100,817]],7696:[[68,807]],7697:[[100,807]],7698:[[68,813]],7699:[[100,813]],7700:[[274,768]],7701:[[275,768]],7702:[[274,769]],7703:[[275,769]],7704:[[69,813]],7705:[[101,813]],7706:[[69,816]],7707:[[101,816]],7708:[[552,774]],7709:[[553,774]],7710:[[70,775]],7711:[[102,775]],7712:[[71,772]],7713:[[103,772]],7714:[[72,775]],7715:[[104,775]],7716:[[72,803]],7717:[[104,803]],7718:[[72,776]],7719:[[104,776]],7720:[[72,807]],7721:[[104,807]],7722:[[72,814]],7723:[[104,814]],7724:[[73,816]],7725:[[105,816]],7726:[[207,769]],7727:[[239,769]],7728:[[75,769]],7729:[[107,769]],7730:[[75,803]],7731:[[107,803]],7732:[[75,817]],7733:[[107,817]],7734:[[76,803],,{772:7736}],7735:[[108,803],,{772:7737}],7736:[[7734,772]],7737:[[7735,772]],7738:[[76,817]],7739:[[108,817]],7740:[[76,813]],7741:[[108,813]],7742:[[77,769]],7743:[[109,769]],7744:[[77,775]],7745:[[109,775]],7746:[[77,803]],7747:[[109,803]],7748:[[78,775]],7749:[[110,775]],7750:[[78,803]],7751:[[110,803]],7752:[[78,817]],7753:[[110,817]],7754:[[78,813]],7755:[[110,813]],7756:[[213,769]],7757:[[245,769]],7758:[[213,776]],7759:[[245,776]],7760:[[332,768]],7761:[[333,768]],7762:[[332,769]],7763:[[333,769]],7764:[[80,769]],7765:[[112,769]],7766:[[80,775]],7767:[[112,775]],7768:[[82,775]],7769:[[114,775]],7770:[[82,803],,{772:7772}],7771:[[114,803],,{772:7773}],7772:[[7770,772]],7773:[[7771,772]],7774:[[82,817]],7775:[[114,817]],7776:[[83,775]],7777:[[115,775]],7778:[[83,803],,{775:7784}],7779:[[115,803],,{775:7785}],7780:[[346,775]],7781:[[347,775]],7782:[[352,775]],7783:[[353,775]],7784:[[7778,775]],7785:[[7779,775]],7786:[[84,775]],7787:[[116,775]],7788:[[84,803]],7789:[[116,803]],7790:[[84,817]],7791:[[116,817]],7792:[[84,813]],7793:[[116,813]],7794:[[85,804]],7795:[[117,804]],7796:[[85,816]],7797:[[117,816]],7798:[[85,813]],7799:[[117,813]],7800:[[360,769]],7801:[[361,769]],7802:[[362,776]],7803:[[363,776]],7804:[[86,771]],7805:[[118,771]],7806:[[86,803]],7807:[[118,803]],7808:[[87,768]],7809:[[119,768]],7810:[[87,769]],7811:[[119,769]],7812:[[87,776]],7813:[[119,776]],7814:[[87,775]],7815:[[119,775]],7816:[[87,803]],7817:[[119,803]],7818:[[88,775]],7819:[[120,775]],7820:[[88,776]],7821:[[120,776]],7822:[[89,775]],7823:[[121,775]],7824:[[90,770]],7825:[[122,770]],7826:[[90,803]],7827:[[122,803]],7828:[[90,817]],7829:[[122,817]],7830:[[104,817]],7831:[[116,776]],7832:[[119,778]],7833:[[121,778]],7834:[[97,702],256],7835:[[383,775]],7840:[[65,803],,{770:7852,774:7862}],7841:[[97,803],,{770:7853,774:7863}],7842:[[65,777]],7843:[[97,777]],7844:[[194,769]],7845:[[226,769]],7846:[[194,768]],7847:[[226,768]],7848:[[194,777]],7849:[[226,777]],7850:[[194,771]],7851:[[226,771]],7852:[[7840,770]],7853:[[7841,770]],7854:[[258,769]],7855:[[259,769]],7856:[[258,768]],7857:[[259,768]],7858:[[258,777]],7859:[[259,777]],7860:[[258,771]],7861:[[259,771]],7862:[[7840,774]],7863:[[7841,774]],7864:[[69,803],,{770:7878}],7865:[[101,803],,{770:7879}],7866:[[69,777]],7867:[[101,777]],7868:[[69,771]],7869:[[101,771]],7870:[[202,769]],7871:[[234,769]],7872:[[202,768]],7873:[[234,768]],7874:[[202,777]],7875:[[234,777]],7876:[[202,771]],7877:[[234,771]],7878:[[7864,770]],7879:[[7865,770]],7880:[[73,777]],7881:[[105,777]],7882:[[73,803]],7883:[[105,803]],7884:[[79,803],,{770:7896}],7885:[[111,803],,{770:7897}],7886:[[79,777]],7887:[[111,777]],7888:[[212,769]],7889:[[244,769]],7890:[[212,768]],7891:[[244,768]],7892:[[212,777]],7893:[[244,777]],7894:[[212,771]],7895:[[244,771]],7896:[[7884,770]],7897:[[7885,770]],7898:[[416,769]],7899:[[417,769]],7900:[[416,768]],7901:[[417,768]],7902:[[416,777]],7903:[[417,777]],7904:[[416,771]],7905:[[417,771]],7906:[[416,803]],7907:[[417,803]],7908:[[85,803]],7909:[[117,803]],7910:[[85,777]],7911:[[117,777]],7912:[[431,769]],7913:[[432,769]],7914:[[431,768]],7915:[[432,768]],7916:[[431,777]],7917:[[432,777]],7918:[[431,771]],7919:[[432,771]],7920:[[431,803]],7921:[[432,803]],7922:[[89,768]],7923:[[121,768]],7924:[[89,803]],7925:[[121,803]],7926:[[89,777]],7927:[[121,777]],7928:[[89,771]],7929:[[121,771]]}, +7936:{7936:[[945,787],,{768:7938,769:7940,834:7942,837:8064}],7937:[[945,788],,{768:7939,769:7941,834:7943,837:8065}],7938:[[7936,768],,{837:8066}],7939:[[7937,768],,{837:8067}],7940:[[7936,769],,{837:8068}],7941:[[7937,769],,{837:8069}],7942:[[7936,834],,{837:8070}],7943:[[7937,834],,{837:8071}],7944:[[913,787],,{768:7946,769:7948,834:7950,837:8072}],7945:[[913,788],,{768:7947,769:7949,834:7951,837:8073}],7946:[[7944,768],,{837:8074}],7947:[[7945,768],,{837:8075}],7948:[[7944,769],,{837:8076}],7949:[[7945,769],,{837:8077}],7950:[[7944,834],,{837:8078}],7951:[[7945,834],,{837:8079}],7952:[[949,787],,{768:7954,769:7956}],7953:[[949,788],,{768:7955,769:7957}],7954:[[7952,768]],7955:[[7953,768]],7956:[[7952,769]],7957:[[7953,769]],7960:[[917,787],,{768:7962,769:7964}],7961:[[917,788],,{768:7963,769:7965}],7962:[[7960,768]],7963:[[7961,768]],7964:[[7960,769]],7965:[[7961,769]],7968:[[951,787],,{768:7970,769:7972,834:7974,837:8080}],7969:[[951,788],,{768:7971,769:7973,834:7975,837:8081}],7970:[[7968,768],,{837:8082}],7971:[[7969,768],,{837:8083}],7972:[[7968,769],,{837:8084}],7973:[[7969,769],,{837:8085}],7974:[[7968,834],,{837:8086}],7975:[[7969,834],,{837:8087}],7976:[[919,787],,{768:7978,769:7980,834:7982,837:8088}],7977:[[919,788],,{768:7979,769:7981,834:7983,837:8089}],7978:[[7976,768],,{837:8090}],7979:[[7977,768],,{837:8091}],7980:[[7976,769],,{837:8092}],7981:[[7977,769],,{837:8093}],7982:[[7976,834],,{837:8094}],7983:[[7977,834],,{837:8095}],7984:[[953,787],,{768:7986,769:7988,834:7990}],7985:[[953,788],,{768:7987,769:7989,834:7991}],7986:[[7984,768]],7987:[[7985,768]],7988:[[7984,769]],7989:[[7985,769]],7990:[[7984,834]],7991:[[7985,834]],7992:[[921,787],,{768:7994,769:7996,834:7998}],7993:[[921,788],,{768:7995,769:7997,834:7999}],7994:[[7992,768]],7995:[[7993,768]],7996:[[7992,769]],7997:[[7993,769]],7998:[[7992,834]],7999:[[7993,834]],8000:[[959,787],,{768:8002,769:8004}],8001:[[959,788],,{768:8003,769:8005}],8002:[[8000,768]],8003:[[8001,768]],8004:[[8000,769]],8005:[[8001,769]],8008:[[927,787],,{768:8010,769:8012}],8009:[[927,788],,{768:8011,769:8013}],8010:[[8008,768]],8011:[[8009,768]],8012:[[8008,769]],8013:[[8009,769]],8016:[[965,787],,{768:8018,769:8020,834:8022}],8017:[[965,788],,{768:8019,769:8021,834:8023}],8018:[[8016,768]],8019:[[8017,768]],8020:[[8016,769]],8021:[[8017,769]],8022:[[8016,834]],8023:[[8017,834]],8025:[[933,788],,{768:8027,769:8029,834:8031}],8027:[[8025,768]],8029:[[8025,769]],8031:[[8025,834]],8032:[[969,787],,{768:8034,769:8036,834:8038,837:8096}],8033:[[969,788],,{768:8035,769:8037,834:8039,837:8097}],8034:[[8032,768],,{837:8098}],8035:[[8033,768],,{837:8099}],8036:[[8032,769],,{837:8100}],8037:[[8033,769],,{837:8101}],8038:[[8032,834],,{837:8102}],8039:[[8033,834],,{837:8103}],8040:[[937,787],,{768:8042,769:8044,834:8046,837:8104}],8041:[[937,788],,{768:8043,769:8045,834:8047,837:8105}],8042:[[8040,768],,{837:8106}],8043:[[8041,768],,{837:8107}],8044:[[8040,769],,{837:8108}],8045:[[8041,769],,{837:8109}],8046:[[8040,834],,{837:8110}],8047:[[8041,834],,{837:8111}],8048:[[945,768],,{837:8114}],8049:[[940]],8050:[[949,768]],8051:[[941]],8052:[[951,768],,{837:8130}],8053:[[942]],8054:[[953,768]],8055:[[943]],8056:[[959,768]],8057:[[972]],8058:[[965,768]],8059:[[973]],8060:[[969,768],,{837:8178}],8061:[[974]],8064:[[7936,837]],8065:[[7937,837]],8066:[[7938,837]],8067:[[7939,837]],8068:[[7940,837]],8069:[[7941,837]],8070:[[7942,837]],8071:[[7943,837]],8072:[[7944,837]],8073:[[7945,837]],8074:[[7946,837]],8075:[[7947,837]],8076:[[7948,837]],8077:[[7949,837]],8078:[[7950,837]],8079:[[7951,837]],8080:[[7968,837]],8081:[[7969,837]],8082:[[7970,837]],8083:[[7971,837]],8084:[[7972,837]],8085:[[7973,837]],8086:[[7974,837]],8087:[[7975,837]],8088:[[7976,837]],8089:[[7977,837]],8090:[[7978,837]],8091:[[7979,837]],8092:[[7980,837]],8093:[[7981,837]],8094:[[7982,837]],8095:[[7983,837]],8096:[[8032,837]],8097:[[8033,837]],8098:[[8034,837]],8099:[[8035,837]],8100:[[8036,837]],8101:[[8037,837]],8102:[[8038,837]],8103:[[8039,837]],8104:[[8040,837]],8105:[[8041,837]],8106:[[8042,837]],8107:[[8043,837]],8108:[[8044,837]],8109:[[8045,837]],8110:[[8046,837]],8111:[[8047,837]],8112:[[945,774]],8113:[[945,772]],8114:[[8048,837]],8115:[[945,837]],8116:[[940,837]],8118:[[945,834],,{837:8119}],8119:[[8118,837]],8120:[[913,774]],8121:[[913,772]],8122:[[913,768]],8123:[[902]],8124:[[913,837]],8125:[[32,787],256],8126:[[953]],8127:[[32,787],256,{768:8141,769:8142,834:8143}],8128:[[32,834],256],8129:[[168,834]],8130:[[8052,837]],8131:[[951,837]],8132:[[942,837]],8134:[[951,834],,{837:8135}],8135:[[8134,837]],8136:[[917,768]],8137:[[904]],8138:[[919,768]],8139:[[905]],8140:[[919,837]],8141:[[8127,768]],8142:[[8127,769]],8143:[[8127,834]],8144:[[953,774]],8145:[[953,772]],8146:[[970,768]],8147:[[912]],8150:[[953,834]],8151:[[970,834]],8152:[[921,774]],8153:[[921,772]],8154:[[921,768]],8155:[[906]],8157:[[8190,768]],8158:[[8190,769]],8159:[[8190,834]],8160:[[965,774]],8161:[[965,772]],8162:[[971,768]],8163:[[944]],8164:[[961,787]],8165:[[961,788]],8166:[[965,834]],8167:[[971,834]],8168:[[933,774]],8169:[[933,772]],8170:[[933,768]],8171:[[910]],8172:[[929,788]],8173:[[168,768]],8174:[[901]],8175:[[96]],8178:[[8060,837]],8179:[[969,837]],8180:[[974,837]],8182:[[969,834],,{837:8183}],8183:[[8182,837]],8184:[[927,768]],8185:[[908]],8186:[[937,768]],8187:[[911]],8188:[[937,837]],8189:[[180]],8190:[[32,788],256,{768:8157,769:8158,834:8159}]}, +8192:{8192:[[8194]],8193:[[8195]],8194:[[32],256],8195:[[32],256],8196:[[32],256],8197:[[32],256],8198:[[32],256],8199:[[32],256],8200:[[32],256],8201:[[32],256],8202:[[32],256],8209:[[8208],256],8215:[[32,819],256],8228:[[46],256],8229:[[46,46],256],8230:[[46,46,46],256],8239:[[32],256],8243:[[8242,8242],256],8244:[[8242,8242,8242],256],8246:[[8245,8245],256],8247:[[8245,8245,8245],256],8252:[[33,33],256],8254:[[32,773],256],8263:[[63,63],256],8264:[[63,33],256],8265:[[33,63],256],8279:[[8242,8242,8242,8242],256],8287:[[32],256],8304:[[48],256],8305:[[105],256],8308:[[52],256],8309:[[53],256],8310:[[54],256],8311:[[55],256],8312:[[56],256],8313:[[57],256],8314:[[43],256],8315:[[8722],256],8316:[[61],256],8317:[[40],256],8318:[[41],256],8319:[[110],256],8320:[[48],256],8321:[[49],256],8322:[[50],256],8323:[[51],256],8324:[[52],256],8325:[[53],256],8326:[[54],256],8327:[[55],256],8328:[[56],256],8329:[[57],256],8330:[[43],256],8331:[[8722],256],8332:[[61],256],8333:[[40],256],8334:[[41],256],8336:[[97],256],8337:[[101],256],8338:[[111],256],8339:[[120],256],8340:[[601],256],8341:[[104],256],8342:[[107],256],8343:[[108],256],8344:[[109],256],8345:[[110],256],8346:[[112],256],8347:[[115],256],8348:[[116],256],8360:[[82,115],256],8400:[,230],8401:[,230],8402:[,1],8403:[,1],8404:[,230],8405:[,230],8406:[,230],8407:[,230],8408:[,1],8409:[,1],8410:[,1],8411:[,230],8412:[,230],8417:[,230],8421:[,1],8422:[,1],8423:[,230],8424:[,220],8425:[,230],8426:[,1],8427:[,1],8428:[,220],8429:[,220],8430:[,220],8431:[,220],8432:[,230]}, +8448:{8448:[[97,47,99],256],8449:[[97,47,115],256],8450:[[67],256],8451:[[176,67],256],8453:[[99,47,111],256],8454:[[99,47,117],256],8455:[[400],256],8457:[[176,70],256],8458:[[103],256],8459:[[72],256],8460:[[72],256],8461:[[72],256],8462:[[104],256],8463:[[295],256],8464:[[73],256],8465:[[73],256],8466:[[76],256],8467:[[108],256],8469:[[78],256],8470:[[78,111],256],8473:[[80],256],8474:[[81],256],8475:[[82],256],8476:[[82],256],8477:[[82],256],8480:[[83,77],256],8481:[[84,69,76],256],8482:[[84,77],256],8484:[[90],256],8486:[[937]],8488:[[90],256],8490:[[75]],8491:[[197]],8492:[[66],256],8493:[[67],256],8495:[[101],256],8496:[[69],256],8497:[[70],256],8499:[[77],256],8500:[[111],256],8501:[[1488],256],8502:[[1489],256],8503:[[1490],256],8504:[[1491],256],8505:[[105],256],8507:[[70,65,88],256],8508:[[960],256],8509:[[947],256],8510:[[915],256],8511:[[928],256],8512:[[8721],256],8517:[[68],256],8518:[[100],256],8519:[[101],256],8520:[[105],256],8521:[[106],256],8528:[[49,8260,55],256],8529:[[49,8260,57],256],8530:[[49,8260,49,48],256],8531:[[49,8260,51],256],8532:[[50,8260,51],256],8533:[[49,8260,53],256],8534:[[50,8260,53],256],8535:[[51,8260,53],256],8536:[[52,8260,53],256],8537:[[49,8260,54],256],8538:[[53,8260,54],256],8539:[[49,8260,56],256],8540:[[51,8260,56],256],8541:[[53,8260,56],256],8542:[[55,8260,56],256],8543:[[49,8260],256],8544:[[73],256],8545:[[73,73],256],8546:[[73,73,73],256],8547:[[73,86],256],8548:[[86],256],8549:[[86,73],256],8550:[[86,73,73],256],8551:[[86,73,73,73],256],8552:[[73,88],256],8553:[[88],256],8554:[[88,73],256],8555:[[88,73,73],256],8556:[[76],256],8557:[[67],256],8558:[[68],256],8559:[[77],256],8560:[[105],256],8561:[[105,105],256],8562:[[105,105,105],256],8563:[[105,118],256],8564:[[118],256],8565:[[118,105],256],8566:[[118,105,105],256],8567:[[118,105,105,105],256],8568:[[105,120],256],8569:[[120],256],8570:[[120,105],256],8571:[[120,105,105],256],8572:[[108],256],8573:[[99],256],8574:[[100],256],8575:[[109],256],8585:[[48,8260,51],256],8592:[,,{824:8602}],8594:[,,{824:8603}],8596:[,,{824:8622}],8602:[[8592,824]],8603:[[8594,824]],8622:[[8596,824]],8653:[[8656,824]],8654:[[8660,824]],8655:[[8658,824]],8656:[,,{824:8653}],8658:[,,{824:8655}],8660:[,,{824:8654}]}, +8704:{8707:[,,{824:8708}],8708:[[8707,824]],8712:[,,{824:8713}],8713:[[8712,824]],8715:[,,{824:8716}],8716:[[8715,824]],8739:[,,{824:8740}],8740:[[8739,824]],8741:[,,{824:8742}],8742:[[8741,824]],8748:[[8747,8747],256],8749:[[8747,8747,8747],256],8751:[[8750,8750],256],8752:[[8750,8750,8750],256],8764:[,,{824:8769}],8769:[[8764,824]],8771:[,,{824:8772}],8772:[[8771,824]],8773:[,,{824:8775}],8775:[[8773,824]],8776:[,,{824:8777}],8777:[[8776,824]],8781:[,,{824:8813}],8800:[[61,824]],8801:[,,{824:8802}],8802:[[8801,824]],8804:[,,{824:8816}],8805:[,,{824:8817}],8813:[[8781,824]],8814:[[60,824]],8815:[[62,824]],8816:[[8804,824]],8817:[[8805,824]],8818:[,,{824:8820}],8819:[,,{824:8821}],8820:[[8818,824]],8821:[[8819,824]],8822:[,,{824:8824}],8823:[,,{824:8825}],8824:[[8822,824]],8825:[[8823,824]],8826:[,,{824:8832}],8827:[,,{824:8833}],8828:[,,{824:8928}],8829:[,,{824:8929}],8832:[[8826,824]],8833:[[8827,824]],8834:[,,{824:8836}],8835:[,,{824:8837}],8836:[[8834,824]],8837:[[8835,824]],8838:[,,{824:8840}],8839:[,,{824:8841}],8840:[[8838,824]],8841:[[8839,824]],8849:[,,{824:8930}],8850:[,,{824:8931}],8866:[,,{824:8876}],8872:[,,{824:8877}],8873:[,,{824:8878}],8875:[,,{824:8879}],8876:[[8866,824]],8877:[[8872,824]],8878:[[8873,824]],8879:[[8875,824]],8882:[,,{824:8938}],8883:[,,{824:8939}],8884:[,,{824:8940}],8885:[,,{824:8941}],8928:[[8828,824]],8929:[[8829,824]],8930:[[8849,824]],8931:[[8850,824]],8938:[[8882,824]],8939:[[8883,824]],8940:[[8884,824]],8941:[[8885,824]]}, +8960:{9001:[[12296]],9002:[[12297]]}, +9216:{9312:[[49],256],9313:[[50],256],9314:[[51],256],9315:[[52],256],9316:[[53],256],9317:[[54],256],9318:[[55],256],9319:[[56],256],9320:[[57],256],9321:[[49,48],256],9322:[[49,49],256],9323:[[49,50],256],9324:[[49,51],256],9325:[[49,52],256],9326:[[49,53],256],9327:[[49,54],256],9328:[[49,55],256],9329:[[49,56],256],9330:[[49,57],256],9331:[[50,48],256],9332:[[40,49,41],256],9333:[[40,50,41],256],9334:[[40,51,41],256],9335:[[40,52,41],256],9336:[[40,53,41],256],9337:[[40,54,41],256],9338:[[40,55,41],256],9339:[[40,56,41],256],9340:[[40,57,41],256],9341:[[40,49,48,41],256],9342:[[40,49,49,41],256],9343:[[40,49,50,41],256],9344:[[40,49,51,41],256],9345:[[40,49,52,41],256],9346:[[40,49,53,41],256],9347:[[40,49,54,41],256],9348:[[40,49,55,41],256],9349:[[40,49,56,41],256],9350:[[40,49,57,41],256],9351:[[40,50,48,41],256],9352:[[49,46],256],9353:[[50,46],256],9354:[[51,46],256],9355:[[52,46],256],9356:[[53,46],256],9357:[[54,46],256],9358:[[55,46],256],9359:[[56,46],256],9360:[[57,46],256],9361:[[49,48,46],256],9362:[[49,49,46],256],9363:[[49,50,46],256],9364:[[49,51,46],256],9365:[[49,52,46],256],9366:[[49,53,46],256],9367:[[49,54,46],256],9368:[[49,55,46],256],9369:[[49,56,46],256],9370:[[49,57,46],256],9371:[[50,48,46],256],9372:[[40,97,41],256],9373:[[40,98,41],256],9374:[[40,99,41],256],9375:[[40,100,41],256],9376:[[40,101,41],256],9377:[[40,102,41],256],9378:[[40,103,41],256],9379:[[40,104,41],256],9380:[[40,105,41],256],9381:[[40,106,41],256],9382:[[40,107,41],256],9383:[[40,108,41],256],9384:[[40,109,41],256],9385:[[40,110,41],256],9386:[[40,111,41],256],9387:[[40,112,41],256],9388:[[40,113,41],256],9389:[[40,114,41],256],9390:[[40,115,41],256],9391:[[40,116,41],256],9392:[[40,117,41],256],9393:[[40,118,41],256],9394:[[40,119,41],256],9395:[[40,120,41],256],9396:[[40,121,41],256],9397:[[40,122,41],256],9398:[[65],256],9399:[[66],256],9400:[[67],256],9401:[[68],256],9402:[[69],256],9403:[[70],256],9404:[[71],256],9405:[[72],256],9406:[[73],256],9407:[[74],256],9408:[[75],256],9409:[[76],256],9410:[[77],256],9411:[[78],256],9412:[[79],256],9413:[[80],256],9414:[[81],256],9415:[[82],256],9416:[[83],256],9417:[[84],256],9418:[[85],256],9419:[[86],256],9420:[[87],256],9421:[[88],256],9422:[[89],256],9423:[[90],256],9424:[[97],256],9425:[[98],256],9426:[[99],256],9427:[[100],256],9428:[[101],256],9429:[[102],256],9430:[[103],256],9431:[[104],256],9432:[[105],256],9433:[[106],256],9434:[[107],256],9435:[[108],256],9436:[[109],256],9437:[[110],256],9438:[[111],256],9439:[[112],256],9440:[[113],256],9441:[[114],256],9442:[[115],256],9443:[[116],256],9444:[[117],256],9445:[[118],256],9446:[[119],256],9447:[[120],256],9448:[[121],256],9449:[[122],256],9450:[[48],256]}, +10752:{10764:[[8747,8747,8747,8747],256],10868:[[58,58,61],256],10869:[[61,61],256],10870:[[61,61,61],256],10972:[[10973,824],512]}, +11264:{11388:[[106],256],11389:[[86],256],11503:[,230],11504:[,230],11505:[,230]}, +11520:{11631:[[11617],256],11647:[,9],11744:[,230],11745:[,230],11746:[,230],11747:[,230],11748:[,230],11749:[,230],11750:[,230],11751:[,230],11752:[,230],11753:[,230],11754:[,230],11755:[,230],11756:[,230],11757:[,230],11758:[,230],11759:[,230],11760:[,230],11761:[,230],11762:[,230],11763:[,230],11764:[,230],11765:[,230],11766:[,230],11767:[,230],11768:[,230],11769:[,230],11770:[,230],11771:[,230],11772:[,230],11773:[,230],11774:[,230],11775:[,230]}, +11776:{11935:[[27597],256],12019:[[40863],256]}, +12032:{12032:[[19968],256],12033:[[20008],256],12034:[[20022],256],12035:[[20031],256],12036:[[20057],256],12037:[[20101],256],12038:[[20108],256],12039:[[20128],256],12040:[[20154],256],12041:[[20799],256],12042:[[20837],256],12043:[[20843],256],12044:[[20866],256],12045:[[20886],256],12046:[[20907],256],12047:[[20960],256],12048:[[20981],256],12049:[[20992],256],12050:[[21147],256],12051:[[21241],256],12052:[[21269],256],12053:[[21274],256],12054:[[21304],256],12055:[[21313],256],12056:[[21340],256],12057:[[21353],256],12058:[[21378],256],12059:[[21430],256],12060:[[21448],256],12061:[[21475],256],12062:[[22231],256],12063:[[22303],256],12064:[[22763],256],12065:[[22786],256],12066:[[22794],256],12067:[[22805],256],12068:[[22823],256],12069:[[22899],256],12070:[[23376],256],12071:[[23424],256],12072:[[23544],256],12073:[[23567],256],12074:[[23586],256],12075:[[23608],256],12076:[[23662],256],12077:[[23665],256],12078:[[24027],256],12079:[[24037],256],12080:[[24049],256],12081:[[24062],256],12082:[[24178],256],12083:[[24186],256],12084:[[24191],256],12085:[[24308],256],12086:[[24318],256],12087:[[24331],256],12088:[[24339],256],12089:[[24400],256],12090:[[24417],256],12091:[[24435],256],12092:[[24515],256],12093:[[25096],256],12094:[[25142],256],12095:[[25163],256],12096:[[25903],256],12097:[[25908],256],12098:[[25991],256],12099:[[26007],256],12100:[[26020],256],12101:[[26041],256],12102:[[26080],256],12103:[[26085],256],12104:[[26352],256],12105:[[26376],256],12106:[[26408],256],12107:[[27424],256],12108:[[27490],256],12109:[[27513],256],12110:[[27571],256],12111:[[27595],256],12112:[[27604],256],12113:[[27611],256],12114:[[27663],256],12115:[[27668],256],12116:[[27700],256],12117:[[28779],256],12118:[[29226],256],12119:[[29238],256],12120:[[29243],256],12121:[[29247],256],12122:[[29255],256],12123:[[29273],256],12124:[[29275],256],12125:[[29356],256],12126:[[29572],256],12127:[[29577],256],12128:[[29916],256],12129:[[29926],256],12130:[[29976],256],12131:[[29983],256],12132:[[29992],256],12133:[[30000],256],12134:[[30091],256],12135:[[30098],256],12136:[[30326],256],12137:[[30333],256],12138:[[30382],256],12139:[[30399],256],12140:[[30446],256],12141:[[30683],256],12142:[[30690],256],12143:[[30707],256],12144:[[31034],256],12145:[[31160],256],12146:[[31166],256],12147:[[31348],256],12148:[[31435],256],12149:[[31481],256],12150:[[31859],256],12151:[[31992],256],12152:[[32566],256],12153:[[32593],256],12154:[[32650],256],12155:[[32701],256],12156:[[32769],256],12157:[[32780],256],12158:[[32786],256],12159:[[32819],256],12160:[[32895],256],12161:[[32905],256],12162:[[33251],256],12163:[[33258],256],12164:[[33267],256],12165:[[33276],256],12166:[[33292],256],12167:[[33307],256],12168:[[33311],256],12169:[[33390],256],12170:[[33394],256],12171:[[33400],256],12172:[[34381],256],12173:[[34411],256],12174:[[34880],256],12175:[[34892],256],12176:[[34915],256],12177:[[35198],256],12178:[[35211],256],12179:[[35282],256],12180:[[35328],256],12181:[[35895],256],12182:[[35910],256],12183:[[35925],256],12184:[[35960],256],12185:[[35997],256],12186:[[36196],256],12187:[[36208],256],12188:[[36275],256],12189:[[36523],256],12190:[[36554],256],12191:[[36763],256],12192:[[36784],256],12193:[[36789],256],12194:[[37009],256],12195:[[37193],256],12196:[[37318],256],12197:[[37324],256],12198:[[37329],256],12199:[[38263],256],12200:[[38272],256],12201:[[38428],256],12202:[[38582],256],12203:[[38585],256],12204:[[38632],256],12205:[[38737],256],12206:[[38750],256],12207:[[38754],256],12208:[[38761],256],12209:[[38859],256],12210:[[38893],256],12211:[[38899],256],12212:[[38913],256],12213:[[39080],256],12214:[[39131],256],12215:[[39135],256],12216:[[39318],256],12217:[[39321],256],12218:[[39340],256],12219:[[39592],256],12220:[[39640],256],12221:[[39647],256],12222:[[39717],256],12223:[[39727],256],12224:[[39730],256],12225:[[39740],256],12226:[[39770],256],12227:[[40165],256],12228:[[40565],256],12229:[[40575],256],12230:[[40613],256],12231:[[40635],256],12232:[[40643],256],12233:[[40653],256],12234:[[40657],256],12235:[[40697],256],12236:[[40701],256],12237:[[40718],256],12238:[[40723],256],12239:[[40736],256],12240:[[40763],256],12241:[[40778],256],12242:[[40786],256],12243:[[40845],256],12244:[[40860],256],12245:[[40864],256]}, +12288:{12288:[[32],256],12330:[,218],12331:[,228],12332:[,232],12333:[,222],12334:[,224],12335:[,224],12342:[[12306],256],12344:[[21313],256],12345:[[21316],256],12346:[[21317],256],12358:[,,{12441:12436}],12363:[,,{12441:12364}],12364:[[12363,12441]],12365:[,,{12441:12366}],12366:[[12365,12441]],12367:[,,{12441:12368}],12368:[[12367,12441]],12369:[,,{12441:12370}],12370:[[12369,12441]],12371:[,,{12441:12372}],12372:[[12371,12441]],12373:[,,{12441:12374}],12374:[[12373,12441]],12375:[,,{12441:12376}],12376:[[12375,12441]],12377:[,,{12441:12378}],12378:[[12377,12441]],12379:[,,{12441:12380}],12380:[[12379,12441]],12381:[,,{12441:12382}],12382:[[12381,12441]],12383:[,,{12441:12384}],12384:[[12383,12441]],12385:[,,{12441:12386}],12386:[[12385,12441]],12388:[,,{12441:12389}],12389:[[12388,12441]],12390:[,,{12441:12391}],12391:[[12390,12441]],12392:[,,{12441:12393}],12393:[[12392,12441]],12399:[,,{12441:12400,12442:12401}],12400:[[12399,12441]],12401:[[12399,12442]],12402:[,,{12441:12403,12442:12404}],12403:[[12402,12441]],12404:[[12402,12442]],12405:[,,{12441:12406,12442:12407}],12406:[[12405,12441]],12407:[[12405,12442]],12408:[,,{12441:12409,12442:12410}],12409:[[12408,12441]],12410:[[12408,12442]],12411:[,,{12441:12412,12442:12413}],12412:[[12411,12441]],12413:[[12411,12442]],12436:[[12358,12441]],12441:[,8],12442:[,8],12443:[[32,12441],256],12444:[[32,12442],256],12445:[,,{12441:12446}],12446:[[12445,12441]],12447:[[12424,12426],256],12454:[,,{12441:12532}],12459:[,,{12441:12460}],12460:[[12459,12441]],12461:[,,{12441:12462}],12462:[[12461,12441]],12463:[,,{12441:12464}],12464:[[12463,12441]],12465:[,,{12441:12466}],12466:[[12465,12441]],12467:[,,{12441:12468}],12468:[[12467,12441]],12469:[,,{12441:12470}],12470:[[12469,12441]],12471:[,,{12441:12472}],12472:[[12471,12441]],12473:[,,{12441:12474}],12474:[[12473,12441]],12475:[,,{12441:12476}],12476:[[12475,12441]],12477:[,,{12441:12478}],12478:[[12477,12441]],12479:[,,{12441:12480}],12480:[[12479,12441]],12481:[,,{12441:12482}],12482:[[12481,12441]],12484:[,,{12441:12485}],12485:[[12484,12441]],12486:[,,{12441:12487}],12487:[[12486,12441]],12488:[,,{12441:12489}],12489:[[12488,12441]],12495:[,,{12441:12496,12442:12497}],12496:[[12495,12441]],12497:[[12495,12442]],12498:[,,{12441:12499,12442:12500}],12499:[[12498,12441]],12500:[[12498,12442]],12501:[,,{12441:12502,12442:12503}],12502:[[12501,12441]],12503:[[12501,12442]],12504:[,,{12441:12505,12442:12506}],12505:[[12504,12441]],12506:[[12504,12442]],12507:[,,{12441:12508,12442:12509}],12508:[[12507,12441]],12509:[[12507,12442]],12527:[,,{12441:12535}],12528:[,,{12441:12536}],12529:[,,{12441:12537}],12530:[,,{12441:12538}],12532:[[12454,12441]],12535:[[12527,12441]],12536:[[12528,12441]],12537:[[12529,12441]],12538:[[12530,12441]],12541:[,,{12441:12542}],12542:[[12541,12441]],12543:[[12467,12488],256]}, +12544:{12593:[[4352],256],12594:[[4353],256],12595:[[4522],256],12596:[[4354],256],12597:[[4524],256],12598:[[4525],256],12599:[[4355],256],12600:[[4356],256],12601:[[4357],256],12602:[[4528],256],12603:[[4529],256],12604:[[4530],256],12605:[[4531],256],12606:[[4532],256],12607:[[4533],256],12608:[[4378],256],12609:[[4358],256],12610:[[4359],256],12611:[[4360],256],12612:[[4385],256],12613:[[4361],256],12614:[[4362],256],12615:[[4363],256],12616:[[4364],256],12617:[[4365],256],12618:[[4366],256],12619:[[4367],256],12620:[[4368],256],12621:[[4369],256],12622:[[4370],256],12623:[[4449],256],12624:[[4450],256],12625:[[4451],256],12626:[[4452],256],12627:[[4453],256],12628:[[4454],256],12629:[[4455],256],12630:[[4456],256],12631:[[4457],256],12632:[[4458],256],12633:[[4459],256],12634:[[4460],256],12635:[[4461],256],12636:[[4462],256],12637:[[4463],256],12638:[[4464],256],12639:[[4465],256],12640:[[4466],256],12641:[[4467],256],12642:[[4468],256],12643:[[4469],256],12644:[[4448],256],12645:[[4372],256],12646:[[4373],256],12647:[[4551],256],12648:[[4552],256],12649:[[4556],256],12650:[[4558],256],12651:[[4563],256],12652:[[4567],256],12653:[[4569],256],12654:[[4380],256],12655:[[4573],256],12656:[[4575],256],12657:[[4381],256],12658:[[4382],256],12659:[[4384],256],12660:[[4386],256],12661:[[4387],256],12662:[[4391],256],12663:[[4393],256],12664:[[4395],256],12665:[[4396],256],12666:[[4397],256],12667:[[4398],256],12668:[[4399],256],12669:[[4402],256],12670:[[4406],256],12671:[[4416],256],12672:[[4423],256],12673:[[4428],256],12674:[[4593],256],12675:[[4594],256],12676:[[4439],256],12677:[[4440],256],12678:[[4441],256],12679:[[4484],256],12680:[[4485],256],12681:[[4488],256],12682:[[4497],256],12683:[[4498],256],12684:[[4500],256],12685:[[4510],256],12686:[[4513],256],12690:[[19968],256],12691:[[20108],256],12692:[[19977],256],12693:[[22235],256],12694:[[19978],256],12695:[[20013],256],12696:[[19979],256],12697:[[30002],256],12698:[[20057],256],12699:[[19993],256],12700:[[19969],256],12701:[[22825],256],12702:[[22320],256],12703:[[20154],256]}, +12800:{12800:[[40,4352,41],256],12801:[[40,4354,41],256],12802:[[40,4355,41],256],12803:[[40,4357,41],256],12804:[[40,4358,41],256],12805:[[40,4359,41],256],12806:[[40,4361,41],256],12807:[[40,4363,41],256],12808:[[40,4364,41],256],12809:[[40,4366,41],256],12810:[[40,4367,41],256],12811:[[40,4368,41],256],12812:[[40,4369,41],256],12813:[[40,4370,41],256],12814:[[40,4352,4449,41],256],12815:[[40,4354,4449,41],256],12816:[[40,4355,4449,41],256],12817:[[40,4357,4449,41],256],12818:[[40,4358,4449,41],256],12819:[[40,4359,4449,41],256],12820:[[40,4361,4449,41],256],12821:[[40,4363,4449,41],256],12822:[[40,4364,4449,41],256],12823:[[40,4366,4449,41],256],12824:[[40,4367,4449,41],256],12825:[[40,4368,4449,41],256],12826:[[40,4369,4449,41],256],12827:[[40,4370,4449,41],256],12828:[[40,4364,4462,41],256],12829:[[40,4363,4457,4364,4453,4523,41],256],12830:[[40,4363,4457,4370,4462,41],256],12832:[[40,19968,41],256],12833:[[40,20108,41],256],12834:[[40,19977,41],256],12835:[[40,22235,41],256],12836:[[40,20116,41],256],12837:[[40,20845,41],256],12838:[[40,19971,41],256],12839:[[40,20843,41],256],12840:[[40,20061,41],256],12841:[[40,21313,41],256],12842:[[40,26376,41],256],12843:[[40,28779,41],256],12844:[[40,27700,41],256],12845:[[40,26408,41],256],12846:[[40,37329,41],256],12847:[[40,22303,41],256],12848:[[40,26085,41],256],12849:[[40,26666,41],256],12850:[[40,26377,41],256],12851:[[40,31038,41],256],12852:[[40,21517,41],256],12853:[[40,29305,41],256],12854:[[40,36001,41],256],12855:[[40,31069,41],256],12856:[[40,21172,41],256],12857:[[40,20195,41],256],12858:[[40,21628,41],256],12859:[[40,23398,41],256],12860:[[40,30435,41],256],12861:[[40,20225,41],256],12862:[[40,36039,41],256],12863:[[40,21332,41],256],12864:[[40,31085,41],256],12865:[[40,20241,41],256],12866:[[40,33258,41],256],12867:[[40,33267,41],256],12868:[[21839],256],12869:[[24188],256],12870:[[25991],256],12871:[[31631],256],12880:[[80,84,69],256],12881:[[50,49],256],12882:[[50,50],256],12883:[[50,51],256],12884:[[50,52],256],12885:[[50,53],256],12886:[[50,54],256],12887:[[50,55],256],12888:[[50,56],256],12889:[[50,57],256],12890:[[51,48],256],12891:[[51,49],256],12892:[[51,50],256],12893:[[51,51],256],12894:[[51,52],256],12895:[[51,53],256],12896:[[4352],256],12897:[[4354],256],12898:[[4355],256],12899:[[4357],256],12900:[[4358],256],12901:[[4359],256],12902:[[4361],256],12903:[[4363],256],12904:[[4364],256],12905:[[4366],256],12906:[[4367],256],12907:[[4368],256],12908:[[4369],256],12909:[[4370],256],12910:[[4352,4449],256],12911:[[4354,4449],256],12912:[[4355,4449],256],12913:[[4357,4449],256],12914:[[4358,4449],256],12915:[[4359,4449],256],12916:[[4361,4449],256],12917:[[4363,4449],256],12918:[[4364,4449],256],12919:[[4366,4449],256],12920:[[4367,4449],256],12921:[[4368,4449],256],12922:[[4369,4449],256],12923:[[4370,4449],256],12924:[[4366,4449,4535,4352,4457],256],12925:[[4364,4462,4363,4468],256],12926:[[4363,4462],256],12928:[[19968],256],12929:[[20108],256],12930:[[19977],256],12931:[[22235],256],12932:[[20116],256],12933:[[20845],256],12934:[[19971],256],12935:[[20843],256],12936:[[20061],256],12937:[[21313],256],12938:[[26376],256],12939:[[28779],256],12940:[[27700],256],12941:[[26408],256],12942:[[37329],256],12943:[[22303],256],12944:[[26085],256],12945:[[26666],256],12946:[[26377],256],12947:[[31038],256],12948:[[21517],256],12949:[[29305],256],12950:[[36001],256],12951:[[31069],256],12952:[[21172],256],12953:[[31192],256],12954:[[30007],256],12955:[[22899],256],12956:[[36969],256],12957:[[20778],256],12958:[[21360],256],12959:[[27880],256],12960:[[38917],256],12961:[[20241],256],12962:[[20889],256],12963:[[27491],256],12964:[[19978],256],12965:[[20013],256],12966:[[19979],256],12967:[[24038],256],12968:[[21491],256],12969:[[21307],256],12970:[[23447],256],12971:[[23398],256],12972:[[30435],256],12973:[[20225],256],12974:[[36039],256],12975:[[21332],256],12976:[[22812],256],12977:[[51,54],256],12978:[[51,55],256],12979:[[51,56],256],12980:[[51,57],256],12981:[[52,48],256],12982:[[52,49],256],12983:[[52,50],256],12984:[[52,51],256],12985:[[52,52],256],12986:[[52,53],256],12987:[[52,54],256],12988:[[52,55],256],12989:[[52,56],256],12990:[[52,57],256],12991:[[53,48],256],12992:[[49,26376],256],12993:[[50,26376],256],12994:[[51,26376],256],12995:[[52,26376],256],12996:[[53,26376],256],12997:[[54,26376],256],12998:[[55,26376],256],12999:[[56,26376],256],13000:[[57,26376],256],13001:[[49,48,26376],256],13002:[[49,49,26376],256],13003:[[49,50,26376],256],13004:[[72,103],256],13005:[[101,114,103],256],13006:[[101,86],256],13007:[[76,84,68],256],13008:[[12450],256],13009:[[12452],256],13010:[[12454],256],13011:[[12456],256],13012:[[12458],256],13013:[[12459],256],13014:[[12461],256],13015:[[12463],256],13016:[[12465],256],13017:[[12467],256],13018:[[12469],256],13019:[[12471],256],13020:[[12473],256],13021:[[12475],256],13022:[[12477],256],13023:[[12479],256],13024:[[12481],256],13025:[[12484],256],13026:[[12486],256],13027:[[12488],256],13028:[[12490],256],13029:[[12491],256],13030:[[12492],256],13031:[[12493],256],13032:[[12494],256],13033:[[12495],256],13034:[[12498],256],13035:[[12501],256],13036:[[12504],256],13037:[[12507],256],13038:[[12510],256],13039:[[12511],256],13040:[[12512],256],13041:[[12513],256],13042:[[12514],256],13043:[[12516],256],13044:[[12518],256],13045:[[12520],256],13046:[[12521],256],13047:[[12522],256],13048:[[12523],256],13049:[[12524],256],13050:[[12525],256],13051:[[12527],256],13052:[[12528],256],13053:[[12529],256],13054:[[12530],256]}, +13056:{13056:[[12450,12497,12540,12488],256],13057:[[12450,12523,12501,12449],256],13058:[[12450,12531,12506,12450],256],13059:[[12450,12540,12523],256],13060:[[12452,12491,12531,12464],256],13061:[[12452,12531,12481],256],13062:[[12454,12457,12531],256],13063:[[12456,12473,12463,12540,12489],256],13064:[[12456,12540,12459,12540],256],13065:[[12458,12531,12473],256],13066:[[12458,12540,12512],256],13067:[[12459,12452,12522],256],13068:[[12459,12521,12483,12488],256],13069:[[12459,12525,12522,12540],256],13070:[[12460,12525,12531],256],13071:[[12460,12531,12510],256],13072:[[12462,12460],256],13073:[[12462,12491,12540],256],13074:[[12461,12517,12522,12540],256],13075:[[12462,12523,12480,12540],256],13076:[[12461,12525],256],13077:[[12461,12525,12464,12521,12512],256],13078:[[12461,12525,12513,12540,12488,12523],256],13079:[[12461,12525,12527,12483,12488],256],13080:[[12464,12521,12512],256],13081:[[12464,12521,12512,12488,12531],256],13082:[[12463,12523,12476,12452,12525],256],13083:[[12463,12525,12540,12493],256],13084:[[12465,12540,12473],256],13085:[[12467,12523,12490],256],13086:[[12467,12540,12509],256],13087:[[12469,12452,12463,12523],256],13088:[[12469,12531,12481,12540,12512],256],13089:[[12471,12522,12531,12464],256],13090:[[12475,12531,12481],256],13091:[[12475,12531,12488],256],13092:[[12480,12540,12473],256],13093:[[12487,12471],256],13094:[[12489,12523],256],13095:[[12488,12531],256],13096:[[12490,12494],256],13097:[[12494,12483,12488],256],13098:[[12495,12452,12484],256],13099:[[12497,12540,12475,12531,12488],256],13100:[[12497,12540,12484],256],13101:[[12496,12540,12524,12523],256],13102:[[12500,12450,12473,12488,12523],256],13103:[[12500,12463,12523],256],13104:[[12500,12467],256],13105:[[12499,12523],256],13106:[[12501,12449,12521,12483,12489],256],13107:[[12501,12451,12540,12488],256],13108:[[12502,12483,12471,12455,12523],256],13109:[[12501,12521,12531],256],13110:[[12504,12463,12479,12540,12523],256],13111:[[12506,12477],256],13112:[[12506,12491,12498],256],13113:[[12504,12523,12484],256],13114:[[12506,12531,12473],256],13115:[[12506,12540,12472],256],13116:[[12505,12540,12479],256],13117:[[12509,12452,12531,12488],256],13118:[[12508,12523,12488],256],13119:[[12507,12531],256],13120:[[12509,12531,12489],256],13121:[[12507,12540,12523],256],13122:[[12507,12540,12531],256],13123:[[12510,12452,12463,12525],256],13124:[[12510,12452,12523],256],13125:[[12510,12483,12495],256],13126:[[12510,12523,12463],256],13127:[[12510,12531,12471,12519,12531],256],13128:[[12511,12463,12525,12531],256],13129:[[12511,12522],256],13130:[[12511,12522,12496,12540,12523],256],13131:[[12513,12460],256],13132:[[12513,12460,12488,12531],256],13133:[[12513,12540,12488,12523],256],13134:[[12516,12540,12489],256],13135:[[12516,12540,12523],256],13136:[[12518,12450,12531],256],13137:[[12522,12483,12488,12523],256],13138:[[12522,12521],256],13139:[[12523,12500,12540],256],13140:[[12523,12540,12502,12523],256],13141:[[12524,12512],256],13142:[[12524,12531,12488,12466,12531],256],13143:[[12527,12483,12488],256],13144:[[48,28857],256],13145:[[49,28857],256],13146:[[50,28857],256],13147:[[51,28857],256],13148:[[52,28857],256],13149:[[53,28857],256],13150:[[54,28857],256],13151:[[55,28857],256],13152:[[56,28857],256],13153:[[57,28857],256],13154:[[49,48,28857],256],13155:[[49,49,28857],256],13156:[[49,50,28857],256],13157:[[49,51,28857],256],13158:[[49,52,28857],256],13159:[[49,53,28857],256],13160:[[49,54,28857],256],13161:[[49,55,28857],256],13162:[[49,56,28857],256],13163:[[49,57,28857],256],13164:[[50,48,28857],256],13165:[[50,49,28857],256],13166:[[50,50,28857],256],13167:[[50,51,28857],256],13168:[[50,52,28857],256],13169:[[104,80,97],256],13170:[[100,97],256],13171:[[65,85],256],13172:[[98,97,114],256],13173:[[111,86],256],13174:[[112,99],256],13175:[[100,109],256],13176:[[100,109,178],256],13177:[[100,109,179],256],13178:[[73,85],256],13179:[[24179,25104],256],13180:[[26157,21644],256],13181:[[22823,27491],256],13182:[[26126,27835],256],13183:[[26666,24335,20250,31038],256],13184:[[112,65],256],13185:[[110,65],256],13186:[[956,65],256],13187:[[109,65],256],13188:[[107,65],256],13189:[[75,66],256],13190:[[77,66],256],13191:[[71,66],256],13192:[[99,97,108],256],13193:[[107,99,97,108],256],13194:[[112,70],256],13195:[[110,70],256],13196:[[956,70],256],13197:[[956,103],256],13198:[[109,103],256],13199:[[107,103],256],13200:[[72,122],256],13201:[[107,72,122],256],13202:[[77,72,122],256],13203:[[71,72,122],256],13204:[[84,72,122],256],13205:[[956,8467],256],13206:[[109,8467],256],13207:[[100,8467],256],13208:[[107,8467],256],13209:[[102,109],256],13210:[[110,109],256],13211:[[956,109],256],13212:[[109,109],256],13213:[[99,109],256],13214:[[107,109],256],13215:[[109,109,178],256],13216:[[99,109,178],256],13217:[[109,178],256],13218:[[107,109,178],256],13219:[[109,109,179],256],13220:[[99,109,179],256],13221:[[109,179],256],13222:[[107,109,179],256],13223:[[109,8725,115],256],13224:[[109,8725,115,178],256],13225:[[80,97],256],13226:[[107,80,97],256],13227:[[77,80,97],256],13228:[[71,80,97],256],13229:[[114,97,100],256],13230:[[114,97,100,8725,115],256],13231:[[114,97,100,8725,115,178],256],13232:[[112,115],256],13233:[[110,115],256],13234:[[956,115],256],13235:[[109,115],256],13236:[[112,86],256],13237:[[110,86],256],13238:[[956,86],256],13239:[[109,86],256],13240:[[107,86],256],13241:[[77,86],256],13242:[[112,87],256],13243:[[110,87],256],13244:[[956,87],256],13245:[[109,87],256],13246:[[107,87],256],13247:[[77,87],256],13248:[[107,937],256],13249:[[77,937],256],13250:[[97,46,109,46],256],13251:[[66,113],256],13252:[[99,99],256],13253:[[99,100],256],13254:[[67,8725,107,103],256],13255:[[67,111,46],256],13256:[[100,66],256],13257:[[71,121],256],13258:[[104,97],256],13259:[[72,80],256],13260:[[105,110],256],13261:[[75,75],256],13262:[[75,77],256],13263:[[107,116],256],13264:[[108,109],256],13265:[[108,110],256],13266:[[108,111,103],256],13267:[[108,120],256],13268:[[109,98],256],13269:[[109,105,108],256],13270:[[109,111,108],256],13271:[[80,72],256],13272:[[112,46,109,46],256],13273:[[80,80,77],256],13274:[[80,82],256],13275:[[115,114],256],13276:[[83,118],256],13277:[[87,98],256],13278:[[86,8725,109],256],13279:[[65,8725,109],256],13280:[[49,26085],256],13281:[[50,26085],256],13282:[[51,26085],256],13283:[[52,26085],256],13284:[[53,26085],256],13285:[[54,26085],256],13286:[[55,26085],256],13287:[[56,26085],256],13288:[[57,26085],256],13289:[[49,48,26085],256],13290:[[49,49,26085],256],13291:[[49,50,26085],256],13292:[[49,51,26085],256],13293:[[49,52,26085],256],13294:[[49,53,26085],256],13295:[[49,54,26085],256],13296:[[49,55,26085],256],13297:[[49,56,26085],256],13298:[[49,57,26085],256],13299:[[50,48,26085],256],13300:[[50,49,26085],256],13301:[[50,50,26085],256],13302:[[50,51,26085],256],13303:[[50,52,26085],256],13304:[[50,53,26085],256],13305:[[50,54,26085],256],13306:[[50,55,26085],256],13307:[[50,56,26085],256],13308:[[50,57,26085],256],13309:[[51,48,26085],256],13310:[[51,49,26085],256],13311:[[103,97,108],256]}, +27136:{92912:[,1],92913:[,1],92914:[,1],92915:[,1],92916:[,1]}, +27392:{92976:[,230],92977:[,230],92978:[,230],92979:[,230],92980:[,230],92981:[,230],92982:[,230]}, +42496:{42607:[,230],42612:[,230],42613:[,230],42614:[,230],42615:[,230],42616:[,230],42617:[,230],42618:[,230],42619:[,230],42620:[,230],42621:[,230],42652:[[1098],256],42653:[[1100],256],42655:[,230],42736:[,230],42737:[,230]}, +42752:{42864:[[42863],256],43000:[[294],256],43001:[[339],256]}, +43008:{43014:[,9],43204:[,9],43232:[,230],43233:[,230],43234:[,230],43235:[,230],43236:[,230],43237:[,230],43238:[,230],43239:[,230],43240:[,230],43241:[,230],43242:[,230],43243:[,230],43244:[,230],43245:[,230],43246:[,230],43247:[,230],43248:[,230],43249:[,230]}, +43264:{43307:[,220],43308:[,220],43309:[,220],43347:[,9],43443:[,7],43456:[,9]}, +43520:{43696:[,230],43698:[,230],43699:[,230],43700:[,220],43703:[,230],43704:[,230],43710:[,230],43711:[,230],43713:[,230],43766:[,9]}, +43776:{43868:[[42791],256],43869:[[43831],256],43870:[[619],256],43871:[[43858],256],44013:[,9]}, +48128:{113822:[,1]}, +53504:{119134:[[119127,119141],512],119135:[[119128,119141],512],119136:[[119135,119150],512],119137:[[119135,119151],512],119138:[[119135,119152],512],119139:[[119135,119153],512],119140:[[119135,119154],512],119141:[,216],119142:[,216],119143:[,1],119144:[,1],119145:[,1],119149:[,226],119150:[,216],119151:[,216],119152:[,216],119153:[,216],119154:[,216],119163:[,220],119164:[,220],119165:[,220],119166:[,220],119167:[,220],119168:[,220],119169:[,220],119170:[,220],119173:[,230],119174:[,230],119175:[,230],119176:[,230],119177:[,230],119178:[,220],119179:[,220],119210:[,230],119211:[,230],119212:[,230],119213:[,230],119227:[[119225,119141],512],119228:[[119226,119141],512],119229:[[119227,119150],512],119230:[[119228,119150],512],119231:[[119227,119151],512],119232:[[119228,119151],512]}, +53760:{119362:[,230],119363:[,230],119364:[,230]}, +54272:{119808:[[65],256],119809:[[66],256],119810:[[67],256],119811:[[68],256],119812:[[69],256],119813:[[70],256],119814:[[71],256],119815:[[72],256],119816:[[73],256],119817:[[74],256],119818:[[75],256],119819:[[76],256],119820:[[77],256],119821:[[78],256],119822:[[79],256],119823:[[80],256],119824:[[81],256],119825:[[82],256],119826:[[83],256],119827:[[84],256],119828:[[85],256],119829:[[86],256],119830:[[87],256],119831:[[88],256],119832:[[89],256],119833:[[90],256],119834:[[97],256],119835:[[98],256],119836:[[99],256],119837:[[100],256],119838:[[101],256],119839:[[102],256],119840:[[103],256],119841:[[104],256],119842:[[105],256],119843:[[106],256],119844:[[107],256],119845:[[108],256],119846:[[109],256],119847:[[110],256],119848:[[111],256],119849:[[112],256],119850:[[113],256],119851:[[114],256],119852:[[115],256],119853:[[116],256],119854:[[117],256],119855:[[118],256],119856:[[119],256],119857:[[120],256],119858:[[121],256],119859:[[122],256],119860:[[65],256],119861:[[66],256],119862:[[67],256],119863:[[68],256],119864:[[69],256],119865:[[70],256],119866:[[71],256],119867:[[72],256],119868:[[73],256],119869:[[74],256],119870:[[75],256],119871:[[76],256],119872:[[77],256],119873:[[78],256],119874:[[79],256],119875:[[80],256],119876:[[81],256],119877:[[82],256],119878:[[83],256],119879:[[84],256],119880:[[85],256],119881:[[86],256],119882:[[87],256],119883:[[88],256],119884:[[89],256],119885:[[90],256],119886:[[97],256],119887:[[98],256],119888:[[99],256],119889:[[100],256],119890:[[101],256],119891:[[102],256],119892:[[103],256],119894:[[105],256],119895:[[106],256],119896:[[107],256],119897:[[108],256],119898:[[109],256],119899:[[110],256],119900:[[111],256],119901:[[112],256],119902:[[113],256],119903:[[114],256],119904:[[115],256],119905:[[116],256],119906:[[117],256],119907:[[118],256],119908:[[119],256],119909:[[120],256],119910:[[121],256],119911:[[122],256],119912:[[65],256],119913:[[66],256],119914:[[67],256],119915:[[68],256],119916:[[69],256],119917:[[70],256],119918:[[71],256],119919:[[72],256],119920:[[73],256],119921:[[74],256],119922:[[75],256],119923:[[76],256],119924:[[77],256],119925:[[78],256],119926:[[79],256],119927:[[80],256],119928:[[81],256],119929:[[82],256],119930:[[83],256],119931:[[84],256],119932:[[85],256],119933:[[86],256],119934:[[87],256],119935:[[88],256],119936:[[89],256],119937:[[90],256],119938:[[97],256],119939:[[98],256],119940:[[99],256],119941:[[100],256],119942:[[101],256],119943:[[102],256],119944:[[103],256],119945:[[104],256],119946:[[105],256],119947:[[106],256],119948:[[107],256],119949:[[108],256],119950:[[109],256],119951:[[110],256],119952:[[111],256],119953:[[112],256],119954:[[113],256],119955:[[114],256],119956:[[115],256],119957:[[116],256],119958:[[117],256],119959:[[118],256],119960:[[119],256],119961:[[120],256],119962:[[121],256],119963:[[122],256],119964:[[65],256],119966:[[67],256],119967:[[68],256],119970:[[71],256],119973:[[74],256],119974:[[75],256],119977:[[78],256],119978:[[79],256],119979:[[80],256],119980:[[81],256],119982:[[83],256],119983:[[84],256],119984:[[85],256],119985:[[86],256],119986:[[87],256],119987:[[88],256],119988:[[89],256],119989:[[90],256],119990:[[97],256],119991:[[98],256],119992:[[99],256],119993:[[100],256],119995:[[102],256],119997:[[104],256],119998:[[105],256],119999:[[106],256],120000:[[107],256],120001:[[108],256],120002:[[109],256],120003:[[110],256],120005:[[112],256],120006:[[113],256],120007:[[114],256],120008:[[115],256],120009:[[116],256],120010:[[117],256],120011:[[118],256],120012:[[119],256],120013:[[120],256],120014:[[121],256],120015:[[122],256],120016:[[65],256],120017:[[66],256],120018:[[67],256],120019:[[68],256],120020:[[69],256],120021:[[70],256],120022:[[71],256],120023:[[72],256],120024:[[73],256],120025:[[74],256],120026:[[75],256],120027:[[76],256],120028:[[77],256],120029:[[78],256],120030:[[79],256],120031:[[80],256],120032:[[81],256],120033:[[82],256],120034:[[83],256],120035:[[84],256],120036:[[85],256],120037:[[86],256],120038:[[87],256],120039:[[88],256],120040:[[89],256],120041:[[90],256],120042:[[97],256],120043:[[98],256],120044:[[99],256],120045:[[100],256],120046:[[101],256],120047:[[102],256],120048:[[103],256],120049:[[104],256],120050:[[105],256],120051:[[106],256],120052:[[107],256],120053:[[108],256],120054:[[109],256],120055:[[110],256],120056:[[111],256],120057:[[112],256],120058:[[113],256],120059:[[114],256],120060:[[115],256],120061:[[116],256],120062:[[117],256],120063:[[118],256]}, +54528:{120064:[[119],256],120065:[[120],256],120066:[[121],256],120067:[[122],256],120068:[[65],256],120069:[[66],256],120071:[[68],256],120072:[[69],256],120073:[[70],256],120074:[[71],256],120077:[[74],256],120078:[[75],256],120079:[[76],256],120080:[[77],256],120081:[[78],256],120082:[[79],256],120083:[[80],256],120084:[[81],256],120086:[[83],256],120087:[[84],256],120088:[[85],256],120089:[[86],256],120090:[[87],256],120091:[[88],256],120092:[[89],256],120094:[[97],256],120095:[[98],256],120096:[[99],256],120097:[[100],256],120098:[[101],256],120099:[[102],256],120100:[[103],256],120101:[[104],256],120102:[[105],256],120103:[[106],256],120104:[[107],256],120105:[[108],256],120106:[[109],256],120107:[[110],256],120108:[[111],256],120109:[[112],256],120110:[[113],256],120111:[[114],256],120112:[[115],256],120113:[[116],256],120114:[[117],256],120115:[[118],256],120116:[[119],256],120117:[[120],256],120118:[[121],256],120119:[[122],256],120120:[[65],256],120121:[[66],256],120123:[[68],256],120124:[[69],256],120125:[[70],256],120126:[[71],256],120128:[[73],256],120129:[[74],256],120130:[[75],256],120131:[[76],256],120132:[[77],256],120134:[[79],256],120138:[[83],256],120139:[[84],256],120140:[[85],256],120141:[[86],256],120142:[[87],256],120143:[[88],256],120144:[[89],256],120146:[[97],256],120147:[[98],256],120148:[[99],256],120149:[[100],256],120150:[[101],256],120151:[[102],256],120152:[[103],256],120153:[[104],256],120154:[[105],256],120155:[[106],256],120156:[[107],256],120157:[[108],256],120158:[[109],256],120159:[[110],256],120160:[[111],256],120161:[[112],256],120162:[[113],256],120163:[[114],256],120164:[[115],256],120165:[[116],256],120166:[[117],256],120167:[[118],256],120168:[[119],256],120169:[[120],256],120170:[[121],256],120171:[[122],256],120172:[[65],256],120173:[[66],256],120174:[[67],256],120175:[[68],256],120176:[[69],256],120177:[[70],256],120178:[[71],256],120179:[[72],256],120180:[[73],256],120181:[[74],256],120182:[[75],256],120183:[[76],256],120184:[[77],256],120185:[[78],256],120186:[[79],256],120187:[[80],256],120188:[[81],256],120189:[[82],256],120190:[[83],256],120191:[[84],256],120192:[[85],256],120193:[[86],256],120194:[[87],256],120195:[[88],256],120196:[[89],256],120197:[[90],256],120198:[[97],256],120199:[[98],256],120200:[[99],256],120201:[[100],256],120202:[[101],256],120203:[[102],256],120204:[[103],256],120205:[[104],256],120206:[[105],256],120207:[[106],256],120208:[[107],256],120209:[[108],256],120210:[[109],256],120211:[[110],256],120212:[[111],256],120213:[[112],256],120214:[[113],256],120215:[[114],256],120216:[[115],256],120217:[[116],256],120218:[[117],256],120219:[[118],256],120220:[[119],256],120221:[[120],256],120222:[[121],256],120223:[[122],256],120224:[[65],256],120225:[[66],256],120226:[[67],256],120227:[[68],256],120228:[[69],256],120229:[[70],256],120230:[[71],256],120231:[[72],256],120232:[[73],256],120233:[[74],256],120234:[[75],256],120235:[[76],256],120236:[[77],256],120237:[[78],256],120238:[[79],256],120239:[[80],256],120240:[[81],256],120241:[[82],256],120242:[[83],256],120243:[[84],256],120244:[[85],256],120245:[[86],256],120246:[[87],256],120247:[[88],256],120248:[[89],256],120249:[[90],256],120250:[[97],256],120251:[[98],256],120252:[[99],256],120253:[[100],256],120254:[[101],256],120255:[[102],256],120256:[[103],256],120257:[[104],256],120258:[[105],256],120259:[[106],256],120260:[[107],256],120261:[[108],256],120262:[[109],256],120263:[[110],256],120264:[[111],256],120265:[[112],256],120266:[[113],256],120267:[[114],256],120268:[[115],256],120269:[[116],256],120270:[[117],256],120271:[[118],256],120272:[[119],256],120273:[[120],256],120274:[[121],256],120275:[[122],256],120276:[[65],256],120277:[[66],256],120278:[[67],256],120279:[[68],256],120280:[[69],256],120281:[[70],256],120282:[[71],256],120283:[[72],256],120284:[[73],256],120285:[[74],256],120286:[[75],256],120287:[[76],256],120288:[[77],256],120289:[[78],256],120290:[[79],256],120291:[[80],256],120292:[[81],256],120293:[[82],256],120294:[[83],256],120295:[[84],256],120296:[[85],256],120297:[[86],256],120298:[[87],256],120299:[[88],256],120300:[[89],256],120301:[[90],256],120302:[[97],256],120303:[[98],256],120304:[[99],256],120305:[[100],256],120306:[[101],256],120307:[[102],256],120308:[[103],256],120309:[[104],256],120310:[[105],256],120311:[[106],256],120312:[[107],256],120313:[[108],256],120314:[[109],256],120315:[[110],256],120316:[[111],256],120317:[[112],256],120318:[[113],256],120319:[[114],256]}, +54784:{120320:[[115],256],120321:[[116],256],120322:[[117],256],120323:[[118],256],120324:[[119],256],120325:[[120],256],120326:[[121],256],120327:[[122],256],120328:[[65],256],120329:[[66],256],120330:[[67],256],120331:[[68],256],120332:[[69],256],120333:[[70],256],120334:[[71],256],120335:[[72],256],120336:[[73],256],120337:[[74],256],120338:[[75],256],120339:[[76],256],120340:[[77],256],120341:[[78],256],120342:[[79],256],120343:[[80],256],120344:[[81],256],120345:[[82],256],120346:[[83],256],120347:[[84],256],120348:[[85],256],120349:[[86],256],120350:[[87],256],120351:[[88],256],120352:[[89],256],120353:[[90],256],120354:[[97],256],120355:[[98],256],120356:[[99],256],120357:[[100],256],120358:[[101],256],120359:[[102],256],120360:[[103],256],120361:[[104],256],120362:[[105],256],120363:[[106],256],120364:[[107],256],120365:[[108],256],120366:[[109],256],120367:[[110],256],120368:[[111],256],120369:[[112],256],120370:[[113],256],120371:[[114],256],120372:[[115],256],120373:[[116],256],120374:[[117],256],120375:[[118],256],120376:[[119],256],120377:[[120],256],120378:[[121],256],120379:[[122],256],120380:[[65],256],120381:[[66],256],120382:[[67],256],120383:[[68],256],120384:[[69],256],120385:[[70],256],120386:[[71],256],120387:[[72],256],120388:[[73],256],120389:[[74],256],120390:[[75],256],120391:[[76],256],120392:[[77],256],120393:[[78],256],120394:[[79],256],120395:[[80],256],120396:[[81],256],120397:[[82],256],120398:[[83],256],120399:[[84],256],120400:[[85],256],120401:[[86],256],120402:[[87],256],120403:[[88],256],120404:[[89],256],120405:[[90],256],120406:[[97],256],120407:[[98],256],120408:[[99],256],120409:[[100],256],120410:[[101],256],120411:[[102],256],120412:[[103],256],120413:[[104],256],120414:[[105],256],120415:[[106],256],120416:[[107],256],120417:[[108],256],120418:[[109],256],120419:[[110],256],120420:[[111],256],120421:[[112],256],120422:[[113],256],120423:[[114],256],120424:[[115],256],120425:[[116],256],120426:[[117],256],120427:[[118],256],120428:[[119],256],120429:[[120],256],120430:[[121],256],120431:[[122],256],120432:[[65],256],120433:[[66],256],120434:[[67],256],120435:[[68],256],120436:[[69],256],120437:[[70],256],120438:[[71],256],120439:[[72],256],120440:[[73],256],120441:[[74],256],120442:[[75],256],120443:[[76],256],120444:[[77],256],120445:[[78],256],120446:[[79],256],120447:[[80],256],120448:[[81],256],120449:[[82],256],120450:[[83],256],120451:[[84],256],120452:[[85],256],120453:[[86],256],120454:[[87],256],120455:[[88],256],120456:[[89],256],120457:[[90],256],120458:[[97],256],120459:[[98],256],120460:[[99],256],120461:[[100],256],120462:[[101],256],120463:[[102],256],120464:[[103],256],120465:[[104],256],120466:[[105],256],120467:[[106],256],120468:[[107],256],120469:[[108],256],120470:[[109],256],120471:[[110],256],120472:[[111],256],120473:[[112],256],120474:[[113],256],120475:[[114],256],120476:[[115],256],120477:[[116],256],120478:[[117],256],120479:[[118],256],120480:[[119],256],120481:[[120],256],120482:[[121],256],120483:[[122],256],120484:[[305],256],120485:[[567],256],120488:[[913],256],120489:[[914],256],120490:[[915],256],120491:[[916],256],120492:[[917],256],120493:[[918],256],120494:[[919],256],120495:[[920],256],120496:[[921],256],120497:[[922],256],120498:[[923],256],120499:[[924],256],120500:[[925],256],120501:[[926],256],120502:[[927],256],120503:[[928],256],120504:[[929],256],120505:[[1012],256],120506:[[931],256],120507:[[932],256],120508:[[933],256],120509:[[934],256],120510:[[935],256],120511:[[936],256],120512:[[937],256],120513:[[8711],256],120514:[[945],256],120515:[[946],256],120516:[[947],256],120517:[[948],256],120518:[[949],256],120519:[[950],256],120520:[[951],256],120521:[[952],256],120522:[[953],256],120523:[[954],256],120524:[[955],256],120525:[[956],256],120526:[[957],256],120527:[[958],256],120528:[[959],256],120529:[[960],256],120530:[[961],256],120531:[[962],256],120532:[[963],256],120533:[[964],256],120534:[[965],256],120535:[[966],256],120536:[[967],256],120537:[[968],256],120538:[[969],256],120539:[[8706],256],120540:[[1013],256],120541:[[977],256],120542:[[1008],256],120543:[[981],256],120544:[[1009],256],120545:[[982],256],120546:[[913],256],120547:[[914],256],120548:[[915],256],120549:[[916],256],120550:[[917],256],120551:[[918],256],120552:[[919],256],120553:[[920],256],120554:[[921],256],120555:[[922],256],120556:[[923],256],120557:[[924],256],120558:[[925],256],120559:[[926],256],120560:[[927],256],120561:[[928],256],120562:[[929],256],120563:[[1012],256],120564:[[931],256],120565:[[932],256],120566:[[933],256],120567:[[934],256],120568:[[935],256],120569:[[936],256],120570:[[937],256],120571:[[8711],256],120572:[[945],256],120573:[[946],256],120574:[[947],256],120575:[[948],256]}, +55040:{120576:[[949],256],120577:[[950],256],120578:[[951],256],120579:[[952],256],120580:[[953],256],120581:[[954],256],120582:[[955],256],120583:[[956],256],120584:[[957],256],120585:[[958],256],120586:[[959],256],120587:[[960],256],120588:[[961],256],120589:[[962],256],120590:[[963],256],120591:[[964],256],120592:[[965],256],120593:[[966],256],120594:[[967],256],120595:[[968],256],120596:[[969],256],120597:[[8706],256],120598:[[1013],256],120599:[[977],256],120600:[[1008],256],120601:[[981],256],120602:[[1009],256],120603:[[982],256],120604:[[913],256],120605:[[914],256],120606:[[915],256],120607:[[916],256],120608:[[917],256],120609:[[918],256],120610:[[919],256],120611:[[920],256],120612:[[921],256],120613:[[922],256],120614:[[923],256],120615:[[924],256],120616:[[925],256],120617:[[926],256],120618:[[927],256],120619:[[928],256],120620:[[929],256],120621:[[1012],256],120622:[[931],256],120623:[[932],256],120624:[[933],256],120625:[[934],256],120626:[[935],256],120627:[[936],256],120628:[[937],256],120629:[[8711],256],120630:[[945],256],120631:[[946],256],120632:[[947],256],120633:[[948],256],120634:[[949],256],120635:[[950],256],120636:[[951],256],120637:[[952],256],120638:[[953],256],120639:[[954],256],120640:[[955],256],120641:[[956],256],120642:[[957],256],120643:[[958],256],120644:[[959],256],120645:[[960],256],120646:[[961],256],120647:[[962],256],120648:[[963],256],120649:[[964],256],120650:[[965],256],120651:[[966],256],120652:[[967],256],120653:[[968],256],120654:[[969],256],120655:[[8706],256],120656:[[1013],256],120657:[[977],256],120658:[[1008],256],120659:[[981],256],120660:[[1009],256],120661:[[982],256],120662:[[913],256],120663:[[914],256],120664:[[915],256],120665:[[916],256],120666:[[917],256],120667:[[918],256],120668:[[919],256],120669:[[920],256],120670:[[921],256],120671:[[922],256],120672:[[923],256],120673:[[924],256],120674:[[925],256],120675:[[926],256],120676:[[927],256],120677:[[928],256],120678:[[929],256],120679:[[1012],256],120680:[[931],256],120681:[[932],256],120682:[[933],256],120683:[[934],256],120684:[[935],256],120685:[[936],256],120686:[[937],256],120687:[[8711],256],120688:[[945],256],120689:[[946],256],120690:[[947],256],120691:[[948],256],120692:[[949],256],120693:[[950],256],120694:[[951],256],120695:[[952],256],120696:[[953],256],120697:[[954],256],120698:[[955],256],120699:[[956],256],120700:[[957],256],120701:[[958],256],120702:[[959],256],120703:[[960],256],120704:[[961],256],120705:[[962],256],120706:[[963],256],120707:[[964],256],120708:[[965],256],120709:[[966],256],120710:[[967],256],120711:[[968],256],120712:[[969],256],120713:[[8706],256],120714:[[1013],256],120715:[[977],256],120716:[[1008],256],120717:[[981],256],120718:[[1009],256],120719:[[982],256],120720:[[913],256],120721:[[914],256],120722:[[915],256],120723:[[916],256],120724:[[917],256],120725:[[918],256],120726:[[919],256],120727:[[920],256],120728:[[921],256],120729:[[922],256],120730:[[923],256],120731:[[924],256],120732:[[925],256],120733:[[926],256],120734:[[927],256],120735:[[928],256],120736:[[929],256],120737:[[1012],256],120738:[[931],256],120739:[[932],256],120740:[[933],256],120741:[[934],256],120742:[[935],256],120743:[[936],256],120744:[[937],256],120745:[[8711],256],120746:[[945],256],120747:[[946],256],120748:[[947],256],120749:[[948],256],120750:[[949],256],120751:[[950],256],120752:[[951],256],120753:[[952],256],120754:[[953],256],120755:[[954],256],120756:[[955],256],120757:[[956],256],120758:[[957],256],120759:[[958],256],120760:[[959],256],120761:[[960],256],120762:[[961],256],120763:[[962],256],120764:[[963],256],120765:[[964],256],120766:[[965],256],120767:[[966],256],120768:[[967],256],120769:[[968],256],120770:[[969],256],120771:[[8706],256],120772:[[1013],256],120773:[[977],256],120774:[[1008],256],120775:[[981],256],120776:[[1009],256],120777:[[982],256],120778:[[988],256],120779:[[989],256],120782:[[48],256],120783:[[49],256],120784:[[50],256],120785:[[51],256],120786:[[52],256],120787:[[53],256],120788:[[54],256],120789:[[55],256],120790:[[56],256],120791:[[57],256],120792:[[48],256],120793:[[49],256],120794:[[50],256],120795:[[51],256],120796:[[52],256],120797:[[53],256],120798:[[54],256],120799:[[55],256],120800:[[56],256],120801:[[57],256],120802:[[48],256],120803:[[49],256],120804:[[50],256],120805:[[51],256],120806:[[52],256],120807:[[53],256],120808:[[54],256],120809:[[55],256],120810:[[56],256],120811:[[57],256],120812:[[48],256],120813:[[49],256],120814:[[50],256],120815:[[51],256],120816:[[52],256],120817:[[53],256],120818:[[54],256],120819:[[55],256],120820:[[56],256],120821:[[57],256],120822:[[48],256],120823:[[49],256],120824:[[50],256],120825:[[51],256],120826:[[52],256],120827:[[53],256],120828:[[54],256],120829:[[55],256],120830:[[56],256],120831:[[57],256]}, +59392:{125136:[,220],125137:[,220],125138:[,220],125139:[,220],125140:[,220],125141:[,220],125142:[,220]}, +60928:{126464:[[1575],256],126465:[[1576],256],126466:[[1580],256],126467:[[1583],256],126469:[[1608],256],126470:[[1586],256],126471:[[1581],256],126472:[[1591],256],126473:[[1610],256],126474:[[1603],256],126475:[[1604],256],126476:[[1605],256],126477:[[1606],256],126478:[[1587],256],126479:[[1593],256],126480:[[1601],256],126481:[[1589],256],126482:[[1602],256],126483:[[1585],256],126484:[[1588],256],126485:[[1578],256],126486:[[1579],256],126487:[[1582],256],126488:[[1584],256],126489:[[1590],256],126490:[[1592],256],126491:[[1594],256],126492:[[1646],256],126493:[[1722],256],126494:[[1697],256],126495:[[1647],256],126497:[[1576],256],126498:[[1580],256],126500:[[1607],256],126503:[[1581],256],126505:[[1610],256],126506:[[1603],256],126507:[[1604],256],126508:[[1605],256],126509:[[1606],256],126510:[[1587],256],126511:[[1593],256],126512:[[1601],256],126513:[[1589],256],126514:[[1602],256],126516:[[1588],256],126517:[[1578],256],126518:[[1579],256],126519:[[1582],256],126521:[[1590],256],126523:[[1594],256],126530:[[1580],256],126535:[[1581],256],126537:[[1610],256],126539:[[1604],256],126541:[[1606],256],126542:[[1587],256],126543:[[1593],256],126545:[[1589],256],126546:[[1602],256],126548:[[1588],256],126551:[[1582],256],126553:[[1590],256],126555:[[1594],256],126557:[[1722],256],126559:[[1647],256],126561:[[1576],256],126562:[[1580],256],126564:[[1607],256],126567:[[1581],256],126568:[[1591],256],126569:[[1610],256],126570:[[1603],256],126572:[[1605],256],126573:[[1606],256],126574:[[1587],256],126575:[[1593],256],126576:[[1601],256],126577:[[1589],256],126578:[[1602],256],126580:[[1588],256],126581:[[1578],256],126582:[[1579],256],126583:[[1582],256],126585:[[1590],256],126586:[[1592],256],126587:[[1594],256],126588:[[1646],256],126590:[[1697],256],126592:[[1575],256],126593:[[1576],256],126594:[[1580],256],126595:[[1583],256],126596:[[1607],256],126597:[[1608],256],126598:[[1586],256],126599:[[1581],256],126600:[[1591],256],126601:[[1610],256],126603:[[1604],256],126604:[[1605],256],126605:[[1606],256],126606:[[1587],256],126607:[[1593],256],126608:[[1601],256],126609:[[1589],256],126610:[[1602],256],126611:[[1585],256],126612:[[1588],256],126613:[[1578],256],126614:[[1579],256],126615:[[1582],256],126616:[[1584],256],126617:[[1590],256],126618:[[1592],256],126619:[[1594],256],126625:[[1576],256],126626:[[1580],256],126627:[[1583],256],126629:[[1608],256],126630:[[1586],256],126631:[[1581],256],126632:[[1591],256],126633:[[1610],256],126635:[[1604],256],126636:[[1605],256],126637:[[1606],256],126638:[[1587],256],126639:[[1593],256],126640:[[1601],256],126641:[[1589],256],126642:[[1602],256],126643:[[1585],256],126644:[[1588],256],126645:[[1578],256],126646:[[1579],256],126647:[[1582],256],126648:[[1584],256],126649:[[1590],256],126650:[[1592],256],126651:[[1594],256]}, +61696:{127232:[[48,46],256],127233:[[48,44],256],127234:[[49,44],256],127235:[[50,44],256],127236:[[51,44],256],127237:[[52,44],256],127238:[[53,44],256],127239:[[54,44],256],127240:[[55,44],256],127241:[[56,44],256],127242:[[57,44],256],127248:[[40,65,41],256],127249:[[40,66,41],256],127250:[[40,67,41],256],127251:[[40,68,41],256],127252:[[40,69,41],256],127253:[[40,70,41],256],127254:[[40,71,41],256],127255:[[40,72,41],256],127256:[[40,73,41],256],127257:[[40,74,41],256],127258:[[40,75,41],256],127259:[[40,76,41],256],127260:[[40,77,41],256],127261:[[40,78,41],256],127262:[[40,79,41],256],127263:[[40,80,41],256],127264:[[40,81,41],256],127265:[[40,82,41],256],127266:[[40,83,41],256],127267:[[40,84,41],256],127268:[[40,85,41],256],127269:[[40,86,41],256],127270:[[40,87,41],256],127271:[[40,88,41],256],127272:[[40,89,41],256],127273:[[40,90,41],256],127274:[[12308,83,12309],256],127275:[[67],256],127276:[[82],256],127277:[[67,68],256],127278:[[87,90],256],127280:[[65],256],127281:[[66],256],127282:[[67],256],127283:[[68],256],127284:[[69],256],127285:[[70],256],127286:[[71],256],127287:[[72],256],127288:[[73],256],127289:[[74],256],127290:[[75],256],127291:[[76],256],127292:[[77],256],127293:[[78],256],127294:[[79],256],127295:[[80],256],127296:[[81],256],127297:[[82],256],127298:[[83],256],127299:[[84],256],127300:[[85],256],127301:[[86],256],127302:[[87],256],127303:[[88],256],127304:[[89],256],127305:[[90],256],127306:[[72,86],256],127307:[[77,86],256],127308:[[83,68],256],127309:[[83,83],256],127310:[[80,80,86],256],127311:[[87,67],256],127338:[[77,67],256],127339:[[77,68],256],127376:[[68,74],256]}, +61952:{127488:[[12411,12363],256],127489:[[12467,12467],256],127490:[[12469],256],127504:[[25163],256],127505:[[23383],256],127506:[[21452],256],127507:[[12487],256],127508:[[20108],256],127509:[[22810],256],127510:[[35299],256],127511:[[22825],256],127512:[[20132],256],127513:[[26144],256],127514:[[28961],256],127515:[[26009],256],127516:[[21069],256],127517:[[24460],256],127518:[[20877],256],127519:[[26032],256],127520:[[21021],256],127521:[[32066],256],127522:[[29983],256],127523:[[36009],256],127524:[[22768],256],127525:[[21561],256],127526:[[28436],256],127527:[[25237],256],127528:[[25429],256],127529:[[19968],256],127530:[[19977],256],127531:[[36938],256],127532:[[24038],256],127533:[[20013],256],127534:[[21491],256],127535:[[25351],256],127536:[[36208],256],127537:[[25171],256],127538:[[31105],256],127539:[[31354],256],127540:[[21512],256],127541:[[28288],256],127542:[[26377],256],127543:[[26376],256],127544:[[30003],256],127545:[[21106],256],127546:[[21942],256],127552:[[12308,26412,12309],256],127553:[[12308,19977,12309],256],127554:[[12308,20108,12309],256],127555:[[12308,23433,12309],256],127556:[[12308,28857,12309],256],127557:[[12308,25171,12309],256],127558:[[12308,30423,12309],256],127559:[[12308,21213,12309],256],127560:[[12308,25943,12309],256],127568:[[24471],256],127569:[[21487],256]}, +63488:{194560:[[20029]],194561:[[20024]],194562:[[20033]],194563:[[131362]],194564:[[20320]],194565:[[20398]],194566:[[20411]],194567:[[20482]],194568:[[20602]],194569:[[20633]],194570:[[20711]],194571:[[20687]],194572:[[13470]],194573:[[132666]],194574:[[20813]],194575:[[20820]],194576:[[20836]],194577:[[20855]],194578:[[132380]],194579:[[13497]],194580:[[20839]],194581:[[20877]],194582:[[132427]],194583:[[20887]],194584:[[20900]],194585:[[20172]],194586:[[20908]],194587:[[20917]],194588:[[168415]],194589:[[20981]],194590:[[20995]],194591:[[13535]],194592:[[21051]],194593:[[21062]],194594:[[21106]],194595:[[21111]],194596:[[13589]],194597:[[21191]],194598:[[21193]],194599:[[21220]],194600:[[21242]],194601:[[21253]],194602:[[21254]],194603:[[21271]],194604:[[21321]],194605:[[21329]],194606:[[21338]],194607:[[21363]],194608:[[21373]],194609:[[21375]],194610:[[21375]],194611:[[21375]],194612:[[133676]],194613:[[28784]],194614:[[21450]],194615:[[21471]],194616:[[133987]],194617:[[21483]],194618:[[21489]],194619:[[21510]],194620:[[21662]],194621:[[21560]],194622:[[21576]],194623:[[21608]],194624:[[21666]],194625:[[21750]],194626:[[21776]],194627:[[21843]],194628:[[21859]],194629:[[21892]],194630:[[21892]],194631:[[21913]],194632:[[21931]],194633:[[21939]],194634:[[21954]],194635:[[22294]],194636:[[22022]],194637:[[22295]],194638:[[22097]],194639:[[22132]],194640:[[20999]],194641:[[22766]],194642:[[22478]],194643:[[22516]],194644:[[22541]],194645:[[22411]],194646:[[22578]],194647:[[22577]],194648:[[22700]],194649:[[136420]],194650:[[22770]],194651:[[22775]],194652:[[22790]],194653:[[22810]],194654:[[22818]],194655:[[22882]],194656:[[136872]],194657:[[136938]],194658:[[23020]],194659:[[23067]],194660:[[23079]],194661:[[23000]],194662:[[23142]],194663:[[14062]],194664:[[14076]],194665:[[23304]],194666:[[23358]],194667:[[23358]],194668:[[137672]],194669:[[23491]],194670:[[23512]],194671:[[23527]],194672:[[23539]],194673:[[138008]],194674:[[23551]],194675:[[23558]],194676:[[24403]],194677:[[23586]],194678:[[14209]],194679:[[23648]],194680:[[23662]],194681:[[23744]],194682:[[23693]],194683:[[138724]],194684:[[23875]],194685:[[138726]],194686:[[23918]],194687:[[23915]],194688:[[23932]],194689:[[24033]],194690:[[24034]],194691:[[14383]],194692:[[24061]],194693:[[24104]],194694:[[24125]],194695:[[24169]],194696:[[14434]],194697:[[139651]],194698:[[14460]],194699:[[24240]],194700:[[24243]],194701:[[24246]],194702:[[24266]],194703:[[172946]],194704:[[24318]],194705:[[140081]],194706:[[140081]],194707:[[33281]],194708:[[24354]],194709:[[24354]],194710:[[14535]],194711:[[144056]],194712:[[156122]],194713:[[24418]],194714:[[24427]],194715:[[14563]],194716:[[24474]],194717:[[24525]],194718:[[24535]],194719:[[24569]],194720:[[24705]],194721:[[14650]],194722:[[14620]],194723:[[24724]],194724:[[141012]],194725:[[24775]],194726:[[24904]],194727:[[24908]],194728:[[24910]],194729:[[24908]],194730:[[24954]],194731:[[24974]],194732:[[25010]],194733:[[24996]],194734:[[25007]],194735:[[25054]],194736:[[25074]],194737:[[25078]],194738:[[25104]],194739:[[25115]],194740:[[25181]],194741:[[25265]],194742:[[25300]],194743:[[25424]],194744:[[142092]],194745:[[25405]],194746:[[25340]],194747:[[25448]],194748:[[25475]],194749:[[25572]],194750:[[142321]],194751:[[25634]],194752:[[25541]],194753:[[25513]],194754:[[14894]],194755:[[25705]],194756:[[25726]],194757:[[25757]],194758:[[25719]],194759:[[14956]],194760:[[25935]],194761:[[25964]],194762:[[143370]],194763:[[26083]],194764:[[26360]],194765:[[26185]],194766:[[15129]],194767:[[26257]],194768:[[15112]],194769:[[15076]],194770:[[20882]],194771:[[20885]],194772:[[26368]],194773:[[26268]],194774:[[32941]],194775:[[17369]],194776:[[26391]],194777:[[26395]],194778:[[26401]],194779:[[26462]],194780:[[26451]],194781:[[144323]],194782:[[15177]],194783:[[26618]],194784:[[26501]],194785:[[26706]],194786:[[26757]],194787:[[144493]],194788:[[26766]],194789:[[26655]],194790:[[26900]],194791:[[15261]],194792:[[26946]],194793:[[27043]],194794:[[27114]],194795:[[27304]],194796:[[145059]],194797:[[27355]],194798:[[15384]],194799:[[27425]],194800:[[145575]],194801:[[27476]],194802:[[15438]],194803:[[27506]],194804:[[27551]],194805:[[27578]],194806:[[27579]],194807:[[146061]],194808:[[138507]],194809:[[146170]],194810:[[27726]],194811:[[146620]],194812:[[27839]],194813:[[27853]],194814:[[27751]],194815:[[27926]]}, +63744:{63744:[[35912]],63745:[[26356]],63746:[[36554]],63747:[[36040]],63748:[[28369]],63749:[[20018]],63750:[[21477]],63751:[[40860]],63752:[[40860]],63753:[[22865]],63754:[[37329]],63755:[[21895]],63756:[[22856]],63757:[[25078]],63758:[[30313]],63759:[[32645]],63760:[[34367]],63761:[[34746]],63762:[[35064]],63763:[[37007]],63764:[[27138]],63765:[[27931]],63766:[[28889]],63767:[[29662]],63768:[[33853]],63769:[[37226]],63770:[[39409]],63771:[[20098]],63772:[[21365]],63773:[[27396]],63774:[[29211]],63775:[[34349]],63776:[[40478]],63777:[[23888]],63778:[[28651]],63779:[[34253]],63780:[[35172]],63781:[[25289]],63782:[[33240]],63783:[[34847]],63784:[[24266]],63785:[[26391]],63786:[[28010]],63787:[[29436]],63788:[[37070]],63789:[[20358]],63790:[[20919]],63791:[[21214]],63792:[[25796]],63793:[[27347]],63794:[[29200]],63795:[[30439]],63796:[[32769]],63797:[[34310]],63798:[[34396]],63799:[[36335]],63800:[[38706]],63801:[[39791]],63802:[[40442]],63803:[[30860]],63804:[[31103]],63805:[[32160]],63806:[[33737]],63807:[[37636]],63808:[[40575]],63809:[[35542]],63810:[[22751]],63811:[[24324]],63812:[[31840]],63813:[[32894]],63814:[[29282]],63815:[[30922]],63816:[[36034]],63817:[[38647]],63818:[[22744]],63819:[[23650]],63820:[[27155]],63821:[[28122]],63822:[[28431]],63823:[[32047]],63824:[[32311]],63825:[[38475]],63826:[[21202]],63827:[[32907]],63828:[[20956]],63829:[[20940]],63830:[[31260]],63831:[[32190]],63832:[[33777]],63833:[[38517]],63834:[[35712]],63835:[[25295]],63836:[[27138]],63837:[[35582]],63838:[[20025]],63839:[[23527]],63840:[[24594]],63841:[[29575]],63842:[[30064]],63843:[[21271]],63844:[[30971]],63845:[[20415]],63846:[[24489]],63847:[[19981]],63848:[[27852]],63849:[[25976]],63850:[[32034]],63851:[[21443]],63852:[[22622]],63853:[[30465]],63854:[[33865]],63855:[[35498]],63856:[[27578]],63857:[[36784]],63858:[[27784]],63859:[[25342]],63860:[[33509]],63861:[[25504]],63862:[[30053]],63863:[[20142]],63864:[[20841]],63865:[[20937]],63866:[[26753]],63867:[[31975]],63868:[[33391]],63869:[[35538]],63870:[[37327]],63871:[[21237]],63872:[[21570]],63873:[[22899]],63874:[[24300]],63875:[[26053]],63876:[[28670]],63877:[[31018]],63878:[[38317]],63879:[[39530]],63880:[[40599]],63881:[[40654]],63882:[[21147]],63883:[[26310]],63884:[[27511]],63885:[[36706]],63886:[[24180]],63887:[[24976]],63888:[[25088]],63889:[[25754]],63890:[[28451]],63891:[[29001]],63892:[[29833]],63893:[[31178]],63894:[[32244]],63895:[[32879]],63896:[[36646]],63897:[[34030]],63898:[[36899]],63899:[[37706]],63900:[[21015]],63901:[[21155]],63902:[[21693]],63903:[[28872]],63904:[[35010]],63905:[[35498]],63906:[[24265]],63907:[[24565]],63908:[[25467]],63909:[[27566]],63910:[[31806]],63911:[[29557]],63912:[[20196]],63913:[[22265]],63914:[[23527]],63915:[[23994]],63916:[[24604]],63917:[[29618]],63918:[[29801]],63919:[[32666]],63920:[[32838]],63921:[[37428]],63922:[[38646]],63923:[[38728]],63924:[[38936]],63925:[[20363]],63926:[[31150]],63927:[[37300]],63928:[[38584]],63929:[[24801]],63930:[[20102]],63931:[[20698]],63932:[[23534]],63933:[[23615]],63934:[[26009]],63935:[[27138]],63936:[[29134]],63937:[[30274]],63938:[[34044]],63939:[[36988]],63940:[[40845]],63941:[[26248]],63942:[[38446]],63943:[[21129]],63944:[[26491]],63945:[[26611]],63946:[[27969]],63947:[[28316]],63948:[[29705]],63949:[[30041]],63950:[[30827]],63951:[[32016]],63952:[[39006]],63953:[[20845]],63954:[[25134]],63955:[[38520]],63956:[[20523]],63957:[[23833]],63958:[[28138]],63959:[[36650]],63960:[[24459]],63961:[[24900]],63962:[[26647]],63963:[[29575]],63964:[[38534]],63965:[[21033]],63966:[[21519]],63967:[[23653]],63968:[[26131]],63969:[[26446]],63970:[[26792]],63971:[[27877]],63972:[[29702]],63973:[[30178]],63974:[[32633]],63975:[[35023]],63976:[[35041]],63977:[[37324]],63978:[[38626]],63979:[[21311]],63980:[[28346]],63981:[[21533]],63982:[[29136]],63983:[[29848]],63984:[[34298]],63985:[[38563]],63986:[[40023]],63987:[[40607]],63988:[[26519]],63989:[[28107]],63990:[[33256]],63991:[[31435]],63992:[[31520]],63993:[[31890]],63994:[[29376]],63995:[[28825]],63996:[[35672]],63997:[[20160]],63998:[[33590]],63999:[[21050]],194816:[[27966]],194817:[[28023]],194818:[[27969]],194819:[[28009]],194820:[[28024]],194821:[[28037]],194822:[[146718]],194823:[[27956]],194824:[[28207]],194825:[[28270]],194826:[[15667]],194827:[[28363]],194828:[[28359]],194829:[[147153]],194830:[[28153]],194831:[[28526]],194832:[[147294]],194833:[[147342]],194834:[[28614]],194835:[[28729]],194836:[[28702]],194837:[[28699]],194838:[[15766]],194839:[[28746]],194840:[[28797]],194841:[[28791]],194842:[[28845]],194843:[[132389]],194844:[[28997]],194845:[[148067]],194846:[[29084]],194847:[[148395]],194848:[[29224]],194849:[[29237]],194850:[[29264]],194851:[[149000]],194852:[[29312]],194853:[[29333]],194854:[[149301]],194855:[[149524]],194856:[[29562]],194857:[[29579]],194858:[[16044]],194859:[[29605]],194860:[[16056]],194861:[[16056]],194862:[[29767]],194863:[[29788]],194864:[[29809]],194865:[[29829]],194866:[[29898]],194867:[[16155]],194868:[[29988]],194869:[[150582]],194870:[[30014]],194871:[[150674]],194872:[[30064]],194873:[[139679]],194874:[[30224]],194875:[[151457]],194876:[[151480]],194877:[[151620]],194878:[[16380]],194879:[[16392]],194880:[[30452]],194881:[[151795]],194882:[[151794]],194883:[[151833]],194884:[[151859]],194885:[[30494]],194886:[[30495]],194887:[[30495]],194888:[[30538]],194889:[[16441]],194890:[[30603]],194891:[[16454]],194892:[[16534]],194893:[[152605]],194894:[[30798]],194895:[[30860]],194896:[[30924]],194897:[[16611]],194898:[[153126]],194899:[[31062]],194900:[[153242]],194901:[[153285]],194902:[[31119]],194903:[[31211]],194904:[[16687]],194905:[[31296]],194906:[[31306]],194907:[[31311]],194908:[[153980]],194909:[[154279]],194910:[[154279]],194911:[[31470]],194912:[[16898]],194913:[[154539]],194914:[[31686]],194915:[[31689]],194916:[[16935]],194917:[[154752]],194918:[[31954]],194919:[[17056]],194920:[[31976]],194921:[[31971]],194922:[[32000]],194923:[[155526]],194924:[[32099]],194925:[[17153]],194926:[[32199]],194927:[[32258]],194928:[[32325]],194929:[[17204]],194930:[[156200]],194931:[[156231]],194932:[[17241]],194933:[[156377]],194934:[[32634]],194935:[[156478]],194936:[[32661]],194937:[[32762]],194938:[[32773]],194939:[[156890]],194940:[[156963]],194941:[[32864]],194942:[[157096]],194943:[[32880]],194944:[[144223]],194945:[[17365]],194946:[[32946]],194947:[[33027]],194948:[[17419]],194949:[[33086]],194950:[[23221]],194951:[[157607]],194952:[[157621]],194953:[[144275]],194954:[[144284]],194955:[[33281]],194956:[[33284]],194957:[[36766]],194958:[[17515]],194959:[[33425]],194960:[[33419]],194961:[[33437]],194962:[[21171]],194963:[[33457]],194964:[[33459]],194965:[[33469]],194966:[[33510]],194967:[[158524]],194968:[[33509]],194969:[[33565]],194970:[[33635]],194971:[[33709]],194972:[[33571]],194973:[[33725]],194974:[[33767]],194975:[[33879]],194976:[[33619]],194977:[[33738]],194978:[[33740]],194979:[[33756]],194980:[[158774]],194981:[[159083]],194982:[[158933]],194983:[[17707]],194984:[[34033]],194985:[[34035]],194986:[[34070]],194987:[[160714]],194988:[[34148]],194989:[[159532]],194990:[[17757]],194991:[[17761]],194992:[[159665]],194993:[[159954]],194994:[[17771]],194995:[[34384]],194996:[[34396]],194997:[[34407]],194998:[[34409]],194999:[[34473]],195000:[[34440]],195001:[[34574]],195002:[[34530]],195003:[[34681]],195004:[[34600]],195005:[[34667]],195006:[[34694]],195007:[[17879]],195008:[[34785]],195009:[[34817]],195010:[[17913]],195011:[[34912]],195012:[[34915]],195013:[[161383]],195014:[[35031]],195015:[[35038]],195016:[[17973]],195017:[[35066]],195018:[[13499]],195019:[[161966]],195020:[[162150]],195021:[[18110]],195022:[[18119]],195023:[[35488]],195024:[[35565]],195025:[[35722]],195026:[[35925]],195027:[[162984]],195028:[[36011]],195029:[[36033]],195030:[[36123]],195031:[[36215]],195032:[[163631]],195033:[[133124]],195034:[[36299]],195035:[[36284]],195036:[[36336]],195037:[[133342]],195038:[[36564]],195039:[[36664]],195040:[[165330]],195041:[[165357]],195042:[[37012]],195043:[[37105]],195044:[[37137]],195045:[[165678]],195046:[[37147]],195047:[[37432]],195048:[[37591]],195049:[[37592]],195050:[[37500]],195051:[[37881]],195052:[[37909]],195053:[[166906]],195054:[[38283]],195055:[[18837]],195056:[[38327]],195057:[[167287]],195058:[[18918]],195059:[[38595]],195060:[[23986]],195061:[[38691]],195062:[[168261]],195063:[[168474]],195064:[[19054]],195065:[[19062]],195066:[[38880]],195067:[[168970]],195068:[[19122]],195069:[[169110]],195070:[[38923]],195071:[[38923]]}, +64000:{64000:[[20999]],64001:[[24230]],64002:[[25299]],64003:[[31958]],64004:[[23429]],64005:[[27934]],64006:[[26292]],64007:[[36667]],64008:[[34892]],64009:[[38477]],64010:[[35211]],64011:[[24275]],64012:[[20800]],64013:[[21952]],64016:[[22618]],64018:[[26228]],64021:[[20958]],64022:[[29482]],64023:[[30410]],64024:[[31036]],64025:[[31070]],64026:[[31077]],64027:[[31119]],64028:[[38742]],64029:[[31934]],64030:[[32701]],64032:[[34322]],64034:[[35576]],64037:[[36920]],64038:[[37117]],64042:[[39151]],64043:[[39164]],64044:[[39208]],64045:[[40372]],64046:[[37086]],64047:[[38583]],64048:[[20398]],64049:[[20711]],64050:[[20813]],64051:[[21193]],64052:[[21220]],64053:[[21329]],64054:[[21917]],64055:[[22022]],64056:[[22120]],64057:[[22592]],64058:[[22696]],64059:[[23652]],64060:[[23662]],64061:[[24724]],64062:[[24936]],64063:[[24974]],64064:[[25074]],64065:[[25935]],64066:[[26082]],64067:[[26257]],64068:[[26757]],64069:[[28023]],64070:[[28186]],64071:[[28450]],64072:[[29038]],64073:[[29227]],64074:[[29730]],64075:[[30865]],64076:[[31038]],64077:[[31049]],64078:[[31048]],64079:[[31056]],64080:[[31062]],64081:[[31069]],64082:[[31117]],64083:[[31118]],64084:[[31296]],64085:[[31361]],64086:[[31680]],64087:[[32244]],64088:[[32265]],64089:[[32321]],64090:[[32626]],64091:[[32773]],64092:[[33261]],64093:[[33401]],64094:[[33401]],64095:[[33879]],64096:[[35088]],64097:[[35222]],64098:[[35585]],64099:[[35641]],64100:[[36051]],64101:[[36104]],64102:[[36790]],64103:[[36920]],64104:[[38627]],64105:[[38911]],64106:[[38971]],64107:[[24693]],64108:[[148206]],64109:[[33304]],64112:[[20006]],64113:[[20917]],64114:[[20840]],64115:[[20352]],64116:[[20805]],64117:[[20864]],64118:[[21191]],64119:[[21242]],64120:[[21917]],64121:[[21845]],64122:[[21913]],64123:[[21986]],64124:[[22618]],64125:[[22707]],64126:[[22852]],64127:[[22868]],64128:[[23138]],64129:[[23336]],64130:[[24274]],64131:[[24281]],64132:[[24425]],64133:[[24493]],64134:[[24792]],64135:[[24910]],64136:[[24840]],64137:[[24974]],64138:[[24928]],64139:[[25074]],64140:[[25140]],64141:[[25540]],64142:[[25628]],64143:[[25682]],64144:[[25942]],64145:[[26228]],64146:[[26391]],64147:[[26395]],64148:[[26454]],64149:[[27513]],64150:[[27578]],64151:[[27969]],64152:[[28379]],64153:[[28363]],64154:[[28450]],64155:[[28702]],64156:[[29038]],64157:[[30631]],64158:[[29237]],64159:[[29359]],64160:[[29482]],64161:[[29809]],64162:[[29958]],64163:[[30011]],64164:[[30237]],64165:[[30239]],64166:[[30410]],64167:[[30427]],64168:[[30452]],64169:[[30538]],64170:[[30528]],64171:[[30924]],64172:[[31409]],64173:[[31680]],64174:[[31867]],64175:[[32091]],64176:[[32244]],64177:[[32574]],64178:[[32773]],64179:[[33618]],64180:[[33775]],64181:[[34681]],64182:[[35137]],64183:[[35206]],64184:[[35222]],64185:[[35519]],64186:[[35576]],64187:[[35531]],64188:[[35585]],64189:[[35582]],64190:[[35565]],64191:[[35641]],64192:[[35722]],64193:[[36104]],64194:[[36664]],64195:[[36978]],64196:[[37273]],64197:[[37494]],64198:[[38524]],64199:[[38627]],64200:[[38742]],64201:[[38875]],64202:[[38911]],64203:[[38923]],64204:[[38971]],64205:[[39698]],64206:[[40860]],64207:[[141386]],64208:[[141380]],64209:[[144341]],64210:[[15261]],64211:[[16408]],64212:[[16441]],64213:[[152137]],64214:[[154832]],64215:[[163539]],64216:[[40771]],64217:[[40846]],195072:[[38953]],195073:[[169398]],195074:[[39138]],195075:[[19251]],195076:[[39209]],195077:[[39335]],195078:[[39362]],195079:[[39422]],195080:[[19406]],195081:[[170800]],195082:[[39698]],195083:[[40000]],195084:[[40189]],195085:[[19662]],195086:[[19693]],195087:[[40295]],195088:[[172238]],195089:[[19704]],195090:[[172293]],195091:[[172558]],195092:[[172689]],195093:[[40635]],195094:[[19798]],195095:[[40697]],195096:[[40702]],195097:[[40709]],195098:[[40719]],195099:[[40726]],195100:[[40763]],195101:[[173568]]}, +64256:{64256:[[102,102],256],64257:[[102,105],256],64258:[[102,108],256],64259:[[102,102,105],256],64260:[[102,102,108],256],64261:[[383,116],256],64262:[[115,116],256],64275:[[1396,1398],256],64276:[[1396,1381],256],64277:[[1396,1387],256],64278:[[1406,1398],256],64279:[[1396,1389],256],64285:[[1497,1460],512],64286:[,26],64287:[[1522,1463],512],64288:[[1506],256],64289:[[1488],256],64290:[[1491],256],64291:[[1492],256],64292:[[1499],256],64293:[[1500],256],64294:[[1501],256],64295:[[1512],256],64296:[[1514],256],64297:[[43],256],64298:[[1513,1473],512],64299:[[1513,1474],512],64300:[[64329,1473],512],64301:[[64329,1474],512],64302:[[1488,1463],512],64303:[[1488,1464],512],64304:[[1488,1468],512],64305:[[1489,1468],512],64306:[[1490,1468],512],64307:[[1491,1468],512],64308:[[1492,1468],512],64309:[[1493,1468],512],64310:[[1494,1468],512],64312:[[1496,1468],512],64313:[[1497,1468],512],64314:[[1498,1468],512],64315:[[1499,1468],512],64316:[[1500,1468],512],64318:[[1502,1468],512],64320:[[1504,1468],512],64321:[[1505,1468],512],64323:[[1507,1468],512],64324:[[1508,1468],512],64326:[[1510,1468],512],64327:[[1511,1468],512],64328:[[1512,1468],512],64329:[[1513,1468],512],64330:[[1514,1468],512],64331:[[1493,1465],512],64332:[[1489,1471],512],64333:[[1499,1471],512],64334:[[1508,1471],512],64335:[[1488,1500],256],64336:[[1649],256],64337:[[1649],256],64338:[[1659],256],64339:[[1659],256],64340:[[1659],256],64341:[[1659],256],64342:[[1662],256],64343:[[1662],256],64344:[[1662],256],64345:[[1662],256],64346:[[1664],256],64347:[[1664],256],64348:[[1664],256],64349:[[1664],256],64350:[[1658],256],64351:[[1658],256],64352:[[1658],256],64353:[[1658],256],64354:[[1663],256],64355:[[1663],256],64356:[[1663],256],64357:[[1663],256],64358:[[1657],256],64359:[[1657],256],64360:[[1657],256],64361:[[1657],256],64362:[[1700],256],64363:[[1700],256],64364:[[1700],256],64365:[[1700],256],64366:[[1702],256],64367:[[1702],256],64368:[[1702],256],64369:[[1702],256],64370:[[1668],256],64371:[[1668],256],64372:[[1668],256],64373:[[1668],256],64374:[[1667],256],64375:[[1667],256],64376:[[1667],256],64377:[[1667],256],64378:[[1670],256],64379:[[1670],256],64380:[[1670],256],64381:[[1670],256],64382:[[1671],256],64383:[[1671],256],64384:[[1671],256],64385:[[1671],256],64386:[[1677],256],64387:[[1677],256],64388:[[1676],256],64389:[[1676],256],64390:[[1678],256],64391:[[1678],256],64392:[[1672],256],64393:[[1672],256],64394:[[1688],256],64395:[[1688],256],64396:[[1681],256],64397:[[1681],256],64398:[[1705],256],64399:[[1705],256],64400:[[1705],256],64401:[[1705],256],64402:[[1711],256],64403:[[1711],256],64404:[[1711],256],64405:[[1711],256],64406:[[1715],256],64407:[[1715],256],64408:[[1715],256],64409:[[1715],256],64410:[[1713],256],64411:[[1713],256],64412:[[1713],256],64413:[[1713],256],64414:[[1722],256],64415:[[1722],256],64416:[[1723],256],64417:[[1723],256],64418:[[1723],256],64419:[[1723],256],64420:[[1728],256],64421:[[1728],256],64422:[[1729],256],64423:[[1729],256],64424:[[1729],256],64425:[[1729],256],64426:[[1726],256],64427:[[1726],256],64428:[[1726],256],64429:[[1726],256],64430:[[1746],256],64431:[[1746],256],64432:[[1747],256],64433:[[1747],256],64467:[[1709],256],64468:[[1709],256],64469:[[1709],256],64470:[[1709],256],64471:[[1735],256],64472:[[1735],256],64473:[[1734],256],64474:[[1734],256],64475:[[1736],256],64476:[[1736],256],64477:[[1655],256],64478:[[1739],256],64479:[[1739],256],64480:[[1733],256],64481:[[1733],256],64482:[[1737],256],64483:[[1737],256],64484:[[1744],256],64485:[[1744],256],64486:[[1744],256],64487:[[1744],256],64488:[[1609],256],64489:[[1609],256],64490:[[1574,1575],256],64491:[[1574,1575],256],64492:[[1574,1749],256],64493:[[1574,1749],256],64494:[[1574,1608],256],64495:[[1574,1608],256],64496:[[1574,1735],256],64497:[[1574,1735],256],64498:[[1574,1734],256],64499:[[1574,1734],256],64500:[[1574,1736],256],64501:[[1574,1736],256],64502:[[1574,1744],256],64503:[[1574,1744],256],64504:[[1574,1744],256],64505:[[1574,1609],256],64506:[[1574,1609],256],64507:[[1574,1609],256],64508:[[1740],256],64509:[[1740],256],64510:[[1740],256],64511:[[1740],256]}, +64512:{64512:[[1574,1580],256],64513:[[1574,1581],256],64514:[[1574,1605],256],64515:[[1574,1609],256],64516:[[1574,1610],256],64517:[[1576,1580],256],64518:[[1576,1581],256],64519:[[1576,1582],256],64520:[[1576,1605],256],64521:[[1576,1609],256],64522:[[1576,1610],256],64523:[[1578,1580],256],64524:[[1578,1581],256],64525:[[1578,1582],256],64526:[[1578,1605],256],64527:[[1578,1609],256],64528:[[1578,1610],256],64529:[[1579,1580],256],64530:[[1579,1605],256],64531:[[1579,1609],256],64532:[[1579,1610],256],64533:[[1580,1581],256],64534:[[1580,1605],256],64535:[[1581,1580],256],64536:[[1581,1605],256],64537:[[1582,1580],256],64538:[[1582,1581],256],64539:[[1582,1605],256],64540:[[1587,1580],256],64541:[[1587,1581],256],64542:[[1587,1582],256],64543:[[1587,1605],256],64544:[[1589,1581],256],64545:[[1589,1605],256],64546:[[1590,1580],256],64547:[[1590,1581],256],64548:[[1590,1582],256],64549:[[1590,1605],256],64550:[[1591,1581],256],64551:[[1591,1605],256],64552:[[1592,1605],256],64553:[[1593,1580],256],64554:[[1593,1605],256],64555:[[1594,1580],256],64556:[[1594,1605],256],64557:[[1601,1580],256],64558:[[1601,1581],256],64559:[[1601,1582],256],64560:[[1601,1605],256],64561:[[1601,1609],256],64562:[[1601,1610],256],64563:[[1602,1581],256],64564:[[1602,1605],256],64565:[[1602,1609],256],64566:[[1602,1610],256],64567:[[1603,1575],256],64568:[[1603,1580],256],64569:[[1603,1581],256],64570:[[1603,1582],256],64571:[[1603,1604],256],64572:[[1603,1605],256],64573:[[1603,1609],256],64574:[[1603,1610],256],64575:[[1604,1580],256],64576:[[1604,1581],256],64577:[[1604,1582],256],64578:[[1604,1605],256],64579:[[1604,1609],256],64580:[[1604,1610],256],64581:[[1605,1580],256],64582:[[1605,1581],256],64583:[[1605,1582],256],64584:[[1605,1605],256],64585:[[1605,1609],256],64586:[[1605,1610],256],64587:[[1606,1580],256],64588:[[1606,1581],256],64589:[[1606,1582],256],64590:[[1606,1605],256],64591:[[1606,1609],256],64592:[[1606,1610],256],64593:[[1607,1580],256],64594:[[1607,1605],256],64595:[[1607,1609],256],64596:[[1607,1610],256],64597:[[1610,1580],256],64598:[[1610,1581],256],64599:[[1610,1582],256],64600:[[1610,1605],256],64601:[[1610,1609],256],64602:[[1610,1610],256],64603:[[1584,1648],256],64604:[[1585,1648],256],64605:[[1609,1648],256],64606:[[32,1612,1617],256],64607:[[32,1613,1617],256],64608:[[32,1614,1617],256],64609:[[32,1615,1617],256],64610:[[32,1616,1617],256],64611:[[32,1617,1648],256],64612:[[1574,1585],256],64613:[[1574,1586],256],64614:[[1574,1605],256],64615:[[1574,1606],256],64616:[[1574,1609],256],64617:[[1574,1610],256],64618:[[1576,1585],256],64619:[[1576,1586],256],64620:[[1576,1605],256],64621:[[1576,1606],256],64622:[[1576,1609],256],64623:[[1576,1610],256],64624:[[1578,1585],256],64625:[[1578,1586],256],64626:[[1578,1605],256],64627:[[1578,1606],256],64628:[[1578,1609],256],64629:[[1578,1610],256],64630:[[1579,1585],256],64631:[[1579,1586],256],64632:[[1579,1605],256],64633:[[1579,1606],256],64634:[[1579,1609],256],64635:[[1579,1610],256],64636:[[1601,1609],256],64637:[[1601,1610],256],64638:[[1602,1609],256],64639:[[1602,1610],256],64640:[[1603,1575],256],64641:[[1603,1604],256],64642:[[1603,1605],256],64643:[[1603,1609],256],64644:[[1603,1610],256],64645:[[1604,1605],256],64646:[[1604,1609],256],64647:[[1604,1610],256],64648:[[1605,1575],256],64649:[[1605,1605],256],64650:[[1606,1585],256],64651:[[1606,1586],256],64652:[[1606,1605],256],64653:[[1606,1606],256],64654:[[1606,1609],256],64655:[[1606,1610],256],64656:[[1609,1648],256],64657:[[1610,1585],256],64658:[[1610,1586],256],64659:[[1610,1605],256],64660:[[1610,1606],256],64661:[[1610,1609],256],64662:[[1610,1610],256],64663:[[1574,1580],256],64664:[[1574,1581],256],64665:[[1574,1582],256],64666:[[1574,1605],256],64667:[[1574,1607],256],64668:[[1576,1580],256],64669:[[1576,1581],256],64670:[[1576,1582],256],64671:[[1576,1605],256],64672:[[1576,1607],256],64673:[[1578,1580],256],64674:[[1578,1581],256],64675:[[1578,1582],256],64676:[[1578,1605],256],64677:[[1578,1607],256],64678:[[1579,1605],256],64679:[[1580,1581],256],64680:[[1580,1605],256],64681:[[1581,1580],256],64682:[[1581,1605],256],64683:[[1582,1580],256],64684:[[1582,1605],256],64685:[[1587,1580],256],64686:[[1587,1581],256],64687:[[1587,1582],256],64688:[[1587,1605],256],64689:[[1589,1581],256],64690:[[1589,1582],256],64691:[[1589,1605],256],64692:[[1590,1580],256],64693:[[1590,1581],256],64694:[[1590,1582],256],64695:[[1590,1605],256],64696:[[1591,1581],256],64697:[[1592,1605],256],64698:[[1593,1580],256],64699:[[1593,1605],256],64700:[[1594,1580],256],64701:[[1594,1605],256],64702:[[1601,1580],256],64703:[[1601,1581],256],64704:[[1601,1582],256],64705:[[1601,1605],256],64706:[[1602,1581],256],64707:[[1602,1605],256],64708:[[1603,1580],256],64709:[[1603,1581],256],64710:[[1603,1582],256],64711:[[1603,1604],256],64712:[[1603,1605],256],64713:[[1604,1580],256],64714:[[1604,1581],256],64715:[[1604,1582],256],64716:[[1604,1605],256],64717:[[1604,1607],256],64718:[[1605,1580],256],64719:[[1605,1581],256],64720:[[1605,1582],256],64721:[[1605,1605],256],64722:[[1606,1580],256],64723:[[1606,1581],256],64724:[[1606,1582],256],64725:[[1606,1605],256],64726:[[1606,1607],256],64727:[[1607,1580],256],64728:[[1607,1605],256],64729:[[1607,1648],256],64730:[[1610,1580],256],64731:[[1610,1581],256],64732:[[1610,1582],256],64733:[[1610,1605],256],64734:[[1610,1607],256],64735:[[1574,1605],256],64736:[[1574,1607],256],64737:[[1576,1605],256],64738:[[1576,1607],256],64739:[[1578,1605],256],64740:[[1578,1607],256],64741:[[1579,1605],256],64742:[[1579,1607],256],64743:[[1587,1605],256],64744:[[1587,1607],256],64745:[[1588,1605],256],64746:[[1588,1607],256],64747:[[1603,1604],256],64748:[[1603,1605],256],64749:[[1604,1605],256],64750:[[1606,1605],256],64751:[[1606,1607],256],64752:[[1610,1605],256],64753:[[1610,1607],256],64754:[[1600,1614,1617],256],64755:[[1600,1615,1617],256],64756:[[1600,1616,1617],256],64757:[[1591,1609],256],64758:[[1591,1610],256],64759:[[1593,1609],256],64760:[[1593,1610],256],64761:[[1594,1609],256],64762:[[1594,1610],256],64763:[[1587,1609],256],64764:[[1587,1610],256],64765:[[1588,1609],256],64766:[[1588,1610],256],64767:[[1581,1609],256]}, +64768:{64768:[[1581,1610],256],64769:[[1580,1609],256],64770:[[1580,1610],256],64771:[[1582,1609],256],64772:[[1582,1610],256],64773:[[1589,1609],256],64774:[[1589,1610],256],64775:[[1590,1609],256],64776:[[1590,1610],256],64777:[[1588,1580],256],64778:[[1588,1581],256],64779:[[1588,1582],256],64780:[[1588,1605],256],64781:[[1588,1585],256],64782:[[1587,1585],256],64783:[[1589,1585],256],64784:[[1590,1585],256],64785:[[1591,1609],256],64786:[[1591,1610],256],64787:[[1593,1609],256],64788:[[1593,1610],256],64789:[[1594,1609],256],64790:[[1594,1610],256],64791:[[1587,1609],256],64792:[[1587,1610],256],64793:[[1588,1609],256],64794:[[1588,1610],256],64795:[[1581,1609],256],64796:[[1581,1610],256],64797:[[1580,1609],256],64798:[[1580,1610],256],64799:[[1582,1609],256],64800:[[1582,1610],256],64801:[[1589,1609],256],64802:[[1589,1610],256],64803:[[1590,1609],256],64804:[[1590,1610],256],64805:[[1588,1580],256],64806:[[1588,1581],256],64807:[[1588,1582],256],64808:[[1588,1605],256],64809:[[1588,1585],256],64810:[[1587,1585],256],64811:[[1589,1585],256],64812:[[1590,1585],256],64813:[[1588,1580],256],64814:[[1588,1581],256],64815:[[1588,1582],256],64816:[[1588,1605],256],64817:[[1587,1607],256],64818:[[1588,1607],256],64819:[[1591,1605],256],64820:[[1587,1580],256],64821:[[1587,1581],256],64822:[[1587,1582],256],64823:[[1588,1580],256],64824:[[1588,1581],256],64825:[[1588,1582],256],64826:[[1591,1605],256],64827:[[1592,1605],256],64828:[[1575,1611],256],64829:[[1575,1611],256],64848:[[1578,1580,1605],256],64849:[[1578,1581,1580],256],64850:[[1578,1581,1580],256],64851:[[1578,1581,1605],256],64852:[[1578,1582,1605],256],64853:[[1578,1605,1580],256],64854:[[1578,1605,1581],256],64855:[[1578,1605,1582],256],64856:[[1580,1605,1581],256],64857:[[1580,1605,1581],256],64858:[[1581,1605,1610],256],64859:[[1581,1605,1609],256],64860:[[1587,1581,1580],256],64861:[[1587,1580,1581],256],64862:[[1587,1580,1609],256],64863:[[1587,1605,1581],256],64864:[[1587,1605,1581],256],64865:[[1587,1605,1580],256],64866:[[1587,1605,1605],256],64867:[[1587,1605,1605],256],64868:[[1589,1581,1581],256],64869:[[1589,1581,1581],256],64870:[[1589,1605,1605],256],64871:[[1588,1581,1605],256],64872:[[1588,1581,1605],256],64873:[[1588,1580,1610],256],64874:[[1588,1605,1582],256],64875:[[1588,1605,1582],256],64876:[[1588,1605,1605],256],64877:[[1588,1605,1605],256],64878:[[1590,1581,1609],256],64879:[[1590,1582,1605],256],64880:[[1590,1582,1605],256],64881:[[1591,1605,1581],256],64882:[[1591,1605,1581],256],64883:[[1591,1605,1605],256],64884:[[1591,1605,1610],256],64885:[[1593,1580,1605],256],64886:[[1593,1605,1605],256],64887:[[1593,1605,1605],256],64888:[[1593,1605,1609],256],64889:[[1594,1605,1605],256],64890:[[1594,1605,1610],256],64891:[[1594,1605,1609],256],64892:[[1601,1582,1605],256],64893:[[1601,1582,1605],256],64894:[[1602,1605,1581],256],64895:[[1602,1605,1605],256],64896:[[1604,1581,1605],256],64897:[[1604,1581,1610],256],64898:[[1604,1581,1609],256],64899:[[1604,1580,1580],256],64900:[[1604,1580,1580],256],64901:[[1604,1582,1605],256],64902:[[1604,1582,1605],256],64903:[[1604,1605,1581],256],64904:[[1604,1605,1581],256],64905:[[1605,1581,1580],256],64906:[[1605,1581,1605],256],64907:[[1605,1581,1610],256],64908:[[1605,1580,1581],256],64909:[[1605,1580,1605],256],64910:[[1605,1582,1580],256],64911:[[1605,1582,1605],256],64914:[[1605,1580,1582],256],64915:[[1607,1605,1580],256],64916:[[1607,1605,1605],256],64917:[[1606,1581,1605],256],64918:[[1606,1581,1609],256],64919:[[1606,1580,1605],256],64920:[[1606,1580,1605],256],64921:[[1606,1580,1609],256],64922:[[1606,1605,1610],256],64923:[[1606,1605,1609],256],64924:[[1610,1605,1605],256],64925:[[1610,1605,1605],256],64926:[[1576,1582,1610],256],64927:[[1578,1580,1610],256],64928:[[1578,1580,1609],256],64929:[[1578,1582,1610],256],64930:[[1578,1582,1609],256],64931:[[1578,1605,1610],256],64932:[[1578,1605,1609],256],64933:[[1580,1605,1610],256],64934:[[1580,1581,1609],256],64935:[[1580,1605,1609],256],64936:[[1587,1582,1609],256],64937:[[1589,1581,1610],256],64938:[[1588,1581,1610],256],64939:[[1590,1581,1610],256],64940:[[1604,1580,1610],256],64941:[[1604,1605,1610],256],64942:[[1610,1581,1610],256],64943:[[1610,1580,1610],256],64944:[[1610,1605,1610],256],64945:[[1605,1605,1610],256],64946:[[1602,1605,1610],256],64947:[[1606,1581,1610],256],64948:[[1602,1605,1581],256],64949:[[1604,1581,1605],256],64950:[[1593,1605,1610],256],64951:[[1603,1605,1610],256],64952:[[1606,1580,1581],256],64953:[[1605,1582,1610],256],64954:[[1604,1580,1605],256],64955:[[1603,1605,1605],256],64956:[[1604,1580,1605],256],64957:[[1606,1580,1581],256],64958:[[1580,1581,1610],256],64959:[[1581,1580,1610],256],64960:[[1605,1580,1610],256],64961:[[1601,1605,1610],256],64962:[[1576,1581,1610],256],64963:[[1603,1605,1605],256],64964:[[1593,1580,1605],256],64965:[[1589,1605,1605],256],64966:[[1587,1582,1610],256],64967:[[1606,1580,1610],256],65008:[[1589,1604,1746],256],65009:[[1602,1604,1746],256],65010:[[1575,1604,1604,1607],256],65011:[[1575,1603,1576,1585],256],65012:[[1605,1581,1605,1583],256],65013:[[1589,1604,1593,1605],256],65014:[[1585,1587,1608,1604],256],65015:[[1593,1604,1610,1607],256],65016:[[1608,1587,1604,1605],256],65017:[[1589,1604,1609],256],65018:[[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605],256],65019:[[1580,1604,32,1580,1604,1575,1604,1607],256],65020:[[1585,1740,1575,1604],256]}, +65024:{65040:[[44],256],65041:[[12289],256],65042:[[12290],256],65043:[[58],256],65044:[[59],256],65045:[[33],256],65046:[[63],256],65047:[[12310],256],65048:[[12311],256],65049:[[8230],256],65056:[,230],65057:[,230],65058:[,230],65059:[,230],65060:[,230],65061:[,230],65062:[,230],65063:[,220],65064:[,220],65065:[,220],65066:[,220],65067:[,220],65068:[,220],65069:[,220],65072:[[8229],256],65073:[[8212],256],65074:[[8211],256],65075:[[95],256],65076:[[95],256],65077:[[40],256],65078:[[41],256],65079:[[123],256],65080:[[125],256],65081:[[12308],256],65082:[[12309],256],65083:[[12304],256],65084:[[12305],256],65085:[[12298],256],65086:[[12299],256],65087:[[12296],256],65088:[[12297],256],65089:[[12300],256],65090:[[12301],256],65091:[[12302],256],65092:[[12303],256],65095:[[91],256],65096:[[93],256],65097:[[8254],256],65098:[[8254],256],65099:[[8254],256],65100:[[8254],256],65101:[[95],256],65102:[[95],256],65103:[[95],256],65104:[[44],256],65105:[[12289],256],65106:[[46],256],65108:[[59],256],65109:[[58],256],65110:[[63],256],65111:[[33],256],65112:[[8212],256],65113:[[40],256],65114:[[41],256],65115:[[123],256],65116:[[125],256],65117:[[12308],256],65118:[[12309],256],65119:[[35],256],65120:[[38],256],65121:[[42],256],65122:[[43],256],65123:[[45],256],65124:[[60],256],65125:[[62],256],65126:[[61],256],65128:[[92],256],65129:[[36],256],65130:[[37],256],65131:[[64],256],65136:[[32,1611],256],65137:[[1600,1611],256],65138:[[32,1612],256],65140:[[32,1613],256],65142:[[32,1614],256],65143:[[1600,1614],256],65144:[[32,1615],256],65145:[[1600,1615],256],65146:[[32,1616],256],65147:[[1600,1616],256],65148:[[32,1617],256],65149:[[1600,1617],256],65150:[[32,1618],256],65151:[[1600,1618],256],65152:[[1569],256],65153:[[1570],256],65154:[[1570],256],65155:[[1571],256],65156:[[1571],256],65157:[[1572],256],65158:[[1572],256],65159:[[1573],256],65160:[[1573],256],65161:[[1574],256],65162:[[1574],256],65163:[[1574],256],65164:[[1574],256],65165:[[1575],256],65166:[[1575],256],65167:[[1576],256],65168:[[1576],256],65169:[[1576],256],65170:[[1576],256],65171:[[1577],256],65172:[[1577],256],65173:[[1578],256],65174:[[1578],256],65175:[[1578],256],65176:[[1578],256],65177:[[1579],256],65178:[[1579],256],65179:[[1579],256],65180:[[1579],256],65181:[[1580],256],65182:[[1580],256],65183:[[1580],256],65184:[[1580],256],65185:[[1581],256],65186:[[1581],256],65187:[[1581],256],65188:[[1581],256],65189:[[1582],256],65190:[[1582],256],65191:[[1582],256],65192:[[1582],256],65193:[[1583],256],65194:[[1583],256],65195:[[1584],256],65196:[[1584],256],65197:[[1585],256],65198:[[1585],256],65199:[[1586],256],65200:[[1586],256],65201:[[1587],256],65202:[[1587],256],65203:[[1587],256],65204:[[1587],256],65205:[[1588],256],65206:[[1588],256],65207:[[1588],256],65208:[[1588],256],65209:[[1589],256],65210:[[1589],256],65211:[[1589],256],65212:[[1589],256],65213:[[1590],256],65214:[[1590],256],65215:[[1590],256],65216:[[1590],256],65217:[[1591],256],65218:[[1591],256],65219:[[1591],256],65220:[[1591],256],65221:[[1592],256],65222:[[1592],256],65223:[[1592],256],65224:[[1592],256],65225:[[1593],256],65226:[[1593],256],65227:[[1593],256],65228:[[1593],256],65229:[[1594],256],65230:[[1594],256],65231:[[1594],256],65232:[[1594],256],65233:[[1601],256],65234:[[1601],256],65235:[[1601],256],65236:[[1601],256],65237:[[1602],256],65238:[[1602],256],65239:[[1602],256],65240:[[1602],256],65241:[[1603],256],65242:[[1603],256],65243:[[1603],256],65244:[[1603],256],65245:[[1604],256],65246:[[1604],256],65247:[[1604],256],65248:[[1604],256],65249:[[1605],256],65250:[[1605],256],65251:[[1605],256],65252:[[1605],256],65253:[[1606],256],65254:[[1606],256],65255:[[1606],256],65256:[[1606],256],65257:[[1607],256],65258:[[1607],256],65259:[[1607],256],65260:[[1607],256],65261:[[1608],256],65262:[[1608],256],65263:[[1609],256],65264:[[1609],256],65265:[[1610],256],65266:[[1610],256],65267:[[1610],256],65268:[[1610],256],65269:[[1604,1570],256],65270:[[1604,1570],256],65271:[[1604,1571],256],65272:[[1604,1571],256],65273:[[1604,1573],256],65274:[[1604,1573],256],65275:[[1604,1575],256],65276:[[1604,1575],256]}, +65280:{65281:[[33],256],65282:[[34],256],65283:[[35],256],65284:[[36],256],65285:[[37],256],65286:[[38],256],65287:[[39],256],65288:[[40],256],65289:[[41],256],65290:[[42],256],65291:[[43],256],65292:[[44],256],65293:[[45],256],65294:[[46],256],65295:[[47],256],65296:[[48],256],65297:[[49],256],65298:[[50],256],65299:[[51],256],65300:[[52],256],65301:[[53],256],65302:[[54],256],65303:[[55],256],65304:[[56],256],65305:[[57],256],65306:[[58],256],65307:[[59],256],65308:[[60],256],65309:[[61],256],65310:[[62],256],65311:[[63],256],65312:[[64],256],65313:[[65],256],65314:[[66],256],65315:[[67],256],65316:[[68],256],65317:[[69],256],65318:[[70],256],65319:[[71],256],65320:[[72],256],65321:[[73],256],65322:[[74],256],65323:[[75],256],65324:[[76],256],65325:[[77],256],65326:[[78],256],65327:[[79],256],65328:[[80],256],65329:[[81],256],65330:[[82],256],65331:[[83],256],65332:[[84],256],65333:[[85],256],65334:[[86],256],65335:[[87],256],65336:[[88],256],65337:[[89],256],65338:[[90],256],65339:[[91],256],65340:[[92],256],65341:[[93],256],65342:[[94],256],65343:[[95],256],65344:[[96],256],65345:[[97],256],65346:[[98],256],65347:[[99],256],65348:[[100],256],65349:[[101],256],65350:[[102],256],65351:[[103],256],65352:[[104],256],65353:[[105],256],65354:[[106],256],65355:[[107],256],65356:[[108],256],65357:[[109],256],65358:[[110],256],65359:[[111],256],65360:[[112],256],65361:[[113],256],65362:[[114],256],65363:[[115],256],65364:[[116],256],65365:[[117],256],65366:[[118],256],65367:[[119],256],65368:[[120],256],65369:[[121],256],65370:[[122],256],65371:[[123],256],65372:[[124],256],65373:[[125],256],65374:[[126],256],65375:[[10629],256],65376:[[10630],256],65377:[[12290],256],65378:[[12300],256],65379:[[12301],256],65380:[[12289],256],65381:[[12539],256],65382:[[12530],256],65383:[[12449],256],65384:[[12451],256],65385:[[12453],256],65386:[[12455],256],65387:[[12457],256],65388:[[12515],256],65389:[[12517],256],65390:[[12519],256],65391:[[12483],256],65392:[[12540],256],65393:[[12450],256],65394:[[12452],256],65395:[[12454],256],65396:[[12456],256],65397:[[12458],256],65398:[[12459],256],65399:[[12461],256],65400:[[12463],256],65401:[[12465],256],65402:[[12467],256],65403:[[12469],256],65404:[[12471],256],65405:[[12473],256],65406:[[12475],256],65407:[[12477],256],65408:[[12479],256],65409:[[12481],256],65410:[[12484],256],65411:[[12486],256],65412:[[12488],256],65413:[[12490],256],65414:[[12491],256],65415:[[12492],256],65416:[[12493],256],65417:[[12494],256],65418:[[12495],256],65419:[[12498],256],65420:[[12501],256],65421:[[12504],256],65422:[[12507],256],65423:[[12510],256],65424:[[12511],256],65425:[[12512],256],65426:[[12513],256],65427:[[12514],256],65428:[[12516],256],65429:[[12518],256],65430:[[12520],256],65431:[[12521],256],65432:[[12522],256],65433:[[12523],256],65434:[[12524],256],65435:[[12525],256],65436:[[12527],256],65437:[[12531],256],65438:[[12441],256],65439:[[12442],256],65440:[[12644],256],65441:[[12593],256],65442:[[12594],256],65443:[[12595],256],65444:[[12596],256],65445:[[12597],256],65446:[[12598],256],65447:[[12599],256],65448:[[12600],256],65449:[[12601],256],65450:[[12602],256],65451:[[12603],256],65452:[[12604],256],65453:[[12605],256],65454:[[12606],256],65455:[[12607],256],65456:[[12608],256],65457:[[12609],256],65458:[[12610],256],65459:[[12611],256],65460:[[12612],256],65461:[[12613],256],65462:[[12614],256],65463:[[12615],256],65464:[[12616],256],65465:[[12617],256],65466:[[12618],256],65467:[[12619],256],65468:[[12620],256],65469:[[12621],256],65470:[[12622],256],65474:[[12623],256],65475:[[12624],256],65476:[[12625],256],65477:[[12626],256],65478:[[12627],256],65479:[[12628],256],65482:[[12629],256],65483:[[12630],256],65484:[[12631],256],65485:[[12632],256],65486:[[12633],256],65487:[[12634],256],65490:[[12635],256],65491:[[12636],256],65492:[[12637],256],65493:[[12638],256],65494:[[12639],256],65495:[[12640],256],65498:[[12641],256],65499:[[12642],256],65500:[[12643],256],65504:[[162],256],65505:[[163],256],65506:[[172],256],65507:[[175],256],65508:[[166],256],65509:[[165],256],65510:[[8361],256],65512:[[9474],256],65513:[[8592],256],65514:[[8593],256],65515:[[8594],256],65516:[[8595],256],65517:[[9632],256],65518:[[9675],256]} + +}; + + /***** Module to export */ + var unorm = { + nfc: nfc, + nfd: nfd, + nfkc: nfkc, + nfkd: nfkd + }; + + /*globals module:true,define:true*/ + + // CommonJS + if (typeof module === "object") { + module.exports = unorm; + + // AMD + } else if (typeof define === "function" && define.amd) { + define("unorm", function () { + return unorm; + }); + + // Global + } else { + root.unorm = unorm; + } + + /***** Export as shim for String::normalize method *****/ + /* + http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#november_8_2013_draft_rev_21 + + 21.1.3.12 String.prototype.normalize(form="NFC") + When the normalize method is called with one argument form, the following steps are taken: + + 1. Let O be CheckObjectCoercible(this value). + 2. Let S be ToString(O). + 3. ReturnIfAbrupt(S). + 4. If form is not provided or undefined let form be "NFC". + 5. Let f be ToString(form). + 6. ReturnIfAbrupt(f). + 7. If f is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw a RangeError Exception. + 8. Let ns be the String value is the result of normalizing S into the normalization form named by f as specified in Unicode Standard Annex #15, UnicodeNormalizatoin Forms. + 9. Return ns. + + The length property of the normalize method is 0. + + *NOTE* The normalize function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method. + */ + unorm.shimApplied = false; + + if (!String.prototype.normalize) { + String.prototype.normalize = function(form) { + var str = "" + this; + form = form === undefined ? "NFC" : form; + + if (form === "NFC") { + return unorm.nfc(str); + } else if (form === "NFD") { + return unorm.nfd(str); + } else if (form === "NFKC") { + return unorm.nfkc(str); + } else if (form === "NFKD") { + return unorm.nfkd(str); + } else { + throw new RangeError("Invalid normalization form: " + form); + } + }; + + unorm.shimApplied = true; + } +}(this)); diff --git a/node_modules/cordova-android/node_modules/unorm/package.json b/node_modules/cordova-android/node_modules/unorm/package.json new file mode 100644 index 0000000..a394fea --- /dev/null +++ b/node_modules/cordova-android/node_modules/unorm/package.json @@ -0,0 +1,73 @@ +{ + "_from": "unorm@^1.3.3", + "_id": "unorm@1.4.1", + "_inBundle": true, + "_integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", + "_location": "/cordova-android/unorm", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unorm@^1.3.3", + "name": "unorm", + "escapedName": "unorm", + "rawSpec": "^1.3.3", + "saveSpec": null, + "fetchSpec": "^1.3.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", + "_shasum": "364200d5f13646ca8bcd44490271335614792300", + "_spec": "unorm@^1.3.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Bjarke Walling", + "email": "bwp@bwp.dk" + }, + "bugs": { + "url": "https://github.com/walling/unorm/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Bjarke Walling", + "email": "bwp@bwp.dk" + }, + { + "name": "Oleg Grenrus", + "email": "oleg.grenrus@iki.fi" + }, + { + "name": "Matsuza", + "email": "matsuza@gmail.com" + } + ], + "deprecated": false, + "description": "JavaScript Unicode 8.0 Normalization - NFC, NFD, NFKC, NFKD. Read UAX #15 Unicode Normalization Forms.", + "devDependencies": { + "benchmark": "~1.0.0", + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.8.0", + "grunt-contrib-watch": "~0.5.0", + "grunt-simple-mocha": "~0.4.0", + "unorm": "1.4.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/walling/unorm#readme", + "license": "MIT or GPL-2.0", + "main": "./lib/unorm.js", + "name": "unorm", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/walling/unorm.git" + }, + "scripts": { + "test": "grunt test" + }, + "version": "1.4.1" +} diff --git a/node_modules/cordova-android/node_modules/wrappy/LICENSE b/node_modules/cordova-android/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/wrappy/README.md b/node_modules/cordova-android/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/node_modules/cordova-android/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/node_modules/cordova-android/node_modules/wrappy/package.json b/node_modules/cordova-android/node_modules/wrappy/package.json new file mode 100644 index 0000000..974e9fa --- /dev/null +++ b/node_modules/cordova-android/node_modules/wrappy/package.json @@ -0,0 +1,60 @@ +{ + "_from": "wrappy@1", + "_id": "wrappy@1.0.2", + "_inBundle": true, + "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "_location": "/cordova-android/wrappy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "wrappy@1", + "name": "wrappy", + "escapedName": "wrappy", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/inflight", + "/cordova-android/once" + ], + "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "_spec": "wrappy@1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/inflight", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Callback wrapping utility", + "devDependencies": { + "tap": "^2.3.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "wrappy.js" + ], + "homepage": "https://github.com/npm/wrappy", + "license": "ISC", + "main": "wrappy.js", + "name": "wrappy", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "version": "1.0.2" +} diff --git a/node_modules/cordova-android/node_modules/wrappy/wrappy.js b/node_modules/cordova-android/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/node_modules/cordova-android/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/.npmignore b/node_modules/cordova-android/node_modules/xmlbuilder/.npmignore new file mode 100644 index 0000000..b6ad1f6 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/.npmignore @@ -0,0 +1,5 @@ +.travis.yml +src +test +perf +coverage diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/CHANGELOG.md b/node_modules/cordova-android/node_modules/xmlbuilder/CHANGELOG.md new file mode 100644 index 0000000..b0cb178 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/CHANGELOG.md @@ -0,0 +1,395 @@ +# Change Log + +All notable changes to this project are documented in this file. This project adheres to [Semantic Versioning](http://semver.org/#semantic-versioning-200). + +## [8.2.2] - 2016-04-08 +- Falsy values can now be used as a text node in callback mode. + +## [8.2.1] - 2016-04-07 +- Falsy values can now be used as a text node. See +[#117](https://github.com/oozcitak/xmlbuilder-js/issues/117). + +## [8.2.0] - 2016-04-01 +- Removed lodash dependency to keep the library small and simple. See +[#114](https://github.com/oozcitak/xmlbuilder-js/issues/114), +[#53](https://github.com/oozcitak/xmlbuilder-js/issues/53), +and [#43](https://github.com/oozcitak/xmlbuilder-js/issues/43). +- Added title case to name conversion options. + +## [8.1.0] - 2016-03-29 +- Added the callback option to the `begin` export function. When used with a +callback function, the XML document will be generated in chunks and each chunk +will be passed to the supplied function. In this mode, `begin` uses a different +code path and the builder should use much less memory since the entire XML tree +is not kept. There are a few drawbacks though. For example, traversing the document +tree or adding attributes to a node after it is written is not possible. It is +also not possible to remove nodes or attributes. + +``` js +var result = ''; + +builder.begin(function(chunk) { result += chunk; }) + .dec() + .ele('root') + .ele('xmlbuilder').up() + .end(); +``` + +- Replaced native `Object.assign` with `lodash.assign` to support old JS engines. See [#111](https://github.com/oozcitak/xmlbuilder-js/issues/111). + +## [8.0.0] - 2016-03-25 +- Added the `begin` export function. See the wiki for details. +- Added the ability to add comments and processing instructions before and after the root element. Added `commentBefore`, `commentAfter`, `instructionBefore` and `instructionAfter` functions for this purpose. +- Dropped support for old node.js releases. Minimum required node.js version is now 4.0. + +## [7.0.0] - 2016-03-21 +- Processing instructions are now created as regular nodes. This is a major breaking change if you are using processing instructions. Previously processing instructions were inserted before their parent node. After this change processing instructions are appended to the children of the parent node. Note that it is not currently possible to insert processing instructions before or after the root element. +```js +root.ele('node').ins('pi'); +// pre-v7 + +// v7 + +``` + +## [6.0.0] - 2016-03-20 +- Added custom XML writers. The default string conversion functions are now collected under the `XMLStringWriter` class which can be accessed by the `stringWriter(options)` function exported by the module. An `XMLStreamWriter` is also added which outputs the XML document to a writable stream. A stream writer can be created by calling the `streamWriter(stream, options)` function exported by the module. Both classes are heavily customizable and the details are added to the wiki. It is also possible to write an XML writer from scratch and use it when calling `end()` on the XML document. + +## [5.0.1] - 2016-03-08 +- Moved require statements for text case conversion to the top of files to reduce lazy requires. + +## [5.0.0] - 2016-03-05 +- Added text case option for element names and attribute names. Valid cases are `lower`, `upper`, `camel`, `kebab` and `snake`. +- Attribute and element values are escaped according to the [Canonical XML 1.0 specification](http://www.w3.org/TR/2000/WD-xml-c14n-20000119.html#charescaping). See [#54](https://github.com/oozcitak/xmlbuilder-js/issues/54) and [#86](https://github.com/oozcitak/xmlbuilder-js/issues/86). +- Added the `allowEmpty` option to `end()`. When this option is set, empty elements are not self-closed. +- Added support for [nested CDATA](https://en.wikipedia.org/wiki/CDATA#Nesting). The triad `]]>` in CDATA is now automatically replaced with `]]]]>`. + +## [4.2.1] - 2016-01-15 +- Updated lodash dependency to 4.0.0. + +## [4.2.0] - 2015-12-16 +- Added the `noDoubleEncoding` option to `create()` to control whether existing html entities are encoded. + +## [4.1.0] - 2015-11-11 +- Added the `separateArrayItems` option to `create()` to control how arrays are handled when converting from objects. e.g. + +```js +root.ele({ number: [ "one", "two" ]}); +// with separateArrayItems: true + + + + +// with separateArrayItems: false +one +two +``` + +## [4.0.0] - 2015-11-01 +- Removed the `#list` decorator. Array items are now created as child nodes by default. +- Fixed a bug where the XML encoding string was checked partially. + +## [3.1.0] - 2015-09-19 +- `#list` decorator ignores empty arrays. + +## [3.0.0] - 2015-09-10 +- Allow `\r`, `\n` and `\t` in attribute values without escaping. See [#86](https://github.com/oozcitak/xmlbuilder-js/issues/86). + +## [2.6.5] - 2015-09-09 +- Use native `isArray` instead of lodash. +- Indentation of processing instructions are set to the parent element's. + +## [2.6.4] - 2015-05-27 +- Updated lodash dependency to 3.5.0. + +## [2.6.3] - 2015-05-27 +- Bumped version because previous release was not published on npm. + +## [2.6.2] - 2015-03-10 +- Updated lodash dependency to 3.5.0. + +## [2.6.1] - 2015-02-20 +- Updated lodash dependency to 3.3.0. + +## [2.6.0] - 2015-02-20 +- Fixed a bug where the `XMLNode` constructor overwrote the super class parent. +- Removed document property from cloned nodes. +- Switched to mocha.js for testing. + +## [2.5.2] - 2015-02-16 +- Updated lodash dependency to 3.2.0. + +## [2.5.1] - 2015-02-09 +- Updated lodash dependency to 3.1.0. +- Support all node >= 0.8. + +## [2.5.0] - 2015-00-03 +- Updated lodash dependency to 3.0.0. + +## [2.4.6] - 2015-01-26 +- Show more information from attribute creation with null values. +- Added iojs as an engine. +- Self close elements with empty text. + +## [2.4.5] - 2014-11-15 +- Fixed prepublish script to run on windows. +- Fixed bug in XMLStringifier where an undefined value was used while reporting an invalid encoding value. +- Moved require statements to the top of files to reduce lazy requires. See [#62](https://github.com/oozcitak/xmlbuilder-js/issues/62). + +## [2.4.4] - 2014-09-08 +- Added the `offset` option to `toString()` for use in XML fragments. + +## [2.4.3] - 2014-08-13 +- Corrected license in package description. + +## [2.4.2] - 2014-08-13 +- Dropped performance test and memwatch dependency. + +## [2.4.1] - 2014-08-12 +- Fixed a bug where empty indent string was omitted when pretty printing. See [#59](https://github.com/oozcitak/xmlbuilder-js/issues/59). + +## [2.4.0] - 2014-08-04 +- Correct cases of pubID and sysID. +- Use single lodash instead of separate npm modules. See [#53](https://github.com/oozcitak/xmlbuilder-js/issues/53). +- Escape according to Canonical XML 1.0. See [#54](https://github.com/oozcitak/xmlbuilder-js/issues/54). + +## [2.3.0] - 2014-07-17 +- Convert objects to JS primitives while sanitizing user input. +- Object builder preserves items with null values. See [#44](https://github.com/oozcitak/xmlbuilder-js/issues/44). +- Use modularized lodash functions to cut down dependencies. +- Process empty objects when converting from objects so that we don't throw on empty child objects. + +## [2.2.1] - 2014-04-04 +- Bumped version because previous release was not published on npm. + +## [2.2.0] - 2014-04-04 +- Switch to lodash from underscore. +- Removed legacy `ext` option from `create()`. +- Drop old node versions: 0.4, 0.5, 0.6. 0.8 is the minimum requirement from now on. + +## [2.1.0] - 2013-12-30 +- Removed duplicate null checks from constructors. +- Fixed node count in performance test. +- Added option for skipping null attribute values. See [#26](https://github.com/oozcitak/xmlbuilder-js/issues/26). +- Allow multiple values in `att()` and `ins()`. +- Added ability to run individual performance tests. +- Added flag for ignoring decorator strings. + +## [2.0.1] - 2013-12-24 +- Removed performance tests from npm package. + +## [2.0.0] - 2013-12-24 +- Combined loops for speed up. +- Added support for the DTD and XML declaration. +- `clone` includes attributes. +- Added performance tests. +- Evaluate attribute value if function. +- Evaluate instruction value if function. + +## [1.1.2] - 2013-12-11 +- Changed processing instruction decorator to `?`. + +## [1.1.1] - 2013-12-11 +- Added processing instructions to JS object conversion. + +## [1.1.0] - 2013-12-10 +- Added license to package. +- `create()` and `element()` accept JS object to fully build the document. +- Added `nod()` and `n()` aliases for `node()`. +- Renamed `convertAttChar` decorator to `convertAttKey`. +- Ignore empty decorator strings when converting JS objects. + +## [1.0.2] - 2013-11-27 +- Removed temp file which was accidentally included in the package. + +## [1.0.1] - 2013-11-27 +- Custom stringify functions affect current instance only. + +## [1.0.0] - 2013-11-27 +- Added processing instructions. +- Added stringify functions to sanitize and convert input values. +- Added option for headless XML documents. +- Added vows tests. +- Removed Makefile. Using npm publish scripts instead. +- Removed the `begin()` function. `create()` begins the document by creating the root node. + +## [0.4.3] - 2013-11-08 +- Added option to include surrogate pairs in XML content. See [#29](https://github.com/oozcitak/xmlbuilder-js/issues/29). +- Fixed empty value string representation in pretty mode. +- Added pre and postpublish scripts to package.json. +- Filtered out prototype properties when appending attributes. See [#31](https://github.com/oozcitak/xmlbuilder-js/issues/31). + +## [0.4.2] - 2012-09-14 +- Removed README.md from `.npmignore`. + +## [0.4.1] - 2012-08-31 +- Removed `begin()` calls in favor of `XMLBuilder` constructor. +- Added the `end()` function. `end()` is a convenience over `doc().toString()`. + +## [0.4.0] - 2012-08-31 +- Added arguments to `XMLBuilder` constructor to allow the name of the root element and XML prolog to be defined in one line. +- Soft deprecated `begin()`. + +## [0.3.11] - 2012-08-13 +- Package keywords are fixed to be an array of values. + +## [0.3.10] - 2012-08-13 +- Brought back npm package contents which were lost due to incorrect configuration of `package.json` in previous releases. + +## [0.3.3] - 2012-07-27 +- Implemented `importXMLBuilder()`. + +## [0.3.2] - 2012-07-20 +- Fixed a duplicated escaping problem on `element()`. +- Fixed a problem with text node creation from empty string. +- Calling `root()` on the document element returns the root element. +- `XMLBuilder` no longer extends `XMLFragment`. + +## [0.3.1] - 2011-11-28 +- Added guards for document element so that nodes cannot be inserted at document level. + +## [0.3.0] - 2011-11-28 +- Added `doc()` to return the document element. + +## [0.2.2] - 2011-11-28 +- Prevent code relying on `up()`'s older behavior to break. + +## [0.2.1] - 2011-11-28 +- Added the `root()` function. + +## [0.2.0] - 2011-11-21 +- Added Travis-CI integration. +- Added coffee-script dependency. +- Added insert, traversal and delete functions. + +## [0.1.7] - 2011-10-25 +- No changes. Accidental release. + +## [0.1.6] - 2011-10-25 +- Corrected `package.json` bugs link to `url` from `web`. + +## [0.1.5] - 2011-08-08 +- Added missing npm package contents. + +## [0.1.4] - 2011-07-29 +- Text-only nodes are no longer indented. +- Added documentation for multiple instances. + +## [0.1.3] - 2011-07-27 +- Exported the `create()` function to return a new instance. This allows multiple builder instances to be constructed. +- Fixed `u()` function so that it now correctly calls `up()`. +- Fixed typo in `element()` so that `attributes` and `text` can be passed interchangeably. + +## [0.1.2] - 2011-06-03 +- `ele()` accepts element text. +- `attributes()` now overrides existing attributes if passed the same attribute name. + +## [0.1.1] - 2011-05-19 +- Added the raw output option. +- Removed most validity checks. + +## [0.1.0] - 2011-04-27 +- `text()` and `cdata()` now return parent element. +- Attribute values are escaped. + +## [0.0.7] - 2011-04-23 +- Coerced text values to string. + +## [0.0.6] - 2011-02-23 +- Added support for XML comments. +- Text nodes are checked against CharData. + +## [0.0.5] - 2010-12-31 +- Corrected the name of the main npm module in `package.json`. + +## [0.0.4] - 2010-12-28 +- Added `.npmignore`. + +## [0.0.3] - 2010-12-27 +- root element is now constructed in `begin()`. +- moved prolog to `begin()`. +- Added the ability to have CDATA in element text. +- Removed unused prolog aliases. +- Removed `builder()` function from main module. +- Added the name of the main npm module in `package.json`. + +## [0.0.2] - 2010-11-03 +- `element()` expands nested arrays. +- Added pretty printing. +- Added the `up()`, `build()` and `prolog()` functions. +- Added readme. + +## 0.0.1 - 2010-11-02 +- Initial release + +[8.2.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.2.1...v8.2.2 +[8.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.2.0...v8.2.1 +[8.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.1.0...v8.2.0 +[8.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.0.0...v8.1.0 +[8.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v7.0.0...v8.0.0 +[7.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v6.0.0...v7.0.0 +[6.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v5.0.1...v6.0.0 +[5.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v5.0.0...v5.0.1 +[5.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.2.1...v5.0.0 +[4.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.2.0...v4.2.1 +[4.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.1.0...v4.2.0 +[4.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.0.0...v4.1.0 +[4.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v3.1.0...v4.0.0 +[3.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v3.0.0...v3.1.0 +[3.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.5...v3.0.0 +[2.6.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.4...v2.6.5 +[2.6.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.3...v2.6.4 +[2.6.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.2...v2.6.3 +[2.6.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.1...v2.6.2 +[2.6.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.0...v2.6.1 +[2.6.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.2...v2.6.0 +[2.5.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.1...v2.5.2 +[2.5.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.0...v2.5.1 +[2.5.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.6...v2.5.0 +[2.4.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.5...v2.4.6 +[2.4.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.4...v2.4.5 +[2.4.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.3...v2.4.4 +[2.4.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.2...v2.4.3 +[2.4.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.1...v2.4.2 +[2.4.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.0...v2.4.1 +[2.4.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.3.0...v2.4.0 +[2.3.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.2.1...v2.3.0 +[2.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.2.0...v2.2.1 +[2.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.1.0...v2.2.0 +[2.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.0.1...v2.1.0 +[2.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.2...v2.0.0 +[1.1.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.1...v1.1.2 +[1.1.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.2...v1.1.0 +[1.0.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.1...v1.0.2 +[1.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.3...v1.0.0 +[0.4.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.11...v0.4.0 +[0.3.11]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.10...v0.3.11 +[0.3.10]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.3...v0.3.10 +[0.3.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.2...v0.3.3 +[0.3.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.1...v0.3.2 +[0.3.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.0...v0.3.1 +[0.3.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.2...v0.3.0 +[0.2.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.7...v0.2.0 +[0.1.7]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.6...v0.1.7 +[0.1.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.5...v0.1.6 +[0.1.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.7...v0.1.0 +[0.0.7]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.6...v0.0.7 +[0.0.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.5...v0.0.6 +[0.0.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.4...v0.0.5 +[0.0.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.3...v0.0.4 +[0.0.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.2...v0.0.3 +[0.0.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.1...v0.0.2 + diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/LICENSE b/node_modules/cordova-android/node_modules/xmlbuilder/LICENSE new file mode 100644 index 0000000..e7cbac9 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/README.md b/node_modules/cordova-android/node_modules/xmlbuilder/README.md new file mode 100644 index 0000000..d465aa4 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/README.md @@ -0,0 +1,85 @@ +# xmlbuilder-js + +An XML builder for [node.js](https://nodejs.org/) similar to +[java-xmlbuilder](https://github.com/jmurty/java-xmlbuilder). + +[![License](http://img.shields.io/npm/l/xmlbuilder.svg?style=flat-square)](http://opensource.org/licenses/MIT) +[![NPM Version](http://img.shields.io/npm/v/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder) +[![NPM Downloads](https://img.shields.io/npm/dm/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder) + +[![Build Status](http://img.shields.io/travis/oozcitak/xmlbuilder-js.svg?style=flat-square)](http://travis-ci.org/oozcitak/xmlbuilder-js) +[![Dev Dependency Status](http://img.shields.io/david/dev/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://david-dm.org/oozcitak/xmlbuilder-js) +[![Code Coverage](https://img.shields.io/coveralls/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://coveralls.io/github/oozcitak/xmlbuilder-js) + +### Installation: + +``` sh +npm install xmlbuilder +``` + +### Usage: + +``` js +var builder = require('xmlbuilder'); +var xml = builder.create('root') + .ele('xmlbuilder') + .ele('repo', {'type': 'git'}, 'git://github.com/oozcitak/xmlbuilder-js.git') + .end({ pretty: true}); + +console.log(xml); +``` + +will result in: + +``` xml + + + + git://github.com/oozcitak/xmlbuilder-js.git + + +``` + +It is also possible to convert objects into nodes: + +``` js +builder.create({ + root: { + xmlbuilder: { + repo: { + '@type': 'git', // attributes start with @ + '#text': 'git://github.com/oozcitak/xmlbuilder-js.git' // text node + } + } + } +}); +``` + +If you need to do some processing: + +``` js +var root = builder.create('squares'); +root.com('f(x) = x^2'); +for(var i = 1; i <= 5; i++) +{ + var item = root.ele('data'); + item.att('x', i); + item.att('y', i * i); +} +``` + +This will result in: + +``` xml + + + + + + + + + +``` + +See the [wiki](https://github.com/oozcitak/xmlbuilder-js/wiki) for details. diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/Utility.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/Utility.js new file mode 100644 index 0000000..aca1d1e --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/Utility.js @@ -0,0 +1,139 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var assign, camelCase, capitalize, isArray, isEmpty, isFunction, isObject, isPlainObject, kebabCase, snakeCase, titleCase, words, + slice = [].slice, + hasProp = {}.hasOwnProperty; + + assign = function() { + var i, key, len, source, sources, target; + target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : []; + if (isFunction(Object.assign)) { + Object.assign.apply(null, arguments); + } else { + for (i = 0, len = sources.length; i < len; i++) { + source = sources[i]; + if (source != null) { + for (key in source) { + if (!hasProp.call(source, key)) continue; + target[key] = source[key]; + } + } + } + } + return target; + }; + + isFunction = function(val) { + return !!val && Object.prototype.toString.call(val) === '[object Function]'; + }; + + isObject = function(val) { + var ref; + return !!val && ((ref = typeof val) === 'function' || ref === 'object'); + }; + + isArray = function(val) { + if (isFunction(Array.isArray)) { + return Array.isArray(val); + } else { + return Object.prototype.toString.call(val) === '[object Array]'; + } + }; + + isEmpty = function(val) { + var key; + if (isArray(val)) { + return !val.length; + } else { + for (key in val) { + if (!hasProp.call(val, key)) continue; + return false; + } + return true; + } + }; + + isPlainObject = function(val) { + var ctor, proto; + return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object)); + }; + + words = function(val) { + return (val.split(/[-_\s]+|(?=[A-Z][a-z])/) || []).filter(function(n) { + return !!n; + }); + }; + + camelCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += index ? capitalize(word.toLowerCase()) : word.toLowerCase(); + } + return r; + }; + + titleCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += capitalize(word.toLowerCase()); + } + return r; + }; + + kebabCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += (index ? '-' : '') + word.toLowerCase(); + } + return r; + }; + + snakeCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += (index ? '_' : '') + word.toLowerCase(); + } + return r; + }; + + capitalize = function(val) { + return val.charAt(0).toUpperCase() + val.slice(1); + }; + + module.exports.assign = assign; + + module.exports.isFunction = isFunction; + + module.exports.isObject = isObject; + + module.exports.isArray = isArray; + + module.exports.isEmpty = isEmpty; + + module.exports.isPlainObject = isPlainObject; + + module.exports.camelCase = camelCase; + + module.exports.titleCase = titleCase; + + module.exports.kebabCase = kebabCase; + + module.exports.snakeCase = snakeCase; + + module.exports.capitalize = capitalize; + + module.exports.words = words; + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLAttribute.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLAttribute.js new file mode 100644 index 0000000..51ccebe --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLAttribute.js @@ -0,0 +1,31 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute; + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.options = parent.options; + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return Object.create(this); + }; + + XMLAttribute.prototype.toString = function(options) { + return this.options.writer.set(options).attribute(this); + }; + + return XMLAttribute; + + })(); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLCData.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLCData.js new file mode 100644 index 0000000..8ee861d --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLCData.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return Object.create(this); + }; + + XMLCData.prototype.toString = function(options) { + return this.options.writer.set(options).cdata(this); + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLComment.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLComment.js new file mode 100644 index 0000000..2c987a3 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLComment.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLComment, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return Object.create(this); + }; + + XMLComment.prototype.toString = function(options) { + return this.options.writer.set(options).comment(this); + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDAttList.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDAttList.js new file mode 100644 index 0000000..1d7e18e --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDAttList.js @@ -0,0 +1,50 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDAttList, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDAttList = (function(superClass) { + extend(XMLDTDAttList, superClass); + + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + XMLDTDAttList.__super__.constructor.call(this, parent); + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options) { + return this.options.writer.set(options).dtdAttList(this); + }; + + return XMLDTDAttList; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDElement.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDElement.js new file mode 100644 index 0000000..d206771 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDElement.js @@ -0,0 +1,35 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDElement, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDElement = (function(superClass) { + extend(XMLDTDElement, superClass); + + function XMLDTDElement(parent, name, value) { + XMLDTDElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options) { + return this.options.writer.set(options).dtdElement(this); + }; + + return XMLDTDElement; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDEntity.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDEntity.js new file mode 100644 index 0000000..4cfd422 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDEntity.js @@ -0,0 +1,56 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDEntity, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDEntity = (function(superClass) { + extend(XMLDTDEntity, superClass); + + function XMLDTDEntity(parent, pe, name, value) { + XMLDTDEntity.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options) { + return this.options.writer.set(options).dtdEntity(this); + }; + + return XMLDTDEntity; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDNotation.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDNotation.js new file mode 100644 index 0000000..8747d9d --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDTDNotation.js @@ -0,0 +1,37 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDNotation, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDNotation = (function(superClass) { + extend(XMLDTDNotation, superClass); + + function XMLDTDNotation(parent, name, value) { + XMLDTDNotation.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options) { + return this.options.writer.set(options).dtdNotation(this); + }; + + return XMLDTDNotation; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDeclaration.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDeclaration.js new file mode 100644 index 0000000..c8f2c06 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDeclaration.js @@ -0,0 +1,40 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDeclaration, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options) { + return this.options.writer.set(options).declaration(this); + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocType.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocType.js new file mode 100644 index 0000000..fa5e020 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocType.js @@ -0,0 +1,107 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + module.exports = XMLDocType = (function(superClass) { + extend(XMLDocType, superClass); + + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + XMLDocType.__super__.constructor.call(this, parent); + this.documentObject = parent; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.toString = function(options) { + return this.options.writer.set(options).docType(this); + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.up = function() { + return this.root() || this.documentObject; + }; + + return XMLDocType; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocument.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocument.js new file mode 100644 index 0000000..2882faf --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocument.js @@ -0,0 +1,48 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isPlainObject = require('./Utility').isPlainObject; + + XMLNode = require('./XMLNode'); + + XMLStringifier = require('./XMLStringifier'); + + XMLStringWriter = require('./XMLStringWriter'); + + module.exports = XMLDocument = (function(superClass) { + extend(XMLDocument, superClass); + + function XMLDocument(options) { + XMLDocument.__super__.constructor.call(this, null); + options || (options = {}); + if (!options.writer) { + options.writer = new XMLStringWriter(); + } + this.options = options; + this.stringify = new XMLStringifier(options); + this.isDocument = true; + } + + XMLDocument.prototype.end = function(writer) { + var writerOptions; + if (!writer) { + writer = this.options.writer; + } else if (isPlainObject(writer)) { + writerOptions = writer; + writer = this.options.writer.set(writerOptions); + } + return writer.document(this); + }; + + XMLDocument.prototype.toString = function(options) { + return this.options.writer.set(options).document(this); + }; + + return XMLDocument; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocumentCB.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocumentCB.js new file mode 100644 index 0000000..b8506e2 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLDocumentCB.js @@ -0,0 +1,402 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject; + + XMLElement = require('./XMLElement'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLAttribute = require('./XMLAttribute'); + + XMLStringifier = require('./XMLStringifier'); + + XMLStringWriter = require('./XMLStringWriter'); + + module.exports = XMLDocumentCB = (function() { + function XMLDocumentCB(options, onData, onEnd) { + var writerOptions; + options || (options = {}); + if (!options.writer) { + options.writer = new XMLStringWriter(options); + } else if (isPlainObject(options.writer)) { + writerOptions = options.writer; + options.writer = new XMLStringWriter(writerOptions); + } + this.options = options; + this.writer = options.writer; + this.stringify = new XMLStringifier(options); + this.onDataCallback = onData || function() {}; + this.onEndCallback = onEnd || function() {}; + this.currentNode = null; + this.currentLevel = -1; + this.openTags = {}; + this.documentStarted = false; + this.documentCompleted = false; + this.root = null; + } + + XMLDocumentCB.prototype.node = function(name, attributes, text) { + var ref1; + if (name == null) { + throw new Error("Missing node name"); + } + if (this.root && this.currentLevel === -1) { + throw new Error("Document can only have one root node"); + } + this.openCurrent(); + name = name.valueOf(); + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + this.currentNode = new XMLElement(this, name, attributes); + this.currentNode.children = false; + this.currentLevel++; + this.openTags[this.currentLevel] = this.currentNode; + if (text != null) { + this.text(text); + } + return this; + }; + + XMLDocumentCB.prototype.element = function(name, attributes, text) { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.dtdElement.apply(this, arguments); + } else { + return this.node(name, attributes, text); + } + }; + + XMLDocumentCB.prototype.attribute = function(name, value) { + var attName, attValue; + if (!this.currentNode || this.currentNode.children) { + throw new Error("att() can only be used immediately after an ele() call in callback mode"); + } + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.currentNode.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLDocumentCB.prototype.text = function(value) { + var node; + this.openCurrent(); + node = new XMLText(this, value); + this.onData(this.writer.text(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.cdata = function(value) { + var node; + this.openCurrent(); + node = new XMLCData(this, value); + this.onData(this.writer.cdata(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.comment = function(value) { + var node; + this.openCurrent(); + node = new XMLComment(this, value); + this.onData(this.writer.comment(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.raw = function(value) { + var node; + this.openCurrent(); + node = new XMLRaw(this, value); + this.onData(this.writer.raw(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.instruction = function(target, value) { + var i, insTarget, insValue, len, node; + this.openCurrent(); + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + node = new XMLProcessingInstruction(this, target, value); + this.onData(this.writer.processingInstruction(node, this.currentLevel + 1)); + } + return this; + }; + + XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) { + var node; + this.openCurrent(); + if (this.documentStarted) { + throw new Error("declaration() must be the first node"); + } + node = new XMLDeclaration(this, version, encoding, standalone); + this.onData(this.writer.declaration(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) { + this.openCurrent(); + if (root == null) { + throw new Error("Missing root node name"); + } + if (this.root) { + throw new Error("dtd() must come before the root node"); + } + this.currentNode = new XMLDocType(this, pubID, sysID); + this.currentNode.rootNodeName = root; + this.currentNode.children = false; + this.currentLevel++; + this.openTags[this.currentLevel] = this.currentNode; + return this; + }; + + XMLDocumentCB.prototype.dtdElement = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDElement(this, name, value); + this.onData(this.writer.dtdElement(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var node; + this.openCurrent(); + node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.onData(this.writer.dtdAttList(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.entity = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDEntity(this, false, name, value); + this.onData(this.writer.dtdEntity(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.pEntity = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDEntity(this, true, name, value); + this.onData(this.writer.dtdEntity(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.notation = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDNotation(this, name, value); + this.onData(this.writer.dtdNotation(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.up = function() { + if (this.currentLevel < 0) { + throw new Error("The document node has no parent"); + } + if (this.currentNode) { + if (this.currentNode.children) { + this.closeNode(this.currentNode); + } else { + this.openNode(this.currentNode); + } + this.currentNode = null; + } else { + this.closeNode(this.openTags[this.currentLevel]); + } + delete this.openTags[this.currentLevel]; + this.currentLevel--; + return this; + }; + + XMLDocumentCB.prototype.end = function() { + while (this.currentLevel >= 0) { + this.up(); + } + return this.onEnd(); + }; + + XMLDocumentCB.prototype.openCurrent = function() { + if (this.currentNode) { + this.currentNode.children = true; + return this.openNode(this.currentNode); + } + }; + + XMLDocumentCB.prototype.openNode = function(node) { + if (!node.isOpen) { + if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) { + this.root = node; + } + this.onData(this.writer.openNode(node, this.currentLevel)); + return node.isOpen = true; + } + }; + + XMLDocumentCB.prototype.closeNode = function(node) { + if (!node.isClosed) { + this.onData(this.writer.closeNode(node, this.currentLevel)); + return node.isClosed = true; + } + }; + + XMLDocumentCB.prototype.onData = function(chunk) { + this.documentStarted = true; + return this.onDataCallback(chunk); + }; + + XMLDocumentCB.prototype.onEnd = function() { + this.documentCompleted = true; + return this.onEndCallback(); + }; + + XMLDocumentCB.prototype.ele = function() { + return this.element.apply(this, arguments); + }; + + XMLDocumentCB.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLDocumentCB.prototype.txt = function(value) { + return this.text(value); + }; + + XMLDocumentCB.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocumentCB.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocumentCB.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocumentCB.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) { + return this.doctype(root, pubID, sysID); + }; + + XMLDocumentCB.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLDocumentCB.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLDocumentCB.prototype.t = function(value) { + return this.text(value); + }; + + XMLDocumentCB.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLDocumentCB.prototype.c = function(value) { + return this.comment(value); + }; + + XMLDocumentCB.prototype.r = function(value) { + return this.raw(value); + }; + + XMLDocumentCB.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocumentCB.prototype.att = function() { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.attList.apply(this, arguments); + } else { + return this.attribute.apply(this, arguments); + } + }; + + XMLDocumentCB.prototype.a = function() { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.attList.apply(this, arguments); + } else { + return this.attribute.apply(this, arguments); + } + }; + + XMLDocumentCB.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocumentCB.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocumentCB.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + return XMLDocumentCB; + + })(); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLElement.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLElement.js new file mode 100644 index 0000000..620714b --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLElement.js @@ -0,0 +1,111 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction; + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + if (parent.isDocument) { + this.isRoot = true; + this.documentObject = parent; + parent.rootObject = this; + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, ref1; + clonedSelf = Object.create(this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref1 = this.attributes; + for (attName in ref1) { + if (!hasProp.call(ref1, attName)) continue; + att = ref1[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.toString = function(options) { + return this.options.writer.set(options).element(this); + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLNode.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLNode.js new file mode 100644 index 0000000..1b3b456 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLNode.js @@ -0,0 +1,432 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty; + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + XMLProcessingInstruction = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + if (this.parent) { + this.options = this.parent.options; + this.stringify = this.parent.stringify; + } + this.children = []; + if (!XMLElement) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref1, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.separateArrayItems && Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref1; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref1; + if (name != null) { + name = name.valueOf(); + } + attributes || (attributes = {}); + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.commentBefore = function(value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.comment(value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.commentAfter = function(value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.comment(value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.instruction = function(target, value) { + var insTarget, insValue, instruction, j, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (j = 0, len = target.length; j < len; j++) { + insTarget = target[j]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.children.push(instruction); + } + return this; + }; + + XMLNode.prototype.instructionBefore = function(target, value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.instruction(target, value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.instructionAfter = function(target, value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.instruction(target, value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + if (doc.children[0] instanceof XMLDeclaration) { + doc.children[0] = xmldec; + } else { + doc.children.unshift(xmldec); + } + return doc.root() || doc; + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var child, doc, doctype, i, j, k, len, len1, ref1, ref2; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + ref1 = doc.children; + for (i = j = 0, len = ref1.length; j < len; i = ++j) { + child = ref1[i]; + if (child instanceof XMLDocType) { + doc.children[i] = doctype; + return doctype; + } + } + ref2 = doc.children; + for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) { + child = ref2[i]; + if (child.isRoot) { + doc.children.splice(i, 0, doctype); + return doctype; + } + } + doc.children.push(doctype); + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var node; + node = this; + while (node) { + if (node.isDocument) { + return node.rootObject; + } else if (node.isRoot) { + return node; + } else { + node = node.parent; + } + } + }; + + XMLNode.prototype.document = function() { + var node; + node = this; + while (node) { + if (node.isDocument) { + return node; + } else { + node = node.parent; + } + } + }; + + XMLNode.prototype.end = function(options) { + return this.document().end(options); + }; + + XMLNode.prototype.prev = function() { + var i; + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importDocument = function(doc) { + var clonedRoot; + clonedRoot = doc.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + XMLNode.prototype.importXMLBuilder = function(doc) { + return this.importDocument(doc); + }; + + return XMLNode; + + })(); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js new file mode 100644 index 0000000..a15be34 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js @@ -0,0 +1,35 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLNode, XMLProcessingInstruction, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLProcessingInstruction = (function(superClass) { + extend(XMLProcessingInstruction, superClass); + + function XMLProcessingInstruction(parent, target, value) { + XMLProcessingInstruction.__super__.constructor.call(this, parent); + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return Object.create(this); + }; + + XMLProcessingInstruction.prototype.toString = function(options) { + return this.options.writer.set(options).processingInstruction(this); + }; + + return XMLProcessingInstruction; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLRaw.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLRaw.js new file mode 100644 index 0000000..152f83b --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLRaw.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLNode, XMLRaw, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return Object.create(this); + }; + + XMLRaw.prototype.toString = function(options) { + return this.options.writer.set(options).raw(this); + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStreamWriter.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStreamWriter.js new file mode 100644 index 0000000..10a0926 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStreamWriter.js @@ -0,0 +1,278 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLElement = require('./XMLElement'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLWriterBase = require('./XMLWriterBase'); + + module.exports = XMLStreamWriter = (function(superClass) { + extend(XMLStreamWriter, superClass); + + function XMLStreamWriter(stream, options) { + this.stream = stream; + XMLStreamWriter.__super__.constructor.call(this, options); + } + + XMLStreamWriter.prototype.document = function(doc) { + var child, i, j, len, len1, ref, ref1, results; + ref = doc.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + child.isLastRootNode = false; + } + doc.children[doc.children.length - 1].isLastRootNode = true; + ref1 = doc.children; + results = []; + for (j = 0, len1 = ref1.length; j < len1; j++) { + child = ref1[j]; + switch (false) { + case !(child instanceof XMLDeclaration): + results.push(this.declaration(child)); + break; + case !(child instanceof XMLDocType): + results.push(this.docType(child)); + break; + case !(child instanceof XMLComment): + results.push(this.comment(child)); + break; + case !(child instanceof XMLProcessingInstruction): + results.push(this.processingInstruction(child)); + break; + default: + results.push(this.element(child)); + } + } + return results; + }; + + XMLStreamWriter.prototype.attribute = function(att) { + return this.stream.write(' ' + att.name + '="' + att.value + '"'); + }; + + XMLStreamWriter.prototype.cdata = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.comment = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.declaration = function(node, level) { + this.stream.write(this.space(level)); + this.stream.write(''); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.docType = function(node, level) { + var child, i, len, ref; + level || (level = 0); + this.stream.write(this.space(level)); + this.stream.write(' 0) { + this.stream.write(' ['); + this.stream.write(this.endline(node)); + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + switch (false) { + case !(child instanceof XMLDTDAttList): + this.dtdAttList(child, level + 1); + break; + case !(child instanceof XMLDTDElement): + this.dtdElement(child, level + 1); + break; + case !(child instanceof XMLDTDEntity): + this.dtdEntity(child, level + 1); + break; + case !(child instanceof XMLDTDNotation): + this.dtdNotation(child, level + 1); + break; + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + } + this.stream.write(']'); + } + this.stream.write('>'); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.element = function(node, level) { + var att, child, i, len, name, ref, ref1, space; + level || (level = 0); + space = this.space(level); + this.stream.write(space + '<' + node.name); + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + this.attribute(att); + } + if (node.children.length === 0 || node.children.every(function(e) { + return e.value === ''; + })) { + if (this.allowEmpty) { + this.stream.write('>'); + } else { + this.stream.write('/>'); + } + } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) { + this.stream.write('>'); + this.stream.write(node.children[0].value); + this.stream.write(''); + } else { + this.stream.write('>' + this.newline); + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + switch (false) { + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLElement): + this.element(child, level + 1); + break; + case !(child instanceof XMLRaw): + this.raw(child, level + 1); + break; + case !(child instanceof XMLText): + this.text(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + } + this.stream.write(space + ''); + } + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.processingInstruction = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.raw = function(node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.text = function(node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdAttList = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdElement = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdEntity = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdNotation = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.endline = function(node) { + if (!node.isLastRootNode) { + return this.newline; + } else { + return ''; + } + }; + + return XMLStreamWriter; + + })(XMLWriterBase); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringWriter.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringWriter.js new file mode 100644 index 0000000..3164006 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringWriter.js @@ -0,0 +1,302 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLElement = require('./XMLElement'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLWriterBase = require('./XMLWriterBase'); + + module.exports = XMLStringWriter = (function(superClass) { + extend(XMLStringWriter, superClass); + + function XMLStringWriter(options) { + XMLStringWriter.__super__.constructor.call(this, options); + } + + XMLStringWriter.prototype.document = function(doc) { + var child, i, len, r, ref; + r = ''; + ref = doc.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLDeclaration): + return this.declaration(child); + case !(child instanceof XMLDocType): + return this.docType(child); + case !(child instanceof XMLComment): + return this.comment(child); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child); + default: + return this.element(child, 0); + } + }).call(this); + } + if (this.pretty && r.slice(-this.newline.length) === this.newline) { + r = r.slice(0, -this.newline.length); + } + return r; + }; + + XMLStringWriter.prototype.attribute = function(att) { + return ' ' + att.name + '="' + att.value + '"'; + }; + + XMLStringWriter.prototype.cdata = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.comment = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.declaration = function(node, level) { + var r; + r = this.space(level); + r += ''; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.docType = function(node, level) { + var child, i, len, r, ref; + level || (level = 0); + r = this.space(level); + r += ' 0) { + r += ' ['; + r += this.newline; + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLDTDAttList): + return this.dtdAttList(child, level + 1); + case !(child instanceof XMLDTDElement): + return this.dtdElement(child, level + 1); + case !(child instanceof XMLDTDEntity): + return this.dtdEntity(child, level + 1); + case !(child instanceof XMLDTDNotation): + return this.dtdNotation(child, level + 1); + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + }).call(this); + } + r += ']'; + } + r += '>'; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.element = function(node, level) { + var att, child, i, len, name, r, ref, ref1, space; + level || (level = 0); + space = this.space(level); + r = ''; + r += space + '<' + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + if (node.children.length === 0 || node.children.every(function(e) { + return e.value === ''; + })) { + if (this.allowEmpty) { + r += '>' + this.newline; + } else { + r += '/>' + this.newline; + } + } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) { + r += '>'; + r += node.children[0].value; + r += '' + this.newline; + } else { + r += '>' + this.newline; + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLElement): + return this.element(child, level + 1); + case !(child instanceof XMLRaw): + return this.raw(child, level + 1); + case !(child instanceof XMLText): + return this.text(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + }).call(this); + } + r += space + '' + this.newline; + } + return r; + }; + + XMLStringWriter.prototype.processingInstruction = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.raw = function(node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.text = function(node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.dtdAttList = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdElement = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.dtdEntity = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdNotation = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.openNode = function(node, level) { + var att, name, r, ref; + level || (level = 0); + if (node instanceof XMLElement) { + r = this.space(level) + '<' + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + r += (node.children ? '>' : '/>') + this.newline; + return r; + } else { + r = this.space(level) + '') + this.newline; + return r; + } + }; + + XMLStringWriter.prototype.closeNode = function(node, level) { + level || (level = 0); + switch (false) { + case !(node instanceof XMLElement): + return this.space(level) + '' + this.newline; + case !(node instanceof XMLDocType): + return this.space(level) + ']>' + this.newline; + } + }; + + return XMLStringWriter; + + })(XMLWriterBase); + +}).call(this); diff --git a/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringifier.js b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringifier.js new file mode 100644 index 0000000..f549461 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmlbuilder/lib/XMLStringifier.js @@ -0,0 +1,192 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLStringifier, camelCase, kebabCase, ref, snakeCase, titleCase, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), camelCase = ref.camelCase, titleCase = ref.titleCase, kebabCase = ref.kebabCase, snakeCase = ref.snakeCase; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref1, value; + options || (options = {}); + this.allowSurrogateChars = options.allowSurrogateChars; + this.noDoubleEncoding = options.noDoubleEncoding; + this.textCase = options.textCase; + ref1 = options.stringify || {}; + for (key in ref1) { + if (!hasProp.call(ref1, key)) continue; + value = ref1[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + val = this.applyCase(val); + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + val = val.replace(']]>', ']]]]>'); + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + val = '' + val || ''; + return val = this.applyCase(val); + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.applyCase = function(str) { + switch (this.textCase) { + case "camel": + return camelCase(str); + case "title": + return titleCase(str); + case "kebab": + case "lower": + return kebabCase(str); + case "snake": + return snakeCase(str); + case "upper": + return kebabCase(str).toUpperCase(); + default: + return str; + } + }; + + XMLStringifier.prototype.elEscape = function(str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str.replace(ampregex, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str.replace(ampregex, '&').replace(/=4.0" + }, + "homepage": "http://github.com/oozcitak/xmlbuilder-js", + "keywords": [ + "xml", + "xmlbuilder" + ], + "license": "MIT", + "main": "./lib/index", + "name": "xmlbuilder", + "repository": { + "type": "git", + "url": "git://github.com/oozcitak/xmlbuilder-js.git" + }, + "scripts": { + "postpublish": "rm -rf lib", + "prepublish": "coffee -co lib src", + "test": "mocha && istanbul report text lcov" + }, + "version": "8.2.2" +} diff --git a/node_modules/cordova-android/node_modules/xmldom/.npmignore b/node_modules/cordova-android/node_modules/xmldom/.npmignore new file mode 100644 index 0000000..b094a44 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/.npmignore @@ -0,0 +1,5 @@ +test +t +travis.yml +.project +changelog diff --git a/node_modules/cordova-android/node_modules/xmldom/.travis.yml b/node_modules/cordova-android/node_modules/xmldom/.travis.yml new file mode 100644 index 0000000..b95408e --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/.travis.yml @@ -0,0 +1,22 @@ +language: node_js + +node_js: + - '0.10' + +branches: + only: + - master + - proof + - travis-ci + +# Not using `npm install --dev` because it is recursive. It will pull in the all +# development dependencies for CoffeeScript. Way too much spew in the Travis CI +# build output. + +before_install: + - npm install + - npm install istanbul coveralls + +env: + global: + - secure: "BxUHTsa1WVANLQoimilbZwa1MCWSdM9hOmPWBE/rsYb7uT/iiqkRXXwnWhKtN5CLvTvIQbiAzq4iyPID0S8UHrnxClYQrOuA6QkrtwgIEuDAmijao/bgxobPOremvkwXcpMGIwzYKyYQQtSEaEIQbqf6gSSKW9dBh/GZ/vfTsqo=" diff --git a/node_modules/cordova-android/node_modules/xmldom/LICENSE b/node_modules/cordova-android/node_modules/xmldom/LICENSE new file mode 100644 index 0000000..68a9b5e --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/LICENSE @@ -0,0 +1,8 @@ +You can choose any one of those: + +The MIT License (MIT): + +link:http://opensource.org/licenses/MIT + +LGPL: +http://www.gnu.org/licenses/lgpl.html diff --git a/node_modules/cordova-android/node_modules/xmldom/__package__.js b/node_modules/cordova-android/node_modules/xmldom/__package__.js new file mode 100644 index 0000000..b4cad28 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/__package__.js @@ -0,0 +1,4 @@ +this.addScript('dom.js',['DOMImplementation','XMLSerializer']); +this.addScript('dom-parser.js',['DOMHandler','DOMParser'], + ['DOMImplementation','XMLReader']); +this.addScript('sax.js','XMLReader'); \ No newline at end of file diff --git a/node_modules/cordova-android/node_modules/xmldom/changelog b/node_modules/cordova-android/node_modules/xmldom/changelog new file mode 100644 index 0000000..ab815bb --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/changelog @@ -0,0 +1,14 @@ +### Version 0.1.16 + +Sat May 4 14:58:03 UTC 2013 + + * Correctly handle multibyte Unicode greater than two byts. #57. #56. + * Initial unit testing and test coverage. #53. #46. #19. + * Create Bower `component.json` #52. + +### Version 0.1.8 + + * Add: some test case from node-o3-xml(excludes xpath support) + * Fix: remove existed attribute before setting (bug introduced in v0.1.5) + * Fix: index direct access for childNodes and any NodeList collection(not w3c standard) + * Fix: remove last child bug diff --git a/node_modules/cordova-android/node_modules/xmldom/component.json b/node_modules/cordova-android/node_modules/xmldom/component.json new file mode 100644 index 0000000..93b4d57 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/component.json @@ -0,0 +1,10 @@ +{ + "name": "xmldom", + "version": "0.1.15", + "main": "dom-parser.js", + "ignore": [ + "**/.*", + "node_modules", + "components" + ] +} diff --git a/node_modules/cordova-android/node_modules/xmldom/dom-parser.js b/node_modules/cordova-android/node_modules/xmldom/dom-parser.js new file mode 100644 index 0000000..41d5226 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/dom-parser.js @@ -0,0 +1,251 @@ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +//} diff --git a/node_modules/cordova-android/node_modules/xmldom/dom.js b/node_modules/cordova-android/node_modules/xmldom/dom.js new file mode 100644 index 0000000..b290df0 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/dom.js @@ -0,0 +1,1244 @@ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + }, + toString:function(isHTML,nodeFilter){ + for(var buf = [], i = 0;i=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + //console.log() + var i = this.length; + while(i--){ + var attr = this[i]; + //console.log(attr.nodeName,key) + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == ELEMENT_NODE){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){ + return nodeSerializeToString.call(node,isHtml,nodeFilter); +} +Node.prototype.toString = nodeSerializeToString; +function nodeSerializeToString(isHtml,nodeFilter){ + var buf = []; + var refNode = this.nodeType == 9?this.documentElement:this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if(uri && prefix == null){ + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if(prefix == null){ + //isHTML = true; + var visibleNamespaces=[ + {namespace:uri,prefix:null} + //{namespace:uri,prefix:''} + ] + } + } + serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(''); +} +function needNamespaceDefine(node,isHTML, visibleNamespaces) { + var prefix = node.prefix||''; + var uri = node.namespaceURI; + if (!prefix && !uri){ + return false; + } + if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" + || uri == 'http://www.w3.org/2000/xmlns/'){ + return false; + } + + var i = visibleNamespaces.length + //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces) + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + //console.log(node.nodeType,node.tagName,ns.prefix,prefix) + if (ns.prefix == prefix){ + return ns.namespace != uri; + } + } + //console.log(isHTML,uri,prefix=='') + //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){ + // return false; + //} + //node.flag = '11111' + //console.error(3,true,node.flag,node.prefix,node.namespaceURI) + return true; +} +function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){ + if(nodeFilter){ + node = nodeFilter(node); + if(node){ + if(typeof node == 'string'){ + buf.push(node); + return; + } + }else{ + return; + } + //buf.sort.apply(attrs, attributeSorter); + } + switch(node.nodeType){ + case ELEMENT_NODE: + if (!visibleNamespaces) visibleNamespaces = []; + var startVisibleNamespaces = visibleNamespaces.length; + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = (htmlns === node.namespaceURI) ||isHTML + buf.push('<',nodeName); + + + + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + while(child){ + if(child.data){ + buf.push(child.data); + }else{ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + } + child = child.nextSibling; + } + }else + { + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i=0.1" + }, + "homepage": "https://github.com/jindw/xmldom", + "keywords": [ + "w3c", + "dom", + "xml", + "parser", + "javascript", + "DOMParser", + "XMLSerializer" + ], + "licenses": [ + { + "type": "LGPL", + "url": "http://www.gnu.org/licenses/lgpl.html", + "MIT": "http://opensource.org/licenses/MIT" + } + ], + "main": "./dom-parser.js", + "maintainers": [ + { + "name": "jindw", + "email": "jindw@xidea.org", + "url": "http://www.xidea.org" + } + ], + "name": "xmldom", + "repository": { + "type": "git", + "url": "git://github.com/jindw/xmldom.git" + }, + "scripts": { + "test": "proof platform win32 && proof test */*/*.t.js || t/test" + }, + "version": "0.1.27" +} diff --git a/node_modules/cordova-android/node_modules/xmldom/readme.md b/node_modules/cordova-android/node_modules/xmldom/readme.md new file mode 100644 index 0000000..f832c44 --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/readme.md @@ -0,0 +1,219 @@ +# XMLDOM [![Build Status](https://secure.travis-ci.org/bigeasy/xmldom.png?branch=master)](http://travis-ci.org/bigeasy/xmldom) [![Coverage Status](https://coveralls.io/repos/bigeasy/xmldom/badge.png?branch=master)](https://coveralls.io/r/bigeasy/xmldom) [![NPM version](https://badge.fury.io/js/xmldom.png)](http://badge.fury.io/js/xmldom) + +A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully +compatible with `W3C DOM level2`; and some compatible with `level3`. Supports +`DOMParser` and `XMLSerializer` interface such as in browser. + +Install: +------- +>npm install xmldom + +Example: +==== +```javascript +var DOMParser = require('xmldom').DOMParser; +var doc = new DOMParser().parseFromString( + '\n'+ + '\ttest\n'+ + '\t\n'+ + '\t\n'+ + '' + ,'text/xml'); +doc.documentElement.setAttribute('x','y'); +doc.documentElement.setAttributeNS('./lite','c:x','y2'); +var nsAttr = doc.documentElement.getAttributeNS('./lite','x') +console.info(nsAttr) +console.info(doc) +``` +API Reference +===== + + * [DOMParser](https://developer.mozilla.org/en/DOMParser): + + ```javascript + parseFromString(xmlsource,mimeType) + ``` + * **options extension** _by xmldom_(not BOM standard!!) + + ```javascript + //added the options argument + new DOMParser(options) + + //errorHandler is supported + new DOMParser({ + /** + * locator is always need for error position info + */ + locator:{}, + /** + * you can override the errorHandler for xml parser + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback} + //only callback model + //errorHandler:function(level,msg){console.log(level,msg)} + }) + + ``` + + * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer) + + ```javascript + serializeToString(node) + ``` +DOM level2 method and attribute: +------ + + * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247) + + attribute: + nodeValue|prefix + readonly attribute: + nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName + method: + insertBefore(newChild, refChild) + replaceChild(newChild, oldChild) + removeChild(oldChild) + appendChild(newChild) + hasChildNodes() + cloneNode(deep) + normalize() + isSupported(feature, version) + hasAttributes() + + * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490) + + method: + hasFeature(feature, version) + createDocumentType(qualifiedName, publicId, systemId) + createDocument(namespaceURI, qualifiedName, doctype) + + * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node + + readonly attribute: + doctype|implementation|documentElement + method: + createElement(tagName) + createDocumentFragment() + createTextNode(data) + createComment(data) + createCDATASection(data) + createProcessingInstruction(target, data) + createAttribute(name) + createEntityReference(name) + getElementsByTagName(tagname) + importNode(importedNode, deep) + createElementNS(namespaceURI, qualifiedName) + createAttributeNS(namespaceURI, qualifiedName) + getElementsByTagNameNS(namespaceURI, localName) + getElementById(elementId) + + * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node + * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node + + readonly attribute: + tagName + method: + getAttribute(name) + setAttribute(name, value) + removeAttribute(name) + getAttributeNode(name) + setAttributeNode(newAttr) + removeAttributeNode(oldAttr) + getElementsByTagName(name) + getAttributeNS(namespaceURI, localName) + setAttributeNS(namespaceURI, qualifiedName, value) + removeAttributeNS(namespaceURI, localName) + getAttributeNodeNS(namespaceURI, localName) + setAttributeNodeNS(newAttr) + getElementsByTagNameNS(namespaceURI, localName) + hasAttribute(name) + hasAttributeNS(namespaceURI, localName) + + * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node + + attribute: + value + readonly attribute: + name|specified|ownerElement + + * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177) + + readonly attribute: + length + method: + item(index) + + * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922) + + readonly attribute: + length + method: + getNamedItem(name) + setNamedItem(arg) + removeNamedItem(name) + item(index) + getNamedItemNS(namespaceURI, localName) + setNamedItemNS(arg) + removeNamedItemNS(namespaceURI, localName) + + * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node + + method: + substringData(offset, count) + appendData(arg) + insertData(offset, arg) + deleteData(offset, count) + replaceData(offset, count, arg) + + * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData + + method: + splitText(offset) + + * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212) + * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData + + * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927) + + readonly attribute: + name|entities|notations|publicId|systemId|internalSubset + + * Notation : Node + + readonly attribute: + publicId|systemId + + * Entity : Node + + readonly attribute: + publicId|systemId|notationName + + * EntityReference : Node + * ProcessingInstruction : Node + + attribute: + data + readonly attribute: + target + +DOM level 3 support: +----- + + * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) + + attribute: + textContent + method: + isDefaultNamespace(namespaceURI){ + lookupNamespaceURI(prefix) + +DOM extension by xmldom +--- + * [Node] Source position extension; + + attribute: + //Numbered starting from '1' + lineNumber + //Numbered starting from '1' + columnNumber diff --git a/node_modules/cordova-android/node_modules/xmldom/sax.js b/node_modules/cordova-android/node_modules/xmldom/sax.js new file mode 100644 index 0000000..b33635f --- /dev/null +++ b/node_modules/cordova-android/node_modules/xmldom/sax.js @@ -0,0 +1,633 @@ +//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] +//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] +//[5] Name ::= NameStartChar (NameChar)* +var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF +var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"); +var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); +//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ +//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE +var S_TAG = 0;//tag name offerring +var S_ATTR = 1;//attr name offerring +var S_ATTR_SPACE=2;//attr name end and space offer +var S_EQ = 3;//=space? +var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only) +var S_ATTR_END = 5;//attr value end and no space(quot end) +var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer) +var S_TAG_CLOSE = 7;//closed el + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart+2,end); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + //console.error('#@@@@@@'+tagName) + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} + +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="') + attrName = source.slice(start,p) + } + start = p+1; + p = source.indexOf(c,start) + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + } + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!') + } + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || ''] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf('') + if(pos',start+4); + //append comment source.substring(4,end)// + + + Fake + + + Fake plugin to test plugin installation and properties parsing on Android. + + + Apache 2.0 + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/platforms/android/FakeLib/project.properties b/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/platforms/android/FakeLib/project.properties new file mode 100644 index 0000000..131a554 --- /dev/null +++ b/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/platforms/android/FakeLib/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +android.library=true +# Project target. +target=android-9 diff --git a/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/plugin.xml b/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/plugin.xml new file mode 100644 index 0000000..2f5538d --- /dev/null +++ b/node_modules/cordova-android/spec/e2e/fixtures/cordova-plugin-fake/plugin.xml @@ -0,0 +1,44 @@ + + + + + Fake + + + Fake plugin to test plugin installation and properties parsing on Android. + + + Apache 2.0 + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/e2e/helpers/projectActions.js b/node_modules/cordova-android/spec/e2e/helpers/projectActions.js new file mode 100644 index 0000000..9ac8936 --- /dev/null +++ b/node_modules/cordova-android/spec/e2e/helpers/projectActions.js @@ -0,0 +1,150 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +var PluginInfoProvider = require('cordova-common').PluginInfoProvider; +var shell = require('shelljs'); +var cp = require('child_process'); +var path = require('path'); +var util = require('util'); + +var cordova_bin = path.join(__dirname, '../../../bin'); + +/** + * Creates a project using platform create script with given parameters + * @param {string} projectname - name of the project + * @param {string} projectid - id of the project + * @param {string} platformpath - path to the platform + * @param {function} callback - function which is called (without arguments) when the project is created or (with error object) when error occurs + */ +module.exports.createProject = function (projectname, projectid, platformpath, callback) { + // platformpath is optional + if (!callback && typeof platformpath === 'function') { + callback = platformpath; + platformpath = null; + } + var projectDirName = getDirName(projectid); + var createScriptPath = platformpath ? path.join(platformpath, 'bin/create') : path.join(cordova_bin, 'create'); + + // remove existing folder + module.exports.removeProject(projectid); + + // create the project + var command = util.format('"%s" %s %s "%s"', createScriptPath, projectDirName, projectid, projectname); + cp.exec(command, function (error, stdout, stderr) { + if (error) { + console.log(stdout); + console.error(stderr); + } + callback(error); + }); +}; + +/** + * Updates a project using platform update script with given parameters + * @param {string} projectid - id of the project + * @param {string} platformpath - path to the platform + * @param {function} callback - function which is called (without arguments) when the project is updated or (with error object) when error occurs + */ +module.exports.updateProject = function (projectid, platformpath, callback) { + // platformpath is optional + if (!callback && typeof platformpath === 'function') { + callback = platformpath; + platformpath = null; + } + var projectDirName = getDirName(projectid); + var updateScriptPath = platformpath ? path.join(platformpath, 'bin/update') : path.join(cordova_bin, 'update'); + var command = util.format('"%s" %s', updateScriptPath, projectDirName); + cp.exec(command, function (error, stdout, stderr) { + if (error) { + console.log(stdout); + console.error(stderr); + } + callback(error); + }); + +}; + +/** + * Builds a project using platform build script with given parameters + * @param {string} projectid - id of the project + * @param {function} callback - function which is called (without arguments) when the project is built or (with error object) when error occurs + */ +module.exports.buildProject = function (projectid, callback) { + var projectDirName = getDirName(projectid); + var command = path.join(projectDirName, 'cordova/build'); + + cp.exec(command, function (error, stdout, stderr) { + if (error) { + console.log(stdout); + console.error(stderr); + } + callback(error); + }); +}; + +/** + * Removes a project + * @param {string} projectid - id of the project + */ +module.exports.removeProject = function (projectid) { + var projectDirName = getDirName(projectid); + shell.rm('-rf', projectDirName); +}; + +/** + * Add a plugin to a project using platform api + * @param {string} projectid - id of the project + * @param {string} plugindir - path to a plugin + * @param {function} callback - function which is called (without arguments) when the plugin is added or (with error object) when error occurs + */ +module.exports.addPlugin = function (projectid, plugindir, callback) { + var projectDirName = getDirName(projectid); + var pip = new PluginInfoProvider(); + var pluginInfo = pip.get(plugindir); + var Api = require(path.join(__dirname, '../../..', projectDirName, 'cordova', 'Api.js')); + var api = new Api('android', projectDirName); + + api.addPlugin(pluginInfo).then(function () { + callback(null); + }, function (error) { + console.error(error); + callback(error); + }); +}; + +/** + * Gets a version number from project using platform script + * @param {string} projectid - id of the project + * @param {function} callback - function which is called with platform version as an argument + */ +module.exports.getPlatformVersion = function (projectid, callback) { + var command = path.join(getDirName(projectid), 'cordova/version'); + + cp.exec(command, function (error, stdout, stderr) { + if (error) { + console.log(stdout); + console.error(stderr); + } + callback(stdout.trim()); + }); +}; + +function getDirName (projectid) { + return 'test-' + projectid; +} diff --git a/node_modules/cordova-android/spec/e2e/jasmine.json b/node_modules/cordova-android/spec/e2e/jasmine.json new file mode 100644 index 0000000..49c40b2 --- /dev/null +++ b/node_modules/cordova-android/spec/e2e/jasmine.json @@ -0,0 +1,8 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "e2e/**/*[sS]pec.js" + ], + "stopSpecOnExpectationFailure": false, + "random": false +} diff --git a/node_modules/cordova-android/spec/e2e/plugin.spec.js b/node_modules/cordova-android/spec/e2e/plugin.spec.js new file mode 100644 index 0000000..9772ed5 --- /dev/null +++ b/node_modules/cordova-android/spec/e2e/plugin.spec.js @@ -0,0 +1,44 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +var path = require('path'); +var actions = require('./helpers/projectActions.js'); + +var PLUGIN_ADD_TIMEOUT = 90000; + +describe('plugin add', function () { + + it('Test#001 : create project and add a plugin with framework', function (done) { + var projectname = 'testpluginframework'; + var projectid = 'com.test.plugin.framework'; + var fakePluginPath = path.join(__dirname, 'fixtures/cordova-plugin-fake'); + + actions.createProject(projectname, projectid, function () { + actions.addPlugin(projectid, fakePluginPath, function (error) { + actions.removeProject(projectid); + if (error) { + console.error(error.stack); + } + expect(error).toBe(null); + done(); + }); + }); + }, PLUGIN_ADD_TIMEOUT); + +}); diff --git a/node_modules/cordova-android/spec/fixtures/android_project/AndroidManifest.xml b/node_modules/cordova-android/spec/fixtures/android_project/AndroidManifest.xml new file mode 100644 index 0000000..17489ca --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_project/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/android_project/assets/www/.gitkeep b/node_modules/cordova-android/spec/fixtures/android_project/assets/www/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/cordova-android/spec/fixtures/android_project/res/xml/config.xml b/node_modules/cordova-android/spec/fixtures/android_project/res/xml/config.xml new file mode 100644 index 0000000..4f087a9 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_project/res/xml/config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/android_project/src/.gitkeep b/node_modules/cordova-android/spec/fixtures/android_project/src/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/build.gradle b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/build.gradle new file mode 100644 index 0000000..5485f06 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.example.anis.myapplication" + minSdkVersion 21 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.4.0' +} diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/proguard-rules.pro b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/proguard-rules.pro new file mode 100644 index 0000000..15bbf26 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/anis/opt/android-sdk-macosx/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/AndroidManifest.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b9140cd --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/layout/activity_main.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..2a65552 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-hdpi/ic_launcher.png b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..aee44e138434630332d88b1680f33c4b24c70ab3 GIT binary patch literal 10486 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 + + 64dp + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/colors.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..3ab3e9c --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/dimens.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..47c8224 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 16dp + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/strings.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..efd3073 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + My Application + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/styles.xml b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..5885930 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/build.gradle b/node_modules/cordova-android/spec/fixtures/android_studio_project/build.gradle new file mode 100644 index 0000000..168f129 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.0.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle.properties b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle/wrapper/gradle-wrapper.properties b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..122a0dc --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 28 10:00:20 PST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew.bat b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/node_modules/cordova-android/spec/fixtures/android_studio_project/settings.gradle b/node_modules/cordova-android/spec/fixtures/android_studio_project/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/android_studio_project/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/android-resource.xml b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/android-resource.xml new file mode 100644 index 0000000..9046e6e --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/android-resource.xml @@ -0,0 +1 @@ +./org.test.plugins.dummyplugin/android-resource.xml diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/extra.gradle b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/extra.gradle new file mode 100644 index 0000000..5b828a9 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/extra.gradle @@ -0,0 +1 @@ +extra.gradle diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/AndroidManifest.xml b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/AndroidManifest.xml new file mode 100644 index 0000000..3c9499c --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/libFile b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/libFile new file mode 100644 index 0000000..c79df8e --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/libFile @@ -0,0 +1 @@ +libFile contents diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/project.properties b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/project.properties new file mode 100644 index 0000000..c4a5b63 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib/project.properties @@ -0,0 +1 @@ +target=android-11 diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/AndroidManifest.xml b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/AndroidManifest.xml new file mode 100644 index 0000000..3c9499c --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/libFile b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/libFile new file mode 100644 index 0000000..c79df8e --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/libFile @@ -0,0 +1 @@ +libFile contents diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/project.properties b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/project.properties new file mode 100644 index 0000000..c4a5b63 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin-lib2/project.properties @@ -0,0 +1 @@ +target=android-11 diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin.xml b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin.xml new file mode 100644 index 0000000..a40df2b --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/plugin.xml @@ -0,0 +1,75 @@ + + + + + + + dummyplugin + + my description + Jackson Badman + dummy,plugin + BSD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/DummyPlugin.java b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/DummyPlugin.java new file mode 100644 index 0000000..90e4f5a --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/DummyPlugin.java @@ -0,0 +1 @@ +./org.test.plugins.dummyplugin/src/android/DummyPlugin.java diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/TestLib.jar b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/TestLib.jar new file mode 100644 index 0000000..089ae3b --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/src/android/TestLib.jar @@ -0,0 +1 @@ +./org.test.plugins.dummyplugin/src/android/TestLib.jar diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin.js b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin/image.jpg b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin/image.jpg new file mode 100644 index 0000000..219c78a --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.dummyplugin/www/dummyplugin/image.jpg @@ -0,0 +1 @@ +./org.test.plugins.dummyplugin/www/dummyplugin/image.jpg diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/plugin.xml b/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/plugin.xml new file mode 100644 index 0000000..7d2a2d2 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/plugin.xml @@ -0,0 +1,63 @@ + + + + + + Faulty Plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/src/android/FaultyPlugin.java b/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/src/android/FaultyPlugin.java new file mode 100644 index 0000000..dba5492 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/org.test.plugins.faultyplugin/src/android/FaultyPlugin.java @@ -0,0 +1 @@ +./org.test.plugins.faultyplugin/src/android/org.test.plugins.faultyplugin.java diff --git a/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_avd.txt b/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_avd.txt new file mode 100644 index 0000000..22f80a4 --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_avd.txt @@ -0,0 +1,7 @@ +Available Android Virtual Devices: + Name: QWR + Device: Nexus 5 (Google) + Path: /Users/shazron/.android/avd/QWR.avd + Target: Android 7.1.1 (API level 25) + Tag/ABI: google_apis/x86_64 + Skin: 1080x1920 diff --git a/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_targets.txt b/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_targets.txt new file mode 100644 index 0000000..b21e4bd --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/sdk25.2-android_list_targets.txt @@ -0,0 +1,116 @@ +Available Android targets: +---------- +id: 1 or "android-20" + Name: Android 4.4W.2 + Type: Platform + API level: 20 + Revision: 2 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : no ABIs. +---------- +id: 2 or "android-21" + Name: Android 5.0.1 + Type: Platform + API level: 21 + Revision: 2 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : android-tv/armeabi-v7a, android-tv/x86, default/armeabi-v7a, default/x86, default/x86_64 +---------- +id: 3 or "android-22" + Name: Android 5.1.1 + Type: Platform + API level: 22 + Revision: 2 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : android-tv/armeabi-v7a, android-tv/x86, default/armeabi-v7a, default/x86, default/x86_64 +---------- +id: 4 or "android-MNC" + Name: Android M (Preview) + Type: Platform + API level: MNC + Revision: 1 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : no ABIs. +---------- +id: 5 or "android-23" + Name: Android 6.0 + Type: Platform + API level: 23 + Revision: 3 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : android-tv/armeabi-v7a, android-tv/x86, default/x86, default/x86_64 +---------- +id: 6 or "android-N" + Name: Android N (Preview) + Type: Platform + API level: N + Revision: 3 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : no ABIs. +---------- +id: 7 or "android-24" + Name: Android 7.0 + Type: Platform + API level: 24 + Revision: 2 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : android-tv/x86, default/x86, default/x86_64 +---------- +id: 8 or "android-25" + Name: Android 7.1.1 + Type: Platform + API level: 25 + Revision: 3 + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : android-tv/x86, google_apis/x86, google_apis/x86_64 +---------- +id: 9 or "Google Inc.:Google APIs:21" + Name: Google APIs + Type: Add-On + Vendor: Google Inc. + Revision: 1 + Description: Android + Google APIs + Based on Android 5.0.1 (API level 21) + Libraries: + * com.android.future.usb.accessory (usb.jar) + API for USB Accessories + * com.google.android.media.effects (effects.jar) + Collection of video effects + * com.google.android.maps (maps.jar) + API for Google Maps + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : google_apis/armeabi-v7a, google_apis/x86, google_apis/x86_64 +---------- +id: 10 or "Google Inc.:Google APIs:22" + Name: Google APIs + Type: Add-On + Vendor: Google Inc. + Revision: 1 + Description: Android + Google APIs + Based on Android 5.1.1 (API level 22) + Libraries: + * com.android.future.usb.accessory (usb.jar) + API for USB Accessories + * com.google.android.media.effects (effects.jar) + Collection of video effects + * com.google.android.maps (maps.jar) + API for Google Maps + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : google_apis/armeabi-v7a, google_apis/x86, google_apis/x86_64 +---------- +id: 11 or "Google Inc.:Google APIs:23" + Name: Google APIs + Type: Add-On + Vendor: Google Inc. + Revision: 1 + Description: Android + Google APIs + Based on Android 6.0 (API level 23) + Libraries: + * com.android.future.usb.accessory (usb.jar) + API for USB Accessories + * com.google.android.media.effects (effects.jar) + Collection of video effects + * com.google.android.maps (maps.jar) + API for Google Maps + Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in + Tag/ABIs : google_apis/armeabi-v7a, google_apis/x86, google_apis/x86_64 diff --git a/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_avd.txt b/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_avd.txt new file mode 100644 index 0000000..92f77bb --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_avd.txt @@ -0,0 +1,22 @@ +Available Android Virtual Devices: + Name: nexus5-5.1 + Device: Nexus 5 (Google) + Path: /Users/maj/.android/avd/nexus5-5.1.avd + Target: Google APIs + Based on: Android 5.1 (Lollipop) Tag/ABI: google_apis/x86_64 + Skin: 1080x1920 + Sdcard: 128M +--------- + Name: Pixel_API_25 + Device: pixel (Google) + Path: /Users/maj/.android/avd/Pixel_API_25.avd + Target: Google APIs + Based on: Android 7.1.1 (Nougat) Tag/ABI: google_apis/x86_64 + Skin: pixel + Sdcard: 100M +--------- + Name: stock51 + Path: /Users/maj/.android/avd/stock51.avd + Target: Default + Based on: Android 5.1 (Lollipop) Tag/ABI: default/x86_64 + Sdcard: 128M diff --git a/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_target.txt b/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_target.txt new file mode 100644 index 0000000..23da57d --- /dev/null +++ b/node_modules/cordova-android/spec/fixtures/sdk25.3-avdmanager_list_target.txt @@ -0,0 +1,7 @@ +Available Android targets: +---------- +id: 1 or "android-25" + Name: Android API 25 + Type: Platform + API level: 25 + Revision: 3 diff --git a/node_modules/cordova-android/spec/unit/AndroidProject.spec.js b/node_modules/cordova-android/spec/unit/AndroidProject.spec.js new file mode 100644 index 0000000..755c6f3 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/AndroidProject.spec.js @@ -0,0 +1,31 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var path = require('path'); +var AndroidProject = require('../../bin/templates/cordova/lib/AndroidProject'); +var android_project = path.join(__dirname, '../fixtures/android_project'); + +describe('AndroidProject class', function () { + describe('getPackageName method', function () { + it('Test#001 : should return an android project\'s proper package name', function () { + expect(AndroidProject.getProjectFile(android_project).getPackageName()) + .toEqual('com.alunny.childapp'); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/AndroidStudio.spec.js b/node_modules/cordova-android/spec/unit/AndroidStudio.spec.js new file mode 100644 index 0000000..4db74d6 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/AndroidStudio.spec.js @@ -0,0 +1,16 @@ + +var path = require('path'); +var AndroidStudio = require('../../bin/templates/cordova/lib/AndroidStudio'); + +describe('AndroidStudio module', function () { + it('should return true for Android Studio project', function () { + var root = path.join(__dirname, '../fixtures/android_studio_project/'); + var isAndStud = AndroidStudio.isAndroidStudioProject(root); + expect(isAndStud).toBe(true); + }); + it('should return false non Android Studio project', function () { + var root = path.join(__dirname, '../fixtures/android_project/'); + var isAndStud = AndroidStudio.isAndroidStudioProject(root); + expect(isAndStud).toBe(false); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/Api.spec.js b/node_modules/cordova-android/spec/unit/Api.spec.js new file mode 100644 index 0000000..ec36eee --- /dev/null +++ b/node_modules/cordova-android/spec/unit/Api.spec.js @@ -0,0 +1,74 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + 'License'); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var os = require('os'); +var path = require('path'); +var common = require('cordova-common'); +var rewire = require('rewire'); + +var AndroidProject = require('../../bin/templates/cordova/lib/AndroidProject'); +var builders = require('../../bin/templates/cordova/lib/builders/builders'); + +var PluginInfo = common.PluginInfo; + +var FIXTURES = path.join(__dirname, '../e2e/fixtures'); +var FAKE_PROJECT_DIR = path.join(os.tmpdir(), 'plugin-test-project'); + +describe('addPlugin method', function () { + var api, fail, gradleBuilder, oldClean; + var Api = rewire('../../bin/templates/cordova/Api'); + + beforeEach(function () { + var pluginManager = jasmine.createSpyObj('pluginManager', ['addPlugin']); + pluginManager.addPlugin.and.returnValue(Q()); + spyOn(common.PluginManager, 'get').and.returnValue(pluginManager); + + var projectSpy = jasmine.createSpyObj('AndroidProject', ['getPackageName', 'write', 'isClean']); + spyOn(AndroidProject, 'getProjectFile').and.returnValue(projectSpy); + + oldClean = Api.__get__('Api.prototype.clean'); + Api.__set__('Api.prototype.clean', Q); + api = new Api('android', FAKE_PROJECT_DIR); + + fail = jasmine.createSpy('fail'); + gradleBuilder = jasmine.createSpyObj('gradleBuilder', ['prepBuildFiles']); + spyOn(builders, 'getBuilder').and.returnValue(gradleBuilder); + }); + + afterEach(function () { + Api.__set__('Api.prototype.clean', oldClean); + }); + + it('Test#001 : should call gradleBuilder.prepBuildFiles for every plugin with frameworks', function (done) { + api.addPlugin(new PluginInfo(path.join(FIXTURES, 'cordova-plugin-fake'))).catch(fail).fin(function () { + expect(fail).not.toHaveBeenCalled(); + expect(gradleBuilder.prepBuildFiles).toHaveBeenCalled(); + done(); + }); + }); + + it('Test#002 : shouldn\'t trigger gradleBuilder.prepBuildFiles for plugins without android frameworks', function (done) { + api.addPlugin(new PluginInfo(path.join(FIXTURES, 'cordova-plugin-fake-ios-frameworks'))).catch(fail).fin(function () { + expect(fail).not.toHaveBeenCalled(); + expect(gradleBuilder.prepBuildFiles).not.toHaveBeenCalled(); + done(); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/android_sdk.spec.js b/node_modules/cordova-android/spec/unit/android_sdk.spec.js new file mode 100644 index 0000000..178b7e6 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/android_sdk.spec.js @@ -0,0 +1,124 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var android_sdk = require('../../bin/templates/cordova/lib/android_sdk'); +var superspawn = require('cordova-common').superspawn; +var fs = require('fs'); +var path = require('path'); +var Q = require('q'); + +describe('android_sdk', function () { + describe('list_targets_with_android', function () { + it('should invoke `android` with the `list target` command and _not_ the `list targets` command, as the plural form is not supported in some Android SDK Tools versions', function () { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + android_sdk.list_targets_with_android(); + expect(superspawn.spawn).toHaveBeenCalledWith('android', ['list', 'target']); + }); + it('should parse and return results from `android list targets` command', function (done) { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + deferred.resolve(fs.readFileSync(path.join('spec', 'fixtures', 'sdk25.2-android_list_targets.txt'), 'utf-8')); + return android_sdk.list_targets_with_android().then(function (list) { + [ 'Google Inc.:Google APIs:23', + 'Google Inc.:Google APIs:22', + 'Google Inc.:Google APIs:21', + 'android-25', + 'android-24', + 'android-N', + 'android-23', + 'android-MNC', + 'android-22', + 'android-21', + 'android-20' ].forEach(function (target) { expect(list).toContain(target); }); + }).fail(function (err) { + console.log(err); + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + }); + describe('list_targets_with_avdmanager', function () { + it('should parse and return results from `avdmanager list target` command', function (done) { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + deferred.resolve(fs.readFileSync(path.join('spec', 'fixtures', 'sdk25.3-avdmanager_list_target.txt'), 'utf-8')); + return android_sdk.list_targets_with_avdmanager().then(function (list) { + expect(list).toContain('android-25'); + }).fail(function (err) { + console.log(err); + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + }); + describe('list_targets', function () { + it('should parse Android SDK installed target information with `avdmanager` command first', function () { + var deferred = Q.defer(); + var avdmanager_spy = spyOn(android_sdk, 'list_targets_with_avdmanager').and.returnValue(deferred.promise); + android_sdk.list_targets(); + expect(avdmanager_spy).toHaveBeenCalled(); + }); + it('should parse Android SDK installed target information with `android` command if list_targets_with_avdmanager fails with ENOENT', function (done) { + var deferred = Q.defer(); + spyOn(android_sdk, 'list_targets_with_avdmanager').and.returnValue(deferred.promise); + deferred.reject({ + code: 'ENOENT' + }); + var twoferred = Q.defer(); + twoferred.resolve(['target1']); + var avdmanager_spy = spyOn(android_sdk, 'list_targets_with_android').and.returnValue(twoferred.promise); + return android_sdk.list_targets().then(function (targets) { + expect(avdmanager_spy).toHaveBeenCalled(); + expect(targets[0]).toEqual('target1'); + done(); + }); + }); + it('should parse Android SDK installed target information with `android` command if list_targets_with_avdmanager fails with not-recognized error (Windows)', function (done) { + var deferred = Q.defer(); + spyOn(android_sdk, 'list_targets_with_avdmanager').and.returnValue(deferred.promise); + deferred.reject({ + code: 1, + stderr: "'avdmanager' is not recognized as an internal or external commmand,\r\noperable program or batch file.\r\n" + }); + var twoferred = Q.defer(); + twoferred.resolve(['target1']); + var avdmanager_spy = spyOn(android_sdk, 'list_targets_with_android').and.returnValue(twoferred.promise); + return android_sdk.list_targets().then(function (targets) { + expect(avdmanager_spy).toHaveBeenCalled(); + expect(targets[0]).toEqual('target1'); + done(); + }); + }); + it('should throw an error if no Android targets were found.', function (done) { + var deferred = Q.defer(); + spyOn(android_sdk, 'list_targets_with_avdmanager').and.returnValue(deferred.promise); + deferred.resolve([]); + return android_sdk.list_targets().then(function (targets) { + done.fail(); + }).catch(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('No android targets (SDKs) installed!'); + done(); + }); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/builders/GradleBuilder.spec.js b/node_modules/cordova-android/spec/unit/builders/GradleBuilder.spec.js new file mode 100644 index 0000000..f8ad1a4 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/builders/GradleBuilder.spec.js @@ -0,0 +1,28 @@ + +var Gradle_builder = require('../../../bin/templates/cordova/lib/builders/GradleBuilder.js'); +var fs = require('fs'); +var Q = require('q'); +var superspawn = require('cordova-common').superspawn; +var builder; + +describe('Gradle Builder', function () { + beforeEach(function () { + spyOn(fs, 'existsSync').and.returnValue(true); + builder = new Gradle_builder('/root'); + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + }); + + describe('runGradleWrapper method', function () { + it('should run the provided gradle command if a gradle wrapper does not already exist', function () { + fs.existsSync.and.returnValue(false); + builder.runGradleWrapper('/my/sweet/gradle'); + expect(superspawn.spawn).toHaveBeenCalledWith('/my/sweet/gradle', jasmine.any(Array), jasmine.any(Object)); + }); + it('should do nothing if a gradle wrapper exists in the project directory', function () { + fs.existsSync.and.returnValue(true); + builder.runGradleWrapper('/my/sweet/gradle'); + expect(superspawn.spawn).not.toHaveBeenCalledWith('/my/sweet/gradle', jasmine.any(Array), jasmine.any(Object)); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/check_reqs.spec.js b/node_modules/cordova-android/spec/unit/check_reqs.spec.js new file mode 100644 index 0000000..bf44c4a --- /dev/null +++ b/node_modules/cordova-android/spec/unit/check_reqs.spec.js @@ -0,0 +1,239 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var check_reqs = require('../../bin/templates/cordova/lib/check_reqs'); +var android_sdk = require('../../bin/templates/cordova/lib/android_sdk'); +var shelljs = require('shelljs'); +var fs = require('fs'); +var path = require('path'); +var Q = require('q'); + +describe('check_reqs', function () { + var original_env; + beforeAll(function () { + original_env = Object.create(process.env); + }); + afterEach(function () { + Object.keys(original_env).forEach(function (k) { + process.env[k] = original_env[k]; + }); + }); + describe('check_android', function () { + describe('set ANDROID_HOME if not set', function () { + beforeEach(function () { + delete process.env.ANDROID_HOME; + }); + describe('even if no Android binaries are on the PATH', function () { + beforeEach(function () { + spyOn(shelljs, 'which').and.returnValue(null); + spyOn(fs, 'existsSync').and.returnValue(true); + }); + it('it should set ANDROID_HOME on Windows', function (done) { + spyOn(check_reqs, 'isWindows').and.returnValue(true); + process.env.LOCALAPPDATA = 'windows-local-app-data'; + process.env.ProgramFiles = 'windows-program-files'; + return check_reqs.check_android().then(function () { + expect(process.env.ANDROID_HOME).toContain('windows-local-app-data'); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }).fin(function () { + delete process.env.LOCALAPPDATA; + delete process.env.ProgramFiles; + done(); + }); + }); + it('it should set ANDROID_HOME on Darwin', function (done) { + spyOn(check_reqs, 'isWindows').and.returnValue(false); + spyOn(check_reqs, 'isDarwin').and.returnValue(true); + process.env.HOME = 'home is where the heart is'; + return check_reqs.check_android().then(function () { + expect(process.env.ANDROID_HOME).toContain('home is where the heart is'); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }).fin(function () { + delete process.env.HOME; + done(); + }); + }); + }); + describe('if some Android tooling exists on the PATH', function () { + beforeEach(function () { + spyOn(fs, 'realpathSync').and.callFake(function (path) { + return path; + }); + }); + it('should set ANDROID_HOME based on `android` command if command exists in a SDK-like directory structure', function (done) { + spyOn(fs, 'existsSync').and.returnValue(true); + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'android') { + return '/android/sdk/tools/android'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + expect(process.env.ANDROID_HOME).toEqual('/android/sdk'); + done(); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }); + }); + it('should error out if `android` command exists in a non-SDK-like directory structure', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'android') { + return '/just/some/random/path/android'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + done.fail(); + }).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('update your PATH to include valid path'); + done(); + }); + }); + it('should set ANDROID_HOME based on `adb` command if command exists in a SDK-like directory structure', function (done) { + spyOn(fs, 'existsSync').and.returnValue(true); + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'adb') { + return '/android/sdk/platform-tools/adb'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + expect(process.env.ANDROID_HOME).toEqual('/android/sdk'); + done(); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }); + }); + it('should error out if `adb` command exists in a non-SDK-like directory structure', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'adb') { + return '/just/some/random/path/adb'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + done.fail(); + }).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('update your PATH to include valid path'); + done(); + }); + }); + it('should set ANDROID_HOME based on `avdmanager` command if command exists in a SDK-like directory structure', function (done) { + spyOn(fs, 'existsSync').and.returnValue(true); + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'avdmanager') { + return '/android/sdk/tools/bin/avdmanager'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + expect(process.env.ANDROID_HOME).toEqual('/android/sdk'); + done(); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }); + }); + it('should error out if `avdmanager` command exists in a non-SDK-like directory structure', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'avdmanager') { + return '/just/some/random/path/avdmanager'; + } else { + return null; + } + }); + return check_reqs.check_android().then(function () { + done.fail(); + }).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('update your PATH to include valid path'); + done(); + }); + }); + }); + }); + describe('set PATH for various Android binaries if not available', function () { + beforeEach(function () { + spyOn(shelljs, 'which').and.returnValue(null); + process.env.ANDROID_HOME = 'let the children play'; + spyOn(fs, 'existsSync').and.returnValue(true); + }); + afterEach(function () { + delete process.env.ANDROID_HOME; + }); + it('should add tools/bin,tools,platform-tools to PATH if `avdmanager`,`android`,`adb` is not found', function (done) { + return check_reqs.check_android().then(function () { + expect(process.env.PATH).toContain('let the children play' + path.sep + 'tools'); + expect(process.env.PATH).toContain('let the children play' + path.sep + 'platform-tools'); + expect(process.env.PATH).toContain('let the children play' + path.sep + 'tools' + path.sep + 'bin'); + done(); + }).fail(function (err) { + expect(err).toBeUndefined(); + console.log(err); + }); + }); + }); + }); + describe('get_target', function () { + it('should retrieve target from framework project.properties file', function () { + var target = check_reqs.get_target(); + expect(target).toBeDefined(); + expect(target).toContain('android-'); + }); + }); + describe('check_android_target', function () { + it('should should return full list of supported targets if there is a match to ideal api level', function (done) { + var deferred = Q.defer(); + spyOn(android_sdk, 'list_targets').and.returnValue(deferred.promise); + var fake_targets = ['you are my fire', 'my one desire']; + deferred.resolve(fake_targets); + spyOn(check_reqs, 'get_target').and.returnValue('you are my fire'); + return check_reqs.check_android_target().then(function (targets) { + expect(targets).toBeDefined(); + expect(targets).toEqual(fake_targets); + done(); + }); + }); + it('should error out if there is no match between ideal api level and installed targets', function (done) { + var deferred = Q.defer(); + spyOn(android_sdk, 'list_targets').and.returnValue(deferred.promise); + var fake_targets = ['you are my fire', 'my one desire']; + deferred.resolve(fake_targets); + spyOn(check_reqs, 'get_target').and.returnValue('and i knowwwwwwwwwwww'); + return check_reqs.check_android_target().catch(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Please install Android target'); + done(); + }); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/create.spec.js b/node_modules/cordova-android/spec/unit/create.spec.js new file mode 100644 index 0000000..77eeaa3 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/create.spec.js @@ -0,0 +1,282 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var rewire = require('rewire'); +var create = rewire('../../bin/lib/create'); +var check_reqs = require('../../bin/templates/cordova/lib/check_reqs'); +var fs = require('fs'); +var path = require('path'); +var Q = require('q'); +var shell = require('shelljs'); + +describe('create', function () { + describe('validatePackageName helper method', function () { + describe('happy path (valid package names)', function () { + var valid = [ + 'org.apache.mobilespec', + 'com.example', + 'com.floors42.package', + 'ball8.ball8.ball8ball' + ]; + valid.forEach(function (package_name) { + it('Test#001 : should accept ' + package_name, function (done) { + create.validatePackageName(package_name).fail(fail).done(done); + }); + }); + }); + + describe('failure cases (invalid package names)', function () { + it('should reject empty package names', function (done) { + create.validatePackageName('').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names containing "class"', function (done) { + create.validatePackageName('com.class.is.bad').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names that do not start with a latin letter', function (done) { + create.validatePackageName('_un.der.score').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names with terms that do not start with a latin letter', function (done) { + create.validatePackageName('un._der.score').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names containing non-alphanumeric or underscore characters', function (done) { + create.validatePackageName('th!$.!$.b@d').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names that do not contain enough dots', function (done) { + create.validatePackageName('therearenodotshere').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + it('should reject package names that end with a dot', function (done) { + create.validatePackageName('this.is.a.complete.sentence.').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Error validating package name'); + }).done(done); + }); + }); + }); + describe('validateProjectName helper method', function () { + describe('happy path (valid project names)', function () { + var valid = [ + 'mobilespec', + 'package_name', + 'PackageName', + 'CordovaLib' + ]; + valid.forEach(function (project_name) { + it('Test#003 : should accept ' + project_name, function (done) { + create.validateProjectName(project_name).fail(fail).done(done); + }); + }); + }); + describe('failure cases (invalid project names)', function () { + it('should reject empty project names', function (done) { + create.validateProjectName('').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Project name cannot be empty'); + }).done(done); + }); + it('should reject "CordovaActivity" as a project name', function (done) { + create.validateProjectName('CordovaActivity').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Project name cannot be CordovaActivity'); + }).done(done); + }); + it('should reject project names that begin with a number', function (done) { + create.validateProjectName('1337').then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Project name must not begin with a number'); + }).done(done); + }); + }); + }); + describe('main method', function () { + var config_mock; + var events_mock; + var Manifest_mock = function () {}; + var revert_manifest_mock; + var project_path = path.join('some', 'path'); + var app_path = path.join(project_path, 'app', 'src', 'main'); + var default_templates = path.join(__dirname, '..', '..', 'bin', 'templates', 'project'); + var fake_android_target = 'android-1337'; + beforeEach(function () { + Manifest_mock.prototype = jasmine.createSpyObj('AndroidManifest instance mock', ['setPackageId', 'setTargetSdkVersion', 'getActivity', 'setName', 'write']); + Manifest_mock.prototype.setPackageId.and.returnValue(new Manifest_mock()); + Manifest_mock.prototype.setTargetSdkVersion.and.returnValue(new Manifest_mock()); + Manifest_mock.prototype.getActivity.and.returnValue(new Manifest_mock()); + Manifest_mock.prototype.setName.and.returnValue(new Manifest_mock()); + spyOn(create, 'validatePackageName').and.returnValue(Q()); + spyOn(create, 'validateProjectName').and.returnValue(Q()); + spyOn(create, 'setShellFatal').and.callFake(function (noop, cb) { cb(); }); + spyOn(create, 'copyJsAndLibrary'); + spyOn(create, 'copyScripts'); + spyOn(create, 'copyBuildRules'); + spyOn(create, 'writeProjectProperties'); + spyOn(create, 'prepBuildFiles'); + revert_manifest_mock = create.__set__('AndroidManifest', Manifest_mock); + spyOn(fs, 'existsSync').and.returnValue(false); + spyOn(shell, 'cp'); + spyOn(shell, 'mkdir'); + spyOn(shell, 'sed'); + config_mock = jasmine.createSpyObj('ConfigParser mock instance', ['packageName', 'android_packageName', 'name', 'android_activityName']); + events_mock = jasmine.createSpyObj('EventEmitter mock instance', ['emit']); + spyOn(check_reqs, 'get_target').and.returnValue(fake_android_target); + }); + afterEach(function () { + revert_manifest_mock(); + }); + describe('parameter values and defaults', function () { + it('should have a default package name of my.cordova.project', function (done) { + config_mock.packageName.and.returnValue(undefined); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.validatePackageName).toHaveBeenCalledWith('my.cordova.project'); + }).fail(fail).done(done); + }); + it('should use the ConfigParser-provided package name, if exists', function (done) { + config_mock.packageName.and.returnValue('org.apache.cordova'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.validatePackageName).toHaveBeenCalledWith('org.apache.cordova'); + }).fail(fail).done(done); + }); + it('should have a default project name of CordovaExample', function (done) { + config_mock.name.and.returnValue(undefined); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.validateProjectName).toHaveBeenCalledWith('CordovaExample'); + }).fail(fail).done(done); + }); + it('should use the ConfigParser-provided project name, if exists', function (done) { + config_mock.name.and.returnValue('MySweetAppName'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.validateProjectName).toHaveBeenCalledWith('MySweetAppName'); + }).fail(fail).done(done); + }); + it('should replace any non-word characters (including unicode and spaces) in the ConfigParser-provided project name with underscores', function (done) { + config_mock.name.and.returnValue('応応応応 hello 用用用用'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.validateProjectName).toHaveBeenCalledWith('_____hello_____'); + }).fail(fail).done(done); + }); + it('should have a default activity name of MainActivity', function (done) { + config_mock.android_activityName.and.returnValue(undefined); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(Manifest_mock.prototype.setName).toHaveBeenCalledWith('MainActivity'); + }).fail(fail).done(done); + }); + it('should use the activityName provided via options parameter, if exists', function (done) { + config_mock.android_activityName.and.returnValue(undefined); + create.create(project_path, config_mock, {activityName: 'AwesomeActivity'}, events_mock).then(function () { + expect(Manifest_mock.prototype.setName).toHaveBeenCalledWith('AwesomeActivity'); + }).fail(fail).done(done); + }); + it('should use the ConfigParser-provided activity name, if exists', function (done) { + config_mock.android_activityName.and.returnValue('AmazingActivity'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(Manifest_mock.prototype.setName).toHaveBeenCalledWith('AmazingActivity'); + }).fail(fail).done(done); + }); + }); + describe('failure', function () { + it('should fail if the target path already exists', function (done) { + fs.existsSync.and.returnValue(true); + create.create(project_path, config_mock, {}, events_mock).then(fail).fail(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Project already exists!'); + }).done(done); + }); + }); + describe('happy path', function () { + it('should copy project templates from a specified custom template', function (done) { + create.create(project_path, config_mock, {customTemplate: '/template/path'}, events_mock).then(function () { + expect(shell.cp).toHaveBeenCalledWith('-r', path.join('/template/path', 'assets'), app_path); + expect(shell.cp).toHaveBeenCalledWith('-r', path.join('/template/path', 'res'), app_path); + expect(shell.cp).toHaveBeenCalledWith(path.join('/template/path', 'gitignore'), path.join(project_path, '.gitignore')); + }).fail(fail).done(done); + }); + it('should copy project templates from the default templates location if no custom template is provided', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(shell.cp).toHaveBeenCalledWith('-r', path.join(default_templates, 'assets'), app_path); + expect(shell.cp).toHaveBeenCalledWith('-r', path.join(default_templates, 'res'), app_path); + expect(shell.cp).toHaveBeenCalledWith(path.join(default_templates, 'gitignore'), path.join(project_path, '.gitignore')); + }).fail(fail).done(done); + }); + it('should copy JS and library assets', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.copyJsAndLibrary).toHaveBeenCalled(); + }).fail(fail).done(done); + }); + it('should create a java src directory based on the provided project package name', function (done) { + config_mock.packageName.and.returnValue('org.apache.cordova'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(shell.mkdir).toHaveBeenCalledWith('-p', path.join(app_path, 'java', 'org', 'apache', 'cordova')); + }).fail(fail).done(done); + }); + it('should copy, rename and interpolate the template Activity java class with the project-specific activity name and package name', function (done) { + config_mock.packageName.and.returnValue('org.apache.cordova'); + config_mock.android_activityName.and.returnValue('CEEDEEVEE'); + var activity_path = path.join(app_path, 'java', 'org', 'apache', 'cordova', 'CEEDEEVEE.java'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(shell.cp).toHaveBeenCalledWith('-f', path.join(default_templates, 'Activity.java'), activity_path); + expect(shell.sed).toHaveBeenCalledWith('-i', /__ACTIVITY__/, 'CEEDEEVEE', activity_path); + expect(shell.sed).toHaveBeenCalledWith('-i', /__ID__/, 'org.apache.cordova', activity_path); + }).fail(fail).done(done); + }); + it('should interpolate the project name into strings.xml', function (done) { + config_mock.name.and.returnValue('IncredibleApp'); + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(shell.sed).toHaveBeenCalledWith('-i', /__NAME__/, 'IncredibleApp', path.join(app_path, 'res', 'values', 'strings.xml')); + }).fail(fail).done(done); + }); + it('should copy template scripts into generated project', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.copyScripts).toHaveBeenCalledWith(project_path); + }).fail(fail).done(done); + }); + it('should copy build rules / gradle files into generated project', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.copyBuildRules).toHaveBeenCalledWith(project_path); + }).fail(fail).done(done); + }); + it('should write project.properties file with project details and target API', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.writeProjectProperties).toHaveBeenCalledWith(project_path, fake_android_target); + }).fail(fail).done(done); + }); + it('should prepare build files', function (done) { + create.create(project_path, config_mock, {}, events_mock).then(function () { + expect(create.prepBuildFiles).toHaveBeenCalledWith(project_path, 'studio'); + }).fail(fail).done(done); + }); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/emulator.spec.js b/node_modules/cordova-android/spec/unit/emulator.spec.js new file mode 100644 index 0000000..60d7a8a --- /dev/null +++ b/node_modules/cordova-android/spec/unit/emulator.spec.js @@ -0,0 +1,224 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var emu = require('../../bin/templates/cordova/lib/emulator'); +var check_reqs = require('../../bin/templates/cordova/lib/check_reqs'); +var superspawn = require('cordova-common').superspawn; +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var shelljs = require('shelljs'); + +describe('emulator', function () { + describe('list_images_using_avdmanager', function () { + it('should properly parse details of SDK Tools 25.3.1 `avdmanager` output', function (done) { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + deferred.resolve(fs.readFileSync(path.join('spec', 'fixtures', 'sdk25.3-avdmanager_list_avd.txt'), 'utf-8')); + return emu.list_images_using_avdmanager().then(function (list) { + expect(list).toBeDefined(); + expect(list[0].name).toEqual('nexus5-5.1'); + expect(list[0].target).toEqual('Android 5.1 (API level 22)'); + expect(list[1].device).toEqual('pixel (Google)'); + expect(list[2].abi).toEqual('default/x86_64'); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + }); + describe('list_images_using_android', function () { + it('should invoke `android` with the `list avd` command and _not_ the `list avds` command, as the plural form is not supported in some Android SDK Tools versions', function () { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + emu.list_images_using_android(); + expect(superspawn.spawn).toHaveBeenCalledWith('android', ['list', 'avd']); + }); + it('should properly parse details of SDK Tools pre-25.3.1 `android list avd` output', function (done) { + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); + deferred.resolve(fs.readFileSync(path.join('spec', 'fixtures', 'sdk25.2-android_list_avd.txt'), 'utf-8')); + return emu.list_images_using_android().then(function (list) { + expect(list).toBeDefined(); + expect(list[0].name).toEqual('QWR'); + expect(list[0].device).toEqual('Nexus 5 (Google)'); + expect(list[0].path).toEqual('/Users/shazron/.android/avd/QWR.avd'); + expect(list[0].target).toEqual('Android 7.1.1 (API level 25)'); + expect(list[0].abi).toEqual('google_apis/x86_64'); + expect(list[0].skin).toEqual('1080x1920'); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + }); + describe('list_images', function () { + beforeEach(function () { + spyOn(fs, 'realpathSync').and.callFake(function (cmd) { + return cmd; + }); + }); + it('should try to parse AVD information using `avdmanager` first', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'avdmanager') { + return true; + } else { + return false; + } + }); + var deferred = Q.defer(); + var avdmanager_spy = spyOn(emu, 'list_images_using_avdmanager').and.returnValue(deferred.promise); + deferred.resolve([]); + emu.list_images().then(function () { + expect(avdmanager_spy).toHaveBeenCalled(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + it('should delegate to `android` if `avdmanager` cant be found and `android` can', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'avdmanager') { + return false; + } else { + return true; + } + }); + var deferred = Q.defer(); + var android_spy = spyOn(emu, 'list_images_using_android').and.returnValue(deferred.promise); + deferred.resolve([]); + emu.list_images().then(function () { + expect(android_spy).toHaveBeenCalled(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + it('should correct api level information and fill in the blanks about api level if exists', function (done) { + spyOn(shelljs, 'which').and.callFake(function (cmd) { + if (cmd === 'avdmanager') { + return true; + } else { + return false; + } + }); + var deferred = Q.defer(); + spyOn(emu, 'list_images_using_avdmanager').and.returnValue(deferred.promise); + deferred.resolve([ + { + name: 'Pixel_7.0', + device: 'pixel (Google)', + path: '/Users/maj/.android/avd/Pixel_7.0.avd', + abi: 'google_apis/x86_64', + target: 'Android 7.0 (API level 24)' + }, { + name: 'Pixel_8.0', + device: 'pixel (Google)', + path: '/Users/maj/.android/avd/Pixel_8.0.avd', + abi: 'google_apis/x86', + target: 'Android API 26' + } + ]); + emu.list_images().then(function (avds) { + expect(avds[1].target).toContain('Android 8'); + expect(avds[1].target).toContain('API level 26'); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(function () { + done(); + }); + }); + it('should throw an error if neither `avdmanager` nor `android` are able to be found', function (done) { + spyOn(shelljs, 'which').and.returnValue(false); + return emu.list_images().catch(function (err) { + expect(err).toBeDefined(); + expect(err.message).toContain('Could not find either `android` or `avdmanager`'); + done(); + }); + }); + }); + describe('best_image', function () { + var avds_promise; + var target_mock; + beforeEach(function () { + avds_promise = Q.defer(); + spyOn(emu, 'list_images').and.returnValue(avds_promise.promise); + target_mock = spyOn(check_reqs, 'get_target').and.returnValue('android-26'); + }); + it('should return undefined if there are no defined AVDs', function (done) { + avds_promise.resolve([]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBeUndefined(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the first available image if there is no available target information for existing AVDs', function (done) { + var fake_avd = { name: 'MyFakeAVD' }; + var second_fake_avd = { name: 'AnotherAVD' }; + avds_promise.resolve([fake_avd, second_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the first AVD for the API level that matches the project target', function (done) { + target_mock.and.returnValue('android-25'); + var fake_avd = { name: 'MyFakeAVD', target: 'Android 7.0 (API level 24)' }; + var second_fake_avd = { name: 'AnotherAVD', target: 'Android 7.1 (API level 25)' }; + var third_fake_avd = { name: 'AVDThree', target: 'Android 8.0 (API level 26)' }; + avds_promise.resolve([fake_avd, second_fake_avd, third_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(second_fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the AVD with API level that is closest to the project target API level, without going over', function (done) { + target_mock.and.returnValue('android-26'); + var fake_avd = { name: 'MyFakeAVD', target: 'Android 7.0 (API level 24)' }; + var second_fake_avd = { name: 'AnotherAVD', target: 'Android 7.1 (API level 25)' }; + var third_fake_avd = { name: 'AVDThree', target: 'Android 99.0 (API level 134)' }; + avds_promise.resolve([fake_avd, second_fake_avd, third_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(second_fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should not try to compare API levels when an AVD definition is missing API level info', function (done) { + avds_promise.resolve([ { name: 'Samsung_S8_API_26', + device: 'Samsung S8+ (User)', + path: '/Users/daviesd/.android/avd/Samsung_S8_API_26.avd', + abi: 'google_apis/x86', + target: 'Android 8.0' + }]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBeDefined(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/jasmine.json b/node_modules/cordova-android/spec/unit/jasmine.json new file mode 100644 index 0000000..4fe01a6 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/jasmine.json @@ -0,0 +1,8 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "unit/**/*[sS]pec.js" + ], + "stopSpecOnExpectationFailure": false, + "random": true +} diff --git a/node_modules/cordova-android/spec/unit/pluginHandlers/common.spec.js b/node_modules/cordova-android/spec/unit/pluginHandlers/common.spec.js new file mode 100644 index 0000000..e0161fe --- /dev/null +++ b/node_modules/cordova-android/spec/unit/pluginHandlers/common.spec.js @@ -0,0 +1,171 @@ +/* + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var rewire = require('rewire'); +var common = rewire('../../../bin/templates/cordova/lib/pluginHandlers'); +var path = require('path'); +var fs = require('fs'); +var osenv = require('os'); +var shell = require('shelljs'); +var test_dir = path.join(osenv.tmpdir(), 'test_plugman'); +var project_dir = path.join(test_dir, 'project'); +var src = path.join(project_dir, 'src'); +var dest = path.join(project_dir, 'dest'); +var java_dir = path.join(src, 'one', 'two', 'three'); +var java_file = path.join(java_dir, 'test.java'); +var symlink_file = path.join(java_dir, 'symlink'); +var non_plugin_file = path.join(osenv.tmpdir(), 'non_plugin_file'); + +var copyFile = common.__get__('copyFile'); +var deleteJava = common.__get__('deleteJava'); +var copyNewFile = common.__get__('copyNewFile'); + +describe('common platform handler', function () { + + describe('copyFile', function () { + it('Test#001 : should throw if source path not found', function () { + shell.rm('-rf', src); + expect(function () { copyFile(test_dir, src, project_dir, dest); }) + .toThrow(new Error('"' + src + '" not found!')); + }); + + it('Test#002 : should throw if src not in plugin directory', function () { + shell.mkdir('-p', project_dir); + fs.writeFileSync(non_plugin_file, 'contents', 'utf-8'); + var outside_file = '../non_plugin_file'; + expect(function () { copyFile(test_dir, outside_file, project_dir, dest); }) + .toThrow(new Error('File "' + path.resolve(test_dir, outside_file) + '" is located outside the plugin directory "' + test_dir + '"')); + shell.rm('-rf', test_dir); + }); + + it('Test#003 : should allow symlink src, if inside plugin', function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(java_file, 'contents', 'utf-8'); + + // This will fail on windows if not admin - ignore the error in that case. + if (ignoreEPERMonWin32(java_file, symlink_file)) { + return; + } + + copyFile(test_dir, symlink_file, project_dir, dest); + shell.rm('-rf', project_dir); + }); + + it('Test#004 : should throw if symlink is linked to a file outside the plugin', function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(non_plugin_file, 'contents', 'utf-8'); + + // This will fail on windows if not admin - ignore the error in that case. + if (ignoreEPERMonWin32(non_plugin_file, symlink_file)) { + return; + } + + expect(function () { copyFile(test_dir, symlink_file, project_dir, dest); }) + .toThrow(new Error('File "' + path.resolve(test_dir, symlink_file) + '" is located outside the plugin directory "' + test_dir + '"')); + shell.rm('-rf', project_dir); + }); + + it('Test#005 : should throw if dest is outside the project directory', function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(java_file, 'contents', 'utf-8'); + expect(function () { copyFile(test_dir, java_file, project_dir, non_plugin_file); }) + .toThrow(new Error('Destination "' + path.resolve(project_dir, non_plugin_file) + '" for source file "' + path.resolve(test_dir, java_file) + '" is located outside the project')); + shell.rm('-rf', project_dir); + }); + + it('Test#006 : should call mkdir -p on target path', function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(java_file, 'contents', 'utf-8'); + + var s = spyOn(shell, 'mkdir').and.callThrough(); + var resolvedDest = path.resolve(project_dir, dest); + + copyFile(test_dir, java_file, project_dir, dest); + + expect(s).toHaveBeenCalled(); + expect(s).toHaveBeenCalledWith('-p', path.dirname(resolvedDest)); + shell.rm('-rf', project_dir); + }); + + it('Test#007 : should call cp source/dest paths', function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(java_file, 'contents', 'utf-8'); + + var s = spyOn(shell, 'cp').and.callThrough(); + var resolvedDest = path.resolve(project_dir, dest); + + copyFile(test_dir, java_file, project_dir, dest); + + expect(s).toHaveBeenCalled(); + expect(s).toHaveBeenCalledWith('-f', java_file, resolvedDest); + + shell.rm('-rf', project_dir); + }); + }); + + describe('copyNewFile', function () { + it('Test#008 : should throw if target path exists', function () { + shell.mkdir('-p', dest); + expect(function () { copyNewFile(test_dir, src, project_dir, dest); }) + .toThrow(new Error('"' + dest + '" already exists!')); + shell.rm('-rf', dest); + }); + }); + + describe('deleteJava', function () { + beforeEach(function () { + shell.mkdir('-p', java_dir); + fs.writeFileSync(java_file, 'contents', 'utf-8'); + }); + + afterEach(function () { + shell.rm('-rf', java_dir); + }); + + it('Test#009 : should call fs.unlinkSync on the provided paths', function () { + var s = spyOn(fs, 'unlinkSync').and.callThrough(); + deleteJava(project_dir, java_file); + expect(s).toHaveBeenCalled(); + expect(s).toHaveBeenCalledWith(path.resolve(project_dir, java_file)); + }); + + it('Test#010 : should delete empty directories after removing source code in a java src path hierarchy', function () { + deleteJava(project_dir, java_file); + expect(fs.existsSync(java_file)).not.toBe(true); + expect(fs.existsSync(java_dir)).not.toBe(true); + expect(fs.existsSync(path.join(src, 'one'))).not.toBe(true); + }); + + it('Test#011 : should never delete the top-level src directory, even if all plugins added were removed', function () { + deleteJava(project_dir, java_file); + expect(fs.existsSync(src)).toBe(true); + }); + }); +}); + +function ignoreEPERMonWin32 (symlink_src, symlink_dest) { + try { + fs.symlinkSync(symlink_src, symlink_dest); + } catch (e) { + if (process.platform === 'win32' && e.message.indexOf('Error: EPERM, operation not permitted' > -1)) { + return true; + } + throw e; + } + return false; +} diff --git a/node_modules/cordova-android/spec/unit/pluginHandlers/handlers.spec.js b/node_modules/cordova-android/spec/unit/pluginHandlers/handlers.spec.js new file mode 100644 index 0000000..dae57a9 --- /dev/null +++ b/node_modules/cordova-android/spec/unit/pluginHandlers/handlers.spec.js @@ -0,0 +1,391 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var rewire = require('rewire'); +var common = rewire('../../../bin/templates/cordova/lib/pluginHandlers'); +var android = common.__get__('handlers'); +var path = require('path'); +var fs = require('fs'); +var shell = require('shelljs'); +var os = require('os'); +var temp = path.join(os.tmpdir(), 'plugman'); +var plugins_dir = path.join(temp, 'cordova/plugins'); +var dummyplugin = path.join(__dirname, '../../fixtures/org.test.plugins.dummyplugin'); +var faultyplugin = path.join(__dirname, '../../fixtures/org.test.plugins.faultyplugin'); +var android_project = path.join(__dirname, '../../fixtures/android_project/*'); + +var PluginInfo = require('cordova-common').PluginInfo; +var AndroidProject = require('../../../bin/templates/cordova/lib/AndroidProject'); + +var dummyPluginInfo = new PluginInfo(dummyplugin); +var valid_source = dummyPluginInfo.getSourceFiles('android'); +var valid_resources = dummyPluginInfo.getResourceFiles('android'); +var valid_libs = dummyPluginInfo.getLibFiles('android'); + +var faultyPluginInfo = new PluginInfo(faultyplugin); +var invalid_source = faultyPluginInfo.getSourceFiles('android'); + +describe('android project handler', function () { + describe('installation', function () { + var copyFileOrig = common.__get__('copyFile'); + var copyFileSpy = jasmine.createSpy('copyFile'); + var dummyProject; + + beforeEach(function () { + shell.mkdir('-p', temp); + dummyProject = AndroidProject.getProjectFile(temp); + copyFileSpy.calls.reset(); + common.__set__('copyFile', copyFileSpy); + }); + + afterEach(function () { + shell.rm('-rf', temp); + common.__set__('copyFile', copyFileOrig); + }); + + describe('of elements', function () { + it('Test#001 : should copy files', function () { + android['lib-file'].install(valid_libs[0], dummyPluginInfo, dummyProject); + expect(copyFileSpy).toHaveBeenCalledWith(dummyplugin, 'src/android/TestLib.jar', temp, path.join('libs', 'TestLib.jar'), false); + }); + it('Test#002 : should copy files for Android Studio projects', function () { + android['lib-file'].install(valid_libs[0], dummyPluginInfo, dummyProject, {android_studio: true}); + expect(copyFileSpy).toHaveBeenCalledWith(dummyplugin, 'src/android/TestLib.jar', temp, path.join('app', 'libs', 'TestLib.jar'), false); + }); + }); + + describe('of elements', function () { + it('Test#003 : should copy files to the correct location on a non-Android Studio project', function () { + android['resource-file'].install(valid_resources[0], dummyPluginInfo, dummyProject); + expect(copyFileSpy).toHaveBeenCalledWith(dummyplugin, 'android-resource.xml', temp, path.join('res', 'xml', 'dummy.xml'), false); + }); + }); + + describe('of elements', function () { + beforeEach(function () { + shell.cp('-rf', android_project, temp); + }); + + it('Test#004 : should copy stuff from one location to another by calling common.copyFile', function () { + android['source-file'].install(valid_source[0], dummyPluginInfo, dummyProject); + expect(copyFileSpy) + .toHaveBeenCalledWith(dummyplugin, 'src/android/DummyPlugin.java', temp, path.join('src/com/phonegap/plugins/dummyplugin/DummyPlugin.java'), false); + }); + + it('Test#005 : should install source files to the right location for Android Studio projects', function () { + android['source-file'].install(valid_source[0], dummyPluginInfo, dummyProject, {android_studio: true}); + expect(copyFileSpy) + .toHaveBeenCalledWith(dummyplugin, 'src/android/DummyPlugin.java', temp, path.join('app/src/main/java/com/phonegap/plugins/dummyplugin/DummyPlugin.java'), false); + }); + + it('Test#006 : should throw if source file cannot be found', function () { + common.__set__('copyFile', copyFileOrig); + expect(function () { + android['source-file'].install(invalid_source[0], faultyPluginInfo, dummyProject); + }).toThrow(new Error('"' + path.resolve(faultyplugin, 'src/android/NotHere.java') + '" not found!')); + }); + + it('Test#007 : should throw if target file already exists', function () { + // write out a file + var target = path.resolve(temp, 'src/com/phonegap/plugins/dummyplugin'); + shell.mkdir('-p', target); + target = path.join(target, 'DummyPlugin.java'); + fs.writeFileSync(target, 'some bs', 'utf-8'); + + expect(function () { + android['source-file'].install(valid_source[0], dummyPluginInfo, dummyProject); + }).toThrow(new Error('"' + target + '" already exists!')); + }); + }); + + describe('of elements', function () { + + var someString = jasmine.any(String); + + var copyNewFileOrig = common.__get__('copyNewFile'); + var copyNewFileSpy = jasmine.createSpy('copyNewFile'); + + beforeEach(function () { + shell.cp('-rf', android_project, temp); + + spyOn(dummyProject, 'addSystemLibrary'); + spyOn(dummyProject, 'addSubProject'); + spyOn(dummyProject, 'addGradleReference'); + common.__set__('copyNewFile', copyNewFileSpy); + }); + + afterEach(function () { + common.__set__('copyNewFile', copyNewFileOrig); + }); + + it('Test#008 : should throw if framework doesn\'t have "src" attribute', function () { + expect(function () { android.framework.install({}, dummyPluginInfo, dummyProject); }).toThrow(); + }); + + it('Test#009 : should install framework without "parent" attribute into project root', function () { + var framework = {src: 'plugin-lib'}; + android.framework.install(framework, dummyPluginInfo, dummyProject); + expect(dummyProject.addSystemLibrary).toHaveBeenCalledWith(dummyProject.projectDir, someString); + }); + + it('Test#010 : should install framework with "parent" attribute into parent framework dir', function () { + var childFramework = {src: 'plugin-lib2', parent: 'plugin-lib'}; + android.framework.install(childFramework, dummyPluginInfo, dummyProject); + expect(dummyProject.addSystemLibrary).toHaveBeenCalledWith(path.resolve(dummyProject.projectDir, childFramework.parent), someString); + }); + + it('Test#011 : should not copy anything if "custom" attribute is not set', function () { + var framework = {src: 'plugin-lib'}; + var cpSpy = spyOn(shell, 'cp'); + android.framework.install(framework, dummyPluginInfo, dummyProject); + expect(dummyProject.addSystemLibrary).toHaveBeenCalledWith(someString, framework.src); + expect(cpSpy).not.toHaveBeenCalled(); + }); + + it('Test#012 : should copy framework sources if "custom" attribute is set', function () { + var framework = {src: 'plugin-lib', custom: true}; + android.framework.install(framework, dummyPluginInfo, dummyProject); + expect(dummyProject.addSubProject).toHaveBeenCalledWith(dummyProject.projectDir, someString); + expect(copyNewFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, framework.src, dummyProject.projectDir, someString, false); + }); + + it('Test#013 : should install gradleReference using project.addGradleReference', function () { + var framework = {src: 'plugin-lib', custom: true, type: 'gradleReference'}; + android.framework.install(framework, dummyPluginInfo, dummyProject); + expect(copyNewFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, framework.src, dummyProject.projectDir, someString, false); + expect(dummyProject.addGradleReference).toHaveBeenCalledWith(dummyProject.projectDir, someString); + }); + }); + + describe('of elements', function () { + var jsModule = {src: 'www/dummyplugin.js'}; + var wwwDest, platformWwwDest; + + beforeEach(function () { + spyOn(fs, 'writeFileSync'); + wwwDest = path.resolve(dummyProject.www, 'plugins', dummyPluginInfo.id, jsModule.src); + platformWwwDest = path.resolve(dummyProject.platformWww, 'plugins', dummyPluginInfo.id, jsModule.src); + }); + + it('Test#014 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () { + android['js-module'].install(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true}); + expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8'); + expect(fs.writeFileSync).toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8'); + }); + + it('Test#015 : should put module to www only when options.usePlatformWww flag is not specified', function () { + android['js-module'].install(jsModule, dummyPluginInfo, dummyProject); + expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8'); + expect(fs.writeFileSync).not.toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8'); + }); + }); + + describe('of elements', function () { + var asset = {src: 'www/dummyPlugin.js', target: 'foo/dummy.js'}; + var wwwDest; /* eslint no-unused-vars: "off" */ + var platformWwwDest; /* eslint no-unused-vars: "off" */ + + beforeEach(function () { + wwwDest = path.resolve(dummyProject.www, asset.target); + platformWwwDest = path.resolve(dummyProject.platformWww, asset.target); + }); + + it('Test#016 : should put asset to both www and platform_www when options.usePlatformWww flag is specified', function () { + android.asset.install(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true}); + expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target); + expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target); + }); + + it('Test#017 : should put asset to www only when options.usePlatformWww flag is not specified', function () { + android.asset.install(asset, dummyPluginInfo, dummyProject); + expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target); + expect(copyFileSpy).not.toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target); + }); + }); + }); + + describe('uninstallation', function () { + + var removeFileOrig = common.__get__('removeFile'); + var deleteJavaOrig = common.__get__('deleteJava'); + + var removeFileSpy = jasmine.createSpy('removeFile'); + var deleteJavaSpy = jasmine.createSpy('deleteJava'); + var dummyProject; + + beforeEach(function () { + shell.mkdir('-p', temp); + shell.mkdir('-p', plugins_dir); + shell.cp('-rf', android_project, temp); + AndroidProject.purgeCache(); + dummyProject = AndroidProject.getProjectFile(temp); + common.__set__('removeFile', removeFileSpy); + common.__set__('deleteJava', deleteJavaSpy); + }); + + afterEach(function () { + shell.rm('-rf', temp); + common.__set__('removeFile', removeFileOrig); + common.__set__('deleteJava', deleteJavaOrig); + }); + + describe('of elements', function () { + it('Test#018 : should remove jar files', function () { + android['lib-file'].install(valid_libs[0], dummyPluginInfo, dummyProject); + android['lib-file'].uninstall(valid_libs[0], dummyPluginInfo, dummyProject); + expect(removeFileSpy).toHaveBeenCalledWith(temp, path.join('libs/TestLib.jar')); + }); + it('Test#019 : should remove jar files for Android Studio projects', function () { + android['lib-file'].install(valid_libs[0], dummyPluginInfo, dummyProject, {android_studio: true}); + android['lib-file'].uninstall(valid_libs[0], dummyPluginInfo, dummyProject, {android_studio: true}); + expect(removeFileSpy).toHaveBeenCalledWith(temp, path.join('app/libs/TestLib.jar')); + }); + }); + + describe('of elements', function () { + it('Test#020 : should remove files', function () { + android['resource-file'].install(valid_resources[0], dummyPluginInfo, dummyProject); + android['resource-file'].uninstall(valid_resources[0], dummyPluginInfo, dummyProject); + expect(removeFileSpy).toHaveBeenCalledWith(temp, path.join('res/xml/dummy.xml')); + }); + it('Test#021 : should remove files for Android Studio projects', function () { + android['resource-file'].install(valid_resources[0], dummyPluginInfo, dummyProject, {android_studio: true}); + android['resource-file'].uninstall(valid_resources[0], dummyPluginInfo, dummyProject, {android_studio: true}); + expect(removeFileSpy).toHaveBeenCalledWith(temp, path.join('app/src/main/res/xml/dummy.xml')); + }); + }); + + describe('of elements', function () { + it('Test#022 : should remove stuff by calling common.deleteJava', function () { + android['source-file'].install(valid_source[0], dummyPluginInfo, dummyProject); + android['source-file'].uninstall(valid_source[0], dummyPluginInfo, dummyProject); + expect(deleteJavaSpy).toHaveBeenCalledWith(temp, path.join('src/com/phonegap/plugins/dummyplugin/DummyPlugin.java')); + }); + it('Test#023 : should remove stuff by calling common.deleteJava for Android Studio projects', function () { + android['source-file'].install(valid_source[0], dummyPluginInfo, dummyProject, {android_studio: true}); + android['source-file'].uninstall(valid_source[0], dummyPluginInfo, dummyProject, {android_studio: true}); + expect(deleteJavaSpy).toHaveBeenCalledWith(temp, path.join('app/src/main/java/com/phonegap/plugins/dummyplugin/DummyPlugin.java')); + }); + }); + + describe('of elements', function () { + + var someString = jasmine.any(String); + + beforeEach(function () { + shell.mkdir(path.join(dummyProject.projectDir, dummyPluginInfo.id)); + + spyOn(dummyProject, 'removeSystemLibrary'); + spyOn(dummyProject, 'removeSubProject'); + spyOn(dummyProject, 'removeGradleReference'); + }); + + it('Test#024 : should throw if framework doesn\'t have "src" attribute', function () { + expect(function () { android.framework.uninstall({}, dummyPluginInfo, dummyProject); }).toThrow(); + }); + + it('Test#025 : should uninstall framework without "parent" attribute into project root', function () { + var framework = {src: 'plugin-lib'}; + android.framework.uninstall(framework, dummyPluginInfo, dummyProject); + expect(dummyProject.removeSystemLibrary).toHaveBeenCalledWith(dummyProject.projectDir, someString); + }); + + it('Test#026 : should uninstall framework with "parent" attribute into parent framework dir', function () { + var childFramework = {src: 'plugin-lib2', parent: 'plugin-lib'}; + android.framework.uninstall(childFramework, dummyPluginInfo, dummyProject); + expect(dummyProject.removeSystemLibrary).toHaveBeenCalledWith(path.resolve(dummyProject.projectDir, childFramework.parent), someString); + }); + + it('Test#027 : should remove framework sources if "custom" attribute is set', function () { + var framework = {src: 'plugin-lib', custom: true}; + android.framework.uninstall(framework, dummyPluginInfo, dummyProject); + expect(dummyProject.removeSubProject).toHaveBeenCalledWith(dummyProject.projectDir, someString); + expect(removeFileSpy).toHaveBeenCalledWith(dummyProject.projectDir, someString); + }); + + it('Test#28 : should install gradleReference using project.removeGradleReference', function () { + var framework = {src: 'plugin-lib', custom: true, type: 'gradleReference'}; + android.framework.uninstall(framework, dummyPluginInfo, dummyProject); + expect(removeFileSpy).toHaveBeenCalledWith(dummyProject.projectDir, someString); + expect(dummyProject.removeGradleReference).toHaveBeenCalledWith(dummyProject.projectDir, someString); + }); + }); + + describe('of elements', function () { + var jsModule = {src: 'www/dummyPlugin.js'}; + var wwwDest; + var platformWwwDest; + + beforeEach(function () { + wwwDest = path.resolve(dummyProject.www, 'plugins', dummyPluginInfo.id, jsModule.src); + platformWwwDest = path.resolve(dummyProject.platformWww, 'plugins', dummyPluginInfo.id, jsModule.src); + + spyOn(shell, 'rm'); + + var existsSyncOrig = fs.existsSync; + spyOn(fs, 'existsSync').and.callFake(function (file) { + if ([wwwDest, platformWwwDest].indexOf(file) >= 0) return true; + return existsSyncOrig.call(fs, file); + }); + }); + + it('Test#029 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () { + android['js-module'].uninstall(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true}); + expect(shell.rm).toHaveBeenCalledWith('-Rf', wwwDest); + expect(shell.rm).toHaveBeenCalledWith('-Rf', platformWwwDest); + }); + + it('Test#030 : should put module to www only when options.usePlatformWww flag is not specified', function () { + android['js-module'].uninstall(jsModule, dummyPluginInfo, dummyProject); + expect(shell.rm).toHaveBeenCalledWith('-Rf', wwwDest); + expect(shell.rm).not.toHaveBeenCalledWith('-Rf', platformWwwDest); + }); + }); + + describe('of elements', function () { + var asset = {src: 'www/dummyPlugin.js', target: 'foo/dummy.js'}; + var wwwDest, platformWwwDest; + + beforeEach(function () { + wwwDest = path.resolve(dummyProject.www, asset.target); + platformWwwDest = path.resolve(dummyProject.platformWww, asset.target); + + spyOn(shell, 'rm'); + + var existsSyncOrig = fs.existsSync; + spyOn(fs, 'existsSync').and.callFake(function (file) { + if ([wwwDest, platformWwwDest].indexOf(file) >= 0) return true; + return existsSyncOrig.call(fs, file); + }); + }); + + it('Test#031 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () { + android.asset.uninstall(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true}); + expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest); + expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), platformWwwDest); + }); + + it('Test#032 : should put module to www only when options.usePlatformWww flag is not specified', function () { + android.asset.uninstall(asset, dummyPluginInfo, dummyProject); + expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest); + expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), platformWwwDest); + }); + }); + }); +}); diff --git a/node_modules/cordova-android/spec/unit/run.spec.js b/node_modules/cordova-android/spec/unit/run.spec.js new file mode 100644 index 0000000..881cc4a --- /dev/null +++ b/node_modules/cordova-android/spec/unit/run.spec.js @@ -0,0 +1,38 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var rewire = require('rewire'); +var run = rewire('../../bin/templates/cordova/lib/run'); +var getInstallTarget = run.__get__('getInstallTarget'); + +describe('run', function () { + describe('getInstallTarget', function () { + var targetOpts = { target: 'emu' }; + var deviceOpts = { device: true }; + var emulatorOpts = { emulator: true }; + var emptyOpts = {}; + + it('Test#001 : should select correct target based on the run opts', function () { + expect(getInstallTarget(targetOpts)).toBe('emu'); + expect(getInstallTarget(deviceOpts)).toBe('--device'); + expect(getInstallTarget(emulatorOpts)).toBe('--emulator'); + expect(getInstallTarget(emptyOpts)).toBeUndefined(); + }); + }); +}); diff --git a/node_modules/cordova-android/test/README.md b/node_modules/cordova-android/test/README.md new file mode 100644 index 0000000..4cf0253 --- /dev/null +++ b/node_modules/cordova-android/test/README.md @@ -0,0 +1,58 @@ + + +# Cordova Android Test Project + +The project in this directory is an Android Test project that enables those +interested in further developing cordova-android to validate their changes. + +## Requirements + +The requirements in the [top-level README](../README.md) still apply. In +addition, ensure you have installed Gradle, and that it is (at the time of this +writing) at least version 3.3 or newer. + +## Getting Started + +You can run this test project from both the command line as well as from +Android Studio. + +### Command Line + +Ensure you have the gradle wrapper script, `gradlew`, in this directory. If +you do not, you can run the following to generate it: + + $ cd cordova-android/test + $ gradle :wrapper -b build.gradle + +You can then see a list of all tasks available to run with `gradlew tasks`. + +The two different kinds of tests one typically wants to run are unit tests and +end-to-end, or instrumented, tests. Unit tests do not require any particular +environment to run in, but the instrumented tests, however, require a connected +Android device or emulator to run in. + +To run the unit tests, run: `gradlew test`. +To run the instrumented tests, run: `gradlew connectedAndroidTest`. + +### Android Studio + +Import this `test/` directory into Android Studio, and hit the Play button. diff --git a/node_modules/cordova-android/test/app/build.gradle b/node_modules/cordova-android/test/app/build.gradle new file mode 100644 index 0000000..d63d8ff --- /dev/null +++ b/node_modules/cordova-android/test/app/build.gradle @@ -0,0 +1,52 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + buildToolsVersion "27.0.1" + defaultConfig { + applicationId "org.apache.cordova.unittests" + minSdkVersion 19 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(path: ':CordovaLib') + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + androidTestImplementation('com.android.support.test.espresso:espresso-web:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + implementation 'com.android.support:appcompat-v7:26.1.0' + testImplementation 'junit:junit:4.12' + testImplementation 'org.json:json:20140107' +} diff --git a/node_modules/cordova-android/test/app/proguard-rules.pro b/node_modules/cordova-android/test/app/proguard-rules.pro new file mode 100644 index 0000000..fa4b7eb --- /dev/null +++ b/node_modules/cordova-android/test/app/proguard-rules.pro @@ -0,0 +1,36 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/jbowser/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java new file mode 100644 index 0000000..c50c221 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java @@ -0,0 +1,158 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.apache.cordova.CordovaWebView; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.pressBack; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.web.sugar.Web.onWebView; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + + +import static org.apache.cordova.unittests.R.id.cordovaWebView; + + +@RunWith(AndroidJUnit4.class) +public class BackButtonMultipageTest { + + private static final String START_URL = "file:///android_asset/www/backbuttonmultipage/index.html"; + //I have no idea why we picked 100, but we did. + private static final int WEBVIEW_ID = 100; + private TestActivity mActivity; + + // Don't launch the activity, we're going to send it intents + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + TestActivity.class, true, false); + + @Before + public void launchApplicationWithIntent() { + Intent intent = new Intent(); + intent.putExtra("startUrl", START_URL); + mActivity = (TestActivity) mActivityRule.launchActivity(intent); + } + + @Test + public void testViaHref() throws Throwable { + final CordovaWebView webInterface = mActivity.getWebInterface(); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.sendJavascript("window.location = 'sample2.html';"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.sendJavascript("window.location = 'sample3.html';"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample3.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertTrue(webInterface.backHistory()); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertTrue(webInterface.backHistory()); + } + }); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertFalse(webInterface.backHistory()); + } + }); + } + + @Test + public void testViaLoadUrl() throws Throwable { + final CordovaWebView webInterface = mActivity.getWebInterface(); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.loadUrl("file:///android_asset/www/backbuttonmultipage/sample2.html"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.loadUrl("file:///android_asset/www/backbuttonmultipage/sample3.html"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample3.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertTrue(webInterface.backHistory()); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertTrue(webInterface.backHistory()); + } + }); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertFalse(webInterface.backHistory()); + } + }); + } + + @Test + public void testViaBackButtonOnView() throws Throwable { + final CordovaWebView webInterface = mActivity.getWebInterface(); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.loadUrl("file:///android_asset/www/backbuttonmultipage/sample2.html"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + webInterface.loadUrl("file:///android_asset/www/backbuttonmultipage/sample3.html"); + } + }); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample3.html", mActivity.onPageFinishedUrl.take()); + onView(withId(WEBVIEW_ID)).perform(pressBack()); + assertEquals("file:///android_asset/www/backbuttonmultipage/sample2.html", mActivity.onPageFinishedUrl.take()); + onView(withId(WEBVIEW_ID)).perform(pressBack()); + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + } +} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java new file mode 100644 index 0000000..0793377 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java @@ -0,0 +1,53 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertNotNull; + +/* + * This test is to cover the use case of Cordova Android used as a component in a larger Android + * application. This test is strictly used to cover this use case. In this example, the WebView + * should load, not be null, and the Plugin Manager should also be initialized. + * + + */ + + +@RunWith(AndroidJUnit4.class) +public class EmbeddedWebViewTest { + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + EmbeddedWebViewActivity.class); + + @Test + public void checkWebViewTest() { + EmbeddedWebViewActivity activity = (EmbeddedWebViewActivity) mActivityRule.getActivity(); + assertNotNull(activity.webInterface); + assertNotNull(activity.webInterface.getPluginManager()); + } +} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java new file mode 100644 index 0000000..7300d7c --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java @@ -0,0 +1,68 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.apache.cordova.CordovaWebView; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertEquals; + +@RunWith(AndroidJUnit4.class) +public class ErrorUrlTest { + private static final String START_URL = "file:///android_asset/www/htmlnotfound/index.html"; + private static final String ERROR_URL = "file:///android_asset/www/htmlnotfound/error.html"; + private static final String INVALID_URL = "file:///android_asset/www/invalid.html"; + + //I have no idea why we picked 100, but we did. + private static final int WEBVIEW_ID = 100; + private TestActivity mActivity; + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + TestActivity.class); + + @Before + public void launchApplicationWithIntent() { + Intent intent = new Intent(); + intent.putExtra("startUrl", START_URL); + intent.putExtra("errorurl", INVALID_URL); + intent.putExtra("url", INVALID_URL); + mActivity = (TestActivity) mActivityRule.launchActivity(intent); + } + + @Test + public void errorUrlTest() throws Throwable { + assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); + assertEquals(ERROR_URL, mActivity.onPageFinishedUrl.take()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + assertEquals(ERROR_URL, mActivity.getWebInterface().getUrl()); + } + }); + } +} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java new file mode 100644 index 0000000..f3f66d7 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java @@ -0,0 +1,114 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.support.test.espresso.web.webdriver.Locator; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.apache.cordova.CordovaWebView; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.pressBack; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.web.sugar.Web.onWebView; +import static android.support.test.espresso.web.webdriver.DriverAtoms.findElement; +import static android.support.test.espresso.web.webdriver.DriverAtoms.webClick; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.fail; + +@RunWith(AndroidJUnit4.class) +public class IFrameTest { + + private static final String START_URL = "file:///android_asset/www/iframe/index.html"; + //I have no idea why we picked 100, but we did. + private static final int WEBVIEW_ID = 100; + private int WEBVIEW_LOAD_DELAY = 500; + + private TestActivity testActivity; + + // Don't launch the activity, we're going to send it intents + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + TestActivity.class, true, false); + + @Before + public void launchApplicationWithIntent() { + Intent intent = new Intent(); + intent.putExtra("startUrl", START_URL); + testActivity = (TestActivity) mActivityRule.launchActivity(intent); + } + + @Test + public void iFrameHistory() throws Throwable { + final CordovaWebView cordovaWebView = (CordovaWebView) testActivity.getWebInterface(); + onWebView().withElement(findElement(Locator.ID, "google_maps")).perform(webClick()); + sleep(WEBVIEW_LOAD_DELAY); + mActivityRule.runOnUiThread(new Runnable() { + public void run() + { + String url = cordovaWebView.getUrl(); + assertTrue(url.endsWith("index.html")); + } + }); + sleep(WEBVIEW_LOAD_DELAY); + onWebView().withElement(findElement(Locator.ID, "javascript_load")).perform(webClick()); + mActivityRule.runOnUiThread(new Runnable() { + public void run() + { + String url = cordovaWebView.getUrl(); + assertTrue(url.endsWith("index.html")); + } + }); + sleep(WEBVIEW_LOAD_DELAY); + //Espresso will kill the application and not trigger the backHistory method, which correctly + //navigates the iFrame history. backHistory is tied to the back button. + mActivityRule.runOnUiThread(new Runnable() { + public void run() + { + assertTrue(cordovaWebView.backHistory()); + String url = cordovaWebView.getUrl(); + assertTrue(url.endsWith("index.html")); + assertFalse(cordovaWebView.backHistory()); + } + }); + + } + + + //BRUTE FORCE THE CRAP OUT OF CONCURRENCY ERRORS + private void sleep(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + fail("Unexpected Timeout"); + } + } + +} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java new file mode 100644 index 0000000..6597156 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java @@ -0,0 +1,130 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaWebViewImpl; +import org.apache.cordova.PluginManager; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.fail; + +@RunWith(AndroidJUnit4.class) +public class MessageChannelMultipageTest { + private static final String START_URL = "file:///android_asset/www/backbuttonmultipage/index.html"; + //I have no idea why we picked 100, but we did. + private static final int WEBVIEW_ID = 100; + private TestActivity testActivity; + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + TestActivity.class); + + @Before + public void launchApplicationWithIntent() { + Intent intent = new Intent(); + intent.putExtra("startUrl", START_URL); + testActivity = (TestActivity) mActivityRule.launchActivity(intent); + } + + + + //test that after a page load the cached callback id and the live callback id match + //this is to prevent a regression + //the issue was that CordovaWebViewImpl's cached instance of CoreAndroid would become stale on page load + //this is because the cached instance was not being cleared when the pluginManager was reset on page load + //the plugin manager would get a new instance which would be updated with a new callback id + //the cached instance's message channel callback id would become stale + //effectively this caused message channel events to not be delivered + @Test + public void testThatCachedCallbackIdIsValid() throws Throwable { + final CordovaWebView cordovaWebView = testActivity.getWebInterface(); + Class cordovaWebViewImpl = CordovaWebViewImpl.class; + //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) + Method method = cordovaWebViewImpl.getDeclaredMethod("sendJavascriptEvent", String.class); + method.setAccessible(true); + method.invoke(cordovaWebView, "testEvent"); + sleep(1000); + + //load a page - this resets the plugin manager and nulls cordovaWebViewImpl.appPlugin + //(previously this resets plugin manager but did not null cordovaWebViewImpl.appPlugin, leading to the issue) + mActivityRule.runOnUiThread(new Runnable() { + public void run() { + cordovaWebView.loadUrl(START_URL); + } + }); + assertEquals(START_URL, testActivity.onPageFinishedUrl.take()); + + //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) + method.invoke(cordovaWebView, "testEvent"); + sleep(1000); + + //get reference to package protected class CoreAndroid + Class coreAndroid = Class.forName("org.apache.cordova.CoreAndroid"); + + //get cached CoreAndroid + Field appPluginField = cordovaWebViewImpl.getDeclaredField("appPlugin"); + appPluginField.setAccessible(true); + Object cachedAppPlugin = appPluginField.get(cordovaWebView); + //get cached CallbackContext + Field messageChannelField = coreAndroid.getDeclaredField("messageChannel"); + messageChannelField.setAccessible(true); + CallbackContext cachedCallbackContext = (CallbackContext) messageChannelField.get(cachedAppPlugin); + + //get live CoreAndroid + PluginManager pluginManager = cordovaWebView.getPluginManager(); + Field coreAndroidPluginNameField = coreAndroid.getField("PLUGIN_NAME"); + String coreAndroidPluginName = (String) coreAndroidPluginNameField.get(null); + Object liveAppPlugin = pluginManager.getPlugin(coreAndroidPluginName); + //get live CallbackContext + CallbackContext liveCallbackContext = (CallbackContext) messageChannelField.get(liveAppPlugin); + + //get callback id from live callbackcontext + String liveCallbackId = (liveCallbackContext != null) ? liveCallbackContext.getCallbackId() : null; + //get callback id from cached callbackcontext + String cachedCallbackId = (cachedCallbackContext != null) ? cachedCallbackContext.getCallbackId() : null; + + //verify that the live message channel has been initialized + assertNotNull(liveCallbackId); + //verify that the cached message channel and the live message channel have the same id + assertEquals(liveCallbackId, cachedCallbackId); + } + + private void sleep(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + fail("Unexpected Timeout"); + } + } +} diff --git a/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java new file mode 100644 index 0000000..f7162d5 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java @@ -0,0 +1,100 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.graphics.Color; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.view.View; +import android.widget.LinearLayout; + +import org.apache.cordova.CordovaPreferences; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.engine.SystemWebView; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertNotSame; +import static junit.framework.Assert.assertTrue; + +/** + * The purpose of this test is to test the default application that is generated by Cordova itself + * + */ +@RunWith(AndroidJUnit4.class) +public class StandardActivityTest { + + private static final String FALSE_URI = "http://www.google.com"; + + // Don't launch the activity, we're going to send it intents + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + StandardActivity.class, true, false); + + @Before + public void launchApplicationWithIntent() { + Intent intent = new Intent(); + intent.putExtra("startUrl", FALSE_URI); + intent.putExtra("backgroundcolor", "#0000ff"); + mActivityRule.launchActivity(intent); + } + + + @Test + public void webViewCheck() { + StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); + //Fish the webview out of the mostly locked down Activity using the Android SDK + View view = activity.getWindow().getCurrentFocus(); + assertEquals(SystemWebView.class, view.getClass()); + } + + @Test + public void startUriIntentCheck() { + StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); + final SystemWebView webView = (SystemWebView) activity.getWindow().getCurrentFocus(); + try { + mActivityRule.runOnUiThread(new Runnable() { + @Override + public void run() { + String uri = webView.getUrl(); + assertFalse(uri.equals(FALSE_URI)); + } + }); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + @Test + public void checkBackgroundIntentCheck() { + StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); + final SystemWebView webView = (SystemWebView) activity.getWindow().getCurrentFocus(); + CordovaWebView webInterface = webView.getCordovaWebView(); + CordovaPreferences prefs = webInterface.getPreferences(); + assertFalse(prefs.getInteger("backgroundcolor", Color.BLACK) == Color.GREEN); + } + +} diff --git a/node_modules/cordova-android/test/app/src/main/AndroidManifest.xml b/node_modules/cordova-android/test/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9d404fe --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/index.html new file mode 100755 index 0000000..8739aa0 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/index.html @@ -0,0 +1,40 @@ + + + + +Backbutton + + + + + +

    Cordova Android Tests

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    +

    Page 1

    + Go to next page.
    + If returning from previous page, press "backbutton". You should exit this app. +
    + Next page + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample2.html b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample2.html new file mode 100755 index 0000000..0b5be64 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample2.html @@ -0,0 +1,40 @@ + + + + +Backbutton + + + + + +

    Cordova Android Tests

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    +

    Page 2

    + Go to next page.
    + If returning from previous page, press "backbutton". You should go to Page 1. +
    + Next page + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample3.html b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample3.html new file mode 100755 index 0000000..7aa1e3b --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/backbuttonmultipage/sample3.html @@ -0,0 +1,42 @@ + + + + +Backbutton + + + + + +

    Cordova Android Tests

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    +

    Page 3

    + Press the 3 buttons below. You should stay on same page.
    + Press "backbutton" 4 times. This will go back to #test3, #test2, #test1, then return to previous Page 2.
    +
    + page3#test1 + page3#test2 + page3#test3 + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/backgroundcolor/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/backgroundcolor/index.html new file mode 100755 index 0000000..3b09d64 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/backgroundcolor/index.html @@ -0,0 +1,39 @@ + + + + + + + Cordova Tests + + + + + +

    Background Color Test

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + Before this page was show, you should have seen the background flash green.
    +
    + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/cordova.js b/node_modules/cordova-android/test/app/src/main/assets/www/cordova.js new file mode 100644 index 0000000..1814e02 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/cordova.js @@ -0,0 +1,2208 @@ +// Platform: android +// 7c5fcc5a5adfbf3fb8ceaf36fbdd4bd970bd9c20 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +;(function() { +var PLATFORM_VERSION_BUILD_LABEL = '6.2.0-dev'; +// file: src/scripts/require.js + +/*jshint -W079 */ +/*jshint -W020 */ + +var require, + define; + +(function () { + var modules = {}, + // Stack of moduleIds currently being built. + requireStack = [], + // Map of module ID -> index into requireStack of modules currently being built. + inProgressModules = {}, + SEPARATOR = "."; + + + + function build(module) { + var factory = module.factory, + localRequire = function (id) { + var resultantId = id; + //Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === ".") { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: src/cordova.js +define("cordova", function(require, exports, module) { + +// Workaround for Windows 10 in hosted environment case +// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object +if (window.cordova && !(window.cordova instanceof HTMLElement)) { + throw new Error("cordova already defined"); +} + + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + + +var cordova = { + define:define, + require:require, + version:PLATFORM_VERSION_BUILD_LABEL, + platformVersion:PLATFORM_VERSION_BUILD_LABEL, + platformId:platform.id, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, isSuccess, status, args, keepCallback) { + try { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (isSuccess && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!isSuccess) { + callback.fail && callback.fail.apply(null, args); + } + /* + else + Note, this case is intentionally not caught. + this can happen if isSuccess is true, but callbackStatus is NO_RESULT + which is used to remove a callback from the list without calling the callbacks + typically keepCallback is false in this case + */ + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + } + catch (err) { + var msg = "Error in " + (isSuccess ? "Success" : "Error") + " callbackId: " + callbackId + " : " + err; + console && console.log && console.log(msg); + cordova.fireWindowEvent("cordovacallbackerror", { 'message': msg }); + throw err; + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + + +module.exports = cordova; + +}); + +// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used pre-JellyBean, where addJavascriptInterface() is disabled. + */ + +module.exports = { + exec: function(bridgeSecret, service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(bridgeSecret, value) { + prompt(value, 'gap_bridge_mode:' + bridgeSecret); + }, + retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret); + } +}; + +}); + +// file: src/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: src/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function(arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +base64.toArrayBuffer = function(str) { + var decodedStr = typeof atob != 'undefined' ? atob(str) : new Buffer(str,'base64').toString('binary'); + var arrayBuffer = new ArrayBuffer(decodedStr.length); + var array = new Uint8Array(arrayBuffer); + for (var i=0, len=decodedStr.length; i < len; i++) { + array[i] = decodedStr.charCodeAt(i); + } + return arrayBuffer; +}; + +//------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var b64_12bit; + +var b64_12bitTable = function() { + b64_12bit = []; + for (var i=0; i<64; i++) { + for (var j=0; j<64; j++) { + b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function() { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64(rawData) { + var numBytes = rawData.byteLength; + var output=""; + var segment; + var table = b64_12bitTable(); + for (var i=0;i> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i == 2) { + segment = (rawData[i] << 16) + (rawData[i+1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i == 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: src/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + var needsProperty = false; + try { + obj[key] = value; + } catch (e) { + needsProperty = true; + } + // Getters can only be overridden by getters. + if (needsProperty || obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: src/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, + pollEnabled = false, + bridgeSecret = -1; + +var messagesFromNative = []; +var isProcessing = false; +var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); +var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; + +function androidExec(success, fail, service, action, args) { + if (bridgeSecret < 0) { + // If we ever catch this firing, we'll need to queue up exec()s + // and fire them once we get a secret. For now, I don't think + // it's possible for exec() to be called since plugins are parsed but + // not run until until after onNativeReady. + throw new Error('exec() called without bridgeSecret'); + } + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // If args is not provided, default to an empty array + args = args || []; + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } else if (msgs) { + messagesFromNative.push(msgs); + // Always process async to avoid exceptions messing up stack. + nextTick(processMessages); + } +} + +androidExec.init = function() { + //CB-11828 + //This failsafe checks the version of Android and if it's Jellybean, it switches it to + //using the Online Event bridge for communicating from Native to JS + // + //It's ugly, but it's necessary. + var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/); + var version_code = check && check[0].match(/4.[0-3].*/); + if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) { + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT; + } + + bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); + channel.onNativeReady.fire(); +}; + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + if (bridgeSecret < 0) { + // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. + // We know there's nothing to retrieve, so no need to poll. + return; + } + var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); + if (msgs) { + messagesFromNative.push(msgs); + // Process sync since we know we're already top-of-stack. + processMessages(); + } +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + // Otherwise, it will be set by androidExec.init() + if (bridgeSecret >= 0) { + nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); + } + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +function buildPayload(payload, message) { + var payloadKind = message.charAt(0); + if (payloadKind == 's') { + payload.push(message.slice(1)); + } else if (payloadKind == 't') { + payload.push(true); + } else if (payloadKind == 'f') { + payload.push(false); + } else if (payloadKind == 'N') { + payload.push(null); + } else if (payloadKind == 'n') { + payload.push(+message.slice(1)); + } else if (payloadKind == 'A') { + var data = message.slice(1); + payload.push(base64.toArrayBuffer(data)); + } else if (payloadKind == 'S') { + payload.push(window.atob(message.slice(1))); + } else if (payloadKind == 'M') { + var multipartMessages = message.slice(1); + while (multipartMessages !== "") { + var spaceIdx = multipartMessages.indexOf(' '); + var msgLen = +multipartMessages.slice(0, spaceIdx); + var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); + multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); + buildPayload(payload, multipartMessage); + } + } else { + payload.push(JSON.parse(message)); + } +} + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + // This is deprecated on the .java side. It doesn't work with CSP enabled. + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadMessage = message.slice(nextSpaceIdx + 1); + var payload = []; + buildPayload(payload, payloadMessage); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + } else { + console.log("processMessage failed: invalid message: " + JSON.stringify(message)); + } +} + +function processMessages() { + // Check for the reentrant case. + if (isProcessing) { + return; + } + if (messagesFromNative.length === 0) { + return; + } + isProcessing = true; + try { + var msg = popMessageFromQueue(); + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (msg == '*' && messagesFromNative.length === 0) { + nextTick(pollOnce); + return; + } + processMessage(msg); + } finally { + isProcessing = false; + if (messagesFromNative.length > 0) { + nextTick(processMessages); + } + } +} + +function popMessageFromQueue() { + var messageBatch = messagesFromNative.shift(); + if (messageBatch == '*') { + return '*'; + } + + var spaceIdx = messageBatch.indexOf(' '); + var msgLen = +messageBatch.slice(0, spaceIdx); + var message = messageBatch.substr(spaceIdx + 1, msgLen); + messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); + if (messageBatch) { + messagesFromNative.unshift(messageBatch); + } + return message; +} + +module.exports = androidExec; + +}); + +// file: src/common/exec/proxy.js +define("cordova/exec/proxy", function(require, exports, module) { + + +// internal map of proxy function +var CommandProxyMap = {}; + +module.exports = { + + // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...); + add:function(id,proxyObj) { + console.log("adding proxy for " + id); + CommandProxyMap[id] = proxyObj; + return proxyObj; + }, + + // cordova.commandProxy.remove("Accelerometer"); + remove:function(id) { + var proxy = CommandProxyMap[id]; + delete CommandProxyMap[id]; + CommandProxyMap[id] = null; + return proxy; + }, + + get:function(service,action) { + return ( CommandProxyMap[service] ? CommandProxyMap[service][action] : null ); + } +}; +}); + +// file: src/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + else { + (function(k) { + utils.defineGetterSetter(newNavigator,key,function() { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} + +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function() { + pluginloader.load(function() { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + + +}); + +// file: src/common/init_b.js +define("cordova/init_b", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady]; + +// setting exec +cordova.exec = require('cordova/exec'); + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + else { + (function(k) { + utils.defineGetterSetter(newNavigator,key,function() { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function() { + pluginloader.load(function() { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + +}); + +// file: src/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function(moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy == 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + + +}); + +// file: src/common/modulemapper_b.js +define("cordova/modulemapper_b", function(require, exports, module) { + +var builder = require('cordova/builder'), + symbolList = [], + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function(moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy == 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + + +}); + +// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/platform.js +define("cordova/platform", function(require, exports, module) { + +// The last resume event that was received that had the result of a plugin call. +var lastResumeEvent = null; + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Get the shared secret needed to use the bridge. + exec.init(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + function bindButtonChannel(buttonName) { + // generic button bind used for volumeup/volumedown buttons + var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); + volumeButtonChannel.onHasSubscribersChange = function() { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); + }; + } + // Inject a listener for the volume buttons on the document. + bindButtonChannel('volumeup'); + bindButtonChannel('volumedown'); + + // The resume event is not "sticky", but it is possible that the event + // will contain the result of a plugin call. We need to ensure that the + // plugin result is delivered even after the event is fired (CB-10498) + var cordovaAddEventListener = document.addEventListener; + + document.addEventListener = function(evt, handler, capture) { + cordovaAddEventListener(evt, handler, capture); + + if (evt === 'resume' && lastResumeEvent) { + handler(lastResumeEvent); + } + }; + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); + exec(null, null, APP_PLUGIN_NAME, "show", []); + }); + } +}; + +function onMessageFromNative(msg) { + var cordova = require('cordova'); + var action = msg.action; + + switch (action) + { + // Button events + case 'backbutton': + case 'menubutton': + case 'searchbutton': + // App life cycle events + case 'pause': + // Volume events + case 'volumedownbutton': + case 'volumeupbutton': + cordova.fireDocumentEvent(action); + break; + case 'resume': + if(arguments.length > 1 && msg.pendingResult) { + if(arguments.length === 2) { + msg.pendingResult.result = arguments[1]; + } else { + // The plugin returned a multipart message + var res = []; + for(var i = 1; i < arguments.length; i++) { + res.push(arguments[i]); + } + msg.pendingResult.result = res; + } + + // Save the plugin result so that it can be delivered to the js + // even if they miss the initial firing of the event + lastResumeEvent = msg; + } + cordova.fireDocumentEvent(action, msg); + break; + default: + throw new Error('Unknown event action ' + action); + } +} + +}); + +// file: /Users/steveng/repo/cordova/cordova-android/cordova-js-src/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); +var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, APP_PLUGIN_NAME, "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]); + }, + + /** + * Override the default behavior of the Android volume button. + * If overridden, when the volume button is pressed, the "volume[up|down]button" + * JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "volume[up|down]button" event, this is automatically done. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + overrideButton:function(button, override) { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, APP_PLUGIN_NAME, "exitApp", []); + } +}; + +}); + +// file: src/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); +var urlutil = require('cordova/urlutil'); + +// Helper function to inject a + + + +

    Full Screen Test

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + The app should take over the entire screen.
    + The top Android status bar should not be shown. +
    + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/htmlnotfound/error.html b/node_modules/cordova-android/test/app/src/main/assets/www/htmlnotfound/error.html new file mode 100755 index 0000000..3852efe --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/htmlnotfound/error.html @@ -0,0 +1,38 @@ + + + + + + + Expected Error + + + + + +

    Expected Error

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + This is an expected error page because the initial href doesn't exist. + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index.html new file mode 100755 index 0000000..c286e24 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index.html @@ -0,0 +1,49 @@ + + + + + + + Cordova Tests + + + + + + +

    IFrame

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + Press the two buttons:
    + 1. Google Maps should display in iframe.
    + 2. Page 2 replaces current page.
    + (NOTE: THIS BEHAVIOR IS WRONG - AND NEEDS TO BE FIXED IN FUTURE RELEASE.) +
    + + Google Maps + Page 2 + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index2.html b/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index2.html new file mode 100755 index 0000000..b1ca1b0 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/iframe/index2.html @@ -0,0 +1,40 @@ + + + + + + + Cordova Tests + + + + + +

    IFrame window

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + This should display a Cordova page inside an iframe. The info above should be filled out. + (NOTE: THIS DOES NOT WORK AND NEEDS TO BE FIXED IN FUTURE RELEASE.) +
    + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/index.html new file mode 100755 index 0000000..4614826 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/index.html @@ -0,0 +1,56 @@ + + + + + + + Cordova Tests + + + + + + + +

    Cordova Android Native Tests

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    +

    Run each of the test activities below:

    +
    + + + + + + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index.html new file mode 100755 index 0000000..25fc230 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index.html @@ -0,0 +1,112 @@ + + + + + + +Lifecycle Page 1 + + + + + + +

    Events

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    +

    Test 1

    + Press "Home" button, then return to this app to see pause/resume.
    + There should be "Running" entries between pause and resume since app continues to run in the background. +

    Test 2

    + Press "Load new page" button to load a new Cordova page.
    + When returning, you should see +
      +
    • Page2: onunload
    • +
    • Page1: onload
    • +
    • Page1: Running
    • +
    +
    +
    +

    Info for event testing:

    +
    +
    + + Load new page + Clear status + + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index2.html b/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index2.html new file mode 100755 index 0000000..9b22a0d --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/lifecycle/index2.html @@ -0,0 +1,110 @@ + + + + + + +Lifecycle Page 2 + + + + + + +

    Events

    +
    +

    Cordova:  

    +

    Platform:  , Version:  

    +

    UUID:  , Name:  

    +

    Width:  , Height:  , Color Depth:

    +
    +
    + You should see
    +
      +
    • Page1: onunload
    • +
    • Page2: onload
    • +
    • Page2: Running
    • +
    + Press "backbutton" to return to Page 1. +
    +
    +

    Info for event testing:

    +
    +
    + + Load new page + Clear status + + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/main.js b/node_modules/cordova-android/test/app/src/main/assets/www/main.js new file mode 100755 index 0000000..a242139 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/main.js @@ -0,0 +1,27 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var deviceInfo = function() { + document.getElementById("deviceready").innerHTML = "fired"; + document.getElementById("cordova").innerHTML = cordova.version; +}; + +function init() { + document.addEventListener("deviceready", deviceInfo, true); +} diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/master.css b/node_modules/cordova-android/test/app/src/main/assets/www/master.css new file mode 100755 index 0000000..c3e3c45 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/master.css @@ -0,0 +1,136 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + + body { + background:#222 none repeat scroll 0 0; + color:#666; + font-family:Helvetica; + font-size:72%; + line-height:1.5em; + margin:0; + border-top:1px solid #393939; + } + + #info{ + background:#ffa; + border: 1px solid #ffd324; + -webkit-border-radius: 5px; + border-radius: 5px; + clear:both; + margin:15px 6px 0; + width:295px; + padding:4px 0px 2px 10px; + } + + #info > h4{ + font-size:.95em; + margin:5px 0; + } + + #stage.theme{ + padding-top:3px; + } + + /* Definition List */ + #stage.theme > dl{ + padding-top:10px; + clear:both; + margin:0; + list-style-type:none; + padding-left:10px; + overflow:auto; + } + + #stage.theme > dl > dt{ + font-weight:bold; + float:left; + margin-left:5px; + } + + #stage.theme > dl > dd{ + width:45px; + float:left; + color:#a87; + font-weight:bold; + } + + /* Content Styling */ + #stage.theme > h1, #stage.theme > h2, #stage.theme > p{ + margin:1em 0 .5em 13px; + } + + #stage.theme > h1{ + color:#eee; + font-size:1.6em; + text-align:center; + margin:0; + margin-top:15px; + padding:0; + } + + #stage.theme > h2{ + clear:both; + margin:0; + padding:3px; + font-size:1em; + text-align:center; + } + + /* Stage Buttons */ + #stage.theme a.btn{ + border: 1px solid #555; + -webkit-border-radius: 5px; + border-radius: 5px; + text-align:center; + display:block; + float:left; + background:#444; + width:150px; + color:#9ab; + font-size:1.1em; + text-decoration:none; + padding:1.2em 0; + margin:3px 0px 3px 5px; + } + #stage.theme a.btn.large{ + width:308px; + padding:1.2em 0; + } + + /* Stage Buttons */ + #stage.theme button.btn{ + border: 1px solid #555; + -webkit-border-radius: 5px; + border-radius: 5px; + text-align:center; + display:block; + float:left; + background:#444; + width:150px; + color:#9ab; + font-size:1.1em; + text-decoration:none; + padding:1.2em 0; + margin:3px 0px 3px 5px; + } +#stage.theme button.btn.large{ + width:308px; + padding:1.2em 0; + } + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index.html b/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index.html new file mode 100755 index 0000000..b9596c9 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index.html @@ -0,0 +1,45 @@ + + + + + + + Cordova Tests + + + + + +

    Whitelist Page 1

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + Loading Page 2 should be successful.
    + Loading Page 3 should be in web browser.
    + Loading Page 2 with target=_blank should be in web browser?
    + (THIS DOESN'T HAPPEN.) https://issues.apache.org/jira/browse/CB-362 +
    + Page 2 + Page 3 + Page 2 with target=_blank + + diff --git a/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index2.html b/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index2.html new file mode 100755 index 0000000..5d990ad --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/assets/www/whitelist/index2.html @@ -0,0 +1,39 @@ + + + + + + + Cordova Tests + + + + + +

    Whitelist Page 2

    +
    +

    Cordova:  

    +

    Deviceready:  

    +
    +
    + Press "backbutton" +
    + + diff --git a/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java new file mode 100644 index 0000000..2e60ba5 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java @@ -0,0 +1,110 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; + +import org.apache.cordova.ConfigXmlParser; +import org.apache.cordova.CordovaInterfaceImpl; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaWebViewImpl; +import org.apache.cordova.PluginManager; +import org.apache.cordova.engine.SystemWebView; +import org.apache.cordova.engine.SystemWebViewEngine; +import org.json.JSONException; + +public class EmbeddedWebViewActivity extends AppCompatActivity { + + public CordovaWebView webInterface; + private CordovaInterfaceImpl cordovaInterface = new CordovaInterfaceImpl(this); + private String TAG = "CordovaTestActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + //Set up the webview + ConfigXmlParser parser = new ConfigXmlParser(); + parser.parse(this); + + SystemWebView webView = (SystemWebView) findViewById(R.id.cordovaWebView); + webInterface = new CordovaWebViewImpl(new SystemWebViewEngine(webView)); + webInterface.init(cordovaInterface, parser.getPluginEntries(), parser.getPreferences()); + + webView.loadUrl(parser.getLaunchUrl()); + } + + // This is still required by Cordova + @Override + public void onDestroy() + { + super.onDestroy(); + PluginManager pluginManager = webInterface.getPluginManager(); + if(pluginManager != null) + { + pluginManager.onDestroy(); + } + + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); + cordovaInterface.onActivityResult(requestCode, resultCode, intent); + } + + /** + * Called by the system when the user grants permissions! + * + * Note: The fragment gets priority over the activity, since the activity doesn't call + * into the parent onRequestPermissionResult, which is why there's no override. + * + * @param requestCode + * @param permissions + * @param grantResults + */ + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + try + { + cordovaInterface.onRequestPermissionResult(requestCode, permissions, grantResults); + } + catch (JSONException e) + { + Log.d(TAG, "JSONException: Parameters fed into the method are not valid"); + e.printStackTrace(); + } + + } + +} diff --git a/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java new file mode 100644 index 0000000..deaf74d --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java @@ -0,0 +1,49 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.unittests; + +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; + +public class LifeCyclePlugin extends CordovaPlugin { + + static String TAG = "LifeCyclePlugin"; + String calls = ""; + + @Override + public void onStart() { + calls += "start,"; + LOG.d(TAG, "onStart"); + } + @Override + public void onPause(boolean multitasking) { + calls += "pause,"; + LOG.d(TAG, "onPause"); + } + @Override + public void onResume(boolean multitasking) { + calls += "resume,"; + LOG.d(TAG, "onResume"); + } + @Override + public void onStop() { + calls += "stop,"; + LOG.d(TAG, "onStop"); + } +} diff --git a/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java new file mode 100644 index 0000000..9e7cce9 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java @@ -0,0 +1,42 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.os.Bundle; + +import org.apache.cordova.CordovaActivity; + +public class StandardActivity extends CordovaActivity { + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // enable Cordova apps to be started in the background + Bundle extras = getIntent().getExtras(); + if (extras != null && extras.getBoolean("cdvStartInBackground", false)) { + moveTaskToBack(true); + } + + // Set by in config.xml + loadUrl(launchUrl); + } +} diff --git a/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/TestActivity.java b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/TestActivity.java new file mode 100644 index 0000000..024a131 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/java/org/apache/cordova/unittests/TestActivity.java @@ -0,0 +1,67 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.os.Bundle; + +import org.apache.cordova.CordovaActivity; +import org.apache.cordova.CordovaWebView; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.RunnableFuture; + +/** + * The purpose of this activity is to allow the test framework to manipulate the start url, which + * is normally locked down by CordovaActivity to standard users who aren't editing their Java code. + */ + +public class TestActivity extends CordovaActivity { + + public final ArrayBlockingQueue onPageFinishedUrl = new ArrayBlockingQueue(500); + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // enable Cordova apps to be started in the background + Bundle extras = getIntent().getExtras(); + if (extras != null) { + if (extras.getBoolean("cdvStartInBackground", false)) { + moveTaskToBack(true); + } + launchUrl = extras.getString("startUrl", "index.html"); + } + + // Set by in config.xml + loadUrl(launchUrl); + } + + @Override + public Object onMessage(String id, Object data) { + if ("onPageFinished".equals(id)) { + onPageFinishedUrl.add((String) data); + } + return super.onMessage(id, data); + } + + public CordovaWebView getWebInterface() { return this.appView; } + +} diff --git a/node_modules/cordova-android/test/app/src/main/res/layout/activity_main.xml b/node_modules/cordova-android/test/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..7cbd51d --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,34 @@ + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/res/mipmap-hdpi/ic_launcher.png b/node_modules/cordova-android/test/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/test/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/node_modules/cordova-android/test/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/test/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/node_modules/cordova-android/test/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/node_modules/cordova-android/test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/node_modules/cordova-android/test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..aee44e138434630332d88b1680f33c4b24c70ab3 GIT binary patch literal 10486 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 + + + 64dp + diff --git a/node_modules/cordova-android/test/app/src/main/res/values/colors.xml b/node_modules/cordova-android/test/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..b184be6 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/values/colors.xml @@ -0,0 +1,24 @@ + + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/node_modules/cordova-android/test/app/src/main/res/values/dimens.xml b/node_modules/cordova-android/test/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..8f9a14a --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/values/dimens.xml @@ -0,0 +1,23 @@ + + + + 16dp + 16dp + diff --git a/node_modules/cordova-android/test/app/src/main/res/values/strings.xml b/node_modules/cordova-android/test/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..353e3ab --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/values/strings.xml @@ -0,0 +1,22 @@ + + + + UnitTests + diff --git a/node_modules/cordova-android/test/app/src/main/res/values/styles.xml b/node_modules/cordova-android/test/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..ae304da --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/values/styles.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/node_modules/cordova-android/test/app/src/main/res/xml/config.xml b/node_modules/cordova-android/test/app/src/main/res/xml/config.xml new file mode 100644 index 0000000..a824011 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/main/res/xml/config.xml @@ -0,0 +1,44 @@ + + + + Hello Cordova + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-android/test/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java b/node_modules/cordova-android/test/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java new file mode 100644 index 0000000..dc7bb67 --- /dev/null +++ b/node_modules/cordova-android/test/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java @@ -0,0 +1,177 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.unittests; + +import android.app.Activity; +import android.content.Intent; +import android.view.View; +import android.webkit.ValueCallback; + +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaResourceApi; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaWebViewEngine; +import org.apache.cordova.ICordovaCookieManager; +import org.apache.cordova.NativeToJsMessageQueue; +import org.apache.cordova.PluginManager; +import org.apache.cordova.PluginResult; +import org.apache.cordova.engine.SystemWebViewEngine; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.concurrent.ExecutorService; + +import static org.junit.Assert.*; + +public class NativeToJsMessageQueueTest { + + NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); + private String TEST_CALLBACK_ID = "MessageQueueTest"; + + //A queue with no bridges should not work + @Test + public void testEmptyBridge() + { + assertFalse(queue.isBridgeEnabled()); + } + + + //A queue with at least one bridge should work, using Eval Bridge + @Test + public void testEnabledBridge() + { + NativeToJsMessageQueue.BridgeMode bridge; + bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); + queue.addBridgeMode(bridge); + queue.setBridgeMode(0); + assertTrue(queue.isBridgeEnabled()); + } + + //This test is for the undocumented encoding system setup for the bridge + //TODO: Document how the non-Javascript bridges are supposed to work + @Test + public void testPopAndEncode() + { + NativeToJsMessageQueue.BridgeMode bridge; + bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); + queue.addBridgeMode(bridge); + queue.setBridgeMode(0); + + PluginResult result = new PluginResult(PluginResult.Status.OK); + queue.addPluginResult(result, TEST_CALLBACK_ID); + assertFalse(queue.isEmpty()); + String resultString = queue.popAndEncode(false); + String [] results = resultString.split(" "); + assertEquals(TEST_CALLBACK_ID, results[2]); + } + + //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping + //platform specific NativeToJs code + @Test + public void testBasicPopAndEncodeAsJs() + { + NativeToJsMessageQueue.BridgeMode bridge; + bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); + queue.addBridgeMode(bridge); + queue.setBridgeMode(0); + + PluginResult result = new PluginResult(PluginResult.Status.OK); + queue.addPluginResult(result, TEST_CALLBACK_ID); + assertFalse(queue.isEmpty()); + String resultString = queue.popAndEncodeAsJs(); + assertTrue(resultString.startsWith("cordova.callbackFromNative")); + } + + //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping + //platform specific NativeToJs code + @Test + public void testStringPopAndEncodeAsJs() + { + NativeToJsMessageQueue.BridgeMode bridge; + bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); + queue.addBridgeMode(bridge); + queue.setBridgeMode(0); + + PluginResult result = new PluginResult(PluginResult.Status.OK, "String Plugin Result"); + queue.addPluginResult(result, TEST_CALLBACK_ID); + assertFalse(queue.isEmpty()); + String resultString = queue.popAndEncodeAsJs(); + assertTrue(resultString.startsWith("cordova.callbackFromNative")); + } + + //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping + //platform specific NativeToJs code + @Test + public void testJsonPopAndEncodeAsJs() + { + NativeToJsMessageQueue.BridgeMode bridge; + bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); + queue.addBridgeMode(bridge); + queue.setBridgeMode(0); + + JSONObject object = new JSONObject(); + try { + object.put("test", "value"); + } catch (JSONException e) { + e.printStackTrace(); + } + PluginResult result = new PluginResult(PluginResult.Status.OK, object); + queue.addPluginResult(result, TEST_CALLBACK_ID); + assertFalse(queue.isEmpty()); + String resultString = queue.popAndEncodeAsJs(); + assertTrue(resultString.startsWith("cordova.callbackFromNative")); + } + + //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping + //platform specific NativeToJs code + @Test + public void testMultipartPopAndEncodeAsJs() + { + ArrayList multiparts = new ArrayList(); + for (int i=0; i<5; i++) { + multiparts.add(new PluginResult(PluginResult.Status.OK, i)); + } + PluginResult multipartresult = new PluginResult(PluginResult.Status.OK, multiparts); + NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); + queue.addBridgeMode(new NativeToJsMessageQueue.NoOpBridgeMode()); + queue.setBridgeMode(0); + queue.addPluginResult(multipartresult, "37"); + String result = queue.popAndEncodeAsJs(); + assertEquals(result, "cordova.callbackFromNative('37',true,1,[0,1,2,3,4],false);"); + } + + @Test + public void testNullPopAndEncodeAsJs() + { + NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); + queue.addBridgeMode(new NativeToJsMessageQueue.NoOpBridgeMode()); + queue.setBridgeMode(0); + + PluginResult result = new PluginResult(PluginResult.Status.OK, (String)null); + queue.addPluginResult(result, TEST_CALLBACK_ID); + assertFalse(queue.isEmpty()); + String resultString = queue.popAndEncodeAsJs(); + assertEquals(resultString, "cordova.callbackFromNative('" + TEST_CALLBACK_ID + "',true,1,[null],false);"); + } +} diff --git a/node_modules/cordova-android/test/gradle.properties b/node_modules/cordova-android/test/gradle.properties new file mode 100644 index 0000000..aac7c9b --- /dev/null +++ b/node_modules/cordova-android/test/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/node_modules/cordova-android/test/run_java_unit_tests.js b/node_modules/cordova-android/test/run_java_unit_tests.js new file mode 100644 index 0000000..9e585a6 --- /dev/null +++ b/node_modules/cordova-android/test/run_java_unit_tests.js @@ -0,0 +1,47 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +var Q = require('q'); +var path = require('path'); +var superspawn = require('cordova-common').superspawn; + +// First we make sure the gradlew helper file is built and ready. +var GradleBuilder = require('../bin/templates/cordova/lib/builders/GradleBuilder'); +var builder = new GradleBuilder(__dirname); +var needs_gradlew_built = builder.runGradleWrapper('gradle', 'build.gradle'); + +if (!needs_gradlew_built) { + // Due to interface of gradle builder, if the gradlew file already exists, `runGradleWrapper` returns undefined. + // In this case, we will fill the gap and create a resolved promise here now, this way the next bit of code + // will jump straight to running the tests + // TODO: maybe this should be done in GradleBuilder `runGradleWrapper` method instead? + needs_gradlew_built = Q.fcall(function () { return true; }); +} + +needs_gradlew_built.then(function () { + return superspawn.spawn(path.join(__dirname, 'gradlew'), ['test'], {stdio: 'inherit'}); +}, function (err) { + console.error('There was an error building the gradlew file:', err); +}).then(function () { + console.log('Tests completed successfully.'); +}).fail(function (err) { + console.error('Tests failed!', err); +}); diff --git a/node_modules/cordova-android/test/settings.gradle b/node_modules/cordova-android/test/settings.gradle new file mode 100644 index 0000000..5236022 --- /dev/null +++ b/node_modules/cordova-android/test/settings.gradle @@ -0,0 +1,21 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +include ':app' +include ":CordovaLib" +project(':CordovaLib').projectDir = new File('../framework') diff --git a/node_modules/cordova-plugin-splashscreen/.appveyor.yml b/node_modules/cordova-plugin-splashscreen/.appveyor.yml new file mode 100644 index 0000000..a7b2426 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.appveyor.yml @@ -0,0 +1,28 @@ +# appveyor file +# http://www.appveyor.com/docs/appveyor-yml + +max_jobs: 1 + +shallow_clone: true + +init: + - git config --global core.autocrlf true + +image: + - Visual Studio 2017 + +environment: + nodejs_version: "4" + matrix: + - PLATFORM: windows-10-store + JUST_BUILD: --justBuild +install: + - npm cache clean -f + - node --version + - npm install -g cordova-paramedic@https://github.com/apache/cordova-paramedic.git + - npm install -g cordova + +build: off + +test_script: + - cordova-paramedic --config pr\%PLATFORM% --plugin . %JUST_BUILD% diff --git a/node_modules/cordova-plugin-splashscreen/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/cordova-plugin-splashscreen/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..91582f4 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Platforms affected + + +### What does this PR do? + + +### What testing has been done on this change? + + +### Checklist +- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database +- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected. +- [ ] Added automated test coverage as appropriate for this change. diff --git a/node_modules/cordova-plugin-splashscreen/.jshintignore b/node_modules/cordova-plugin-splashscreen/.jshintignore new file mode 100644 index 0000000..09bc22e --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.jshintignore @@ -0,0 +1 @@ +tests/ios diff --git a/node_modules/cordova-plugin-splashscreen/.jshintrc b/node_modules/cordova-plugin-splashscreen/.jshintrc new file mode 100644 index 0000000..cf48aac --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.jshintrc @@ -0,0 +1,16 @@ +{ + "browser": true + , "devel": true + , "bitwise": true + , "undef": true + , "trailing": true + , "quotmark": false + , "indent": 4 + , "unused": "vars" + , "latedef": "nofunc" + , "globals": { + "module": false, + "exports": false, + "require": false + } +} diff --git a/node_modules/cordova-plugin-splashscreen/.npmignore b/node_modules/cordova-plugin-splashscreen/.npmignore new file mode 100644 index 0000000..7d3b1ce --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.npmignore @@ -0,0 +1,28 @@ +#If ignorance is bliss, then somebody knock the smile off my face + +*.csproj.user +*.suo +*.cache +Thumbs.db +*.DS_Store + +*.bak +*.cache +*.log +*.swp +*.user + + + + + + + + + + +node_modules + +/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcuserdata/ + +/tests/ios/CDVSplashScreenTest.xcworkspace/xcuserdata/ diff --git a/node_modules/cordova-plugin-splashscreen/.travis.yml b/node_modules/cordova-plugin-splashscreen/.travis.yml new file mode 100644 index 0000000..c5d3cdd --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/.travis.yml @@ -0,0 +1,98 @@ +sudo: false +addons: + jwt: + secure: UmbBQ73ydIzhTCfaTb/g0beTwnOHjYxlILmQYK2Tl9Gna/KbpawiVmbloX1eZakevkeYgzQmAHEF0LyDINy5AUk97azYeP0Sz/IOjIDfXAdc6U6sZb7BScneBMt6ET/hCprG4f3mbmleQ+gx+dmNWez6rlb3Xu+XWfJuwDfAWm0= +env: + global: + - SAUCE_USERNAME=snay + - TRAVIS_NODE_VERSION="4.2" +matrix: + include: + - env: PLATFORM=browser-chrome + os: linux + language: node_js + node_js: '4.2' + - env: PLATFORM=browser-firefox + os: linux + language: node_js + node_js: '4.2' + - env: PLATFORM=browser-safari + os: linux + language: node_js + node_js: '4.2' + - env: PLATFORM=browser-edge + os: linux + language: node_js + node_js: '4.2' + - env: TEST_DIR=. + language: objective-c + osx_image: xcode7 + - env: TEST_DIR=./tests/ios + language: objective-c + osx_image: xcode7 + - env: PLATFORM=ios-9.3 + os: osx + osx_image: xcode7.3 + language: node_js + node_js: '4.2' + - env: PLATFORM=ios-10.0 + os: osx + osx_image: xcode7.3 + language: node_js + node_js: '4.2' + - env: PLATFORM=android-4.4 + os: linux + language: android + jdk: oraclejdk8 + android: + components: + - tools + - extra-android-m2repository + - build-tools-26.0.2 + - env: PLATFORM=android-5.1 + os: linux + language: android + jdk: oraclejdk8 + android: + components: + - tools + - extra-android-m2repository + - build-tools-26.0.2 + - env: PLATFORM=android-6.0 + os: linux + language: android + jdk: oraclejdk8 + android: + components: + - tools + - extra-android-m2repository + - build-tools-26.0.2 + - env: PLATFORM=android-7.0 + os: linux + language: android + jdk: oraclejdk8 + android: + components: + - tools + - extra-android-m2repository + - build-tools-26.0.2 +before_install: +- rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm + && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm + install $TRAVIS_NODE_VERSION +- node --version +- if [[ "$PLATFORM" =~ android ]]; then gradle --version; fi +- if [[ "$PLATFORM" =~ ios ]]; then npm install -g ios-deploy; fi +- if [[ "$PLATFORM" =~ android ]]; then echo y | android update sdk -u --filter android-22,android-23,android-24,android-25,android-26; + fi +- git clone https://github.com/apache/cordova-paramedic /tmp/paramedic && pushd /tmp/paramedic + && npm install && popd +- npm install -g cordova +install: +- npm install +script: +- if [[ "$TEST_DIR" != "" ]]; + then cd $TEST_DIR && npm install && (npm test || npm test); + else node /tmp/paramedic/main.js --config pr/$PLATFORM --plugin $(pwd) --shouldUseSauce + --buildName travis-plugin-splashscreen-$TRAVIS_JOB_NUMBER; + fi diff --git a/node_modules/cordova-plugin-splashscreen/CONTRIBUTING.md b/node_modules/cordova-plugin-splashscreen/CONTRIBUTING.md new file mode 100644 index 0000000..4c8e6a5 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/CONTRIBUTING.md @@ -0,0 +1,37 @@ + + +# Contributing to Apache Cordova + +Anyone can contribute to Cordova. And we need your contributions. + +There are multiple ways to contribute: report bugs, improve the docs, and +contribute code. + +For instructions on this, start with the +[contribution overview](http://cordova.apache.org/contribute/). + +The details are explained there, but the important items are: + - Sign and submit an Apache ICLA (Contributor License Agreement). + - Have a Jira issue open that corresponds to your contribution. + - Run the tests so your patch doesn't break existing functionality. + +We look forward to your contributions! diff --git a/node_modules/cordova-plugin-splashscreen/LICENSE b/node_modules/cordova-plugin-splashscreen/LICENSE new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/NOTICE b/node_modules/cordova-plugin-splashscreen/NOTICE new file mode 100644 index 0000000..8ec56a5 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/NOTICE @@ -0,0 +1,5 @@ +Apache Cordova +Copyright 2012 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/node_modules/cordova-plugin-splashscreen/README.md b/node_modules/cordova-plugin-splashscreen/README.md new file mode 100644 index 0000000..49ff0ef --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/README.md @@ -0,0 +1,522 @@ +--- +title: Splashscreen +description: Control the splash screen for your app. +--- + + +|AppVeyor|Travis CI| +|:-:|:-:| +|[![Build status](https://ci.appveyor.com/api/projects/status/github/apache/cordova-plugin-splashscreen?branch=master)](https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-plugin-splashscreen)|[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg?branch=master)](https://travis-ci.org/apache/cordova-plugin-splashscreen)| + +# cordova-plugin-splashscreen + +This plugin is required to work with splash screens. This plugin displays and hides a splash screen during application launch. + +Report issues with this plugin on the [Apache Cordova issue tracker][Apache Cordova issue tracker]. + +## Installation + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + +## Supported Platforms + +- Android +- iOS +- Windows (`cordova-windows` version >= 4.4.0 is required) +- Browser + +__Note__: Extended splashscreen does not require the plugin on Windows (as opposed to Android and iOS) in case you don't use the plugin API, i.e. programmatic hide/show. + +### iOS-specific information + +There are two mechanisms for displaying a launch screen on iOS: + +1. Legacy launch images: images are sized exactly for the device's screen size. Does not support the iPad Pro 12.9's native resolution or split-screen/slide-over multitasking. + +2. Launch storyboard images: Images are sized based on scale, idiom, and size classes. Supports all devices, and can be used with split-screen/slide-over multitasking. + +Apple is moving away from legacy launch images. There is no official support for providing a native-resolution launch image for the iPad Pro 12.9 or for providing launch images that work with split-screen multitasking or slide-over. If your app doesn't need to support these contexts, then you can continue to use legacy launch images for as long as you like. + +The preferred method of providing launch images is to use a launch storyboard. For native app developers, the ideal launch storyboard is an unpopulated version of the app's user interface at launch. For non-native app developers who don't wish to learn Interface Builder, however, this plugin simulates the legacy launch image method as much as is feasible. + +#### Legacy launch images + +If you choose to use legacy launch images, you will use the following syntax in `config.xml`: + +``` + + + + + + + + + +``` + +Technically the filename for the `src` attribute can be anything you want; the filenames are used because they match what will be used when your project is compiled. The width and height attributes determine which launch images are displayed on which devices as follows: + +| width | height | device (orientation) | +|:-----------:|:------------:|:--------------------------------:| +| 320 | 480 | All non-retina iPhones and iPods | +| 640 | 960 | iPhone 4/4s (portrait) | +| 640 | 1136 | iPhone 5/5s/SE (portrait) | +| 750 | 1334 | iPhone 6/6s/7 (portrait) | +| 1242 | 2208 | iPhone 6+/6s+/7+ (portrait) | +| 2208 | 1242 | iPhone 6+/6s+/7+ (landscape) | +| 768 | 1024 | All non-retina iPads (portrait) | +| 1024 | 768 | All non-retina iPads (landscape) | +| 1536 | 2048 | All retina iPads (portrait) | +| 2048 | 1536 | All retina iPads (landscape) | + +Note: It is vitally important that the source image actually matches the size specified in the `width` and `height` attributes. If it does not, the device may fail to render it properly, if at all. + +#### Launch storyboard images + +In order to support newer form factors and split-screen/slide-over multitasking, you should use launch storyboard images. These are similar to the legacy launch images above, but there are crucial differences: + + - images are not specific to a given device. + + - images are scaled to fill the available viewport (while maintaining the aspect ratio). + + - the outer edges of the images will be cropped, and the amount will vary based on device an viewport. + + - there is no need to provide an image for each possible device, viewport, and orientation; iOS will choose the best image for the situation automatically. + +##### Designing launch storyboard images + +The key to designing a launch storyboard image is understanding that the edges of the image will almost certainly be cropped. Therefore, one should not place any important information near the edges of any images provided to the launch storyboard. Only the center is a safe area, and this all but guarantees that following Apple's advice of presenting an unpopulated user interface will not work well. + +Instead, the following tips should enable you to create a launch image that works across a multitude of form factors, viewports, and orientations: + + - Important graphics (logos, icons, titles) should be centered. The safe bounding region will vary, so you will need to test to ensure that the important graphics are never cropped. Better yet, don't supply any important graphics in the first place. + + - You _can_ fine-tune the placement and size of these graphics, but you don't have the same fine-grained control as you did with legacy launch images. + + - Use a simple color wash. If you use two colors, you'll want one color to fill the top half of the image, and the second to fill the bottom half. If you use a gradient, you'll probably want to ensure that the middle of the gradient lines up with the center of the image. + + - Don't worry about pixel perfection -- because the images are scaled, there's almost no chance the images will be perfectly fit to the pixel grid. Since all supported iOS devices use retina screens, users will be hard pressed to notice it anyway. + +It is important to understand the concept of scale, idiom, and size class traits in order to use launch storyboard images effectively. Of the images supplied to the launch storyboard, iOS will choose the image that best matches the device and viewport and render that image. It is possible to supply only one launch image if so desired, but it is also possible to fine-tune the displayed launch image based on traits. When fine-tuning, one can ignore traits that aren't targeted or supported by the app. + +> Note: If you are using launch storyboard images, there is no need to include legacy images. If you do, the legacy images will be copied, but not used. + +##### Scale + +| scale | devices | +|:-----------:|:----------------------:| +| 1x | All non-retina devices | +| 2x | Most retina devices | +| 3x | iPhone 6+/6s+,7s+ | + +In general, you'll want to supply 2x and 3x images. Cordova only supports retina devices now, so there's no point in supplying 1x images. + +##### Idioms + +| idiom | devices | +|:-----------:|:-------------:| +| ipad | All iPads | +| iphone | All iPhones and iPod Touches | +| universal | All devices | + +You only need to provide universal images unless you need to fine-tune for a specific device idiom. + +##### Size classes + +There are two size classes applies to both screen axes. Narrow viewports are considered to be the "compact" size class, and remaining viewports are considered "regular". When supplying images to Xcode, however, one must choose between "any & compact" and "any & regular". To stay consistent with the native terminology, this feature will match based on "any" and "compact". `any` will match regular-sized viewports. + +Note: this feature uses `com` as an abbreviation for "compact" classes. + +The following classes are supported by this feature: + +| width | height | orientation | +|:-----------:|:------------:|:-----------------:| +| any | any | any | +| com | any | portrait | +| any | com | landscape (wide) | +| com | com | landscape (narrow)| + +To see the complete list of size classes associated with devices and viewports, see . + +##### Single-image launch screen + +If your launch image is simple, you may be able to avoid creating a lot of different launch images and supply only one. The launch image needs to meet the following requirements: + + - the image should be square + + - the image should be large enough to fit on an iPad Pro 12.9": 2732x2732 + + - anything important should fit within the center + + Keep in mind that the image will be cropped, possibly quite severely, depending upon the viewport. + +Once the image is created, you can include it in your project by adding the following to `config.xml`: + +``` + +``` + +Because only one image is provided, iOS will utilize it in every context. + +##### Multi-image launch screen + +If a single launch image won't meet your needs, you will probably need to supply at least six images, if not more. Furthermore, keep in mind that it will not be possible to fine tune the image to a specific device, but only to a device class, display factor, and viewport size. + +If you don't need to target images to a specific idiom, you should create six images, as follows: + +| scale | idiom | width | height | size | filename | +|:-----------:|:-----------:|:-----------:|:------------:|:----------:|:--------------:| +| 2x* | universal | any | any | 2732x2732 | `Default@2x~universal~anyany.png` | +| 2x | universal | com | any | 1278x2732 | `Default@2x~universal~comany.png` | +| 2x | universal | com | com | 1334x750 | `Default@2x~universal~comcom.png` | +| 3x* | universal | any | any | 2208x2208 | `Default@3x~universal~anyany.png` | +| 3x | universal | any | com | 2208x1242 | `Default@3x~universal~anycom.png` | +| 3x | universal | com | any | 1242x2208 | `Default@3x~universal~comany.png` | + +\* this image is required in order for iOS utilize the other images within this scale and idiom. + +> Note: If the 3x sizes look small too you, that's because there's only one device class that currently has a 3x density: the iPhone 6+/6s+/7+. + +The above looks like the following snippet when present in `config.xml`: + +``` + + + + + + +``` + +Should one need to further fine tune based upon device idiom, one can do so. This might look like so: + +| scale | idiom | width | height | size | filename | +|:-----------:|:-----------:|:-----------:|:------------:|:----------:|:--------------:| +| 2x* | iphone | any | any | 1334x1334 | `Default@2x~iphone~anyany.png` | +| 2x | iphone | com | any | 750x1334 | `Default@2x~iphone~comany.png` | +| 2x | iphone | com | com | 1334x750 | `Default@2x~iphone~comcom.png` | +| 3x* | iphone | any | any | 2208x2208 | `Default@3x~iphone~anyany.png` | +| 3x | iphone | any | com | 2208x1242 | `Default@3x~iphone~anycom.png` | +| 3x | iphone | com | any | 1242x2208 | `Default@3x~iphone~comany.png` | +| 2x* | ipad | any | any | 2732x2732 | `Default@2x~ipad~anyany.png` | +| 2x | ipad | com | any | 1278x2732 | `Default@2x~ipad~comany.png` | + +\* this image is required in order for iOS utilize the other images within this scale and idiom. + +The above looks like the following in `config.xml`: + +``` + + + + + + + + +``` + +##### Quirks and Known Issues + +1. **App on target may not reflect changes to images** + Once you run the app on a target, iOS caches the launch image. Unfortunately, when you chance the images, iOS does _not_ invalidate the cache, which means you'll still see the old launch image. You should either: delete the app, or reset content & settings (simulator). + +2. **Simulator may not show expected images when launched from CLI** + When Xcode deploys to a specific simulator, it only copies the assets that match the simulator's characteristics. For example, if you try to run an app on the iPhone 6s Plus simulator, only @3x launch images are copied. When compiling from the CLI, however, the default is to assume an iPhone 5s, which means only @2x launch images are copied. Unless your launch images are markedly different, chances are good the difference would go unnoticed, but this does mean that the only accurate method of testing is to test on a physical device. + +3. **`anyany` must be provided for other variations to be used** + If you don't provide an `anyany` version of the launch image for a specific scale and idiom, the other variations (like `anycom`, `comany`, and `comcom`) will ignored. + +## Windows-specific information + +Splash screen images can be defined using the [MRT](https://cordova.apache.org/docs/en/dev/config_ref/images.html#windows) concept. +If you specify src="res/windows/splashscreen.png" the following files will be copied into the application's images folder: +`res/windows/splashscreen.png` | `res/windows/splashscreen.scale-100.png`, `res/windows/splashscreen.scale-125.png`, etc. +The following are supported: + +| Scale, % | Project | Width | Height | Filename | +|:------------:|:-------------------:|:-----------:|:------------:|:---------------------------------:| +| 100 | Windows 10/8.1 | 620 | 300 | `splashscreen.png` \| `splashscreen.scale-100.png` | +| 125 | Windows 10 | 775 | 375 | `splashscreen.scale-125.png` | +| 150 | Windows 10 | 930 | 450 | `splashscreen.scale-150.png` | +| 200 | Windows 10 | 1240 | 600 | `splashscreen.scale-200.png` | +| 400 | Windows 10 | 2480 | 1200 | `splashscreen.scale-400.png` | +| 140 | Windows 8.1 | 868 | 420 | `splashscreen.scale-140.png` | +| 180 | Windows 8.1 | 1116 | 540 | `splashscreen.scale-180.png` | +| 100 | Windows Phone 8.1 | 480 | 800 | `splashscreenphone.png` \| `splashscreenphone.scale-100.png` | +| 140 | Windows Phone 8.1 | 672 | 1120 | `splashscreenphone.scale-140.png` | +| 240 | Windows Phone 8.1 | 1152 | 1920 | `splashscreenphone.scale-240.png` | + +__Note__: SplashScreens size for Windows 10 project should not exceed 200 KBytes. +__Note__: Supported formats are `.png`, `.jpg`, `.jpeg`. Mixing of the extensions within a target is not supported. I.e. you can have `splashscreen.jpg` and `splashscreenphone.png` but not `splashscreen.scale-100.png`, `splashscreen.scale-400.jpg`. +__Note__: You may need to reopen Visual Studio solution after changing the images and doing a `cordova prepare` for the changes to take effect. + +## Example Configuration +In the top-level `config.xml` file (not the one in `platforms`), add configuration elements like those specified here. + +Please notice that the value of the "src" attribute is relative to the project root directory and not to the www directory (see `Directory structure` below). You can name the source image whatever you like. The internal name in the app is determined by Cordova. + +Directory structure: + +``` +projectRoot + hooks + platforms + plugins + www + css + img + js + res + screen + android + ios + windows +``` + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +## Preferences + +#### config.xml + +- `AutoHideSplashScreen` (boolean, default to `true`). Indicates whether to hide splash screen automatically or not. Splash screen hidden after amount of time specified in the `SplashScreenDelay` preference. + +```xml + +``` + +- `SplashScreenDelay` (number, default to 3000). Amount of time in milliseconds to wait before automatically hide splash screen. + +```xml + +``` + +Note also that this value used to be seconds, and not milliseconds, so values less than 30 will still be treated as seconds. ( Consider this a deprecated patch that will disapear in some future version. ) + +To disable the splashscreen add the following preference to `config.xml`: +```xml + +``` + +**Windows Quirk**: You should disable the splashscreen in case you are updating the entire document body dynamically (f.e. with a SPA router) to avoid affecting UI/controls. +Note that you should also directly reference `WinJS/base.js` in the page HTML in this case to avoid the issues with activation context ([CB-11658](https://issues.apache.org/jira/browse/CB-11658)). + +**iOS Quirk**: to disable the splashscreen on `ios` platform you should also add `` to `config.xml`. + +- `FadeSplashScreen` (boolean, defaults to `true`): Set to `false` to + prevent the splash screen from fading in and out when its display + state changes. + +```xml + +``` + +- `FadeSplashScreenDuration` (float, defaults to `500`): Specifies the + number of milliseconds for the splash screen fade effect to execute. + +```xml + +``` + +_Note_: `FadeSplashScreenDuration` is included into `SplashScreenDelay`, for example if you have `` and `` defined in `config.xml`: + +- 00:00 - splashscreen is shown +- 00:02 - fading has started +- 00:03 - splashscreen is hidden + +Turning the fading off via `` technically means fading duration to be `0` so that in this example the overall splash delay will still be 3 seconds. + +_Note_: This only applies to the app startup - you need to take the fading timeout into account when manually showing/hiding the splashscreen in the code: + +```javascript +navigator.splashscreen.show(); +window.setTimeout(function () { + navigator.splashscreen.hide(); +}, splashDuration - fadeDuration); +``` + +- `ShowSplashScreenSpinner` (boolean, defaults to `true`): Set to `false` + to hide the splash-screen spinner. + +```xml + +``` + +### Android Quirks + +In your `config.xml`, you can add the following preferences: + +```xml + + + +``` + +"SplashMaintainAspectRatio" preference is optional. If set to true, splash screen drawable is not stretched to fit screen, but instead simply "covers" the screen, like CSS "background-size:cover". This is very useful when splash screen images cannot be distorted in any way, for example when they contain scenery or text. This setting works best with images that have large margins (safe areas) that can be safely cropped on screens with different aspect ratios. + +The plugin reloads splash drawable whenever orientation changes, so you can specify different drawables for portrait and landscape orientations. + +"SplashShowOnlyFirstTime" preference is also optional and defaults to `true`. When set to `true` splash screen will only appear on application launch. However, if you plan to use `navigator.app.exitApp()` to close application and force splash screen appear on next launch, you should set this property to `false` (this also applies to closing the App with Back button). + +"SplashScreenSpinnerColor" preference is also optional and is ignored when not set. Setting it to a valid color name or HEX color code will change the color of the spinner on Android 5.0+ devices. + +### Browser Quirks + +You can use the following preferences in your `config.xml`: + +```xml + + + + + + + + + +``` + +__Note__: `SplashScreen` value should be absolute in order to work in a sub-page. The `SplashScreen` value is used only for the browser platform. The value will be ignored for other platforms. + +### iOS Quirks + +- In iOS, the splashscreen images are called launch images. These images are mandatory on iOS. + +### Windows Quirks + +- `SplashScreenSpinnerColor` (string, defaults to system accent color): hash, rgb notation or CSS color name. + +```xml + + + +``` + +- `SplashScreenBackgroundColor` (string, defaults to #464646): hex notation. + +```xml + +``` + +## Methods + +- splashscreen.show +- splashscreen.hide + +## splashscreen.hide + +Dismiss the splash screen. + +```js +navigator.splashscreen.hide(); +``` + + +### iOS Quirk + +The `config.xml` file's `AutoHideSplashScreen` setting must be +`false`. To delay hiding the splash screen for two seconds, add a +timer such as the following in the `deviceready` event handler: + +```js +setTimeout(function() { + navigator.splashscreen.hide(); +}, 2000); +``` + +## splashscreen.show + +Displays the splash screen. + +```js +navigator.splashscreen.show(); +``` + +Your application cannot call `navigator.splashscreen.show()` until the app has +started and the `deviceready` event has fired. But since typically the splash +screen is meant to be visible before your app has started, that would seem to +defeat the purpose of the splash screen. Providing some configuration in +`config.xml` will automatically `show` the splash screen immediately after your +app launch and before it has fully started and received the `deviceready` +event. For this reason, it is unlikely you need to call `navigator.splashscreen.show()` to make the splash +screen visible for app startup. + +[Apache Cordova issue tracker]: https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Splashscreen%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC diff --git a/node_modules/cordova-plugin-splashscreen/RELEASENOTES.md b/node_modules/cordova-plugin-splashscreen/RELEASENOTES.md new file mode 100644 index 0000000..e0c90c9 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/RELEASENOTES.md @@ -0,0 +1,238 @@ + +# Release Notes + +### 5.0.2 (Jan 24, 2018) +* [CB-13750](https://issues.apache.org/jira/browse/CB-13750) Add build-tools-26.0.2 to travis +* [CB-13737](https://issues.apache.org/jira/browse/CB-13737) (iOS): fix Splash screen images for iPhone X + +### 5.0.1 (Dec 27, 2017) +* [CB-13709](https://issues.apache.org/jira/browse/CB-13709) Fix to allow 5.0.0 version install (#144) + +### 5.0.0 (Dec 15, 2017) +* [CB-13677](https://issues.apache.org/jira/browse/CB-13677) Remove deprecated platforms + +### 4.1.0 (Nov 06, 2017) +* [CB-13473](https://issues.apache.org/jira/browse/CB-13473) (CI) Removed **Browser** builds from AppVeyor +* [CB-12011](https://issues.apache.org/jira/browse/CB-12011) (android) added the possibility to change the spinner color on **Android 5.0**+ apps +* [CB-13028](https://issues.apache.org/jira/browse/CB-13028) (CI) **Browser** builds on Travis and AppVeyor +* [CB-13094](https://issues.apache.org/jira/browse/CB-13094) (android) Don't show splash when activity being finished +* [CB-11487](https://issues.apache.org/jira/browse/CB-11487) (browser) Documented `AutoHideSplashScreen` for **Browser** +* [CB-11488](https://issues.apache.org/jira/browse/CB-11488) (browser) The `hide()` call became non re-entrant after the addition of fade out. This fixes the issue. +* [CB-11487](https://issues.apache.org/jira/browse/CB-11487) (browser) The standard `AutoHideSplashScreen` `config.xml` property is now supported by the **Browser** platform. +* [CB-11486](https://issues.apache.org/jira/browse/CB-11486) (browser) `splashScreenDelay` now feed through `parseInt` to ensure it is an integer by the time it's value is passed in to `setTimeout()` in `hide()`. +* [CB-12847](https://issues.apache.org/jira/browse/CB-12847) added `bugs` entry to `package.json`. + +### 4.0.3 (Apr 27, 2017) +* [CB-12622](https://issues.apache.org/jira/browse/CB-12622) Added **Android 6.0** build badge to `README` +* [CB-12685](https://issues.apache.org/jira/browse/CB-12685) added `package.json` to tests folder + +### 4.0.2 (Feb 28, 2017) +* [CB-12353](https://issues.apache.org/jira/browse/CB-12353) Corrected merges usage in `plugin.xml` +* [CB-12369](https://issues.apache.org/jira/browse/CB-12369) Add plugin typings from `DefinitelyTyped` +* [CB-12363](https://issues.apache.org/jira/browse/CB-12363) Added build badges for **iOS 9.3** and **iOS 10.0** +* [CB-12230](https://issues.apache.org/jira/browse/CB-12230) Removed **Windows 8.1** build badges + +### 4.0.1 (Dec 07, 2016) +* [CB-12224](https://issues.apache.org/jira/browse/CB-12224) Updated version and RELEASENOTES.md for release 4.0.1 +* [CB-11751](https://issues.apache.org/jira/browse/CB-11751) 'extendedSplashScreen' is undefined Document that splashscreen needs to be disabled on Windows in case of updating entire document body +* [CB-9287](https://issues.apache.org/jira/browse/CB-9287) Not enough Icons and Splashscreens for **Windows 8.1** and Windows Phone 8.1 +* [CB-11917](https://issues.apache.org/jira/browse/CB-11917) - Remove pull request template checklist item: "iCLA has been submitted…" +* [CB-11830](https://issues.apache.org/jira/browse/CB-11830) (iOS) Fix doc typos in PR#114 +* [CB-11829](https://issues.apache.org/jira/browse/CB-11829) (iOS) Support for CB-9762; docs (CB-11830) +* [CB-11832](https://issues.apache.org/jira/browse/CB-11832) Incremented plugin version. + +### 4.0.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* [CB-11326](https://issues.apache.org/jira/browse/CB-11326) Prevent crash when initializing plugin after navigating to another URL +* Fix crash on **iOS** when reloading page from remote **Safari** +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* [CB-11179](https://issues.apache.org/jira/browse/CB-11179) Extend the windows-splashscreen docs +* [CB-11159](https://issues.apache.org/jira/browse/CB-11159) Fix flaky splashscreen native tests +* [CB-11156](https://issues.apache.org/jira/browse/CB-11156) Change default `FadeSplashScreenDuration` value +* [CB-8056](https://issues.apache.org/jira/browse/CB-8056) Updated the dependency version, added it to the docs +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md +* [CB-8056](https://issues.apache.org/jira/browse/CB-8056) Implement splashscreen for **Windows** platform +* [CB-6498](https://issues.apache.org/jira/browse/CB-6498) Misleading documentation in **Android** Quirks + +### 3.2.2 (Apr 15, 2016) +* [CB-10979](https://issues.apache.org/jira/browse/CB-10979) Fix splashscreen **iOS** native tests. Added `jshintignore` for tests/ios +* [CB-10895](https://issues.apache.org/jira/browse/CB-10895) Transparent Splashscreen view sometimes remains +* [CB-10562](https://issues.apache.org/jira/browse/CB-10562) `hide()` not working in latest splashscreen plug in 3.1.0 in **iOS** +* [CB-10688](https://issues.apache.org/jira/browse/CB-10688) Plugin Splashscreen Readme must have examples. +* [CB-10864](https://issues.apache.org/jira/browse/CB-10864) Run **iOS** native tests on Travis + +### 3.2.1 (Mar 09, 2016) +* [CB-10764](https://issues.apache.org/jira/browse/CB-10764) Remove emoji in cordova-plugin-splashscreen +* [CB-10650](https://issues.apache.org/jira/browse/CB-10650) Non-index content.src causes Splashscreen to be not displayed on **Browser** +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add JSHint for plugins +* [CB-10606](https://issues.apache.org/jira/browse/CB-10606) fix deprecation warning for interfaceOrientation on **iOS** +* chore: edit package.json license to match SPDX id + +### 3.2.0 (Feb 09, 2016) +* [CB-10422](https://issues.apache.org/jira/browse/CB-10422) Splashscreen displays black screen with no image on Android +* [CB-10412](https://issues.apache.org/jira/browse/CB-10412) AutoHideSplashScreen "false" isn't taken in account on iOS +* [CB-9516](https://issues.apache.org/jira/browse/CB-9516) Android SplashScreen - Spinner Does Not Display +* [CB-9094](https://issues.apache.org/jira/browse/CB-9094) Smarter autohide logic on Android +* [CB-8396](https://issues.apache.org/jira/browse/CB-8396) Add AutoHideSplashScreen logic to Android's Splashscreen + +### 3.1.0 (Jan 15, 2016) +* [CB-9538](https://issues.apache.org/jira/browse/CB-9538) Implementing `FadeSplashScreen` feature for **Android** +* [CB-9240](https://issues.apache.org/jira/browse/CB-9240) Cordova splash screen plugin **iPad** landscape mode issue +* [CB-10263](https://issues.apache.org/jira/browse/CB-10263) Fix splashscreen plugin filenames for Asset Catalog +* [CB-9374](https://issues.apache.org/jira/browse/CB-9374) **Android** add `SplashShowOnlyFirstTime` as preference +* [CB-10244](https://issues.apache.org/jira/browse/CB-10244) Don't rotate the **iPhone 6 Plus** splash +* [CB-9043](https://issues.apache.org/jira/browse/CB-9043) Fix the **ios** splashscreen being deformed on orientation change +* [CB-10079](https://issues.apache.org/jira/browse/CB-10079) Splashscreen plugin does not honor `SplashScreenDelay` on **iOS** +* [CB-10231](https://issues.apache.org/jira/browse/CB-10231) Fix `FadeSplashScreen` to default to true on **iOS** + +### 3.0.0 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* Fixing contribute link. +* [CB-9750](https://issues.apache.org/jira/browse/CB-9750) `FadeSplashDuration` is now in `msecs` +* [CB-8875](https://issues.apache.org/jira/browse/CB-8875) `FadeSplashScreen` was not fading +* [CB-9467](https://issues.apache.org/jira/browse/CB-9467) SplashScreen does not show any image in hosted app on **Windows 10** +* [CB-7282](https://issues.apache.org/jira/browse/CB-7282) Document `AutoHideSplashScreenpreference` +* [CB-9327](https://issues.apache.org/jira/browse/CB-9327) - Splashscreen not receiving `CDVPageLoadNotification` +* WP8: Avoid config `value` of a wrong element. + +### 2.1.0 (Jun 17, 2015) +* added missing license headers +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-splashscreen documentation translation: cordova-plugin-splashscreen +* fix npm md issue +* Fixed iOS unit tests. +* [CB-3562](https://issues.apache.org/jira/browse/CB-3562): Disable screen rotation for iPhone when splash screen is shown. (closes #47) +* [CB-8988](https://issues.apache.org/jira/browse/CB-8988): Fix rotation on iOS/iPad (closes #46) +* [CB-8904](https://issues.apache.org/jira/browse/CB-8904): Don't reset the static variable when it's destroyed, otherwise we might as well just have a member variable +* Removed wp7 from `plugin.xml` and package.json +* [CB-8750](https://issues.apache.org/jira/browse/CB-8750) [wp8]: Rewrite resoultion helper +* [CB-8750](https://issues.apache.org/jira/browse/CB-8750) [wp8]: Allow resolution-specific splashscreen images +* [CB-8758](https://issues.apache.org/jira/browse/CB-8758) [wp8]: UnauthorizedAccessException on hide() + +### 2.0.0 (Apr 15, 2015) +* give users a way to install the bleeding edge. +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8797](https://issues.apache.org/jira/browse/CB-8797) - Splashscreen preferences FadeSplashScreenDuration and FadeSplashScreen (iOS) are missing +* [CB-8836](https://issues.apache.org/jira/browse/CB-8836) - Crashes after animating splashscreen +* [CB-8753](https://issues.apache.org/jira/browse/CB-8753) android: Fix missing import in previous commit +* [CB-8753](https://issues.apache.org/jira/browse/CB-8753) android: Adds `SplashMaintainAspectRatio` preference (close #43) +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* [CB-8345](https://issues.apache.org/jira/browse/CB-8345) Make default for splashscreen resource "screen" (which is what template and CLI assume it to be) +* Revert "CB-8345 android: Make "splash" the default resource ID instead of null" +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* [CB-8345](https://issues.apache.org/jira/browse/CB-8345) android: Make "splash" the default resource ID instead of null +* docs: added Windows to supported platforms +* [CB-7964](https://issues.apache.org/jira/browse/CB-7964) Add cordova-plugin-splashscreen support for browser platform +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* [wp8] oops, Added back config parse result checks +* [WP8] code cleanup, minor refactors, comments to clarify some stuff. +* Extend WP8 Splash Screen to respect SplashScreen and SplashScreenDelay preferences from config file +* [CB-8574](https://issues.apache.org/jira/browse/CB-8574) Integrate TravisCI +* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-splashscreen documentation translation: cordova-plugin-splashscreen +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file +* [CB-8397](https://issues.apache.org/jira/browse/CB-8397) Add support to 'windows' for showing the Windows Phone splashscreen + +### 1.0.0 (Feb 04, 2015) +* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Stop using deprecated IsIpad macro +* [CB-3679](https://issues.apache.org/jira/browse/CB-3679) Add engine tag for Android >= 3.6.0 due to use of `preferences` +* [CB-3679](https://issues.apache.org/jira/browse/CB-3679) Make SplashScreen plugin compatible with cordova-android@4.0.x + +### 0.3.5 (Dec 02, 2014) +* [CB-7204](https://issues.apache.org/jira/browse/CB-7204) - Race condition when hiding and showing spinner (closes #21) +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-splashscreen documentation translation: cordova-plugin-splashscreen + +### 0.3.4 (Oct 03, 2014) +* Finalized iOS splash screen (image name) tests. 176 tests in all, 44 for each type of device (iPad, iPhone, iPhone5, iPhone6, iPhone 6 Plus). +* [CB-7633](https://issues.apache.org/jira/browse/CB-7633) - (Re-fix based on updated unit tests) iPhone 6 Plus support +* Updated iOS tests for locked orientations +* Added more iOS splash screen tests. +* [CB-7633](https://issues.apache.org/jira/browse/CB-7633) - Add support for iPhone 6/6+ +* Added failing iPhone 6/6 Plus tests. +* Added 'npm test' +* [CB-7663](https://issues.apache.org/jira/browse/CB-7663) - iOS unit tests for splash screen +* Properly formatted splashscreen preference docs. + +### 0.3.3 (Sep 17, 2014) +* [CB-7249](https://issues.apache.org/jira/browse/CB-7249) cordova-plugin-splashscreen documentation translation +* Renamed test dir, added nested `plugin.xml` +* added documentation for manual tests +* [CB-7196](https://issues.apache.org/jira/browse/CB-7196) port splashscreen tests to framework + +### 0.3.2 (Aug 06, 2014) +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs +* [CB-7041](https://issues.apache.org/jira/browse/CB-7041) ios: Fix image filename logic when setting the iPad splash screen +* fixes Splashscreen crash on WP8 +* Remove outdated doc + +### 0.3.1 (Jun 05, 2014) +* documentation translation: cordova-plugin-splashscreen +* Lisa testing pulling in plugins for plugin: cordova-plugin-splashscreen +* Lisa testing pulling in plugins for plugin: cordova-plugin-splashscreen +* Lisa testing pulling in plugins for plugin: cordova-plugin-splashscreen +* Lisa testing pulling in plugins for plugin: cordova-plugin-splashscreen +* [CB-6810](https://issues.apache.org/jira/browse/CB-6810) Add license to CONTRIBUTING.md +* [wp8] updated quirk for and combined iOS,WP8,BB10 quirks as they are all the same +* [wp] implemented OnInit so splash screen can be shown before cordova page is loaded +* [wp] plugin must be autoloaded for AutoHideSplashScreen preference to work +* [CB-6483](https://issues.apache.org/jira/browse/CB-6483) Use splash screen image from manifest on Windows8 +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md +* Revert "Merge branch 'tizen' of http://github.com/siovene/cordova-plugin-splashscreen" + +### 0.3.0 (Apr 17, 2014) +* Add Tizen support to plugin +* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy +* [CB-4051](https://issues.apache.org/jira/browse/CB-4051): [ios] - Re-fix - Splashscreen rotation problem (closes #13) +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers +* [CB-6465](https://issues.apache.org/jira/browse/CB-6465): Add license headers to Tizen code +* Add NOTICE file + +### 0.2.7 (Feb 05, 2014) +* [CB-3562](https://issues.apache.org/jira/browse/CB-3562) Fix aspect ratio on landscape-only iPhone applications +* [CB-4051](https://issues.apache.org/jira/browse/CB-4051) fix for splashscreen rotation problem + +### 0.2.6 (Jan 02, 2014) +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for Splashscreen plugin +* Handle error when splash image is missing. + +### 0.2.5 (Dec 4, 2013) +* add ubuntu platform +* Added amazon-fireos platform. Change to use amazon-fireos as a platform if the user agent string contains 'cordova-amazon-fireos' +* [CB-5124](https://issues.apache.org/jira/browse/CB-5124) - Remove splashscreen config.xml values from iOS Configuration Docs, move to plugin docs + +### 0.2.4 (Oct 28, 2013) +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): add repo + issue tag to `plugin.xml` for splashscreen plugin +* [CB-5010](https://issues.apache.org/jira/browse/CB-5010) Incremented plugin version on dev branch. + +### 0.2.3 (Oct 9, 2013) +* [CB-4806](https://issues.apache.org/jira/browse/CB-4806) Re-fix Update splashscreen image bounds for iOS 7 +* [CB-4934](https://issues.apache.org/jira/browse/CB-4934) plugin-splashscreen should not show by default on Windows8 +* [CB-4929](https://issues.apache.org/jira/browse/CB-4929) plugin-splashscreen not loading proxy windows8 +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. + +### 0.2.2 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.splashscreen to org.apache.cordova.splashscreen +* Rename CHANGELOG.md -> RELEASENOTES.md +* [CB-4806](https://issues.apache.org/jira/browse/CB-4806) Update splashscreen image bounds for iOS 7 +* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch. diff --git a/node_modules/cordova-plugin-splashscreen/doc/de/README.md b/node_modules/cordova-plugin-splashscreen/doc/de/README.md new file mode 100644 index 0000000..f876eff --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/de/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +Dieses Plugin zeigt und verbirgt einen Splash-Screen beim Start der Anwendung. + +## Installation + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## Unterstützte Plattformen + + * Amazon Fire OS + * Android + * BlackBerry 10 + * iOS + * Windows Phone 7 und 8 + * Windows 8 + * Windows + * Browser + +## Methoden + + * SplashScreen.Show + * SplashScreen.Hide + +### Android Eigenarten + +Sie müssen in Ihrem `"config.xml"`fügen Sie die folgenden Einstellungen: + + + + + + +Wo Foo ist der Name der Datei Splashscreen, vorzugsweise eine 9-Patch-Datei. Stellen Sie sicher, Splashcreen Dateien zu Ihrem res/xml-Verzeichnis unter den entsprechenden Ordnern hinzuzufügen. Der zweite Parameter stellt dar, wie lange das Splashscreen in Millisekunden angezeigt werden. Es wird standardmäßig auf 3000 ms. Weitere Informationen finden Sie unter [Symbole und Splash-Screens](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). + +"SplashMaintainAspectRatio" Präferenz ist optional. Wenn wahr, Splash-Screen zeichenbaren nicht gestreckt wird, um den Bildschirm passen, sondern stattdessen einfach "" den Bildschirm, wie CSS abdeckt "Hintergrund-Größe: Schutz vor". Dies ist sehr nützlich, wenn Splash-Bildschirm Bilder können nicht, in keiner Weise, zum Beispiel verzerrt werden wenn sie Landschaft oder Text enthalten. Diese Einstellung funktioniert am besten mit Bildern, die große Margen (sichere Bereiche) haben, die sicher auf Bildschirme mit unterschiedlichen Seitenverhältnissen zugeschnitten werden können. + +Das Plugin lädt platsch zeichenbaren wenn Ausrichtung ändert, sodass Sie verschiedene Drawables für hoch- und Querformat Ausrichtungen angeben können. + +### Browser-Eigenheiten + +In Ihrem `"config.xml"`können Sie die folgenden Einstellungen: + + + + + + + + + + + +### iOS Macken + + * `FadeSplashScreen` (Boolean, standardmäßig auf `true festgelegt`): um zu verhindern, dass den Begrüßungsbildschirm ein-und ausblenden bei ihrer Anzeige Statusänderungen auf `false` festgelegt. + + + + + * `FadeSplashScreenDuration` (float, Standardwert ist `2`): gibt die Anzahl der Sekunden für den Begrüßungsbildschirm fade Effekt ausgeführt. + + + + + * `ShowSplashScreenSpinner` (Boolean, standardmäßig auf `true festgelegt`): auf `false` festgelegt wird, um den Begrüßungsbildschirm Spinner auszublenden. + + + + +## SplashScreen.Hide + +Schließen Sie den Splash-Screen. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Eigenarten + +Die Datei `config.xml` `AutoHideSplashScreen` Einstellung muss `false` sein. Verstecken des Begrüßungsbildschirms für zwei Sekunden Verzögerung, fügen Sie einen Timer wie die folgende in der `deviceready`-Ereignishandler: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## SplashScreen.Show + +Zeigt den Begrüßungsbildschirm. + + navigator.splashscreen.show(); + + +Ihre Anwendung kann nicht `navigator.splashscreen.show()` aufrufen, bis die app begonnen hat und das `deviceready`-Ereignis ausgelöst hat. Aber da in der Regel der Splash-Screen soll sichtbar sein, bevor die Anwendung gestartet wurde, scheint die Niederlage der Zweck des Begrüßungsbildschirms. Somit einige Konfiguration in der Datei `config.xml` werden automatisch die Splash `show` sofort nach Ihrer app-Start und Bildschirm bevor es voll begonnen hat, und das `deviceready`-Ereignis empfangen. Weitere Informationen zu dieser Konfiguration finden Sie unter [Symbole und Splash-Screens](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). Aus diesem Grund ist es unwahrscheinlich, dass Sie `navigator.splashscreen.show()` damit den Splash-Screen sichtbar ist für app-Start aufrufen müssen. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/de/index.md b/node_modules/cordova-plugin-splashscreen/doc/de/index.md new file mode 100644 index 0000000..b9fc40d --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/de/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +Dieses Plugin zeigt und verbirgt einen Splash-Screen beim Start der Anwendung. + +## Installation + + cordova plugin add cordova-plugin-splashscreen + + +## Unterstützte Plattformen + +* Amazon Fire OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 und 8 +* Windows 8 + +## Methoden + +* SplashScreen.Show +* SplashScreen.Hide + +### Android Eigenarten + +Sie müssen in der config.xml folgende Einstellungen vornehmen: + + + + + +Wo Foo ist der Name der Datei Splashscreen, vorzugsweise eine 9-Patch-Datei. Stellen Sie sicher, Splashcreen Dateien zu Ihrem res/xml-Verzeichnis unter den entsprechenden Ordnern hinzuzufügen. Der zweite Parameter stellt dar, wie lange das Splashscreen in Millisekunden angezeigt werden. Es wird standardmäßig auf 3000 ms. Weitere Informationen finden Sie unter [Symbole und Splash-Screens][1]. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## SplashScreen.Hide + +Schließen Sie den Splash-Screen. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Eigenarten + +Die Datei `config.xml` `AutoHideSplashScreen` Einstellung muss `false` sein. Verstecken des Begrüßungsbildschirms für zwei Sekunden Verzögerung, fügen Sie einen Timer wie die folgende in der `deviceready`-Ereignishandler: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## SplashScreen.Show + +Zeigt den Begrüßungsbildschirm. + + navigator.splashscreen.show(); + + +Ihre Anwendung kann nicht `navigator.splashscreen.show()` aufrufen, bis die app begonnen hat und das `deviceready`-Ereignis ausgelöst hat. Aber da in der Regel der Splash-Screen soll sichtbar sein, bevor die Anwendung gestartet wurde, scheint die Niederlage der Zweck des Begrüßungsbildschirms. Somit einige Konfiguration in der Datei `config.xml` werden automatisch die Splash `show` sofort nach Ihrer app-Start und Bildschirm bevor es voll begonnen hat, und das `deviceready`-Ereignis empfangen. Weitere Informationen zu dieser Konfiguration finden Sie unter [Symbole und Splash-Screens][1]. Aus diesem Grund ist es unwahrscheinlich, dass Sie `navigator.splashscreen.show()` damit den Splash-Screen sichtbar ist für app-Start aufrufen müssen. diff --git a/node_modules/cordova-plugin-splashscreen/doc/es/README.md b/node_modules/cordova-plugin-splashscreen/doc/es/README.md new file mode 100644 index 0000000..1a94161 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/es/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +Este plugin muestra y esconde una pantalla de bienvenida durante el inicio de la aplicación. + +## Instalación + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## Plataformas soportadas + + * Amazon fire OS + * Android + * BlackBerry 10 + * iOS + * Windows Phone 7 y 8 + * Windows 8 + * Windows + * Explorador + +## Métodos + + * splashscreen.show + * splashscreen.hide + +### Rarezas Android + +En el `archivo config.xml`, es necesario agregar las siguientes preferencias: + + + + + + +Donde foo es el nombre del archivo splashscreen, preferiblemente un archivo de 9 parche. Asegúrese de agregar tus archivos splashcreen en tu directorio res/xml bajo las carpetas apropiadas. El segundo parámetro representa cuánto aparecerán el splashscreen en milisegundos. Valor predeterminado es ms 3000. Ver [los iconos y salpicadura pantallas](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) para obtener más información. + +Preferencia "SplashMaintainAspectRatio" es opcional. Si establece en true, pantalla dibujable no es estirado para caber la pantalla, pero en su lugar simplemente "cover" la pantalla, como CSS "background-size: cover". Esto es muy útil cuando las imágenes de pantallas splash no distorsionadas de cualquier manera, por ejemplo cuando contienen texto o paisaje. Esta opción funciona mejor con imágenes que tienen bordes grandes (zonas seguras) que pueden ser recortadas con seguridad en pantallas con diferentes relaciones de aspecto. + +El plugin recarga splash dibujable cuando cambia de orientación, por lo que puede especificar diferente dibujo para orientaciones vertical y horizontal. + +### Navegador rarezas + +Puede utilizar las siguientes preferencias en el `archivo config.xml`: + + + + + + + + + + + +### iOS rarezas + + * `FadeSplashScreen` (booleano, por defecto `true`): establecida en `false` para evitar que la pantalla de bienvenida de descolorarse adentro y hacia fuera cuando cambia su estado de presentación. + + + + + * `FadeSplashScreenDuration` (float, por defecto es `2`): especifica el número de segundos para que la pantalla se descolora efecto para ejecutar. + + + + + * `ShowSplashScreenSpinner` (booleano, por defecto `true`): establecida en `false` para ocultar la ruleta de la pantalla de bienvenida. + + + + +## splashscreen.hide + +Despedir a la pantalla de bienvenida. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +El `config.xml` del archivo `AutoHideSplashScreen` la configuración debe ser `false` . Para retrasar oculta la pantalla splash durante dos segundos, agregue un temporizador como la siguiente en el `deviceready` controlador de eventos: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +Muestra la pantalla de bienvenida. + + navigator.splashscreen.show(); + + +La aplicación no se puede llamar `navigator.splashscreen.show()` hasta que haya iniciado la aplicación y el `deviceready` evento ha despedido. Pero puesto que normalmente la pantalla está destinada a ser visible antes de que comience su aplicación, que parecería que el propósito de la pantalla de bienvenida. Proporcionar cierta configuración en `config.xml` automáticamente `show` la pantalla de presentación inmediatamente después de su lanzamiento de la aplicación y antes de ser completamente ha iniciado y recibió el `deviceready` evento. Ver [los iconos y salpicadura pantallas](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) para obtener más información sobre haciendo esta configuración. Por esta razón, es poco probable que necesitas llamar a `navigator.splashscreen.show()` para hacer la pantalla visible para el inicio de la aplicación. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/es/index.md b/node_modules/cordova-plugin-splashscreen/doc/es/index.md new file mode 100644 index 0000000..3295c27 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/es/index.md @@ -0,0 +1,76 @@ + + +# cordova-plugin-splashscreen + +Este plugin muestra y esconde una pantalla de bienvenida durante el inicio de la aplicación. + +## Instalación + + cordova plugin add cordova-plugin-splashscreen + + +## Plataformas soportadas + +* Amazon fire OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 y 8 +* Windows 8 + +## Métodos + +* splashscreen.show +* splashscreen.hide + +### Rarezas Android + +En el archivo config.xml, tienes que añadir las siguientes preferencias: + + < nombre de preferencia = "SplashScreen" value = "foo" / >< nombre de preferencia = "SplashScreenDelay" value = "10000" / > + + +Donde foo es el nombre del archivo splashscreen, preferiblemente un archivo de 9 parche. Asegúrese de agregar tus archivos splashcreen en tu directorio res/xml bajo las carpetas apropiadas. El segundo parámetro representa cuánto aparecerán el splashscreen en milisegundos. Valor predeterminado es ms 3000. Ver [los iconos y salpicadura pantallas][1] para obtener más información. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.hide + +Despedir a la pantalla de bienvenida. + + Navigator.SplashScreen.Hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +El `config.xml` del archivo `AutoHideSplashScreen` la configuración debe ser `false` . Para retrasar oculta la pantalla splash durante dos segundos, agregue un temporizador como la siguiente en el `deviceready` controlador de eventos: + + setTimeout(function() {navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +Muestra la pantalla de bienvenida. + + Navigator.SplashScreen.Show(); + + +La aplicación no se puede llamar `navigator.splashscreen.show()` hasta que haya iniciado la aplicación y el `deviceready` evento ha despedido. Pero puesto que normalmente la pantalla está destinada a ser visible antes de que comience su aplicación, que parecería que el propósito de la pantalla de bienvenida. Proporcionar cierta configuración en `config.xml` automáticamente `show` la pantalla de presentación inmediatamente después de su lanzamiento de la aplicación y antes de ser completamente ha iniciado y recibió el `deviceready` evento. Ver [los iconos y salpicadura pantallas][1] para obtener más información sobre haciendo esta configuración. Por esta razón, es poco probable que necesitas llamar a `navigator.splashscreen.show()` para hacer la pantalla visible para el inicio de la aplicación. diff --git a/node_modules/cordova-plugin-splashscreen/doc/fr/README.md b/node_modules/cordova-plugin-splashscreen/doc/fr/README.md new file mode 100644 index 0000000..65f5880 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/fr/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +Ce plugin affiche et masque un écran de démarrage lors du lancement de l'application. + +## Installation + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## Plates-formes supportées + + * Amazon Fire OS + * Android + * BlackBerry 10 + * iOS + * Windows Phone 7 et 8 + * Windows 8 + * Windows + * Navigateur + +## Méthodes + + * splashscreen.Show + * splashscreen.Hide + +### Quirks Android + +Dans votre `fichier config.xml`, vous devez ajouter les préférences suivantes : + + + + + + +Où foo est le nom du fichier splashscreen, préférablement un fichier de 9 correctif. Assurez-vous d'ajouter vos fichiers splashcreen dans votre répertoire res/xml dans les dossiers appropriés. Le deuxième paramètre représente combien de temps le splashscreen apparaîtra en millisecondes. Il est par défaut à 3000 ms. Pour plus d'informations, consultez [icônes et écrans de démarrage](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). + +Préférence de « SplashMaintainAspectRatio » est facultative. Si défini à true, écran de démarrage drawable n'est pas étirée pour s'adapter écran, mais plutôt simplement « couvre » l'écran, comme CSS "fond-taille : couverture". Ceci est très utile lorsque images écran de démarrage ne peut pas être déformées en quelque sorte, par exemple lorsqu'ils contiennent des décors ou texte. Ce paramètre fonctionne mieux avec des images qui ont des marges importantes (zones de sécurité) qui peuvent être recadrées en toute sécurité sur les écrans avec des proportions différentes. + +Le plugin recharge splash drawable chaque fois que l'orientation change, donc vous pouvez spécifier différents drawables pour les orientations portrait et paysage. + +### Bizarreries navigateur + +Vous pouvez utiliser les préférences suivantes dans votre `fichier config.xml`: + + + + + + + + + + + +### Notes au sujet d'iOS + + * `FadeSplashScreen` (boolean, par défaut est `true`): la valeur `false` pour empêcher l'écran de démarrage de fading in et out lorsque son état d'affichage est modifié. + + + + + * `FadeSplashScreenDuration` (float, la valeur par défaut `2`): spécifie le nombre de secondes que l'écran de démarrage s'estomper l'effet d'exécuter. + + + + + * `ShowSplashScreenSpinner` (boolean, par défaut est `true`): la valeur `false` pour masquer le cône de l'écran de démarrage. + + + + +## splashscreen.Hide + +Faire disparaître de l'écran de démarrage. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +Paramètre `AutoHideSplashScreen` du fichier `config.xml` doit avoir la valeur `false`. Pour retarder la cacher l'écran de démarrage pendant deux secondes, ajouter un minuteur semblable à la suivante dans le gestionnaire d'événements `deviceready` : + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.Show + +Affiche l'écran de démarrage. + + navigator.splashscreen.show(); + + +Votre application ne peut pas appeler `navigator.splashscreen.show()` jusqu'à ce que l'application a commencé et l'événement `deviceready` est déclenché. Mais puisqu'en général, l'écran de démarrage est destiné à être visible avant que votre application a commencé, qui semblerait à l'encontre des objectifs de l'écran de démarrage. Fournir une configuration dans le fichier `config.xml` automatiquement `show` le splash projettera immédiatement après votre lancement de l'app et avant qu'il a complètement démarré et a reçu l'événement `deviceready`. Voir les [icônes et les écrans de démarrage](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) pour plus d'informations sur la conduite de cette configuration. Pour cette raison, il est peu probable que vous devez appeler `navigator.splashscreen.show()` pour rendre l'écran de démarrage visible pour le démarrage de l'application. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/fr/index.md b/node_modules/cordova-plugin-splashscreen/doc/fr/index.md new file mode 100644 index 0000000..6d2fd08 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/fr/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +Ce plugin affiche et masque un écran de démarrage lors du lancement de l'application. + +## Installation + + cordova plugin add cordova-plugin-splashscreen + + +## Plates-formes prises en charge + +* Amazon Fire OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 et 8 +* Windows 8 + +## Méthodes + +* splashscreen.Show +* splashscreen.Hide + +### Quirks Android + +Dans votre fichier config.xml, vous devez ajouter les préférences suivantes : + + + + + +Où foo est le nom du fichier splashscreen, préférablement un fichier de 9 correctif. Assurez-vous d'ajouter vos fichiers splashcreen dans votre répertoire res/xml dans les dossiers appropriés. Le deuxième paramètre représente combien de temps le splashscreen apparaîtra en millisecondes. Il est par défaut à 3000 ms. Pour plus d'informations, consultez [icônes et écrans de démarrage][1]. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.Hide + +Faire disparaître de l'écran de démarrage. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +Paramètre `AutoHideSplashScreen` du fichier `config.xml` doit avoir la valeur `false`. Pour retarder la cacher l'écran de démarrage pendant deux secondes, ajouter un minuteur semblable à la suivante dans le gestionnaire d'événements `deviceready` : + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.Show + +Affiche l'écran de démarrage. + + navigator.splashscreen.show(); + + +Votre application ne peut pas appeler `navigator.splashscreen.show()` jusqu'à ce que l'application a commencé et l'événement `deviceready` est déclenché. Mais puisqu'en général, l'écran de démarrage est destiné à être visible avant que votre application a commencé, qui semblerait à l'encontre des objectifs de l'écran de démarrage. Fournir une configuration dans le fichier `config.xml` automatiquement `show` le splash projettera immédiatement après votre lancement de l'app et avant qu'il a complètement démarré et a reçu l'événement `deviceready`. Voir les [icônes et les écrans de démarrage][1] pour plus d'informations sur la conduite de cette configuration. Pour cette raison, il est peu probable que vous devez appeler `navigator.splashscreen.show()` pour rendre l'écran de démarrage visible pour le démarrage de l'application. diff --git a/node_modules/cordova-plugin-splashscreen/doc/it/README.md b/node_modules/cordova-plugin-splashscreen/doc/it/README.md new file mode 100644 index 0000000..2a6c6ba --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/it/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +Questo plugin Visualizza e nasconde una schermata iniziale durante l'avvio dell'applicazione. + +## Installazione + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## Piattaforme supportate + + * Amazon fuoco OS + * Android + * BlackBerry 10 + * iOS + * Windows Phone 7 e 8 + * Windows 8 + * Windows + * Browser + +## Metodi + + * splashscreen + * splashscreen.Hide + +### Stranezze Android + +Nel vostro `config. XML`, è necessario aggiungere le seguenti preferenze: + + + + + + +Dove foo è il nome del file splashscreen, preferibilmente un file 9 patch. Assicurati di aggiungere i tuoi file splashcreen res/xml nella directory sotto cartelle appropriate. Il secondo parametro rappresenta quanto tempo lo splashscreen apparirà in millisecondi. Il valore predefinito è 3000 ms. Per ulteriori informazioni, vedere [icone e schermate iniziali](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). + +"SplashMaintainAspectRatio" preferenza è facoltativo. Se impostato su true, schermata iniziale drawable non viene adattata per misura lo schermo, ma invece semplicemente "copre" lo schermo, come CSS "sfondo-dimensione: copertina". Questo è molto utile quando immagini schermata iniziale non possono essere distorta in qualche modo, per esempio quando contengono testo o scenario. Questa impostazione funziona meglio con immagini che hanno grandi margini (zone sicure) che possono essere ritagliati in modo sicuro su schermi con proporzioni diverse. + +Il plugin viene ricaricata splash drawable ogni volta che cambia orientamento, è possibile specificare diversi parte per orientamento verticale e orizzontale. + +### Stranezze browser + +Nel vostro `config. XML`, è possibile utilizzare le seguenti preferenze: + + + + + + + + + + + +### iOS stranezze + + * `FadeSplashScreen` (boolean, impostazioni predefinite a `true`): impostare su `false` per impedire che la schermata iniziale e scompaiono quando cambia il relativo stato di visualizzazione. + + + + + * `FadeSplashScreenDuration` (float, il valore predefinito è `2`): specifica il numero di secondi per la schermata iniziale dissolvenza effetto da eseguire. + + + + + * `ShowSplashScreenSpinner` (boolean, impostazioni predefinite a `true`): impostare su `false` per nascondere la filatrice schermata iniziale. + + + + +## splashscreen.Hide + +Respingere la schermata iniziale. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +Impostazione `AutoHideSplashScreen` del file `config.xml` deve essere `false`. Per ritardare nascondendo la schermata iniziale per due secondi, aggiungere un timer ad esempio nel gestore eventi `deviceready`: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen + +Visualizza la schermata iniziale. + + navigator.splashscreen.show(); + + +L'applicazione non può chiamare `navigator.splashscreen.show()` fino a quando l'app ha iniziato e ha generato l'evento `deviceready`. Ma poiché in genere la schermata iniziale è destinata ad essere visibile prima app ha iniziato, che sembrerebbe per sconfiggere lo scopo della schermata iniziale. Fornendo qualche configurazione nel `file config.xml` sarà automaticamente `show` il tonfo schermo subito dopo il lancio dell'app e prima che completamente ha iniziato e ha ricevuto l'evento `deviceready`. Per ulteriori informazioni su facendo questa configurazione, vedere [icone e schermate iniziali](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). Per questo motivo, è improbabile che dovete chiamare `navigator.splashscreen.show()` per rendere la schermata visibile per avvio di app. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/it/index.md b/node_modules/cordova-plugin-splashscreen/doc/it/index.md new file mode 100644 index 0000000..7043541 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/it/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +Questo plugin Visualizza e nasconde una schermata iniziale durante l'avvio dell'applicazione. + +## Installazione + + cordova plugin add cordova-plugin-splashscreen + + +## Piattaforme supportate + +* Amazon fuoco OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 e 8 +* Windows 8 + +## Metodi + +* splashscreen +* splashscreen.Hide + +### Stranezze Android + +Nel vostro config. xml, è necessario aggiungere le seguenti preferenze: + + + + + +Dove foo è il nome del file splashscreen, preferibilmente un file 9 patch. Assicurati di aggiungere i tuoi file splashcreen res/xml nella directory sotto cartelle appropriate. Il secondo parametro rappresenta quanto tempo lo splashscreen apparirà in millisecondi. Il valore predefinito è 3000 ms. Per ulteriori informazioni, vedere [icone e schermate iniziali][1]. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.Hide + +Respingere la schermata iniziale. + + navigator.splashscreen.hide(); + + +### BlackBerry 10, WP8, iOS Quirk + +Impostazione `AutoHideSplashScreen` del file `config.xml` deve essere `false`. Per ritardare nascondendo la schermata iniziale per due secondi, aggiungere un timer ad esempio nel gestore eventi `deviceready`: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen + +Visualizza la schermata iniziale. + + navigator.splashscreen.show(); + + +L'applicazione non può chiamare `navigator.splashscreen.show()` fino a quando l'app ha iniziato e ha generato l'evento `deviceready`. Ma poiché in genere la schermata iniziale è destinata ad essere visibile prima app ha iniziato, che sembrerebbe per sconfiggere lo scopo della schermata iniziale. Fornendo qualche configurazione nel `file config.xml` sarà automaticamente `show` il tonfo schermo subito dopo il lancio dell'app e prima che completamente ha iniziato e ha ricevuto l'evento `deviceready`. Per ulteriori informazioni su facendo questa configurazione, vedere [icone e schermate iniziali][1]. Per questo motivo, è improbabile che dovete chiamare `navigator.splashscreen.show()` per rendere la schermata visibile per avvio di app. diff --git a/node_modules/cordova-plugin-splashscreen/doc/ja/README.md b/node_modules/cordova-plugin-splashscreen/doc/ja/README.md new file mode 100644 index 0000000..a688b27 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/ja/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +このプラグインが表示され、アプリケーションの起動中にスプラッシュ スクリーンを非表示にします。 + +## インストール + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## サポートされているプラットフォーム + + * アマゾン火 OS + * アンドロイド + * ブラックベリー 10 + * iOS + * Windows Phone 7 と 8 + * Windows 8 + * Windows + * ブラウザー + +## メソッド + + * splashscreen.show + * splashscreen.hide + +### Android の癖 + +あなたの`config.xml`内の次の設定を追加する必要があります。 + + + + + + +Foo ができれば 9 パッチファイル splashscreen ファイルの名前です。 解像度/xml ディレクトリの適切なフォルダーの下に splashcreen ファイルを追加することを確認します。 2 番目のパラメーターは、スプラッシュ ・ スクリーンがの表示時間 (ミリ秒単位) を表します。 デフォルトでは 3000 ミリ秒です。 詳細については、[アイコンとスプラッシュ画面](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) を参照してください。 + +"SplashMaintainAspectRatio"の設定はオプションです。 True の場合、スプラッシュ画面描画に設定画面を埋めるために拡大されませんが、代わりに単に「カバー」画面では、CSS のような場合「背景-サイズ: カバー」. これは、たとえば風景またはテキストが含まれている場合、任意の方法でスプラッシュ画面画像が歪むことができない非常に便利です。 この設定は、画面と異なる縦横比で安全にトリミングすることができます大規模なマージン (安全な地域) の画像に適しています。 + +縦長と横長の異なるドロウアブルを指定できるように、プラグインは向きを変更するたびにスプラッシュ ドロウアブルをリロードします。 + +### ブラウザーの癖 + +あなたの`config.xml`で次の設定を使用できます。 + + + + + + + + + + + +### iOS の癖 + + * `FadeSplashScreen`(ブール値、既定で [ `true`): スプラッシュ画面がフェードインとフェードアウトの表示状態が変更されたときすることを防ぐために`false`に設定します。 + + + + + * `FadeSplashScreenDuration`(float, デフォルトは`2`): スプラッシュ画面の秒数のフェードを実行する効果を指定します。 + + + + + * `ShowSplashScreenSpinner`(ブール値、既定で [ `true`): スプラッシュ スクリーン スピナーを非表示にするを`false`に設定します。 + + + + +## splashscreen.hide + +スプラッシュ スクリーンを閉じます。 + + navigator.splashscreen.hide(); + + +### ブラックベリー 10、WP8、iOS の気まぐれ + +`config.xml` ファイルの `AutoHideSplashScreen` の設定は `false` である必要があります。 遅延を 2 秒間スプラッシュ スクリーンを非表示に `deviceready` イベント ハンドラーで、次のようタイマーを追加します。 + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +スプラッシュ画面が表示されます。 + + navigator.splashscreen.show(); + + +アプリが開始され、`deviceready` イベントが発生するまで、アプリケーションは `navigator.splashscreen.show()` を呼び出すことはできません。 しかし、以来、通常スプラッシュ画面アプリ開始前に表示するものですと思われる、スプラッシュ スクリーンの目的の敗北します。 `config.xml` にいくつかの構成を提供するは自動的に `表示` スプラッシュ画面、アプリを起動後すぐに、それが完全に起動し、`deviceready` イベントを受信する前に。 詳細についてはこの構成を行うには、[アイコンとスプラッシュ画面](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) を参照してください。 この理由のためにアプリ起動時のスプラッシュ スクリーンを確認 `navigator.splashscreen.show()` をコールする必要がある可能性が高いです。 \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/ja/index.md b/node_modules/cordova-plugin-splashscreen/doc/ja/index.md new file mode 100644 index 0000000..24e72e5 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/ja/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +このプラグインが表示され、アプリケーションの起動中にスプラッシュ スクリーンを非表示にします。 + +## インストール + + cordova plugin add cordova-plugin-splashscreen + + +## サポートされているプラットフォーム + +* アマゾン火 OS +* アンドロイド +* ブラックベリー 10 +* iOS +* Windows Phone 7 と 8 +* Windows 8 + +## メソッド + +* splashscreen.show +* splashscreen.hide + +### Android の癖 + +あなたの config.xml を以下の設定を追加する必要があります。 + + + + + +Foo ができれば 9 パッチファイル splashscreen ファイルの名前です。 解像度/xml ディレクトリの適切なフォルダーの下に splashcreen ファイルを追加することを確認します。 2 番目のパラメーターは、スプラッシュ ・ スクリーンがの表示時間 (ミリ秒単位) を表します。 デフォルトでは 3000 ミリ秒です。 詳細については、[アイコンとスプラッシュ画面][1] を参照してください。 + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.hide + +スプラッシュ スクリーンを閉じます。 + + navigator.splashscreen.hide(); + + +### ブラックベリー 10、WP8、iOS の気まぐれ + +`config.xml` ファイルの `AutoHideSplashScreen` の設定は `false` である必要があります。 遅延を 2 秒間スプラッシュ スクリーンを非表示に `deviceready` イベント ハンドラーで、次のようタイマーを追加します。 + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +スプラッシュ画面が表示されます。 + + navigator.splashscreen.show(); + + +アプリが開始され、`deviceready` イベントが発生するまで、アプリケーションは `navigator.splashscreen.show()` を呼び出すことはできません。 しかし、以来、通常スプラッシュ画面アプリ開始前に表示するものですと思われる、スプラッシュ スクリーンの目的の敗北します。 `config.xml` にいくつかの構成を提供するは自動的に `表示` スプラッシュ画面、アプリを起動後すぐに、それが完全に起動し、`deviceready` イベントを受信する前に。 詳細についてはこの構成を行うには、[アイコンとスプラッシュ画面][1] を参照してください。 この理由のためにアプリ起動時のスプラッシュ スクリーンを確認 `navigator.splashscreen.show()` をコールする必要がある可能性が高いです。 diff --git a/node_modules/cordova-plugin-splashscreen/doc/ko/README.md b/node_modules/cordova-plugin-splashscreen/doc/ko/README.md new file mode 100644 index 0000000..5e10d20 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/ko/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +이 플러그인은 표시 하 고 응용 프로그램 실행 하는 동안 시작 화면을 숨깁니다. + +## 설치 + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## 지원 되는 플랫폼 + + * 아마존 화재 운영 체제 + * 안 드 로이드 + * 블랙베리 10 + * iOS + * Windows Phone 7과 8 + * 윈도우 8 + * 윈도우 + * 브라우저 + +## 메서드 + + * splashscreen.show + * splashscreen.hide + +### 안 드 로이드 단점 + +`Config.xml`에 다음 환경 설정에 추가 해야 합니다. + + + + + + +여기서 foo splashscreen 파일, 선호 9 패치 파일의 이름입니다. 적절 한 폴더 아래 res/xml 디렉토리에 splashcreen 파일을 추가 해야 합니다. 두 번째 매개 변수는 splashscreen 얼마나 밀리초 단위로 표시 됩니다 나타냅니다. 3000 ms 기본값으로 사용 됩니다. 자세한 내용은 [아이콘 및 시작 화면을](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) 참조 하십시오. + +"SplashMaintainAspectRatio" 취향은 선택 사항입니다. Drawable, 시작 화면 설정 화면에 맞게 확장 되지 하지만 대신 단순히 "커버" CSS 같은 화면 "배경-크기: 덮개". 시작 화면 이미지 예: 풍경 또는 텍스트를 포함 하는 경우 어떤 식으로든에서 왜곡 될 수 없는 경우에 매우 유용 합니다. 이 설정은 큰 여백 (안전 지역) 안전 하 게 다른 종횡비와 화면에 자를 수 있는 이미지에 가장 적합 합니다. + +플러그인 다시 로드 스플래시 drawable 방향이 변경 될 때마다 세로 및 가로 방향에 대 한 다른 drawables를 지정할 수 있도록 합니다. + +### 브라우저 만지면 + +`Config.xml`에 다음 기본 설정을 사용할 수 있습니다. + + + + + + + + + + + +### iOS 단점 + + * `FadeSplashScreen` (부울 `true`로 기본값): 시작 화면 표시 상태로 변경 될 때 밖으로 퇴색 하지 않도록 하려면 `false` 로 설정. + + + + + * `FadeSplashScreenDuration` (부동, `2`기본값): 시작 화면에 대 한 초 페이드 효과를 실행 하는 지정 합니다. + + + + + * `ShowSplashScreenSpinner` (부울 `true`로 기본값): 스플래시 화면 회전자를 숨기려면 `false` 로 설정. + + + + +## splashscreen.hide + +시작 화면을 닫습니다. + + navigator.splashscreen.hide(); + + +### 블랙베리 10, WP8, iOS 특질 + +`config.xml` 파일의 `AutoHideSplashScreen` 설정을 `false` 여야 합니다. 2 초 동안 시작 화면을 숨기고 지연, `deviceready` 이벤트 처리기에서 다음과 같은 타이머를 추가: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +시작 화면을 표시합니다. + + navigator.splashscreen.show(); + + +응용 프로그램 시작 및 `deviceready` 이벤트는 발생 될 때까지 응용 프로그램이 `navigator.splashscreen.show()`을 호출할 수 없습니다. 하지만 그 스플래시 스크린의 목적 것 같다 일반적으로 시작 화면이 당신의 애플 리 케이 션 시작 하기 전에 표시 될 운명이 다, 이후. `config.xml에서` 몇 가지 구성을 제공 하 자동으로 스플래시 `표시` 화면 애플 리 케이 션 출시 직후와 그것은 완벽 하 게 시작 하 고 `deviceready` 이벤트를 받은 전에. 이 구성 하 고 자세한 내용은 [아이콘 및 시작 화면을](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) 참조 하십시오. 이러한 이유로, 그것은 가능성이 시작 화면은 응용 프로그램 시작에 대 한 표시 되도록 `navigator.splashscreen.show()`를 호출 해야입니다. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/ko/index.md b/node_modules/cordova-plugin-splashscreen/doc/ko/index.md new file mode 100644 index 0000000..6a0ea98 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/ko/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +이 플러그인은 표시 하 고 응용 프로그램 실행 하는 동안 시작 화면을 숨깁니다. + +## 설치 + + cordova plugin add cordova-plugin-splashscreen + + +## 지원 되는 플랫폼 + +* 아마존 화재 운영 체제 +* 안 드 로이드 +* 블랙베리 10 +* iOS +* Windows Phone 7과 8 +* 윈도우 8 + +## 메서드 + +* splashscreen.show +* splashscreen.hide + +### 안 드 로이드 단점 + +당신의 config.xml에 다음 환경 설정에 추가 해야 합니다. + + + + + +여기서 foo splashscreen 파일, 선호 9 패치 파일의 이름입니다. 적절 한 폴더 아래 res/xml 디렉토리에 splashcreen 파일을 추가 해야 합니다. 두 번째 매개 변수는 splashscreen 얼마나 밀리초 단위로 표시 됩니다 나타냅니다. 3000 ms 기본값으로 사용 됩니다. 자세한 내용은 [아이콘 및 시작 화면을][1] 참조 하십시오. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.hide + +시작 화면을 닫습니다. + + navigator.splashscreen.hide(); + + +### 블랙베리 10, WP8, iOS 특질 + +`config.xml` 파일의 `AutoHideSplashScreen` 설정을 `false` 여야 합니다. 2 초 동안 시작 화면을 숨기고 지연, `deviceready` 이벤트 처리기에서 다음과 같은 타이머를 추가: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +시작 화면을 표시합니다. + + navigator.splashscreen.show(); + + +응용 프로그램 시작 및 `deviceready` 이벤트는 발생 될 때까지 응용 프로그램이 `navigator.splashscreen.show()`을 호출할 수 없습니다. 하지만 그 스플래시 스크린의 목적 것 같다 일반적으로 시작 화면이 당신의 애플 리 케이 션 시작 하기 전에 표시 될 운명이 다, 이후. `config.xml에서` 몇 가지 구성을 제공 하 자동으로 스플래시 `표시` 화면 애플 리 케이 션 출시 직후와 그것은 완벽 하 게 시작 하 고 `deviceready` 이벤트를 받은 전에. 이 구성 하 고 자세한 내용은 [아이콘 및 시작 화면을][1] 참조 하십시오. 이러한 이유로, 그것은 가능성이 시작 화면은 응용 프로그램 시작에 대 한 표시 되도록 `navigator.splashscreen.show()`를 호출 해야입니다. diff --git a/node_modules/cordova-plugin-splashscreen/doc/pl/README.md b/node_modules/cordova-plugin-splashscreen/doc/pl/README.md new file mode 100644 index 0000000..0156be5 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/pl/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +Ten plugin wyświetla i ukrywa ekran powitalny podczas uruchamiania aplikacji. + +## Instalacja + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## Obsługiwane platformy + + * Amazon Fire OS + * Android + * BlackBerry 10 + * iOS + * Windows Phone 7 i 8 + * Windows 8 + * Windows + * Przeglądarka + +## Metody + + * splashscreen.show + * splashscreen.Hide + +### Dziwactwa Androida + +W pliku `config.xml`musisz dodać następujące preferencje: + + + + + + +Gdzie foo jest nazwą pliku ekranu powitalnego, najlepiej 9 łatce. Upewnij się dodać pliki splashcreen do katalogu res/xml w odpowiednich folderach. Drugi parametr reprezentuje, jak długo ekranu powitalnego pojawi się w milisekundach. Domyślnie 3000 ms. Aby uzyskać więcej informacji, zobacz [ikony i ekrany powitalne w aplikacjach](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). + +"SplashMaintainAspectRatio" preferencji jest opcjonalne. Jeśli zestaw na wartość true, ekran powitalny dolarowe nie jest rozciągnięty do ekranów, ale zamiast po prostu "obejmuje" ekranu, jak CSS "tło-rozmiar: okładka". Jest to bardzo przydatne, kiedy opryskać tęcza obrazy nie zniekształcony w jakikolwiek sposób, na przykład, gdy zawierają one dekoracje lub tekst. To ustawienie działa najlepiej z obrazów, które mają duże marginesy (bezpiecznych obszarów), które mogą być bezpiecznie przycięte na ekrany z różnych proporcji. + +Plugin ładuje rozchlapać dolarowe, gdy zmienia orientację, tak można określić różnych drawables do orientacji pionowej i poziomej. + +### Quirks przeglądarki + +W pliku `config.xml`można użyć następujące preferencje: + + + + + + + + + + + +### Dziwactwa iOS + + * `FadeSplashScreen` (wartość logiczna, domyślnie `true`): zestaw na `false` , aby zapobiec Znikająca i odkładane po zmianie stanu wyświetlania ekranu powitalnego. + + + + + * `FadeSplashScreenDuration` (float, domyślnie `2`): określa liczbę sekund dla ekranu powitalnego zanikanie efekt do wykonać. + + + + + * `ShowSplashScreenSpinner` (wartość logiczna, domyślnie `true`): zestaw na `false` , aby ukryć pokrętła ekran powitalny. + + + + +## splashscreen.Hide + +Odrzucić ten opryskaæ têcza. + + navigator.splashscreen.hide(); + + +### Jeżyna 10, WP8, iOS dziwactwo + +Plik `config.xml` `AutoHideSplashScreen` ustawienie musi być `false`. Opóźnienia, ukrywanie ekranu powitalnego przez dwie sekundy, dodać timer następujących w `deviceready` obsługa zdarzeń: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +Wyświetla ekran powitalny. + + navigator.splashscreen.show(); + + +Aplikacja nie można wywołać `navigator.splashscreen.show()`, aż aplikacja została uruchomiona i zdarzenie `deviceready` został zwolniony. Ale ponieważ zazwyczaj opryskać tęcza ma być widoczne przed rozpoczęciem aplikacji, wydaje się sprzeczne z celem ekranu powitalnego. Dostarczanie niektórych konfiguracji w `pliku config.xml` będzie automatycznie `show` splash na ekranie natychmiast po uruchomienie aplikacji i przed pełni rozpoczął i odebrał zdarzenie `deviceready`. Aby uzyskać więcej informacji na robienie tej konfiguracji, zobacz [ikony i ekrany powitalne w aplikacjach](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html). Z tego powodu jest mało prawdopodobne, należy zadzwonić `navigator.splashscreen.show()`, aby wyświetlić ekran powitalny dla uruchamiania aplikacji. \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/pl/index.md b/node_modules/cordova-plugin-splashscreen/doc/pl/index.md new file mode 100644 index 0000000..33045cb --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/pl/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +Ten plugin wyświetla i ukrywa ekran powitalny podczas uruchamiania aplikacji. + +## Instalacja + + cordova plugin add cordova-plugin-splashscreen + + +## Obsługiwane platformy + +* Amazon Fire OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 i 8 +* Windows 8 + +## Metody + +* splashscreen.show +* splashscreen.Hide + +### Dziwactwa Androida + +W pliku config.xml musisz dodać następujące preferencje: + + + + + +Gdzie foo jest nazwą pliku ekranu powitalnego, najlepiej 9 łatce. Upewnij się dodać pliki splashcreen do katalogu res/xml w odpowiednich folderach. Drugi parametr reprezentuje, jak długo ekranu powitalnego pojawi się w milisekundach. Domyślnie 3000 ms. Aby uzyskać więcej informacji, zobacz [ikony i ekrany powitalne w aplikacjach][1]. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.Hide + +Odrzucić ten opryskaæ têcza. + + navigator.splashscreen.hide(); + + +### Jeżyna 10, WP8, iOS dziwactwo + +Plik `config.xml` `AutoHideSplashScreen` ustawienie musi być `false`. Opóźnienia, ukrywanie ekranu powitalnego przez dwie sekundy, dodać timer następujących w `deviceready` obsługa zdarzeń: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +Wyświetla ekran powitalny. + + navigator.splashscreen.show(); + + +Aplikacja nie można wywołać `navigator.splashscreen.show()`, aż aplikacja została uruchomiona i zdarzenie `deviceready` został zwolniony. Ale ponieważ zazwyczaj opryskać tęcza ma być widoczne przed rozpoczęciem aplikacji, wydaje się sprzeczne z celem ekranu powitalnego. Dostarczanie niektórych konfiguracji w `pliku config.xml` będzie automatycznie `show` splash na ekranie natychmiast po uruchomienie aplikacji i przed pełni rozpoczął i odebrał zdarzenie `deviceready`. Aby uzyskać więcej informacji na robienie tej konfiguracji, zobacz [ikony i ekrany powitalne w aplikacjach][1]. Z tego powodu jest mało prawdopodobne, należy zadzwonić `navigator.splashscreen.show()`, aby wyświetlić ekran powitalny dla uruchamiania aplikacji. diff --git a/node_modules/cordova-plugin-splashscreen/doc/ru/index.md b/node_modules/cordova-plugin-splashscreen/doc/ru/index.md new file mode 100644 index 0000000..635c22d --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/ru/index.md @@ -0,0 +1,75 @@ + + +# cordova-plugin-splashscreen + +Этот плагин отображает и скрывает экран-заставку при запуске приложения. + +## Установка + + cordova plugin add cordova-plugin-splashscreen + + +## Поддерживаемые платформы + +* Amazon Fire OS +* Android +* BlackBerry 10 +* iOS +* Windows Phone 7 и 8 +* Windows 8 + +## Методы + +* splashscreen.show +* splashscreen.hide + +### Особенности Android + +В вашем файле config.xml необходимо добавить следующие настройки: + +`` `` + +Где foo это имя файла splashscreen, желательно 9 заплатку. Убедитесь в том добавить ваши splashcreen файлы в папку res/xml в соответствующие папки. Второй параметр представляет, как долго splashscreen появится в миллисекундах. По умолчанию он 3000 МС. Увидеть [иконки и заставки][1] для получения дополнительной информации. + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.hide + +Закройте экран-заставка. + + Navigator.SplashScreen.Hide(); + + +### Особенности BlackBerry 10, WP8, iOS + +`config.xml`Файла `AutoHideSplashScreen` должен быть `false` . Для задержки скрытия заставки на две секунды, добавить таймер, например в `deviceready` обработчик событий: + + setTimeout(function() {navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +Отображает экран-заставку. + + Navigator.SplashScreen.Show(); + + +Ваше приложение не может вызвать `navigator.splashscreen.show()` до тех пор, пока приложение началась и `deviceready` событие инициировано. Но поскольку обычно экран-заставка должен быть видимым до начала вашего приложения, что казалось бы поражение цели экрана-заставки. Предоставление некоторых конфигурации в `config.xml` будет автоматически `show` экран-заставку сразу же после запуска вашего приложения и перед его полностью запущен и получил `deviceready` событие. Увидеть [иконки и заставки][1] для получения дополнительной информации на делать этой конфигурации. По этой причине маловероятно, вам нужно вызвать `navigator.splashscreen.show()` для отображения экрана-заставки для запуска приложения. diff --git a/node_modules/cordova-plugin-splashscreen/doc/zh/README.md b/node_modules/cordova-plugin-splashscreen/doc/zh/README.md new file mode 100644 index 0000000..da37405 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/zh/README.md @@ -0,0 +1,119 @@ + + +# cordova-plugin-splashscreen + +[![Build Status](https://travis-ci.org/apache/cordova-plugin-splashscreen.svg)](https://travis-ci.org/apache/cordova-plugin-splashscreen) + +這個外掛程式顯示和隱藏在應用程式啟動期間的初始螢幕。 + +## 安裝 + + // npm hosted (new) id + cordova plugin add cordova-plugin-splashscreen + // you may also install directly from this repo + cordova plugin add https://github.com/apache/cordova-plugin-splashscreen.git + + +## 支援的平臺 + + * 亞馬遜火 OS + * Android 系統 + * 黑莓 10 + * iOS + * Windows Phone 7 和 8 + * Windows 8 + * Windows + * 瀏覽器 + +## 方法 + + * splashscreen.show + * splashscreen.hide + +### Android 的怪癖 + +在你的`config.xml`,您需要添加以下優惠: + + + + + + +美孚在哪裡閃屏檔,最好是 9 修補程式檔的名稱。 請確保您的 splashcreen 檔添加到 res/xml 目錄下相應的資料夾。 第二個參數表示多久閃屏會顯示以毫秒為單位。 它將預設為 3000 毫秒。 有關更多資訊,請參見 [圖示和啟動畫面](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html)。 + +"SplashMaintainAspectRatio"首選項是可選的。 如果設置為 true,可繪製的初始螢幕不會拉伸以適合螢幕,但相反只是"覆蓋"螢幕,像 CSS"背景-大小: 蓋"。 這是非常有用的不能以任何方式,例如當他們包含文本或風景畸變閃屏圖像時。 此設置適用于有大利潤 (安全區),可以安全地裁剪不同長寬比與螢幕上的圖像。 + +該外掛程式重新載入初始可繪製只要方向發生變化,所以您可以指定不同的畫板為縱向和橫向方向。 + +### 瀏覽器的怪癖 + +你可以用你的`config.xml`下列優先選項: + + + + + + + + + + + +### iOS 的怪癖 + + * `FadeSplashScreen`(預設為`true`的布林值): 設置為`false` ,以防止出現閃屏衰落和退出其顯示狀態發生變化時。 + + + + + * `FadeSplashScreenDuration`(float,預設為`2`): 指定的閃屏秒數淡出效果來執行。 + + + + + * `ShowSplashScreenSpinner`(boolean, `true`的布林值): 設置為`false`來隱藏初始螢幕微調框。 + + + + +## splashscreen.hide + +解雇的閃屏。 + + navigator.splashscreen.hide(); + + +### 黑莓 10,WP8,iOS 怪癖 + +`config.xml` 檔 `AutoHideSplashScreen` 設置必須是 `假` 的。 若要延遲兩秒鐘隱藏的閃屏,`deviceready` 事件處理常式中添加一個計時器,如下所示: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +顯示初始螢幕。 + + navigator.splashscreen.show(); + + +您的應用程式無法調用 `navigator.splashscreen.show()`,直到該應用程式已啟動,且觸發了 `deviceready` 事件。 但是,由於通常的閃屏為了是可見的在您的應用程式啟動之前,這似乎會打敗閃屏的目的。 提供一些配置在 `config.xml` 中的會自動 `show` 初始螢幕您的應用程式啟動後立即和之前它已經完全起步並收到 `deviceready` 事件。 做這種配置的詳細資訊,請參閱 [圖示和啟動畫面](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html)。 出於此原因,不太可能您需要調用 `navigator.splashscreen.show()`,使初始螢幕可見為應用程式啟動。 \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/doc/zh/index.md b/node_modules/cordova-plugin-splashscreen/doc/zh/index.md new file mode 100644 index 0000000..efb309d --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/doc/zh/index.md @@ -0,0 +1,78 @@ + + +# cordova-plugin-splashscreen + +這個外掛程式顯示和隱藏在應用程式啟動期間的初始螢幕。 + +## 安裝 + + cordova plugin add cordova-plugin-splashscreen + + +## 支援的平臺 + +* 亞馬遜火 OS +* Android 系統 +* 黑莓 10 +* iOS +* Windows Phone 7 和 8 +* Windows 8 + +## 方法 + +* splashscreen.show +* splashscreen.hide + +### Android 的怪癖 + +在你的 config.xml,您需要添加以下優惠: + + + + + +美孚在哪裡閃屏檔,最好是 9 修補程式檔的名稱。 請確保您的 splashcreen 檔添加到 res/xml 目錄下相應的資料夾。 第二個參數表示多久閃屏會顯示以毫秒為單位。 它將預設為 3000 毫秒。 有關更多資訊,請參見 [圖示和啟動畫面][1]。 + + [1]: http://cordova.apache.org/docs/en/edge/config_ref_images.md.html + +## splashscreen.hide + +解雇的閃屏。 + + navigator.splashscreen.hide(); + + +### 黑莓 10,WP8,iOS 怪癖 + +`config.xml` 檔 `AutoHideSplashScreen` 設置必須是 `假` 的。 若要延遲兩秒鐘隱藏的閃屏,`deviceready` 事件處理常式中添加一個計時器,如下所示: + + setTimeout(function() { + navigator.splashscreen.hide(); + }, 2000); + + +## splashscreen.show + +顯示初始螢幕。 + + navigator.splashscreen.show(); + + +您的應用程式無法調用 `navigator.splashscreen.show()`,直到該應用程式已啟動,且觸發了 `deviceready` 事件。 但是,由於通常的閃屏為了是可見的在您的應用程式啟動之前,這似乎會打敗閃屏的目的。 提供一些配置在 `config.xml` 中的會自動 `show` 初始螢幕您的應用程式啟動後立即和之前它已經完全起步並收到 `deviceready` 事件。 做這種配置的詳細資訊,請參閱 [圖示和啟動畫面][1]。 出於此原因,不太可能您需要調用 `navigator.splashscreen.show()`,使初始螢幕可見為應用程式啟動。 diff --git a/node_modules/cordova-plugin-splashscreen/package.json b/node_modules/cordova-plugin-splashscreen/package.json new file mode 100644 index 0000000..d55365b --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/package.json @@ -0,0 +1,83 @@ +{ + "_from": "cordova-plugin-splashscreen@5.0.2", + "_id": "cordova-plugin-splashscreen@5.0.2", + "_inBundle": false, + "_integrity": "sha1-dH509W4gHNWFvGLRS8oZ9oZ/8e0=", + "_location": "/cordova-plugin-splashscreen", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "cordova-plugin-splashscreen@5.0.2", + "name": "cordova-plugin-splashscreen", + "escapedName": "cordova-plugin-splashscreen", + "rawSpec": "5.0.2", + "saveSpec": null, + "fetchSpec": "5.0.2" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz", + "_shasum": "747e74f56e201cd585bc62d14bca19f6867ff1ed", + "_spec": "cordova-plugin-splashscreen@5.0.2", + "_where": "/home/cromer/WebstormProjects/jvon-mobile", + "author": { + "name": "Apache Software Foundation" + }, + "bugs": { + "url": "https://issues.apache.org/jira/browse/CB" + }, + "bundleDependencies": false, + "cordova": { + "id": "cordova-plugin-splashscreen", + "platforms": [ + "android", + "ubuntu", + "ios", + "windows", + "browser" + ] + }, + "deprecated": false, + "description": "Cordova Splashscreen Plugin", + "devDependencies": { + "jshint": "^2.6.0" + }, + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + }, + "homepage": "https://github.com/apache/cordova-plugin-splashscreen#readme", + "keywords": [ + "cordova", + "splashscreen", + "ecosystem:cordova", + "cordova-android", + "cordova-ios", + "cordova-windows" + ], + "license": "Apache-2.0", + "name": "cordova-plugin-splashscreen", + "repository": { + "type": "git", + "url": "git+https://github.com/apache/cordova-plugin-splashscreen.git" + }, + "scripts": { + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests", + "test": "npm run jshint" + }, + "types": "./types/index.d.ts", + "version": "5.0.2" +} diff --git a/node_modules/cordova-plugin-splashscreen/plugin.xml b/node_modules/cordova-plugin-splashscreen/plugin.xml new file mode 100644 index 0000000..bf3c8a4 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/plugin.xml @@ -0,0 +1,82 @@ + + + + + Splashscreen + Cordova Splashscreen Plugin + Apache 2.0 + cordova,splashscreen + https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git + https://issues.apache.org/jira/browse/CB/component/12320653 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/src/android/SplashScreen.java b/node_modules/cordova-plugin-splashscreen/src/android/SplashScreen.java new file mode 100644 index 0000000..6f56c6c --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/android/SplashScreen.java @@ -0,0 +1,413 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.splashscreen; + +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Configuration; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Handler; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AlphaAnimation; +import android.view.animation.DecelerateInterpolator; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.json.JSONArray; +import org.json.JSONException; + +public class SplashScreen extends CordovaPlugin { + private static final String LOG_TAG = "SplashScreen"; + // Cordova 3.x.x has a copy of this plugin bundled with it (SplashScreenInternal.java). + // Enable functionality only if running on 4.x.x. + private static final boolean HAS_BUILT_IN_SPLASH_SCREEN = Integer.valueOf(CordovaWebView.CORDOVA_VERSION.split("\\.")[0]) < 4; + private static final int DEFAULT_SPLASHSCREEN_DURATION = 3000; + private static final int DEFAULT_FADE_DURATION = 500; + private static Dialog splashDialog; + private static ProgressDialog spinnerDialog; + private static boolean firstShow = true; + private static boolean lastHideAfterDelay; // https://issues.apache.org/jira/browse/CB-9094 + + /** + * Displays the splash drawable. + */ + private ImageView splashImageView; + + /** + * Remember last device orientation to detect orientation changes. + */ + private int orientation; + + // Helper to be compile-time compatible with both Cordova 3.x and 4.x. + private View getView() { + try { + return (View)webView.getClass().getMethod("getView").invoke(webView); + } catch (Exception e) { + return (View)webView; + } + } + + private int getSplashId() { + int drawableId = 0; + String splashResource = preferences.getString("SplashScreen", "screen"); + if (splashResource != null) { + drawableId = cordova.getActivity().getResources().getIdentifier(splashResource, "drawable", cordova.getActivity().getClass().getPackage().getName()); + if (drawableId == 0) { + drawableId = cordova.getActivity().getResources().getIdentifier(splashResource, "drawable", cordova.getActivity().getPackageName()); + } + } + return drawableId; + } + + @Override + protected void pluginInitialize() { + if (HAS_BUILT_IN_SPLASH_SCREEN) { + return; + } + // Make WebView invisible while loading URL + // CB-11326 Ensure we're calling this on UI thread + cordova.getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + getView().setVisibility(View.INVISIBLE); + } + }); + int drawableId = getSplashId(); + + // Save initial orientation. + orientation = cordova.getActivity().getResources().getConfiguration().orientation; + + if (firstShow) { + boolean autoHide = preferences.getBoolean("AutoHideSplashScreen", true); + showSplashScreen(autoHide); + } + + if (preferences.getBoolean("SplashShowOnlyFirstTime", true)) { + firstShow = false; + } + } + + /** + * Shorter way to check value of "SplashMaintainAspectRatio" preference. + */ + private boolean isMaintainAspectRatio () { + return preferences.getBoolean("SplashMaintainAspectRatio", false); + } + + private int getFadeDuration () { + int fadeSplashScreenDuration = preferences.getBoolean("FadeSplashScreen", true) ? + preferences.getInteger("FadeSplashScreenDuration", DEFAULT_FADE_DURATION) : 0; + + if (fadeSplashScreenDuration < 30) { + // [CB-9750] This value used to be in decimal seconds, so we will assume that if someone specifies 10 + // they mean 10 seconds, and not the meaningless 10ms + fadeSplashScreenDuration *= 1000; + } + + return fadeSplashScreenDuration; + } + + @Override + public void onPause(boolean multitasking) { + if (HAS_BUILT_IN_SPLASH_SCREEN) { + return; + } + // hide the splash screen to avoid leaking a window + this.removeSplashScreen(true); + } + + @Override + public void onDestroy() { + if (HAS_BUILT_IN_SPLASH_SCREEN) { + return; + } + // hide the splash screen to avoid leaking a window + this.removeSplashScreen(true); + // If we set this to true onDestroy, we lose track when we go from page to page! + //firstShow = true; + } + + @Override + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + if (action.equals("hide")) { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.postMessage("splashscreen", "hide"); + } + }); + } else if (action.equals("show")) { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.postMessage("splashscreen", "show"); + } + }); + } else { + return false; + } + + callbackContext.success(); + return true; + } + + @Override + public Object onMessage(String id, Object data) { + if (HAS_BUILT_IN_SPLASH_SCREEN) { + return null; + } + if ("splashscreen".equals(id)) { + if ("hide".equals(data.toString())) { + this.removeSplashScreen(false); + } else { + this.showSplashScreen(false); + } + } else if ("spinner".equals(id)) { + if ("stop".equals(data.toString())) { + getView().setVisibility(View.VISIBLE); + } + } else if ("onReceivedError".equals(id)) { + this.spinnerStop(); + } + return null; + } + + // Don't add @Override so that plugin still compiles on 3.x.x for a while + public void onConfigurationChanged(Configuration newConfig) { + if (newConfig.orientation != orientation) { + orientation = newConfig.orientation; + + // Splash drawable may change with orientation, so reload it. + if (splashImageView != null) { + int drawableId = getSplashId(); + if (drawableId != 0) { + splashImageView.setImageDrawable(cordova.getActivity().getResources().getDrawable(drawableId)); + } + } + } + } + + private void removeSplashScreen(final boolean forceHideImmediately) { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + if (splashDialog != null && splashDialog.isShowing()) { + final int fadeSplashScreenDuration = getFadeDuration(); + // CB-10692 If the plugin is being paused/destroyed, skip the fading and hide it immediately + if (fadeSplashScreenDuration > 0 && forceHideImmediately == false) { + AlphaAnimation fadeOut = new AlphaAnimation(1, 0); + fadeOut.setInterpolator(new DecelerateInterpolator()); + fadeOut.setDuration(fadeSplashScreenDuration); + + splashImageView.setAnimation(fadeOut); + splashImageView.startAnimation(fadeOut); + + fadeOut.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + spinnerStop(); + } + + @Override + public void onAnimationEnd(Animation animation) { + if (splashDialog != null && splashDialog.isShowing()) { + splashDialog.dismiss(); + splashDialog = null; + splashImageView = null; + } + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + } else { + spinnerStop(); + splashDialog.dismiss(); + splashDialog = null; + splashImageView = null; + } + } + } + }); + } + + /** + * Shows the splash screen over the full Activity + */ + @SuppressWarnings("deprecation") + private void showSplashScreen(final boolean hideAfterDelay) { + final int splashscreenTime = preferences.getInteger("SplashScreenDelay", DEFAULT_SPLASHSCREEN_DURATION); + final int drawableId = getSplashId(); + + final int fadeSplashScreenDuration = getFadeDuration(); + final int effectiveSplashDuration = Math.max(0, splashscreenTime - fadeSplashScreenDuration); + + lastHideAfterDelay = hideAfterDelay; + + // Prevent to show the splash dialog if the activity is in the process of finishing + if (cordova.getActivity().isFinishing()) { + return; + } + // If the splash dialog is showing don't try to show it again + if (splashDialog != null && splashDialog.isShowing()) { + return; + } + if (drawableId == 0 || (splashscreenTime <= 0 && hideAfterDelay)) { + return; + } + + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + // Get reference to display + Display display = cordova.getActivity().getWindowManager().getDefaultDisplay(); + Context context = webView.getContext(); + + // Use an ImageView to render the image because of its flexible scaling options. + splashImageView = new ImageView(context); + splashImageView.setImageResource(drawableId); + LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + splashImageView.setLayoutParams(layoutParams); + + splashImageView.setMinimumHeight(display.getHeight()); + splashImageView.setMinimumWidth(display.getWidth()); + + // TODO: Use the background color of the webView's parent instead of using the preference. + splashImageView.setBackgroundColor(preferences.getInteger("backgroundColor", Color.BLACK)); + + if (isMaintainAspectRatio()) { + // CENTER_CROP scale mode is equivalent to CSS "background-size:cover" + splashImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + } + else { + // FIT_XY scales image non-uniformly to fit into image view. + splashImageView.setScaleType(ImageView.ScaleType.FIT_XY); + } + + // Create and show the dialog + splashDialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar); + // check to see if the splash screen should be full screen + if ((cordova.getActivity().getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) + == WindowManager.LayoutParams.FLAG_FULLSCREEN) { + splashDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + splashDialog.setContentView(splashImageView); + splashDialog.setCancelable(false); + splashDialog.show(); + + if (preferences.getBoolean("ShowSplashScreenSpinner", true)) { + spinnerStart(); + } + + // Set Runnable to remove splash screen just in case + if (hideAfterDelay) { + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + public void run() { + if (lastHideAfterDelay) { + removeSplashScreen(false); + } + } + }, effectiveSplashDuration); + } + } + }); + } + + // Show only spinner in the center of the screen + private void spinnerStart() { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + spinnerStop(); + + spinnerDialog = new ProgressDialog(webView.getContext()); + spinnerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + spinnerDialog = null; + } + }); + + spinnerDialog.setCancelable(false); + spinnerDialog.setIndeterminate(true); + + RelativeLayout centeredLayout = new RelativeLayout(cordova.getActivity()); + centeredLayout.setGravity(Gravity.CENTER); + centeredLayout.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + + ProgressBar progressBar = new ProgressBar(webView.getContext()); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); + progressBar.setLayoutParams(layoutParams); + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + String colorName = preferences.getString("SplashScreenSpinnerColor", null); + if(colorName != null){ + int[][] states = new int[][] { + new int[] { android.R.attr.state_enabled}, // enabled + new int[] {-android.R.attr.state_enabled}, // disabled + new int[] {-android.R.attr.state_checked}, // unchecked + new int[] { android.R.attr.state_pressed} // pressed + }; + int progressBarColor = Color.parseColor(colorName); + int[] colors = new int[] { + progressBarColor, + progressBarColor, + progressBarColor, + progressBarColor + }; + ColorStateList colorStateList = new ColorStateList(states, colors); + progressBar.setIndeterminateTintList(colorStateList); + } + } + + centeredLayout.addView(progressBar); + + spinnerDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + spinnerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + spinnerDialog.show(); + spinnerDialog.setContentView(centeredLayout); + } + }); + } + + private void spinnerStop() { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + if (spinnerDialog != null && spinnerDialog.isShowing()) { + spinnerDialog.dismiss(); + spinnerDialog = null; + } + } + }); + } +} diff --git a/node_modules/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js b/node_modules/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js new file mode 100644 index 0000000..1a5cd30 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js @@ -0,0 +1,170 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// Default parameter values including image size can be changed in `config.xml` +var splashImageWidth = 170; +var splashImageHeight = 200; +var position = { x: 0, y: 0, width: splashImageWidth, height: splashImageHeight }; +var localSplash; // the image to display +var localSplashImage; +var bgColor = "#464646"; +var imageSrc = '/img/logo.png'; +var splashScreenDelay = 3000; // in milliseconds +var showSplashScreen = true; // show splashcreen by default +var cordova = require('cordova'); +var configHelper = cordova.require('cordova/confighelper'); +var autoHideSplashScreen = true; + +function updateImageLocation() { + position.width = Math.min(splashImageWidth, window.innerWidth); + position.height = position.width * (splashImageHeight / splashImageWidth); + + localSplash.style.width = window.innerWidth + "px"; + localSplash.style.height = window.innerHeight + "px"; + localSplash.style.top = "0px"; + localSplash.style.left = "0px"; + + localSplashImage.style.top = "50%"; + localSplashImage.style.left = "50%"; + localSplashImage.style.height = position.height + "px"; + localSplashImage.style.width = position.width + "px"; + localSplashImage.style.marginTop = (-position.height / 2) + "px"; + localSplashImage.style.marginLeft = (-position.width / 2) + "px"; +} + +function onResize() { + updateImageLocation(); +} + +var SplashScreen = { + setBGColor: function (cssBGColor) { + bgColor = cssBGColor; + if (localSplash) { + localSplash.style.backgroundColor = bgColor; + } + }, + show: function () { + if(!localSplash) { + window.addEventListener("resize", onResize, false); + localSplash = document.createElement("div"); + localSplash.style.backgroundColor = bgColor; + localSplash.style.position = "absolute"; + localSplash.style["z-index"] = "99999"; + + localSplashImage = document.createElement("img"); + localSplashImage.src = imageSrc; + localSplashImage.style.position = "absolute"; + + updateImageLocation(); + + localSplash.appendChild(localSplashImage); + document.body.appendChild(localSplash); + + // deviceready fires earlier than the plugin init on cold-start + if (SplashScreen.shouldHideImmediately) { + SplashScreen.shouldHideImmediately = false; + window.setTimeout(function () { + SplashScreen.hide(); + }, 1000); + } + } + }, + hide: function () { + if(localSplash) { + var innerLocalSplash = localSplash; + localSplash = null; + window.removeEventListener("resize", onResize, false); + + innerLocalSplash.style.opacity = '0'; + innerLocalSplash.style["-webkit-transition"] = "opacity 1s ease-in-out"; + innerLocalSplash.style["-moz-transition"] = "opacity 1s ease-in-out"; + innerLocalSplash.style["-ms-transition"] = "opacity 1s ease-in-out"; + innerLocalSplash.style["-o-transition"] = "opacity 1s ease-in-out"; + + window.setTimeout(function () { + document.body.removeChild(innerLocalSplash); + innerLocalSplash = null; + }, 1000); + } else { + SplashScreen.shouldHideImmediately = true; + } + } +}; + +/** + * Reads preferences via ConfigHelper and substitutes default parameters. + */ +function readPreferencesFromCfg(cfg) { + try { + var value = cfg.getPreferenceValue('ShowSplashScreen'); + if(typeof value != 'undefined') { + showSplashScreen = value === 'true'; + } + + splashScreenDelay = cfg.getPreferenceValue('SplashScreenDelay') || splashScreenDelay; + splashScreenDelay = parseInt(splashScreenDelay, 10); + + imageSrc = cfg.getPreferenceValue('SplashScreen') || imageSrc; + bgColor = cfg.getPreferenceValue('SplashScreenBackgroundColor') || bgColor; + splashImageWidth = cfg.getPreferenceValue('SplashScreenWidth') || splashImageWidth; + splashImageHeight = cfg.getPreferenceValue('SplashScreenHeight') || splashImageHeight; + autoHideSplashScreen = cfg.getPreferenceValue('AutoHideSplashScreen') || autoHideSplashScreen; + autoHideSplashScreen = (autoHideSplashScreen === true || autoHideSplashScreen.toLowerCase() === 'true'); + } catch(e) { + var msg = '[Browser][SplashScreen] Error occurred on loading preferences from config.xml: ' + JSON.stringify(e); + console.error(msg); + } +} + +/** + * Shows and hides splashscreen if it is enabled, with a delay according the current preferences. + */ +function showAndHide() { + if(showSplashScreen) { + SplashScreen.show(); + + window.setTimeout(function() { + SplashScreen.hide(); + }, splashScreenDelay); + } +} + +/** + * Tries to read config.xml and override default properties and then shows and hides splashscreen if it is enabled. + */ +(function initAndShow() { + configHelper.readConfig(function(config) { + readPreferencesFromCfg(config); + if (autoHideSplashScreen) { + showAndHide(); + } else { + SplashScreen.show(); + } + + }, function(err) { + console.error(err); + }); +})(); + +module.exports = SplashScreen; + +require("cordova/exec/proxy").add("SplashScreen", SplashScreen); + diff --git a/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h b/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h new file mode 100644 index 0000000..dcc0d77 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h @@ -0,0 +1,46 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import + +typedef struct { + BOOL iPhone; + BOOL iPad; + BOOL iPhone4; + BOOL iPhone5; + BOOL iPhone6; + BOOL iPhone6Plus; + BOOL retina; + BOOL iPhoneX; + +} CDV_iOSDevice; + +@interface CDVSplashScreen : CDVPlugin { + UIActivityIndicatorView* _activityView; + UIImageView* _imageView; + NSString* _curImageName; + BOOL _visible; + BOOL _destroyed; +} + +- (void)show:(CDVInvokedUrlCommand*)command; +- (void)hide:(CDVInvokedUrlCommand*)command; + +@end diff --git a/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m b/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m new file mode 100644 index 0000000..9b04582 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m @@ -0,0 +1,514 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVSplashScreen.h" +#import +#import +#import "CDVViewController+SplashScreen.h" + +#define kSplashScreenDurationDefault 3000.0f +#define kFadeDurationDefault 500.0f + + +@implementation CDVSplashScreen + +- (void)pluginInitialize +{ + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pageDidLoad) name:CDVPageDidLoadNotification object:nil]; + + [self setVisible:YES]; +} + +- (void)show:(CDVInvokedUrlCommand*)command +{ + [self setVisible:YES]; +} + +- (void)hide:(CDVInvokedUrlCommand*)command +{ + [self setVisible:NO andForce:YES]; +} + +- (void)pageDidLoad +{ + id autoHideSplashScreenValue = [self.commandDelegate.settings objectForKey:[@"AutoHideSplashScreen" lowercaseString]]; + + // if value is missing, default to yes + if ((autoHideSplashScreenValue == nil) || [autoHideSplashScreenValue boolValue]) { + [self setVisible:NO]; + } +} + +- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context +{ + [self updateImage]; +} + +- (void)createViews +{ + /* + * The Activity View is the top spinning throbber in the status/battery bar. We init it with the default Grey Style. + * + * whiteLarge = UIActivityIndicatorViewStyleWhiteLarge + * white = UIActivityIndicatorViewStyleWhite + * gray = UIActivityIndicatorViewStyleGray + * + */ + + // Determine whether rotation should be enabled for this device + // Per iOS HIG, landscape is only supported on iPad and iPhone 6+ + CDV_iOSDevice device = [self getCurrentDevice]; + BOOL autorotateValue = (device.iPad || device.iPhone6Plus || device.iPhoneX) ? + [(CDVViewController *)self.viewController shouldAutorotateDefaultValue] : + NO; + + [(CDVViewController *)self.viewController setEnabledAutorotation:autorotateValue]; + + NSString* topActivityIndicator = [self.commandDelegate.settings objectForKey:[@"TopActivityIndicator" lowercaseString]]; + UIActivityIndicatorViewStyle topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray; + + if ([topActivityIndicator isEqualToString:@"whiteLarge"]) + { + topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhiteLarge; + } + else if ([topActivityIndicator isEqualToString:@"white"]) + { + topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhite; + } + else if ([topActivityIndicator isEqualToString:@"gray"]) + { + topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray; + } + + UIView* parentView = self.viewController.view; + parentView.userInteractionEnabled = NO; // disable user interaction while splashscreen is shown + _activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:topActivityIndicatorStyle]; + _activityView.center = CGPointMake(parentView.bounds.size.width / 2, parentView.bounds.size.height / 2); + _activityView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin + | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin; + [_activityView startAnimating]; + + // Set the frame & image later. + _imageView = [[UIImageView alloc] init]; + [parentView addSubview:_imageView]; + + id showSplashScreenSpinnerValue = [self.commandDelegate.settings objectForKey:[@"ShowSplashScreenSpinner" lowercaseString]]; + // backwards compatibility - if key is missing, default to true + if ((showSplashScreenSpinnerValue == nil) || [showSplashScreenSpinnerValue boolValue]) + { + [parentView addSubview:_activityView]; + } + + // Frame is required when launching in portrait mode. + // Bounds for landscape since it captures the rotation. + [parentView addObserver:self forKeyPath:@"frame" options:0 context:nil]; + [parentView addObserver:self forKeyPath:@"bounds" options:0 context:nil]; + + [self updateImage]; + _destroyed = NO; +} + +- (void)hideViews +{ + [_imageView setAlpha:0]; + [_activityView setAlpha:0]; +} + +- (void)destroyViews +{ + _destroyed = YES; + [(CDVViewController *)self.viewController setEnabledAutorotation:[(CDVViewController *)self.viewController shouldAutorotateDefaultValue]]; + + [_imageView removeFromSuperview]; + [_activityView removeFromSuperview]; + _imageView = nil; + _activityView = nil; + _curImageName = nil; + + self.viewController.view.userInteractionEnabled = YES; // re-enable user interaction upon completion + @try { + [self.viewController.view removeObserver:self forKeyPath:@"frame"]; + [self.viewController.view removeObserver:self forKeyPath:@"bounds"]; + } + @catch (NSException *exception) { + // When reloading the page from a remotely connected Safari, there + // are no observers, so the removeObserver method throws an exception, + // that we can safely ignore. + // Alternatively we can check whether there are observers before calling removeObserver + } +} + +- (CDV_iOSDevice) getCurrentDevice +{ + CDV_iOSDevice device; + + UIScreen* mainScreen = [UIScreen mainScreen]; + CGFloat mainScreenHeight = mainScreen.bounds.size.height; + CGFloat mainScreenWidth = mainScreen.bounds.size.width; + + int limit = MAX(mainScreenHeight,mainScreenWidth); + + device.iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); + device.iPhone = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone); + device.retina = ([mainScreen scale] == 2.0); + device.iPhone4 = (device.iPhone && limit == 480.0); + device.iPhone5 = (device.iPhone && limit == 568.0); + // note these below is not a true device detect, for example if you are on an + // iPhone 6/6+ but the app is scaled it will prob set iPhone5 as true, but + // this is appropriate for detecting the runtime screen environment + device.iPhone6 = (device.iPhone && limit == 667.0); + device.iPhone6Plus = (device.iPhone && limit == 736.0); + device.iPhoneX = (device.iPhone && limit == 812.0); + + return device; +} + +- (BOOL) isUsingCDVLaunchScreen { + NSString* launchStoryboardName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; + if (launchStoryboardName) { + return ([launchStoryboardName isEqualToString:@"CDVLaunchScreen"]); + } else { + return NO; + } +} + +- (NSString*)getImageName:(UIInterfaceOrientation)currentOrientation delegate:(id)orientationDelegate device:(CDV_iOSDevice)device +{ + // Use UILaunchImageFile if specified in plist. Otherwise, use Default. + NSString* imageName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchImageFile"]; + + // detect if we are using CB-9762 Launch Storyboard; if so, return the associated image instead + if ([self isUsingCDVLaunchScreen]) { + imageName = @"LaunchStoryboard"; + return imageName; + } + + NSUInteger supportedOrientations = [orientationDelegate supportedInterfaceOrientations]; + + // Checks to see if the developer has locked the orientation to use only one of Portrait or Landscape + BOOL supportsLandscape = (supportedOrientations & UIInterfaceOrientationMaskLandscape); + BOOL supportsPortrait = (supportedOrientations & UIInterfaceOrientationMaskPortrait || supportedOrientations & UIInterfaceOrientationMaskPortraitUpsideDown); + // this means there are no mixed orientations in there + BOOL isOrientationLocked = !(supportsPortrait && supportsLandscape); + + if (imageName) + { + imageName = [imageName stringByDeletingPathExtension]; + } + else + { + imageName = @"Default"; + } + + // Add Asset Catalog specific prefixes + if ([imageName isEqualToString:@"LaunchImage"]) + { + if (device.iPhone4 || device.iPhone5 || device.iPad) { + imageName = [imageName stringByAppendingString:@"-700"]; + } else if(device.iPhone6) { + imageName = [imageName stringByAppendingString:@"-800"]; + } else if(device.iPhone6Plus || device.iPhoneX ) { + if(device.iPhone6Plus) { + imageName = [imageName stringByAppendingString:@"-800"]; + } else { + imageName = [imageName stringByAppendingString:@"-1100"]; + } + if (currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown) + { + imageName = [imageName stringByAppendingString:@"-Portrait"]; + } + } + } + + if (device.iPhone5) + { // does not support landscape + imageName = [imageName stringByAppendingString:@"-568h"]; + } + else if (device.iPhone6) + { // does not support landscape + imageName = [imageName stringByAppendingString:@"-667h"]; + } + else if (device.iPhone6Plus || device.iPhoneX) + { // supports landscape + if (isOrientationLocked) + { + imageName = [imageName stringByAppendingString:(supportsLandscape ? @"-Landscape" : @"")]; + } + else + { + switch (currentOrientation) + { + case UIInterfaceOrientationLandscapeLeft: + case UIInterfaceOrientationLandscapeRight: + imageName = [imageName stringByAppendingString:@"-Landscape"]; + break; + default: + break; + } + } + if (device.iPhoneX) { + imageName = [imageName stringByAppendingString:@"-2436h"]; + } else { + imageName = [imageName stringByAppendingString:@"-736h"]; + } + } + else if (device.iPad) + { // supports landscape + if (isOrientationLocked) + { + imageName = [imageName stringByAppendingString:(supportsLandscape ? @"-Landscape" : @"-Portrait")]; + } + else + { + switch (currentOrientation) + { + case UIInterfaceOrientationLandscapeLeft: + case UIInterfaceOrientationLandscapeRight: + imageName = [imageName stringByAppendingString:@"-Landscape"]; + break; + + case UIInterfaceOrientationPortrait: + case UIInterfaceOrientationPortraitUpsideDown: + default: + imageName = [imageName stringByAppendingString:@"-Portrait"]; + break; + } + } + } + + return imageName; +} + +- (UIInterfaceOrientation)getCurrentOrientation +{ + UIInterfaceOrientation iOrientation = [UIApplication sharedApplication].statusBarOrientation; + UIDeviceOrientation dOrientation = [UIDevice currentDevice].orientation; + + bool landscape; + + if (dOrientation == UIDeviceOrientationUnknown || dOrientation == UIDeviceOrientationFaceUp || dOrientation == UIDeviceOrientationFaceDown) { + // If the device is laying down, use the UIInterfaceOrientation based on the status bar. + landscape = UIInterfaceOrientationIsLandscape(iOrientation); + } else { + // If the device is not laying down, use UIDeviceOrientation. + landscape = UIDeviceOrientationIsLandscape(dOrientation); + + // There's a bug in iOS!!!! http://openradar.appspot.com/7216046 + // So values needs to be reversed for landscape! + if (dOrientation == UIDeviceOrientationLandscapeLeft) + { + iOrientation = UIInterfaceOrientationLandscapeRight; + } + else if (dOrientation == UIDeviceOrientationLandscapeRight) + { + iOrientation = UIInterfaceOrientationLandscapeLeft; + } + else if (dOrientation == UIDeviceOrientationPortrait) + { + iOrientation = UIInterfaceOrientationPortrait; + } + else if (dOrientation == UIDeviceOrientationPortraitUpsideDown) + { + iOrientation = UIInterfaceOrientationPortraitUpsideDown; + } + } + + return iOrientation; +} + +// Sets the view's frame and image. +- (void)updateImage +{ + NSString* imageName = [self getImageName:[self getCurrentOrientation] delegate:(id)self.viewController device:[self getCurrentDevice]]; + + if (![imageName isEqualToString:_curImageName]) + { + UIImage* img = [UIImage imageNamed:imageName]; + _imageView.image = img; + _curImageName = imageName; + } + + // Check that splash screen's image exists before updating bounds + if (_imageView.image) + { + [self updateBounds]; + } + else + { + NSLog(@"WARNING: The splashscreen image named %@ was not found", imageName); + } +} + +- (void)updateBounds +{ + if ([self isUsingCDVLaunchScreen]) { + // CB-9762's launch screen expects the image to fill the screen and be scaled using AspectFill. + CGSize viewportSize = [UIApplication sharedApplication].delegate.window.bounds.size; + _imageView.frame = CGRectMake(0, 0, viewportSize.width, viewportSize.height); + _imageView.contentMode = UIViewContentModeScaleAspectFill; + return; + } + + UIImage* img = _imageView.image; + CGRect imgBounds = (img) ? CGRectMake(0, 0, img.size.width, img.size.height) : CGRectZero; + + CGSize screenSize = [self.viewController.view convertRect:[UIScreen mainScreen].bounds fromView:nil].size; + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + CGAffineTransform imgTransform = CGAffineTransformIdentity; + + /* If and only if an iPhone application is landscape-only as per + * UISupportedInterfaceOrientations, the view controller's orientation is + * landscape. In this case the image must be rotated in order to appear + * correctly. + */ + CDV_iOSDevice device = [self getCurrentDevice]; + if (UIInterfaceOrientationIsLandscape(orientation) && !device.iPhone6Plus && !device.iPad && !device.iPhoneX) + { + imgTransform = CGAffineTransformMakeRotation(M_PI / 2); + imgBounds.size = CGSizeMake(imgBounds.size.height, imgBounds.size.width); + } + + // There's a special case when the image is the size of the screen. + if (CGSizeEqualToSize(screenSize, imgBounds.size)) + { + CGRect statusFrame = [self.viewController.view convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil]; + if (!(IsAtLeastiOSVersion(@"7.0"))) + { + imgBounds.origin.y -= statusFrame.size.height; + } + } + else if (imgBounds.size.width > 0) + { + CGRect viewBounds = self.viewController.view.bounds; + CGFloat imgAspect = imgBounds.size.width / imgBounds.size.height; + CGFloat viewAspect = viewBounds.size.width / viewBounds.size.height; + // This matches the behaviour of the native splash screen. + CGFloat ratio; + if (viewAspect > imgAspect) + { + ratio = viewBounds.size.width / imgBounds.size.width; + } + else + { + ratio = viewBounds.size.height / imgBounds.size.height; + } + imgBounds.size.height *= ratio; + imgBounds.size.width *= ratio; + } + + _imageView.transform = imgTransform; + _imageView.frame = imgBounds; +} + +- (void)setVisible:(BOOL)visible +{ + [self setVisible:visible andForce:NO]; +} + +- (void)setVisible:(BOOL)visible andForce:(BOOL)force +{ + if (visible != _visible || force) + { + _visible = visible; + + id fadeSplashScreenValue = [self.commandDelegate.settings objectForKey:[@"FadeSplashScreen" lowercaseString]]; + id fadeSplashScreenDuration = [self.commandDelegate.settings objectForKey:[@"FadeSplashScreenDuration" lowercaseString]]; + + float fadeDuration = fadeSplashScreenDuration == nil ? kFadeDurationDefault : [fadeSplashScreenDuration floatValue]; + + id splashDurationString = [self.commandDelegate.settings objectForKey: [@"SplashScreenDelay" lowercaseString]]; + float splashDuration = splashDurationString == nil ? kSplashScreenDurationDefault : [splashDurationString floatValue]; + + id autoHideSplashScreenValue = [self.commandDelegate.settings objectForKey:[@"AutoHideSplashScreen" lowercaseString]]; + BOOL autoHideSplashScreen = true; + + if (autoHideSplashScreenValue != nil) { + autoHideSplashScreen = [autoHideSplashScreenValue boolValue]; + } + + if (!autoHideSplashScreen) { + // CB-10412 SplashScreenDelay does not make sense if the splashscreen is hidden manually + splashDuration = 0; + } + + + if (fadeSplashScreenValue == nil) + { + fadeSplashScreenValue = @"true"; + } + + if (![fadeSplashScreenValue boolValue]) + { + fadeDuration = 0; + } + else if (fadeDuration < 30) + { + // [CB-9750] This value used to be in decimal seconds, so we will assume that if someone specifies 10 + // they mean 10 seconds, and not the meaningless 10ms + fadeDuration *= 1000; + } + + if (_visible) + { + if (_imageView == nil) + { + [self createViews]; + } + } + else if (fadeDuration == 0 && splashDuration == 0) + { + [self destroyViews]; + } + else + { + __weak __typeof(self) weakSelf = self; + float effectiveSplashDuration; + + // [CB-10562] AutoHideSplashScreen may be "true" but we should still be able to hide the splashscreen manually. + if (!autoHideSplashScreen || force) { + effectiveSplashDuration = (fadeDuration) / 1000; + } else { + effectiveSplashDuration = (splashDuration - fadeDuration) / 1000; + } + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (uint64_t) effectiveSplashDuration * NSEC_PER_SEC), dispatch_get_main_queue(), CFBridgingRelease(CFBridgingRetain(^(void) { + if (!_destroyed) { + [UIView transitionWithView:self.viewController.view + duration:(fadeDuration / 1000) + options:UIViewAnimationOptionTransitionNone + animations:^(void) { + [weakSelf hideViews]; + } + completion:^(BOOL finished) { + // Always destroy views, otherwise you could have an + // invisible splashscreen that is overlayed over your active views + // which causes that no touch events are passed + if (!_destroyed) { + [weakSelf destroyViews]; + // TODO: It might also be nice to have a js event happen here -jm + } + } + ]; + } + }))); + } + } +} + +@end diff --git a/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.h b/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.h new file mode 100644 index 0000000..a948ea3 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.h @@ -0,0 +1,28 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import + +@interface CDVViewController (SplashScreen) + +@property (nonatomic, assign) BOOL enabledAutorotation; +@property (nonatomic, readonly) BOOL shouldAutorotateDefaultValue; + + +@end diff --git a/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m b/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m new file mode 100644 index 0000000..e483def --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m @@ -0,0 +1,89 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVViewController+SplashScreen.h" +#import + +@implementation CDVViewController (SplashScreen) + +@dynamic enabledAutorotation; + +- (void)setEnabledAutorotation:(BOOL)value +{ + objc_setAssociatedObject(self, + @selector(enabledAutorotation), + [NSNumber numberWithBool:value], + OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)enabledAutorotation +{ + NSNumber *number = (NSNumber *)objc_getAssociatedObject(self, @selector(enabledAutorotation)); + + // Defaulting to YES to correspond parent CDVViewController behavior + if (number == nil) + { + return YES; + } + + return [number boolValue]; +} + ++ (void)load +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Class class = [self class]; + + SEL originalSelector = @selector(shouldAutorotate); + SEL swizzledSelector = @selector(splash_shouldAutorotate); + + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + + BOOL didAddMethod = class_addMethod(class, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (didAddMethod) { + class_replaceMethod(class, + swizzledSelector, + method_getImplementation(originalMethod), + method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } + }); +} + +#pragma mark - Method Swizzling + +- (BOOL)splash_shouldAutorotate +{ + return self.enabledAutorotation; +} + + +- (BOOL)shouldAutorotateDefaultValue +{ + return [self splash_shouldAutorotate]; +} + +@end diff --git a/node_modules/cordova-plugin-splashscreen/src/wp/ResolutionHelper.cs b/node_modules/cordova-plugin-splashscreen/src/wp/ResolutionHelper.cs new file mode 100644 index 0000000..050c392 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/wp/ResolutionHelper.cs @@ -0,0 +1,39 @@ +/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +using Microsoft.Phone.Info; +using System; +using System.Windows; + +namespace WPCordovaClassLib.Cordova.Commands +{ + public enum Resolutions { WVGA, WXGA, HD }; + + public static class ResolutionHelper + { + public static Resolutions CurrentResolution + { + get + { + switch (Application.Current.Host.Content.ScaleFactor) + { + case 100: return Resolutions.WVGA; + case 160: return Resolutions.WXGA; + case 150: return Resolutions.HD; + } + throw new InvalidOperationException("Unknown resolution"); + } + } + } +} \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/src/wp/SplashScreen.cs b/node_modules/cordova-plugin-splashscreen/src/wp/SplashScreen.cs new file mode 100644 index 0000000..c56d4ad --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/src/wp/SplashScreen.cs @@ -0,0 +1,255 @@ +/* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using Microsoft.Phone.Info; +using System.Windows.Controls.Primitives; +using System.Diagnostics; +using System.Windows.Media.Imaging; +using System.Windows.Resources; +using System.IO; +using System.Xml.Linq; +using System.Linq; +using System.Windows.Threading; + +namespace WPCordovaClassLib.Cordova.Commands +{ + /// + /// Listens for changes to the state of the battery on the device. + /// Currently only the "isPlugged" parameter available via native APIs. + /// + public class SplashScreen : BaseCommand + { + private Popup popup; + + // Time until we dismiss the splashscreen + private int prefDelay = 3000; + + // Whether we hide it by default + private bool prefAutoHide = true; + + // Path to image to use + private string prefImagePath = "SplashScreenImage.jpg"; + + // static because autodismiss is only ever applied once, at app launch + // subsequent page loads should not cause the SplashScreen to be shown. + private static bool WasShown = false; + + public SplashScreen() + { + LoadConfigPrefs(); + + Image SplashScreen = new Image() + { + Height = Application.Current.Host.Content.ActualHeight, + Width = Application.Current.Host.Content.ActualWidth, + Stretch = Stretch.Fill + }; + + var imageResource = GetSplashScreenImageResource(); + if (imageResource != null) + { + BitmapImage splash_image = new BitmapImage(); + splash_image.SetSource(imageResource.Stream); + SplashScreen.Source = splash_image; + } + + // Instansiate the popup and set the Child property of Popup to SplashScreen + popup = new Popup() { IsOpen = false, + Child = SplashScreen, + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Center + + }; + } + + public override void OnInit() + { + // we only want to autoload on the first page load. + // but OnInit is called for every page load. + if (!SplashScreen.WasShown) + { + SplashScreen.WasShown = true; + show(); + } + } + + private void LoadConfigPrefs() + { + StreamResourceInfo streamInfo = Application.GetResourceStream(new Uri("config.xml", UriKind.Relative)); + if (streamInfo != null) + { + using (StreamReader sr = new StreamReader(streamInfo.Stream)) + { + //This will Read Keys Collection for the xml file + XDocument configFile = XDocument.Parse(sr.ReadToEnd()); + + string configAutoHide = configFile.Descendants() + .Where(x => x.Name.LocalName == "preference") + .Where(x => (string)x.Attribute("name") == "AutoHideSplashScreen") + .Select(x => (string)x.Attribute("value")) + .FirstOrDefault(); + + bool bVal; + prefAutoHide = bool.TryParse(configAutoHide, out bVal) ? bVal : prefAutoHide; + + string configDelay = configFile.Descendants() + .Where(x => x.Name.LocalName == "preference") + .Where(x => (string)x.Attribute("name") == "SplashScreenDelay") + .Select(x => (string)x.Attribute("value")) + .FirstOrDefault(); + int nVal; + prefDelay = int.TryParse(configDelay, out nVal) ? nVal : prefDelay; + + string configImage = configFile.Descendants() + .Where(x => x.Name.LocalName == "preference") + .Where(x => (string)x.Attribute("name") == "SplashScreen") + .Select(x => (string)x.Attribute("value")) + .FirstOrDefault(); + + if (!String.IsNullOrEmpty(configImage)) + { + prefImagePath = configImage; + } + } + } + } + + private StreamResourceInfo GetSplashScreenImageResource() + { + // Get the base filename for the splash screen images + string imageName = System.IO.Path.GetFileNameWithoutExtension(prefImagePath); + Uri imageUri = null; + StreamResourceInfo imageResource = null; + + // First, try to get a resolution-specific splashscreen + try + { + // Determine the device's resolution + switch (ResolutionHelper.CurrentResolution) + { + case Resolutions.HD: + imageUri = new Uri(imageName + ".screen-720p.jpg", UriKind.Relative); + break; + + case Resolutions.WVGA: + imageUri = new Uri(imageName + ".screen-WVGA.jpg", UriKind.Relative); + break; + + case Resolutions.WXGA: + default: + imageUri = new Uri(imageName + ".screen-WXGA.jpg", UriKind.Relative); + break; + } + + imageResource = Application.GetResourceStream(imageUri); + } + catch (Exception) + { + // It's OK if we didn't get a resolution-specific image + } + + // Fallback to the default image name without decoration + if (imageResource == null) + { + imageUri = new Uri(prefImagePath, UriKind.Relative); + imageResource = Application.GetResourceStream(imageUri); + } + + if (imageUri != null) Debug.WriteLine("INFO :: SplashScreen: using image {0}", imageUri.OriginalString); + + return imageResource; + } + + public void show(string options = null) + { + Deployment.Current.Dispatcher.BeginInvoke(() => + { + if (!popup.IsOpen) + { + popup.Child.Opacity = 0; + + Storyboard story = new Storyboard(); + DoubleAnimation animation = new DoubleAnimation() + { + From = 0.0, + To = 1.0, + Duration = new Duration(TimeSpan.FromSeconds(0.2)) + }; + + Storyboard.SetTarget(animation, popup.Child); + Storyboard.SetTargetProperty(animation, new PropertyPath("Opacity")); + story.Children.Add(animation); + + story.Begin(); + + popup.IsOpen = true; + + if (prefAutoHide) + { + StartAutoHideTimer(); + } + } + }); + } + + public void hide(string options = null) + { + Deployment.Current.Dispatcher.BeginInvoke(() => + { + if (popup.IsOpen) + { + popup.Child.Opacity = 1.0; + + Storyboard story = new Storyboard(); + DoubleAnimation animation = new DoubleAnimation() + { + From = 1.0, + To = 0.0, + Duration = new Duration(TimeSpan.FromSeconds(0.4)) + }; + + Storyboard.SetTarget(animation, popup.Child); + Storyboard.SetTargetProperty(animation, new PropertyPath("Opacity")); + story.Children.Add(animation); + story.Completed += (object sender, EventArgs e) => + { + popup.IsOpen = false; + }; + story.Begin(); + } + }); + } + + private void StartAutoHideTimer() + { + var timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(prefDelay) }; + timer.Tick += (object sender, EventArgs e) => + { + hide(); + timer.Stop(); + }; + timer.Start(); + } + } +} diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/contents.xcworkspacedata b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2dd325a --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout new file mode 100644 index 0000000..7e4cdb9 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 6BE9AD73-1B9F-4362-98D7-DC631BEC6185 + IDESourceControlProjectName + CDVSplashScreenTest + IDESourceControlProjectOriginsDictionary + + BEF5A5D0FF64801E558286389440357A9233D7DB + https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git + + IDESourceControlProjectPath + tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + BEF5A5D0FF64801E558286389440357A9233D7DB + ../../../../.. + + IDESourceControlProjectURL + https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + BEF5A5D0FF64801E558286389440357A9233D7DB + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + BEF5A5D0FF64801E558286389440357A9233D7DB + IDESourceControlWCCName + cordova-plugin-splashscreen + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme new file mode 100644 index 0000000..13f9a15 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/.npmignore b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/.npmignore new file mode 100644 index 0000000..c795b05 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/.npmignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTest.m b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTest.m new file mode 100644 index 0000000..1637d24 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTest.m @@ -0,0 +1,702 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import +#import +#import "CDVSplashScreen.h" +#import "ImageNameTestDelegates.h" + +const CDV_iOSDevice CDV_iOSDeviceZero = { 0, 0, 0, 0, 0, 0 }; + +@interface ImageNameTest : XCTestCase + +@property (nonatomic, strong) CDVSplashScreen* plugin; + +@end + +@interface CDVSplashScreen () + +// expose private interface +- (NSString*)getImageName:(UIInterfaceOrientation)currentOrientation delegate:(id)orientationDelegate device:(CDV_iOSDevice)device; + +@end + +@implementation ImageNameTest + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. + + self.plugin = [[CDVSplashScreen alloc] init]; +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void) orientationHelper:(id)delegate expectedImageNameDictionary:(NSDictionary*)expectedImageNameDictionary device:(CDV_iOSDevice)device{ + + NSString* name = nil; + NSString* expectedImageName = nil; + UIInterfaceOrientation currentOrientation; + NSString* deviceName = device.iPad? @"iPad" : device.iPhone6Plus? @"iPhone6Plus": device.iPhone6? @"iPhone6": device.iPhone5? @"iPhone5" : @"iPhone"; + + // LandscapeLeft, should always return expectedImageName + currentOrientation = UIInterfaceOrientationLandscapeLeft; + name = [self.plugin getImageName:currentOrientation delegate:delegate device:device]; + expectedImageName = [expectedImageNameDictionary objectForKey:@"landscapeLeft"]; + XCTAssertTrue([expectedImageName isEqualToString:name], @"%@ - %@ failed (%@)", @"Landscape", deviceName, name); + + // LandscapeRight - should always return expectedImageName + currentOrientation = UIInterfaceOrientationLandscapeRight; + name = [self.plugin getImageName:currentOrientation delegate:delegate device:device]; + expectedImageName = [expectedImageNameDictionary objectForKey:@"landscapeRight"]; + XCTAssertTrue([expectedImageName isEqualToString:name], @"%@ - %@ failed (%@)", @"Landscape", deviceName, name); + + // Portrait - should always return expectedImageName + currentOrientation = UIInterfaceOrientationPortrait; + name = [self.plugin getImageName:currentOrientation delegate:delegate device:device]; + expectedImageName = [expectedImageNameDictionary objectForKey:@"portrait"]; + XCTAssertTrue([expectedImageName isEqualToString:name], @"%@ - %@ failed (%@)", @"Portrait", deviceName, name); + + // PortraitUpsideDown - should always return expectedImageName + currentOrientation = UIInterfaceOrientationPortraitUpsideDown; + name = [self.plugin getImageName:currentOrientation delegate:delegate device:device]; + expectedImageName = [expectedImageNameDictionary objectForKey:@"portraitUpsideDown"]; + XCTAssertTrue([expectedImageName isEqualToString:name], @"%@ - %@ failed (%@)", @"Portrait", deviceName, name); +} + +- (void)testiPadOrientation { + + CDV_iOSDevice device = CDV_iOSDeviceZero; + device.iPad = YES; + + // One orientation + + PortraitOnly* delegate = [[PortraitOnly alloc] init]; + [self orientationHelper:delegate expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Portrait", + @"landscapeRight" : @"Default-Portrait", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + PortraitUpsideDownOnly* delegate2 = [[PortraitUpsideDownOnly alloc] init]; + [self orientationHelper:delegate2 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Portrait", + @"landscapeRight" : @"Default-Portrait", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + LandscapeLeftOnly* delegate3 = [[LandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate3 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Landscape", + @"portraitUpsideDown" : @"Default-Landscape" + } + device:device]; + + LandscapeRightOnly* delegate4 = [[LandscapeRightOnly alloc] init]; + [self orientationHelper:delegate4 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Landscape", + @"portraitUpsideDown" : @"Default-Landscape" + } + device:device]; + + // All Portrait + + AllPortraitOnly* delegate5 = [[AllPortraitOnly alloc] init]; + [self orientationHelper:delegate5 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Portrait", + @"landscapeRight" : @"Default-Portrait", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + // All Landscape + + AllLandscapeOnly* delegate6 = [[AllLandscapeOnly alloc] init]; + [self orientationHelper:delegate6 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Landscape", + @"portraitUpsideDown" : @"Default-Landscape" + } + device:device]; + + + // All orientations + + AllOrientations* delegate7 = [[AllOrientations alloc] init]; + [self orientationHelper:delegate7 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + // Portrait and Landscape Left + + PortraitAndLandscapeLeftOnly* delegate8 = [[PortraitAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate8 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + // Portrait and Landscape Right + + PortraitAndLandscapeRightOnly* delegate9 = [[PortraitAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate9 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + // PortraitUpsideDown and Landscape Left + + PortraitUpsideDownAndLandscapeLeftOnly* delegate10 = [[PortraitUpsideDownAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate10 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; + + // PortraitUpsideDown and Landscape Right + + PortraitUpsideDownAndLandscapeRightOnly* delegate11 = [[PortraitUpsideDownAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate11 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape", + @"landscapeRight" : @"Default-Landscape", + @"portrait" : @"Default-Portrait", + @"portraitUpsideDown" : @"Default-Portrait" + } + device:device]; +} + +- (void)testiPhoneOrientation { + + CDV_iOSDevice device = CDV_iOSDeviceZero; + device.iPhone = YES; + + // One orientation + + PortraitOnly* delegate = [[PortraitOnly alloc] init]; + [self orientationHelper:delegate expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + PortraitUpsideDownOnly* delegate2 = [[PortraitUpsideDownOnly alloc] init]; + [self orientationHelper:delegate2 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + LandscapeLeftOnly* delegate3 = [[LandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate3 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + LandscapeRightOnly* delegate4 = [[LandscapeRightOnly alloc] init]; + [self orientationHelper:delegate4 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // All Portrait + + AllPortraitOnly* delegate5 = [[AllPortraitOnly alloc] init]; + [self orientationHelper:delegate5 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // All Landscape + + AllLandscapeOnly* delegate6 = [[AllLandscapeOnly alloc] init]; + [self orientationHelper:delegate6 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + + // All orientations + + AllOrientations* delegate7 = [[AllOrientations alloc] init]; + [self orientationHelper:delegate7 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // Portrait and Landscape Left + + PortraitAndLandscapeLeftOnly* delegate8 = [[PortraitAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate8 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // Portrait and Landscape Right + + PortraitAndLandscapeRightOnly* delegate9 = [[PortraitAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate9 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // PortraitUpsideDown and Landscape Left + + PortraitUpsideDownAndLandscapeLeftOnly* delegate10 = [[PortraitUpsideDownAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate10 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; + + // PortraitUpsideDown and Landscape Right + + PortraitUpsideDownAndLandscapeRightOnly* delegate11 = [[PortraitUpsideDownAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate11 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default", + @"landscapeRight" : @"Default", + @"portrait" : @"Default", + @"portraitUpsideDown" : @"Default" + } + device:device]; +} + +- (void)testiPhone5Orientation { + + CDV_iOSDevice device = CDV_iOSDeviceZero; + device.iPhone = YES; + device.iPhone5 = YES; + + // One orientation + + PortraitOnly* delegate = [[PortraitOnly alloc] init]; + [self orientationHelper:delegate expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + PortraitUpsideDownOnly* delegate2 = [[PortraitUpsideDownOnly alloc] init]; + [self orientationHelper:delegate2 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + LandscapeLeftOnly* delegate3 = [[LandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate3 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + LandscapeRightOnly* delegate4 = [[LandscapeRightOnly alloc] init]; + [self orientationHelper:delegate4 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // All Portrait + + AllPortraitOnly* delegate5 = [[AllPortraitOnly alloc] init]; + [self orientationHelper:delegate5 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // All Landscape + + AllLandscapeOnly* delegate6 = [[AllLandscapeOnly alloc] init]; + [self orientationHelper:delegate6 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + + // All orientations + + AllOrientations* delegate7 = [[AllOrientations alloc] init]; + [self orientationHelper:delegate7 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // Portrait and Landscape Left + + PortraitAndLandscapeLeftOnly* delegate8 = [[PortraitAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate8 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // Portrait and Landscape Right + + PortraitAndLandscapeRightOnly* delegate9 = [[PortraitAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate9 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // PortraitUpsideDown and Landscape Left + + PortraitUpsideDownAndLandscapeLeftOnly* delegate10 = [[PortraitUpsideDownAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate10 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; + + // PortraitUpsideDown and Landscape Right + + PortraitUpsideDownAndLandscapeRightOnly* delegate11 = [[PortraitUpsideDownAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate11 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-568h", + @"landscapeRight" : @"Default-568h", + @"portrait" : @"Default-568h", + @"portraitUpsideDown" : @"Default-568h" + } + device:device]; +} + +- (void)testiPhone6Orientation { + + CDV_iOSDevice device = CDV_iOSDeviceZero; + device.iPhone = YES; + device.iPhone6 = YES; + + // One orientation + + PortraitOnly* delegate = [[PortraitOnly alloc] init]; + [self orientationHelper:delegate expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + PortraitUpsideDownOnly* delegate2 = [[PortraitUpsideDownOnly alloc] init]; + [self orientationHelper:delegate2 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + LandscapeLeftOnly* delegate3 = [[LandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate3 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + LandscapeRightOnly* delegate4 = [[LandscapeRightOnly alloc] init]; + [self orientationHelper:delegate4 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // All Portrait + + AllPortraitOnly* delegate5 = [[AllPortraitOnly alloc] init]; + [self orientationHelper:delegate5 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // All Landscape + + AllLandscapeOnly* delegate6 = [[AllLandscapeOnly alloc] init]; + [self orientationHelper:delegate6 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + + // All orientations + + AllOrientations* delegate7 = [[AllOrientations alloc] init]; + [self orientationHelper:delegate7 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // Portrait and Landscape Left + + PortraitAndLandscapeLeftOnly* delegate8 = [[PortraitAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate8 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // Portrait and Landscape Right + + PortraitAndLandscapeRightOnly* delegate9 = [[PortraitAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate9 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // PortraitUpsideDown and Landscape Left + + PortraitUpsideDownAndLandscapeLeftOnly* delegate10 = [[PortraitUpsideDownAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate10 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; + + // PortraitUpsideDown and Landscape Right + + PortraitUpsideDownAndLandscapeRightOnly* delegate11 = [[PortraitUpsideDownAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate11 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-667h", + @"landscapeRight" : @"Default-667h", + @"portrait" : @"Default-667h", + @"portraitUpsideDown" : @"Default-667h" + } + device:device]; +} + +- (void)testiPhone6PlusOrientation { + + CDV_iOSDevice device = CDV_iOSDeviceZero; + device.iPhone = YES; + device.iPhone6Plus = YES; + + // One orientation + + PortraitOnly* delegate = [[PortraitOnly alloc] init]; + [self orientationHelper:delegate expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-736h", + @"landscapeRight" : @"Default-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + PortraitUpsideDownOnly* delegate2 = [[PortraitUpsideDownOnly alloc] init]; + [self orientationHelper:delegate2 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-736h", + @"landscapeRight" : @"Default-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + LandscapeLeftOnly* delegate3 = [[LandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate3 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-Landscape-736h", + @"portraitUpsideDown" : @"Default-Landscape-736h" + } + device:device]; + + LandscapeRightOnly* delegate4 = [[LandscapeRightOnly alloc] init]; + [self orientationHelper:delegate4 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-Landscape-736h", + @"portraitUpsideDown" : @"Default-Landscape-736h" + } + device:device]; + + // All Portrait + + AllPortraitOnly* delegate5 = [[AllPortraitOnly alloc] init]; + [self orientationHelper:delegate5 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-736h", + @"landscapeRight" : @"Default-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + // All Landscape + + AllLandscapeOnly* delegate6 = [[AllLandscapeOnly alloc] init]; + [self orientationHelper:delegate6 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-Landscape-736h", + @"portraitUpsideDown" : @"Default-Landscape-736h" + } + device:device]; + + + // All orientations + + AllOrientations* delegate7 = [[AllOrientations alloc] init]; + [self orientationHelper:delegate7 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + // Portrait and Landscape Left + + PortraitAndLandscapeLeftOnly* delegate8 = [[PortraitAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate8 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + // Portrait and Landscape Right + + PortraitAndLandscapeRightOnly* delegate9 = [[PortraitAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate9 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + // PortraitUpsideDown and Landscape Left + + PortraitUpsideDownAndLandscapeLeftOnly* delegate10 = [[PortraitUpsideDownAndLandscapeLeftOnly alloc] init]; + [self orientationHelper:delegate10 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; + + // PortraitUpsideDown and Landscape Right + + PortraitUpsideDownAndLandscapeRightOnly* delegate11 = [[PortraitUpsideDownAndLandscapeRightOnly alloc] init]; + [self orientationHelper:delegate11 expectedImageNameDictionary:@{ + @"landscapeLeft" : @"Default-Landscape-736h", + @"landscapeRight" : @"Default-Landscape-736h", + @"portrait" : @"Default-736h", + @"portraitUpsideDown" : @"Default-736h" + } + device:device]; +} + + + +@end diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.h b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.h new file mode 100644 index 0000000..be4a788 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.h @@ -0,0 +1,57 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import + +@interface PortraitOnly : NSObject +@end + +@interface PortraitUpsideDownOnly : NSObject +@end + +@interface AllPortraitOnly : NSObject +@end + + +@interface LandscapeLeftOnly : NSObject +@end + +@interface LandscapeRightOnly : NSObject +@end + +@interface AllLandscapeOnly : NSObject +@end + + +@interface AllOrientations : NSObject +@end + +@interface PortraitAndLandscapeLeftOnly : NSObject +@end + +@interface PortraitAndLandscapeRightOnly : NSObject +@end + +@interface PortraitUpsideDownAndLandscapeLeftOnly : NSObject +@end + +@interface PortraitUpsideDownAndLandscapeRightOnly : NSObject +@end + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.m b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.m new file mode 100644 index 0000000..b5a1b23 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/ImageNameTestDelegates.m @@ -0,0 +1,200 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import +#import "ImageNameTestDelegates.h" + +@implementation PortraitOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortrait; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation PortraitUpsideDownOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortraitUpsideDown; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation AllPortraitOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + + +@implementation LandscapeLeftOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskLandscapeLeft; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation LandscapeRightOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskLandscapeRight; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation AllLandscapeOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + + +@implementation AllOrientations + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskAll; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation PortraitAndLandscapeLeftOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation PortraitAndLandscapeRightOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeRight; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation PortraitUpsideDownAndLandscapeLeftOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortraitUpsideDown | UIInterfaceOrientationMaskLandscapeLeft; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + +@implementation PortraitUpsideDownAndLandscapeRightOnly + +- (NSUInteger)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskPortraitUpsideDown | UIInterfaceOrientationMaskLandscapeRight; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return [self supportedInterfaceOrientations] & (1 << interfaceOrientation) ; +} + +- (BOOL)shouldAutorotate { + return YES; +} + +@end + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/Info.plist b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/Info.plist new file mode 100644 index 0000000..95c8add --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenLibTests/Info.plist @@ -0,0 +1,44 @@ + + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.apache.cordova.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.pbxproj b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ce820d8 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.pbxproj @@ -0,0 +1,505 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 7E9F51AB19DA10AE00DA31AC /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9F51A919DA10AE00DA31AC /* CDVSplashScreen.m */; }; + 7E9F51B119DA114400DA31AC /* ImageNameTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9F51B019DA114400DA31AC /* ImageNameTest.m */; }; + 7E9F51B319DA116500DA31AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F51B219DA116500DA31AC /* Foundation.framework */; }; + 7E9F51B519DA127E00DA31AC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F51B419DA127E00DA31AC /* UIKit.framework */; }; + 7E9F51B819DA14FD00DA31AC /* ImageNameTestDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9F51B719DA14FD00DA31AC /* ImageNameTestDelegates.m */; }; + 7E9F51B919DA1B1600DA31AC /* libCDVSplashScreenLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F519519DA102000DA31AC /* libCDVSplashScreenLib.a */; }; + 7E9F51BA19DA1B2000DA31AC /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E9F519019DA0F8300DA31AC /* libCordova.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7E9F518F19DA0F8300DA31AC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 68A32D7114102E1C006B237C; + remoteInfo = CordovaLib; + }; + 7E9F51AC19DA10DE00DA31AC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7E9F517219DA09CE00DA31AC /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7E9F519419DA102000DA31AC; + remoteInfo = CDVSplashScreenLib; + }; + 7E9F51AE19DA10E100DA31AC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D2AAC07D0554694100DB518D; + remoteInfo = CordovaLib; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 7E9F519319DA102000DA31AC /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CordovaLib.xcodeproj; path = "../node_modules/cordova-ios/CordovaLib/CordovaLib.xcodeproj"; sourceTree = ""; }; + 7E9F519519DA102000DA31AC /* libCDVSplashScreenLib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCDVSplashScreenLib.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E9F519F19DA102000DA31AC /* CDVSplashScreenLibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CDVSplashScreenLibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E9F51A219DA102000DA31AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7E9F51A919DA10AE00DA31AC /* CDVSplashScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVSplashScreen.m; path = ../../../src/ios/CDVSplashScreen.m; sourceTree = SOURCE_ROOT; }; + 7E9F51AA19DA10AE00DA31AC /* CDVSplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVSplashScreen.h; path = ../../../src/ios/CDVSplashScreen.h; sourceTree = SOURCE_ROOT; }; + 7E9F51B019DA114400DA31AC /* ImageNameTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageNameTest.m; sourceTree = ""; }; + 7E9F51B219DA116500DA31AC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 7E9F51B419DA127E00DA31AC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 7E9F51B619DA12C600DA31AC /* ImageNameTestDelegates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageNameTestDelegates.h; sourceTree = ""; }; + 7E9F51B719DA14FD00DA31AC /* ImageNameTestDelegates.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageNameTestDelegates.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7E9F519219DA102000DA31AC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9F519C19DA102000DA31AC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E9F51BA19DA1B2000DA31AC /* libCordova.a in Frameworks */, + 7E9F51B919DA1B1600DA31AC /* libCDVSplashScreenLib.a in Frameworks */, + 7E9F51B519DA127E00DA31AC /* UIKit.framework in Frameworks */, + 7E9F51B319DA116500DA31AC /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7E9F517119DA09CE00DA31AC = { + isa = PBXGroup; + children = ( + 7E9F51B419DA127E00DA31AC /* UIKit.framework */, + 7E9F51B219DA116500DA31AC /* Foundation.framework */, + 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */, + 7E9F519619DA102000DA31AC /* CDVSplashScreenLib */, + 7E9F51A019DA102000DA31AC /* CDVSplashScreenLibTests */, + 7E9F517D19DA0A0A00DA31AC /* Products */, + ); + sourceTree = ""; + }; + 7E9F517D19DA0A0A00DA31AC /* Products */ = { + isa = PBXGroup; + children = ( + 7E9F519519DA102000DA31AC /* libCDVSplashScreenLib.a */, + 7E9F519F19DA102000DA31AC /* CDVSplashScreenLibTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 7E9F518C19DA0F8300DA31AC /* Products */ = { + isa = PBXGroup; + children = ( + 7E9F519019DA0F8300DA31AC /* libCordova.a */, + ); + name = Products; + sourceTree = ""; + }; + 7E9F519619DA102000DA31AC /* CDVSplashScreenLib */ = { + isa = PBXGroup; + children = ( + 7E9F51A919DA10AE00DA31AC /* CDVSplashScreen.m */, + 7E9F51AA19DA10AE00DA31AC /* CDVSplashScreen.h */, + ); + path = CDVSplashScreenLib; + sourceTree = SOURCE_ROOT; + }; + 7E9F51A019DA102000DA31AC /* CDVSplashScreenLibTests */ = { + isa = PBXGroup; + children = ( + 7E9F51A119DA102000DA31AC /* Supporting Files */, + 7E9F51B019DA114400DA31AC /* ImageNameTest.m */, + 7E9F51B619DA12C600DA31AC /* ImageNameTestDelegates.h */, + 7E9F51B719DA14FD00DA31AC /* ImageNameTestDelegates.m */, + ); + path = CDVSplashScreenLibTests; + sourceTree = ""; + }; + 7E9F51A119DA102000DA31AC /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 7E9F51A219DA102000DA31AC /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7E9F519419DA102000DA31AC /* CDVSplashScreenLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E9F51A319DA102000DA31AC /* Build configuration list for PBXNativeTarget "CDVSplashScreenLib" */; + buildPhases = ( + 7E9F519119DA102000DA31AC /* Sources */, + 7E9F519219DA102000DA31AC /* Frameworks */, + 7E9F519319DA102000DA31AC /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CDVSplashScreenLib; + productName = CDVSplashScreenLib; + productReference = 7E9F519519DA102000DA31AC /* libCDVSplashScreenLib.a */; + productType = "com.apple.product-type.library.static"; + }; + 7E9F519E19DA102000DA31AC /* CDVSplashScreenLibTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E9F51A619DA102000DA31AC /* Build configuration list for PBXNativeTarget "CDVSplashScreenLibTests" */; + buildPhases = ( + 7E9F519B19DA102000DA31AC /* Sources */, + 7E9F519C19DA102000DA31AC /* Frameworks */, + 7E9F519D19DA102000DA31AC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7E9F51AF19DA10E100DA31AC /* PBXTargetDependency */, + 7E9F51AD19DA10DE00DA31AC /* PBXTargetDependency */, + ); + name = CDVSplashScreenLibTests; + productName = CDVSplashScreenLibTests; + productReference = 7E9F519F19DA102000DA31AC /* CDVSplashScreenLibTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7E9F517219DA09CE00DA31AC /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + TargetAttributes = { + 7E9F519419DA102000DA31AC = { + CreatedOnToolsVersion = 6.0; + }; + 7E9F519E19DA102000DA31AC = { + CreatedOnToolsVersion = 6.0; + }; + }; + }; + buildConfigurationList = 7E9F517519DA09CE00DA31AC /* Build configuration list for PBXProject "CDVSplashScreenTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7E9F517119DA09CE00DA31AC; + productRefGroup = 7E9F517D19DA0A0A00DA31AC /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 7E9F518C19DA0F8300DA31AC /* Products */; + ProjectRef = 7E9F518B19DA0F8300DA31AC /* CordovaLib.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 7E9F519419DA102000DA31AC /* CDVSplashScreenLib */, + 7E9F519E19DA102000DA31AC /* CDVSplashScreenLibTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 7E9F519019DA0F8300DA31AC /* libCordova.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libCordova.a; + remoteRef = 7E9F518F19DA0F8300DA31AC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 7E9F519D19DA102000DA31AC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7E9F519119DA102000DA31AC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E9F51AB19DA10AE00DA31AC /* CDVSplashScreen.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9F519B19DA102000DA31AC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E9F51B119DA114400DA31AC /* ImageNameTest.m in Sources */, + 7E9F51B819DA14FD00DA31AC /* ImageNameTestDelegates.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7E9F51AD19DA10DE00DA31AC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7E9F519419DA102000DA31AC /* CDVSplashScreenLib */; + targetProxy = 7E9F51AC19DA10DE00DA31AC /* PBXContainerItemProxy */; + }; + 7E9F51AF19DA10E100DA31AC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = CordovaLib; + targetProxy = 7E9F51AE19DA10E100DA31AC /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 7E9F517619DA09CE00DA31AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 7E9F517719DA09CE00DA31AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 7E9F51A419DA102000DA31AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", + "\"$(OBJROOT)/UninstalledProducts/include\"", + "\"$(BUILT_PRODUCTS_DIR)\"", + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 7E9F51A519DA102000DA31AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", + "\n\"$(OBJROOT)/UninstalledProducts/include\"\n\"$(BUILT_PRODUCTS_DIR)\"", + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7E9F51A719DA102000DA31AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = CDVSplashScreenLibTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 7E9F51A819DA102000DA31AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = CDVSplashScreenLibTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7E9F517519DA09CE00DA31AC /* Build configuration list for PBXProject "CDVSplashScreenTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E9F517619DA09CE00DA31AC /* Debug */, + 7E9F517719DA09CE00DA31AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E9F51A319DA102000DA31AC /* Build configuration list for PBXNativeTarget "CDVSplashScreenLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E9F51A419DA102000DA31AC /* Debug */, + 7E9F51A519DA102000DA31AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E9F51A619DA102000DA31AC /* Build configuration list for PBXNativeTarget "CDVSplashScreenLibTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E9F51A719DA102000DA31AC /* Debug */, + 7E9F51A819DA102000DA31AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7E9F517219DA09CE00DA31AC /* Project object */; +} diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8f91278 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout new file mode 100644 index 0000000..7e4cdb9 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/project.xcworkspace/xcshareddata/CDVSplashScreenTest.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 6BE9AD73-1B9F-4362-98D7-DC631BEC6185 + IDESourceControlProjectName + CDVSplashScreenTest + IDESourceControlProjectOriginsDictionary + + BEF5A5D0FF64801E558286389440357A9233D7DB + https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git + + IDESourceControlProjectPath + tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + BEF5A5D0FF64801E558286389440357A9233D7DB + ../../../../.. + + IDESourceControlProjectURL + https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + BEF5A5D0FF64801E558286389440357A9233D7DB + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + BEF5A5D0FF64801E558286389440357A9233D7DB + IDESourceControlWCCName + cordova-plugin-splashscreen + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLib.xcscheme b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLib.xcscheme new file mode 100644 index 0000000..b97b863 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLib.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLibTests.xcscheme b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLibTests.xcscheme new file mode 100644 index 0000000..6a2a526 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/CDVSplashScreenTest/CDVSplashScreenTest.xcodeproj/xcshareddata/xcschemes/CDVSplashScreenLibTests.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/README.md new file mode 100644 index 0000000..97ee9df --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/README.md @@ -0,0 +1,40 @@ + + +# iOS Tests for CDVSplashScreen + +You need to install `node.js` to pull in `cordova-ios`. + +First install cordova-ios: + + npm install + +... in the current folder. + + +# Testing from Xcode + +1. Launch the `CDVSplashScreenTest.xcworkspace` file. +2. Choose "CDVSplashScreenLibTests" from the scheme drop-down menu +3. Click and hold on the `Play` button, and choose the `Wrench` icon to run the tests + + +# Testing from the command line + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/de/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/de/README.md new file mode 100644 index 0000000..9c7f0a4 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/de/README.md @@ -0,0 +1,39 @@ + + +# iOS-Tests für CDVSplashScreen + +Sie müssen installieren `node.js` in `Cordova-Ios` zu ziehen. + +Installieren Sie Cordova-Ios zum ersten Mal: + + npm install + + +... im aktuellen Ordner. + +# Testen von Xcode + + 1. Starten Sie die Datei `CDVSplashScreenTest.xcworkspace` . + 2. Wählen Sie im Dropdown-Schema "CDVSplashScreenLibTests" + 3. Klicken Sie und halten Sie auf den `Play` -Button und wählen Sie das `Schraubenschlüssel` -Symbol zum Ausführen der tests + +# Tests von der Befehlszeile aus + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/es/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/es/README.md new file mode 100644 index 0000000..2176c92 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/es/README.md @@ -0,0 +1,39 @@ + + +# Pruebas de iOS para CDVSplashScreen + +Necesita instalar `node.js` en `Córdoba-ios`. + +Primero instalar cordova-ios: + + npm install + + +... en la carpeta actual. + +# Prueba de Xcode + + 1. Iniciar el archivo `CDVSplashScreenTest.xcworkspace` . + 2. Elija "CDVSplashScreenLibTests" en el menú de lista desplegable esquema + 3. Haga clic y mantenga el botón de `Play` y elegir el icono de `llave inglesa` para ejecutar las pruebas + +# Pruebas desde la línea de comandos + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/fr/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/fr/README.md new file mode 100644 index 0000000..0dbbd0d --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/fr/README.md @@ -0,0 +1,39 @@ + + +# Tests d'iOS pour CDVSplashScreen + +Vous devez installer `node.js` à `cordova-ios`. + +Commencez par installer cordova-ios : + + npm install + + +... dans le dossier actuel. + +# Tests de Xcode + + 1. Lancez le fichier `CDVSplashScreenTest.xcworkspace` . + 2. Choisissez « CDVSplashScreenLibTests » dans le menu déroulant de régime + 3. Cliquez et maintenez sur la touche `Play` et cliquez sur l'icône de `clé` pour exécuter les tests + +# Test de la ligne de commande + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/it/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/it/README.md new file mode 100644 index 0000000..2a42df6 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/it/README.md @@ -0,0 +1,39 @@ + + +# Test di iOS per CDVSplashScreen + +È necessario installare `node. js` per tirare in `cordova-ios`. + +In primo luogo installare cordova-ios: + + npm install + + +... nella cartella corrente. + +# Test da Xcode + + 1. Lanciare il file `CDVSplashScreenTest.xcworkspace` . + 2. Scegli "CDVSplashScreenLibTests" dal menu a discesa Schema + 3. Fare clic e tenere premuto il pulsante `Play` e scegliere l'icona della `chiave inglese` per eseguire i test + +# Test dalla riga di comando + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ja/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ja/README.md new file mode 100644 index 0000000..011b824 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ja/README.md @@ -0,0 +1,39 @@ + + +# CDVSplashScreen の iOS のテスト + +`Node.js` `コルドバ`ios をプルするをインストールする必要があります。. + +コルドバ ios をインストールします。 + + npm install + + +現在のフォルダーに. + +# Xcode からテスト + + 1. `CDVSplashScreenTest.xcworkspace`ファイルを起動します。 + 2. スキーム] ドロップダウン メニューから"CDVSplashScreenLibTests"を選択します。 + 3. クリックし、`再生`ボタンを押し、テストを実行する`レンチ`のアイコンを選択 + +# コマンドラインからテスト + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ko/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ko/README.md new file mode 100644 index 0000000..6981207 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/ko/README.md @@ -0,0 +1,39 @@ + + +# CDVSplashScreen에 대 한 iOS 테스트 + +`Node.js` `코르도바` ios에서를 설치 해야. + +코르도바-ios를 설치 하는 첫번째는: + + npm install + + +현재 폴더에.... + +# Xcode에서 테스트 + + 1. `CDVSplashScreenTest.xcworkspace` 파일을 시작 합니다. + 2. 구성표 드롭 다운 메뉴에서 "CDVSplashScreenLibTests"를 선택 + 3. 클릭 하 고 `재생` 버튼에는 테스트를 실행 하려면 `공구 모양` 아이콘을 선택 + +# 명령줄에서 테스트 + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/pl/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/pl/README.md new file mode 100644 index 0000000..f13828f --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/pl/README.md @@ -0,0 +1,39 @@ + + +# iOS testy dla CDVSplashScreen + +Musisz zainstalować `node.js` ciągnąć w `cordova-ios`. + +Najpierw zainstalować cordova-ios: + + npm install + + +... w folderze bieżącym. + +# Badania z Xcode + + 1. Uruchom plik `CDVSplashScreenTest.xcworkspace` . + 2. Wybierz z menu rozwijanego systemu "CDVSplashScreenLibTests" + 3. Kliknij i przytrzymaj przycisk `Play` i wybrać ikonę `klucz` do testów + +# Badania z wiersza polecenia + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/doc/zh/README.md b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/zh/README.md new file mode 100644 index 0000000..3a04bcd --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/doc/zh/README.md @@ -0,0 +1,39 @@ + + +# CDVSplashScreen 的 iOS 測試 + +您需要安裝`node.js`拉`科爾多瓦 ios`中. + +第一次安裝科爾多瓦 ios: + + npm install + + +在當前資料夾中。 + +# 從 Xcode 測試 + + 1. 啟動`CDVSplashScreenTest.xcworkspace`檔。 + 2. 從方案下拉式功能表中選擇"CDVSplashScreenLibTests" + 3. 按一下並堅持`播放`按鈕,然後選擇要運行的測試的`扳手`圖示 + +# 從命令列測試 + + npm test diff --git a/node_modules/cordova-plugin-splashscreen/tests/ios/package.json b/node_modules/cordova-plugin-splashscreen/tests/ios/package.json new file mode 100644 index 0000000..67f0edc --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/ios/package.json @@ -0,0 +1,13 @@ +{ + "name": "cordova-plugin-splashscreen-test-ios", + "version": "1.0.0", + "description": "iOS Unit Tests for Splashscreen Plugin", + "author": "Apache Software Foundation", + "license": "Apache Version 2.0", + "dependencies": { + "cordova-ios": "*" + }, + "scripts": { + "test": "xcodebuild test -workspace CDVSplashScreenTest.xcworkspace -scheme CDVSplashScreenLibTests -destination 'platform=iOS Simulator,name=iPhone 5' CONFIGURATION_BUILD_DIR='/tmp' HEADER_SEARCH_PATHS='$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include'" + } +} diff --git a/node_modules/cordova-plugin-splashscreen/tests/package.json b/node_modules/cordova-plugin-splashscreen/tests/package.json new file mode 100644 index 0000000..199a6f5 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/package.json @@ -0,0 +1,14 @@ +{ + "name": "cordova-plugin-splashscreen-tests", + "version": "4.0.3-dev", + "description": "", + "cordova": { + "id": "cordova-plugin-splashscreen-tests", + "platforms": [] + }, + "keywords": [ + "ecosystem:cordova" + ], + "author": "", + "license": "Apache 2.0" +} diff --git a/node_modules/cordova-plugin-splashscreen/tests/plugin.xml b/node_modules/cordova-plugin-splashscreen/tests/plugin.xml new file mode 100644 index 0000000..60d7084 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/plugin.xml @@ -0,0 +1,29 @@ + + + + + Cordova Splashscreen Plugin Tests + Apache 2.0 + + + + diff --git a/node_modules/cordova-plugin-splashscreen/tests/tests.js b/node_modules/cordova-plugin-splashscreen/tests/tests.js new file mode 100644 index 0000000..7b55a81 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/tests/tests.js @@ -0,0 +1,64 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* jshint jasmine: true */ + +exports.defineAutoTests = function () { + describe('Splashscreen (cordova)', function () { + it("splashscreen.spec.1 should exist", function () { + expect(navigator.splashscreen).toBeDefined(); + }); + + it("splashscreen.spec.2 show method should exist", function () { + expect(navigator.splashscreen.show).toBeDefined(); + expect(typeof navigator.splashscreen.show).toBe('function'); + }); + + it("splashscreen.spec.3 hide method should exist", function () { + expect(navigator.splashscreen.hide).toBeDefined(); + expect(typeof navigator.splashscreen.hide).toBe('function'); + }); + }); +}; + +exports.defineManualTests = function (contentEl, createActionButton) { + function showFor(duration) { + navigator.splashscreen.show(); + window.setTimeout(function () { + navigator.splashscreen.hide(); + }, 1000 * duration); + } + + contentEl.innerHTML = '

    Splashscreen Tests

    ' + + '

    Note for WP: AutoHideSplashScreen must be set to false in config.xml

    ' + + '
    ' + + 'Expected result: Will show the Cordova splashscreen for 1 second' + + '

    ' + + 'Expected result: Will show the Cordova splashscreen for 5 seconds'; + + createActionButton('Show for 1 second', function () { + showFor(1); + }, 'show1'); + + createActionButton('Show for 5 seconds', function () { + showFor(5); + }, 'show5'); +}; diff --git a/node_modules/cordova-plugin-splashscreen/types/index.d.ts b/node_modules/cordova-plugin-splashscreen/types/index.d.ts new file mode 100644 index 0000000..968b340 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/types/index.d.ts @@ -0,0 +1,17 @@ +// Type definitions for Apache Cordova Splashscreen plugin +// Project: https://github.com/apache/cordova-plugin-splashscreen +// Definitions by: Microsoft Open Technologies Inc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// +// Copyright (c) Microsoft Open Technologies Inc +// Licensed under the MIT license. + +interface Navigator { + /** This plugin displays and hides a splash screen during application launch. */ + splashscreen: { + /** Dismiss the splash screen. */ + hide(): void; + /** Displays the splash screen. */ + show(): void; + } +} \ No newline at end of file diff --git a/node_modules/cordova-plugin-splashscreen/www/splashscreen.js b/node_modules/cordova-plugin-splashscreen/www/splashscreen.js new file mode 100644 index 0000000..7cb48bd --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/www/splashscreen.js @@ -0,0 +1,33 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); + +var splashscreen = { + show:function() { + exec(null, null, "SplashScreen", "show", []); + }, + hide:function() { + exec(null, null, "SplashScreen", "hide", []); + } +}; + +module.exports = splashscreen; diff --git a/node_modules/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js b/node_modules/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js new file mode 100644 index 0000000..1003f06 --- /dev/null +++ b/node_modules/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js @@ -0,0 +1,37 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/*jslint sloppy:true */ + +var splash = require('cordova/splashscreen'); + +var SplashScreen = { + show: function () { + splash.show(); + }, + hide: function () { + splash.hide(); + } +}; + +module.exports = SplashScreen; + +require("cordova/exec/proxy").add("SplashScreen", SplashScreen); diff --git a/node_modules/cordova-plugin-whitelist/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/cordova-plugin-whitelist/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..91582f4 --- /dev/null +++ b/node_modules/cordova-plugin-whitelist/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Platforms affected + + +### What does this PR do? + + +### What testing has been done on this change? + + +### Checklist +- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database +- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected. +- [ ] Added automated test coverage as appropriate for this change. diff --git a/node_modules/cordova-plugin-whitelist/CONTRIBUTING.md b/node_modules/cordova-plugin-whitelist/CONTRIBUTING.md new file mode 100644 index 0000000..7de4c64 --- /dev/null +++ b/node_modules/cordova-plugin-whitelist/CONTRIBUTING.md @@ -0,0 +1,37 @@ + + +# Contributing to Apache Cordova + +Anyone can contribute to Cordova. And we need your contributions. + +There are multiple ways to contribute: report bugs, improve the docs, and +contribute code. + +For instructions on this, start with the +[contribution overview](http://cordova.apache.org/contribute/). + +The details are explained there, but the important items are: + - Sign and submit an Apache ICLA (Contributor License Agreement). + - Have a Jira issue open that corresponds to your contribution. + - Run the tests so your patch doesn't break existing functionality. + +We look forward to your contributions! diff --git a/node_modules/cordova-plugin-whitelist/LICENSE b/node_modules/cordova-plugin-whitelist/LICENSE new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/node_modules/cordova-plugin-whitelist/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/node_modules/cordova-plugin-whitelist/NOTICE b/node_modules/cordova-plugin-whitelist/NOTICE new file mode 100644 index 0000000..8ec56a5 --- /dev/null +++ b/node_modules/cordova-plugin-whitelist/NOTICE @@ -0,0 +1,5 @@ +Apache Cordova +Copyright 2012 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/node_modules/cordova-plugin-whitelist/README.md b/node_modules/cordova-plugin-whitelist/README.md new file mode 100644 index 0000000..e19d230 --- /dev/null +++ b/node_modules/cordova-plugin-whitelist/README.md @@ -0,0 +1,163 @@ +--- +title: Whitelist +description: Whitelist external content accessible by your app. +--- + + +# cordova-plugin-whitelist + +This plugin implements a whitelist policy for navigating the application webview on Cordova 4.0 + +:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Whitelist%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + +## Installation + +You can install whitelist plugin with Cordova CLI, from npm: + +``` +$ cordova plugin add cordova-plugin-whitelist +$ cordova prepare +``` + +## Supported Cordova Platforms + +* Android 4.0.0 or above + +## Navigation Whitelist +Controls which URLs the WebView itself can be navigated to. Applies to +top-level navigations only. + +Quirks: on Android it also applies to iframes for non-http(s) schemes. + +By default, navigations only to `file://` URLs, are allowed. To allow others URLs, you must add `` tags to your `config.xml`: + + + + + + + + + + + + + + + +## Intent Whitelist +Controls which URLs the app is allowed to ask the system to open. +By default, no external URLs are allowed. + +On Android, this equates to sending an intent of type BROWSEABLE. + +This whitelist does not apply to plugins, only hyperlinks and calls to `window.open()`. + +In `config.xml`, add `` tags, like this: + + + + + + + + + + + + + + + + + + + + + + + +## Network Request Whitelist +Controls which network requests (images, XHRs, etc) are allowed to be made (via cordova native hooks). + +Note: We suggest you use a Content Security Policy (see below), which is more secure. This whitelist is mostly historical for webviews which do not support CSP. + +In `config.xml`, add `` tags, like this: + + + + + + + + + + + + + + + + + +Without any `` tags, only requests to `file://` URLs are allowed. However, the default Cordova application includes `` by default. + + +Note: Whitelist cannot block network redirects from a whitelisted remote website (i.e. http or https) to a non-whitelisted website. Use CSP rules to mitigate redirects to non-whitelisted websites for webviews that support CSP. + +Quirk: Android also allows requests to https://ssl.gstatic.com/accessibility/javascript/android/ by default, since this is required for TalkBack to function properly. + +### Content Security Policy +Controls which network requests (images, XHRs, etc) are allowed to be made (via webview directly). + +On Android and iOS, the network request whitelist (see above) is not able to filter all types of requests (e.g. `

    S`Q|gx$1}cXIadFm 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%0D?g3^xC>AK{I&qNv}~LL@V0JJ+W_p!>Q0*5ikrCK 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≷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Π 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