diff --git a/.gitignore b/.gitignore index db25cd02..465a03df 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,13 @@ debug/ release/ testresults/ +# Cordova +cordova/www/ +cordova/platforms/ +cordova/plugins/ +cordova/resources/ +cordova/package-lock.json + # OSX .DS_store diff --git a/README.md b/README.md index 68d4e463..f34791f4 100644 --- a/README.md +++ b/README.md @@ -48,14 +48,15 @@ Unstable testing versions of the lates builds of the configurator for most platf **Be aware that these versions are intended for testing / feedback only, and may be buggy or broken, and can cause flight controller settings to be corrupted. Caution is advised when using these versions.** -## Native app build via NW.js +## Native app build via NW.js (windows/linux/macos) or Cordova (android) ### Development 1. Install node.js (version 10 required) 2. Install yarn: `npm install yarn -g` -3. Change to project folder and run `yarn install`. -4. Run `yarn start`. +3. (For Android platform only) Install Java JDK 8, Gradle and Android Studio (Android SDK at least level 19) +4. Change to project folder and run `yarn install`. +5. Run `yarn start`. ### Running tests @@ -69,12 +70,14 @@ yarn gulp [[platform] [platform] ...] ``` List of possible values of ``: -* **dist** copies all the JS and CSS files in the `./dist` folder. +* **dist** copies all the JS and CSS files in the `./dist` folder [2]. * **apps** builds the apps in the `./apps` folder [1]. -* **debug** builds debug version of the apps in the `./debug` folder [1]. +* **debug** builds debug version of the apps in the `./debug` folder [1][3]. * **release** zips up the apps into individual archives in the `./release` folder [1]. [1] Running this task on macOS or Linux requires Wine, since it's needed to set the icon for the Windows app (build for specific platform to avoid errors). +[2] For Android platform, **dist** task will generate the `./cordova` folder +[3] For Android platform, you need to configure an emulator or to plug an Android device with USB debugging enabled #### Build or release app for one specific platform To build or release only for one specific platform you can append the plaform after the `task-name`. @@ -84,6 +87,7 @@ If no platform is provided, all the platforms will be done in sequence. * **Linux** use `yarn gulp --linux64` * **Windows** use `yarn gulp --win32` * **ChromeOS** use `yarn gulp --chromeos` +* **Android** use `yarn gulp --android` You can also use multiple platforms e.g. `yarn gulp --osx64 --linux64`. diff --git a/assets/android/icon/drawable-hdpi-icon.png b/assets/android/icon/drawable-hdpi-icon.png new file mode 100644 index 00000000..9eb516af Binary files /dev/null and b/assets/android/icon/drawable-hdpi-icon.png differ diff --git a/assets/android/icon/drawable-ldpi-icon.png b/assets/android/icon/drawable-ldpi-icon.png new file mode 100644 index 00000000..7b423d3d Binary files /dev/null and b/assets/android/icon/drawable-ldpi-icon.png differ diff --git a/assets/android/icon/drawable-mdpi-icon.png b/assets/android/icon/drawable-mdpi-icon.png new file mode 100644 index 00000000..543965c7 Binary files /dev/null and b/assets/android/icon/drawable-mdpi-icon.png differ diff --git a/assets/android/icon/drawable-xhdpi-icon.png b/assets/android/icon/drawable-xhdpi-icon.png new file mode 100644 index 00000000..66c748a3 Binary files /dev/null and b/assets/android/icon/drawable-xhdpi-icon.png differ diff --git a/assets/android/icon/drawable-xxhdpi-icon.png b/assets/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 00000000..49cc80f0 Binary files /dev/null and b/assets/android/icon/drawable-xxhdpi-icon.png differ diff --git a/assets/android/icon/drawable-xxxhdpi-icon.png b/assets/android/icon/drawable-xxxhdpi-icon.png new file mode 100644 index 00000000..85172fe7 Binary files /dev/null and b/assets/android/icon/drawable-xxxhdpi-icon.png differ diff --git a/assets/android/splash/drawable-land-hdpi-screen.png b/assets/android/splash/drawable-land-hdpi-screen.png new file mode 100644 index 00000000..40f67fc8 Binary files /dev/null and b/assets/android/splash/drawable-land-hdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-ldpi-screen.png b/assets/android/splash/drawable-land-ldpi-screen.png new file mode 100644 index 00000000..e10c58a9 Binary files /dev/null and b/assets/android/splash/drawable-land-ldpi-screen.png differ diff --git a/assets/android/splash/drawable-land-mdpi-screen.png b/assets/android/splash/drawable-land-mdpi-screen.png new file mode 100644 index 00000000..be1737c7 Binary files /dev/null and b/assets/android/splash/drawable-land-mdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xhdpi-screen.png b/assets/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 00000000..b10dee42 Binary files /dev/null and b/assets/android/splash/drawable-land-xhdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xxhdpi-screen.png b/assets/android/splash/drawable-land-xxhdpi-screen.png new file mode 100644 index 00000000..572a9f3f Binary files /dev/null and b/assets/android/splash/drawable-land-xxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-land-xxxhdpi-screen.png b/assets/android/splash/drawable-land-xxxhdpi-screen.png new file mode 100644 index 00000000..faa76cba Binary files /dev/null and b/assets/android/splash/drawable-land-xxxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-hdpi-screen.png b/assets/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 00000000..1124928a Binary files /dev/null and b/assets/android/splash/drawable-port-hdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-ldpi-screen.png b/assets/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 00000000..d2860952 Binary files /dev/null and b/assets/android/splash/drawable-port-ldpi-screen.png differ diff --git a/assets/android/splash/drawable-port-mdpi-screen.png b/assets/android/splash/drawable-port-mdpi-screen.png new file mode 100644 index 00000000..bba48415 Binary files /dev/null and b/assets/android/splash/drawable-port-mdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xhdpi-screen.png b/assets/android/splash/drawable-port-xhdpi-screen.png new file mode 100644 index 00000000..0e5c7b23 Binary files /dev/null and b/assets/android/splash/drawable-port-xhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xxhdpi-screen.png b/assets/android/splash/drawable-port-xxhdpi-screen.png new file mode 100644 index 00000000..eb238383 Binary files /dev/null and b/assets/android/splash/drawable-port-xxhdpi-screen.png differ diff --git a/assets/android/splash/drawable-port-xxxhdpi-screen.png b/assets/android/splash/drawable-port-xxxhdpi-screen.png new file mode 100644 index 00000000..640a18c4 Binary files /dev/null and b/assets/android/splash/drawable-port-xxxhdpi-screen.png differ diff --git a/cordova/build.json b/cordova/build.json new file mode 100644 index 00000000..fe4b603b --- /dev/null +++ b/cordova/build.json @@ -0,0 +1,10 @@ +{ + "android": { + "release": { + "keystore": "release.keystore", + "storePassword": "betaflight", + "alias": "betaflight", + "password" : "betaflight" + } + } +} diff --git a/cordova/config.xml b/cordova/config.xml new file mode 100644 index 00000000..ce97d906 --- /dev/null +++ b/cordova/config.xml @@ -0,0 +1,52 @@ + + + [INJECTED_BY_GULPFILE] + [INJECTED_BY_GULPFILE] + [INJECTED_BY_GULPFILE] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cordova/package.json b/cordova/package.json new file mode 100644 index 00000000..e4f5a576 --- /dev/null +++ b/cordova/package.json @@ -0,0 +1,54 @@ +{ + "name": "[INJECTED_BY_GULPFILE]", + "displayName": "Betaflight Configurator", + "version": "[INJECTED_BY_GULPFILE]", + "description": "[INJECTED_BY_GULPFILE]", + "main": "index.js", + "scripts": {}, + "author": "[INJECTED_BY_GULPFILE]", + "license": "[INJECTED_BY_GULPFILE]", + "dependencies": { + "cordova": "^9.0.0", + "cordova-android": "^8.1.0", + "cordova-clipboard": "^1.3.0", + "bf-cordova-open-native-settings": "^2.0.4", + "bf-cordova-plugin-appavailability": "^1.0.3", + "cordova-plugin-chrome-apps-common": "^1.0.7", + "cordova-plugin-chrome-apps-runtime": "^2.0.0", + "cordova-plugin-chrome-apps-storage": "^1.0.4", + "bf-cordova-plugin-chrome-apps-usb": "^2.0.1", + "cordova-plugin-dialogs": "^2.0.2", + "cordova-plugin-file": "^6.0.2", + "cordova-plugin-filechooser": "^1.2.0", + "cordova-plugin-market": "^1.2.0", + "cordova-plugin-permission": "^0.1.0", + "cordova-plugin-splashscreen": "^5.0.3", + "cordova-plugin-usb-event": "^1.0.2", + "cordova-plugin-whitelist": "^1.3.4", + "bf-cordovarduino": "^1.0.0" + }, + "cordova": { + "platforms": [ + "android" + ], + "plugins": { + "cordova-plugin-chrome-apps-common": {}, + "cordova-plugin-chrome-apps-runtime": {}, + "cordova-plugin-chrome-apps-storage": {}, + "cordova-plugin-whitelist": {}, + "cordova-plugin-splashscreen": {}, + "cordova-plugin-permission": {}, + "cordova-plugin-usb-event": {}, + "cordova-plugin-dialogs": {}, + "bf-cordovarduino": {}, + "cordova-plugin-file": {}, + "cordova-plugin-filechooser": {}, + "bf-cordova-plugin-chrome-apps-usb": {}, + "cordova-clipboard": {}, + "cordova-plugin-screen-orientation": {}, + "cordova-plugin-market": {}, + "bf-cordova-open-native-settings": {}, + "bf-cordova-plugin-appavailability": {} + } + } +} diff --git a/cordova/release.keystore b/cordova/release.keystore new file mode 100644 index 00000000..8d155515 Binary files /dev/null and b/cordova/release.keystore differ diff --git a/cordova/usb_device_filter.xml b/cordova/usb_device_filter.xml new file mode 100644 index 00000000..f14a3b86 --- /dev/null +++ b/cordova/usb_device_filter.xml @@ -0,0 +1,4 @@ + + + + diff --git a/cordova/yarn.lock b/cordova/yarn.lock new file mode 100644 index 00000000..f630f2fd --- /dev/null +++ b/cordova/yarn.lock @@ -0,0 +1,2989 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +android-versions@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/android-versions/-/android-versions-1.5.0.tgz#7790bc74e0812aafd69fb1ad0cb4db4474a525d6" + integrity sha512-/GWUAqa2OJNlDF5VGSe3SR1QMHEPXxx54Ur56r0qQC0H9FlBr7kyBF2SgVEhzFCPbrW4UcYgVuWrq/2Ty3QvXg== + dependencies: + semver "^5.4.1" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.2.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bf-cordova-open-native-settings@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/bf-cordova-open-native-settings/-/bf-cordova-open-native-settings-2.0.4.tgz#312db37a8e2028c351586077697e6fbdee527d28" + integrity sha512-rGiegnoQIOfPZ6lKhQaszxCUczi5Cg4UwmV40cJSF3WcZRDyNiQlUrAs5dhScT4ZttkHE/IPqUmpBXmTuIVTTQ== + +bf-cordova-plugin-appavailability@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bf-cordova-plugin-appavailability/-/bf-cordova-plugin-appavailability-1.0.3.tgz#3f31fb623af06823170f9b32b8e9991d4a83cf09" + integrity sha512-fNGs+CHG+LhKnWg86W2V+B2Yu2mCr9etMVJ8jt/HpQZdclbFbimfaE00CWjt2veJPN9ZTZijqLPKO3i31wva7A== + +bf-cordova-plugin-chrome-apps-usb@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bf-cordova-plugin-chrome-apps-usb/-/bf-cordova-plugin-chrome-apps-usb-2.0.1.tgz#004a402fda7e67cfae99e3e8fac270add09b54e2" + integrity sha512-LQGtpVKN5vebuoRMsiG3wbuveA0rAKMwvvgVZFS3nxmUpgHFH4Ms013fu3phe/JaA0h1WUB46RVpIxNaDnJLZQ== + +bf-cordovarduino@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bf-cordovarduino/-/bf-cordovarduino-1.0.0.tgz#d4a50415608a3990d3fdfe6eef10c3a8712a44be" + integrity sha512-WH3FSrWeZ2Mkkzybw0MNN7o4w401zGiYZxMFVc+uhYalPkKBWk+rSjQnNij7XOWbN6eFM4tMUrO6Ggm5ibT+YQ== + +big-integer@^1.6.7: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +bplist-parser@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" + integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= + dependencies: + big-integer "^1.6.7" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +compare-func@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.6.0: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +conf@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-1.4.0.tgz#1ea66c9d7a9b601674a5bb9d2b8dc3c726625e67" + integrity sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg== + dependencies: + dot-prop "^4.1.0" + env-paths "^1.0.0" + make-dir "^1.0.0" + pkg-up "^2.0.0" + write-file-atomic "^2.3.0" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +cordova-android@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cordova-android/-/cordova-android-8.1.0.tgz#d9aea62bbe4a4c8d22fdf21616869439cd1c95a0" + integrity sha512-eAY6g9q3raJ4P03wNdSWC5MOW1EfxoomWNXsPhi7T6Q9yAqmxqn0sLEUjLL1Ib0LCH3nKQWBXdxapQ5LgbHu+g== + dependencies: + android-versions "^1.4.0" + compare-func "^1.3.2" + cordova-common "^3.2.0" + nopt "^4.0.1" + properties-parser "^0.3.1" + q "^1.5.1" + shelljs "^0.5.3" + +cordova-app-hello-world@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cordova-app-hello-world/-/cordova-app-hello-world-4.0.0.tgz#a30e896b210787332337069c50845e1802dabcff" + integrity sha512-hTNYHUJT5YyMa1cQQE1naGyU6Eh5D5Jl33sMnCh3+q15ZwWTL/TOy3k8+mUvjTp8bwhO5eECGKULYoVO+fp9ZA== + +cordova-clipboard@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz#0911da4cbdea5df2e3a769f5b3aab00e0be0e679" + integrity sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw== + +cordova-common@^3.1.0, cordova-common@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-3.2.1.tgz#f4fdbeb40d9049fe28a09fa901756ed66d246661" + integrity sha512-xg0EnjnA6EipxXG8cupdlYQYeDA6+ghbN+Pjq88xN1LInwP6Bo7IyGBdSV5QnfjOvzShF9BBwSxBAv0FOO0C2Q== + dependencies: + ansi "^0.3.1" + bplist-parser "^0.1.0" + cross-spawn "^6.0.5" + elementtree "0.1.7" + endent "^1.1.1" + fs-extra "^8.0.0" + glob "^7.1.2" + minimatch "^3.0.0" + plist "^3.0.1" + q "^1.4.1" + strip-bom "^3.0.0" + underscore "^1.8.3" + which "^1.3.0" + +cordova-create@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cordova-create/-/cordova-create-2.0.0.tgz#4195cf01cbbdacfe8abebd7eaf4764f69c53f28b" + integrity sha512-72CaGg/7x+tiZlzeXKQXLTc8Jh4tbwLdu4Ib97kJ6+R3bcew/Yv/l2cVA2E0CaCuOCtouTqwi+YLcA2I4dPFTQ== + dependencies: + cordova-app-hello-world "^4.0.0" + cordova-common "^3.1.0" + cordova-fetch "^2.0.0" + fs-extra "^7.0.1" + import-fresh "^3.0.0" + is-url "^1.2.4" + isobject "^3.0.1" + path-is-inside "^1.0.2" + tmp "0.0.33" + valid-identifier "0.0.2" + +cordova-fetch@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cordova-fetch/-/cordova-fetch-2.0.1.tgz#5c04b7cc6f9bf8e1ffeed233dcefb64cde108cc3" + integrity sha512-q21PeobERzE3Drli5htcl5X9Mtfvodih5VkqIwdRUsjDBCPv+I6ZonRjYGbNnXhYrYx7dm0m0j/7/Smf6Av3hg== + dependencies: + cordova-common "^3.1.0" + fs-extra "^7.0.1" + npm-package-arg "^6.1.0" + pify "^4.0.1" + resolve "^1.10.0" + semver "^5.6.0" + which "^1.3.1" + +cordova-lib@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cordova-lib/-/cordova-lib-9.0.1.tgz#7a6853b6a58538ad414ceae2380dda78ea74301a" + integrity sha512-P9nQhq91gLOyKZkamvKNzzK89gLDpq8rKue/Vu7NUSgNzhPkiWW0w+6VRTbj/9QGVM9w2uDVhB9c9f6rrTXzCw== + dependencies: + cordova-common "^3.1.0" + cordova-create "^2.0.0" + cordova-fetch "^2.0.0" + cordova-serve "^3.0.0" + dep-graph "1.1.0" + detect-indent "^5.0.0" + elementtree "^0.1.7" + fs-extra "^7.0.1" + globby "^9.1.0" + indent-string "^3.2.0" + init-package-json "^1.10.3" + md5-file "^4.0.0" + read-chunk "^3.1.0" + semver "^5.6.0" + shebang-command "^1.2.0" + underscore "^1.9.1" + +cordova-plugin-chrome-apps-common@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-common/-/cordova-plugin-chrome-apps-common-1.0.7.tgz#300319b59c79dc552293f83a2332cf283b10908a" + integrity sha1-MAMZtZx53FUik/g6IzLPKDsQkIo= + +cordova-plugin-chrome-apps-runtime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-runtime/-/cordova-plugin-chrome-apps-runtime-2.0.0.tgz#1159931ed7e9960b6114da4685ebdddc47302986" + integrity sha1-EVmTHtfplgthFNpGhevd3EcwKYY= + +cordova-plugin-chrome-apps-storage@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cordova-plugin-chrome-apps-storage/-/cordova-plugin-chrome-apps-storage-1.0.4.tgz#f83b1e16e54b774ba375f6ff5378fda829b161fd" + integrity sha1-+DseFuVLd0ujdfb/U3j9qCmxYf0= + +cordova-plugin-dialogs@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-dialogs/-/cordova-plugin-dialogs-2.0.2.tgz#ac3ce8b73bc885ff847078d5b533e7a4ed418a2f" + integrity sha512-FUHI6eEVeoz2VkxbF0P56QlUQLGzXcvw3i4xuXyM9gEct6Y+FA3Xzgl2pJTZcTg5wRqLWzN08kgNoHPkom15pw== + +cordova-plugin-file@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz#f3911479f8357e9aacb5576674f8d95b31a1fb20" + integrity sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA== + +cordova-plugin-filechooser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-filechooser/-/cordova-plugin-filechooser-1.2.0.tgz#3a3a3d9c5bef733076f1f6b59e465f60a0d96577" + integrity sha512-ycL9ML3wlRQ8wfK7vCG8gobv1f3VIdO52m0LA9mPSzLblbu0AXJs89yCRxZB87+08/V96qBxrmkxMsMmVYu5wA== + +cordova-plugin-market@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-market/-/cordova-plugin-market-1.2.0.tgz#61e36428147e95402c64eaf86e317378ffdb274f" + integrity sha1-YeNkKBR+lUAsZOr4bjFzeP/bJ08= + +cordova-plugin-permission@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cordova-plugin-permission/-/cordova-plugin-permission-0.1.0.tgz#bb9ba0e71c4c6b2498158ce39ab46d63ed1f4547" + integrity sha1-u5ug5xxMaySYFYzjmrRtY+0fRUc= + +cordova-plugin-splashscreen@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.3.tgz#02820472771c3e10b43ceedd54b0a1e4674efa6d" + integrity sha512-rnoDXMDfzoeHDBvsnu6JmzDE/pV5YJCAfc5hYX/Mb2BIXGgSjFJheByt0tU6kp3Wl40tSyFX4pYfBwFblBGyRg== + +cordova-plugin-usb-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cordova-plugin-usb-event/-/cordova-plugin-usb-event-1.0.2.tgz#68182ae8d56d42236524753a1dbb711ce285e03a" + integrity sha512-4Y1P6pqwK/co+22dYZ6o1lLknmxaA6vThNntx8fuhQfGnG1R+9FpxNnFkUdjI9VnltHb3IhKwDo6q2LtxMY5Cw== + +cordova-plugin-whitelist@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.4.tgz#31938545c7c3e7de35c20ab08c2c3afa06e8a3f9" + integrity sha512-EYC5eQFVkoYXq39l7tYKE6lEjHJ04mvTmKXxGL7quHLdFPfJMNzru/UYpn92AOfpl3PQaZmou78C7EgmFOwFQQ== + +cordova-serve@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cordova-serve/-/cordova-serve-3.0.0.tgz#974d695f75a9f2b3e487604be6f539a39dba8390" + integrity sha512-h479g/5a0PXn//yiFuMrD5MDEbB+mtihNkWcE6uD/aCh/6z0FRZ9sWH3NfZbHDB+Bp1yGLYsjbH8LZBL8KOQ0w== + dependencies: + chalk "^2.4.1" + compression "^1.6.0" + express "^4.13.3" + opn "^5.3.0" + which "^1.3.0" + +cordova@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cordova/-/cordova-9.0.0.tgz#2bba968d9e3339f9c8dace443a77f4d37ed1fe46" + integrity sha512-zWEPo9uGj9KNcEhU2Lpo3r4HYK21tL+at496N2LLnuCWuWVndv6QWed8+EYl/08rrcNshrEtfzXj9Ux6vQm2PQ== + dependencies: + configstore "^4.0.0" + cordova-common "^3.1.0" + cordova-lib "^9.0.0" + editor "^1.0.0" + insight "^0.10.1" + loud-rejection "^2.0.0" + nopt "^4.0.1" + update-notifier "^2.5.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +dep-graph@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dep-graph/-/dep-graph-1.1.0.tgz#fade86a92799a813e9b42511cdf3dfa6cc8dbefe" + integrity sha1-+t6GqSeZqBPptCURzfPfpsyNvv4= + dependencies: + underscore "1.2.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +elementtree@0.1.7, elementtree@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/elementtree/-/elementtree-0.1.7.tgz#9ac91be6e52fb6e6244c4e54a4ac3ed8ae8e29c0" + integrity sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA= + dependencies: + sax "1.1.4" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +endent@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/endent/-/endent-1.4.1.tgz#c58cc13dfc432d0b2c7faf74c13ffdca60b2d1c8" + integrity sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ== + dependencies: + dedent "^0.7.0" + fast-json-parse "^1.0.3" + objectorarray "^1.0.4" + +env-paths@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.13.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-parse@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globby@^9.1.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^6.3.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +insight@^0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/insight/-/insight-0.10.3.tgz#e7fa6593fd11323d227154cc8ce5f8bff638bf02" + integrity sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw== + dependencies: + async "^2.6.2" + chalk "^2.4.2" + conf "^1.4.0" + inquirer "^6.3.1" + lodash.debounce "^4.0.8" + os-name "^3.1.0" + request "^2.88.0" + tough-cookie "^3.0.1" + uuid "^3.3.2" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.12, lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loud-rejection@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c" + integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.2" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584" + integrity sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^3.0.0, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-normalize-package-bin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +objectorarray@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.4.tgz#d69b2f0ff7dc2701903d308bb85882f4ddb49483" + integrity sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opn@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-name@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + +properties-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.3.1.tgz#1316e9539ffbfd93845e369b211022abd478771a" + integrity sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo= + dependencies: + string.prototype.codepointat "^0.2.0" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.4.1, q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-chunk@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca" + integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== + dependencies: + pify "^4.0.1" + with-open-file "^0.1.6" + +"read-package-json@1 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" + integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +run-async@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.4.tgz#74b6d33c9ae1e001510f179a91168588f1aedaa9" + integrity sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk= + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shelljs@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" + integrity sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.codepointat@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" + integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +underscore@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.2.1.tgz#fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4" + integrity sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q= + +underscore@^1.8.3, underscore@^1.9.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +valid-identifier@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/valid-identifier/-/valid-identifier-0.0.2.tgz#4814dff0c1b7d5ef3d7f4b678aeb26841b5b0e69" + integrity sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +windows-release@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0" + integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ== + dependencies: + execa "^1.0.0" + +with-open-file@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729" + integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA== + dependencies: + p-finally "^1.0.0" + p-try "^2.1.0" + pify "^4.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= diff --git a/gulpfile.js b/gulpfile.js index 212d5378..0d699c6c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,15 +23,21 @@ const gulp = require('gulp'); const concat = require('gulp-concat'); const yarn = require("gulp-yarn"); const rename = require('gulp-rename'); +const replace = require('gulp-replace'); +const jeditor = require("gulp-json-editor"); +const xmlTransformer = require("gulp-xml-transformer"); const os = require('os'); const git = require('gulp-git'); const source = require('vinyl-source-stream'); const stream = require('stream'); +const cordova = require("cordova-lib").cordova; + const DIST_DIR = './dist/'; const APPS_DIR = './apps/'; const DEBUG_DIR = './debug/'; const RELEASE_DIR = './release/'; +const CORDOVA_DIR = './cordova/'; const LINUX_INSTALL_DIR = '/opt/betaflight'; @@ -49,6 +55,8 @@ var nwBuilderOptions = { var nwArmVersion = '0.27.6'; +let cordovaDependencies = true; + //----------------- //Pre tasks operations //----------------- @@ -70,16 +78,18 @@ gulp.task('clean-release', clean_release); gulp.task('clean-cache', clean_cache); +gulp.task('clean-cordova', cordova_clean); + // Function definitions are processed before function calls. const getChangesetId = gulp.series(getHash, writeChangesetId); gulp.task('get-changeset-id', getChangesetId); // dist_yarn MUST be done after dist_src -const distBuild = gulp.series(dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, getChangesetId); +const distBuild = gulp.series(dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, getChangesetId, gulp.series(cordova_dist())); const distRebuild = gulp.series(clean_dist, distBuild); gulp.task('dist', distRebuild); -const appsBuild = gulp.series(gulp.parallel(clean_apps, distRebuild), apps, gulp.parallel(listPostBuildTasks(APPS_DIR))); +const appsBuild = gulp.series(gulp.parallel(clean_apps, distRebuild), apps, gulp.series(cordova_apps()), gulp.parallel(listPostBuildTasks(APPS_DIR))); gulp.task('apps', appsBuild); const debugAppsBuild = gulp.series(gulp.parallel(clean_debug, distRebuild), debug, gulp.parallel(listPostBuildTasks(DEBUG_DIR))); @@ -101,10 +111,10 @@ gulp.task('default', debugBuild); // Get platform from commandline args // # -// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, or --chromeos) +// # gulp []+ Run only for platform(s) (with one of --linux64, --linux32, --armv7, --osx64, --win32, --win64, --chromeos or --android) // # function getInputPlatforms() { - var supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32','win64', 'chromeos']; + const supportedPlatforms = ['linux64', 'linux32', 'armv7', 'osx64', 'win32','win64', 'chromeos', 'android']; var platforms = []; var regEx = /--(\w+)/; console.log(process.argv); @@ -112,9 +122,12 @@ function getInputPlatforms() { var arg = process.argv[i].match(regEx)[1]; if (supportedPlatforms.indexOf(arg) > -1) { platforms.push(arg); - } else if (arg == 'nowinicon') { - console.log('ignoring winIco') + } else if (arg === 'nowinicon') { + console.log('ignoring winIco'); delete nwBuilderOptions['winIco']; + } else if (arg === 'skipdep') { + console.log('ignoring cordova dependencies'); + cordovaDependencies = false; } else { console.log('Unknown platform: ' + arg); process.exit(); @@ -282,6 +295,7 @@ function dist_resources() { function apps(done) { var platforms = getPlatforms(); removeItem(platforms, 'chromeos'); + removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'normal', APPS_DIR, done); } @@ -341,6 +355,7 @@ function post_build(arch, folder, done) { function debug(done) { var platforms = getPlatforms(); removeItem(platforms, 'chromeos'); + removeItem(platforms, 'android'); buildNWAppsWrapper(platforms, 'sdk', DEBUG_DIR, done); } @@ -498,9 +513,13 @@ function start_debug(done) { var exec = require('child_process').exec; if (platforms.length === 1) { - var run = getRunDebugAppCommand(platforms[0]); - console.log('Starting debug app (' + run + ')...'); - exec(run); + if (platforms[0] === 'android') { + cordova_debug(); + } else { + var run = getRunDebugAppCommand(platforms[0]); + console.log('Starting debug app (' + run + ')...'); + exec(run); + } } else { console.log('More than one platform specified, not starting debug app'); } @@ -762,5 +781,136 @@ function listReleaseTasks(appDirectory) { }); } + if (platforms.indexOf('android') !== -1) { + releaseTasks.push(function release_android() { + return cordova_release(); + }); + } + return releaseTasks; } + +// Cordova +function cordova_dist() { + const distTasks = []; + const platforms = getPlatforms(); + if (platforms.indexOf('android') !== -1) { + distTasks.push(cordova_clean); + distTasks.push(cordova_copy_www); + distTasks.push(cordova_locales_www); + distTasks.push(cordova_resources); + distTasks.push(cordova_include_www); + distTasks.push(cordova_packagejson); + distTasks.push(cordova_configxml); + distTasks.push(cordova_depedencies); + if (cordovaDependencies) { + distTasks.push(cordova_platforms); + } + } else { + distTasks.push(function cordova_dist_none(done) { + done(); + }); + } + return distTasks; +} +function cordova_apps() { + const appsTasks = []; + const platforms = getPlatforms(); + if (platforms.indexOf('android') !== -1) { + appsTasks.push(cordova_build); + } else { + appsTasks.push(function cordova_dist_none(done) { + done(); + }); + } + return appsTasks; +} + + +function cordova_clean() { + const patterns = ['./cordova/www/**', './cordova/resources/**']; + if (cordovaDependencies) { + patterns.push('./cordova/plugins/**'); + patterns.push('./cordova/platforms/**'); + } + return del(patterns, { force: true }); +} +function cordova_copy_www() { + return gulp.src(`${DIST_DIR}**`, { base: DIST_DIR }) + .pipe(gulp.dest(`${CORDOVA_DIR}www/`)); +} +function cordova_locales_www(cb) { + fs.renameSync(`${CORDOVA_DIR}www/_locales`, `${CORDOVA_DIR}www/i18n`); + gulp.src(`${CORDOVA_DIR}www/js/localization.js`) + .pipe(replace('/_locales', './i18n')) + .pipe(gulp.dest(`${CORDOVA_DIR}www/js`)); + cb(); +} +function cordova_resources() { + return gulp.src('assets/android/**') + .pipe(gulp.dest(`${CORDOVA_DIR}resources/android/`)); +} +function cordova_include_www() { + return gulp.src(`${CORDOVA_DIR}www/main.html`) + .pipe(replace('', '')) + .pipe(replace('', '')) + .pipe(replace('', '')) + .pipe(gulp.dest(`${CORDOVA_DIR}www`)); +} +function cordova_packagejson() { + return gulp.src(`${CORDOVA_DIR}package.json`) + .pipe(jeditor({ + 'name': pkg.name, + 'description': pkg.description, + 'version': pkg.version, + 'author': pkg.author, + 'license': pkg.license, + })) + .pipe(gulp.dest(CORDOVA_DIR)); +} +function cordova_configxml() { + return gulp.src([`${CORDOVA_DIR}config.xml`]) + .pipe(xmlTransformer([ + { path: '//xmlns:name', text: pkg.productName }, + { path: '//xmlns:description', text: pkg.description }, + { path: '//xmlns:author', text: pkg.author }, + ], 'http://www.w3.org/ns/widgets')) + .pipe(xmlTransformer([ + { path: '.', attr: { 'version': pkg.version } }, + ])) + .pipe(gulp.dest(CORDOVA_DIR)); +} +function cordova_depedencies() { + process.chdir('cordova'); + return gulp.src(['./package.json', './yarn.lock']) + .pipe(gulp.dest('./')) + .pipe(yarn({ + production: true, + })); +} +function cordova_platforms() { + return cordova.platform('add', ['android']); +} +function cordova_debug() { + cordova.run(); +} +function cordova_build(cb) { + cordova.build({ + 'platforms': ['android'], + 'options': { + release: true, + buildConfig: 'build.json', + }, + }).then(function() { + process.chdir('../'); + cb(); + }); + console.log('APK will be generated at cordova/platforms/android/app/build/outputs/apk/release/app-release.apk'); +} +async function cordova_release() { + const filename = await getReleaseFilename('android', 'apk'); + console.log(`Release APK : release/${filename}`); + return gulp.src(`${CORDOVA_DIR}platforms/android/app/build/outputs/apk/release/app-release.apk`) + .pipe(rename(filename)) + .pipe(gulp.dest(RELEASE_DIR)); +} diff --git a/locales/en/messages.json b/locales/en/messages.json index 1b9f7701..4a8b7b90 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -92,6 +92,9 @@ "analyticsOptOut": { "message": "Opt out of the anonymised collection of statistics data" }, + "cordovaForceComputerUI": { + "message": "Use computers interface instead of phones interface" + }, "language_changed": { "message": "Language change saved" }, @@ -298,6 +301,9 @@ "tabHelp": { "message": "Documentation & Support" }, + "tabOptions": { + "message": "Options" + }, "tabSetup": { "message": "Setup" @@ -5716,5 +5722,68 @@ "gpsSbasNone": { "message": "None", "description": "One of the options selectable for the GPS SBAS system" + }, + "dialogFileNameTitle": { + "message": "File name" + }, + "dialogFileNameDescription": { + "message": "The file will be saved in the '{{folder}}' folder in your internal storage." + }, + "dialogFileAlreadyExistsTitle": { + "message": "This file already exists!" + }, + "dialogFileAlreadyExistsDescription": { + "message": "Overwrite ?" + }, + "cordovaCheckingWebview": { + "message": "Checking webview applications ..." + }, + "cordovaIncompatibleWebview": { + "message": "Incompatible webview" + }, + "cordovaWebviewTroubleshootingMsg": { + "message": "You must update your device's webview in order to use the configurator." + }, + "cordovaWebviewTroubleshootingMsg2": { + "message": "The tool below is intended to help you to install a new webview or to update an already installed webview." + }, + "cordovaAvailableWebviews": { + "message": "Available webview applications on your device" + }, + "cordovaWebviewInstall": { + "message": "Installing the {{app}} app can resolve this compatibility issue." + }, + "cordovaWebviewInstallBtn": { + "message": "Install from the Google Play Store" + }, + "cordovaWebviewUninstall": { + "message": "Uninstalling the {{app}} app can resolve this compatibility issue. If you are not able to uninstall it, try to disable it from the settings app." + }, + "cordovaWebviewUninstallBtn1": { + "message": "Uninstall from the Google Play Store" + }, + "cordovaWebviewUninstallBtn2": { + "message": "Uninstall / disable from the settings" + }, + "cordovaWebviewUpdate": { + "message": "Updating the {{app}} app can resolve this compatibility issue." + }, + "cordovaWebviewUpdateBtn": { + "message": "Update from the Google Play Store" + }, + "cordovaWebviewEnable": { + "message": "Go into the tab of informations about your device in the settings and tap 10 times on the build version number to enable 'Developper options'. After that, search and go in the developper options and select {{app}} as webview provider." + }, + "cordovaWebviewEnableBtn": { + "message": "Open settings" + }, + "cordovaWebviewIncompatible": { + "message": "Your device seems to be not compatible. Try to search other ways to update your webview" + }, + "cordovaNoWebview": { + "message": "No webview application installed / enabled" + }, + "cordovaWebviewUsed": { + "message": "used" } } diff --git a/package.json b/package.json index bb37a955..8f726c8a 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "betaflight-configurator", + "productName": "Betaflight Configurator", "description": "Crossplatform configuration tool for Betaflight flight control system.", "version": "10.7.1", "main": "main.html", @@ -42,6 +43,7 @@ "node": "10.x" }, "dependencies": { + "@fortawesome/fontawesome-free": "^5.13.0", "bluebird": "^3.7.2", "djv": "^2.1.3-alpha.0", "i18next": "^18.0.1", @@ -50,6 +52,7 @@ "jbox": "1.0.8", "jquery": "3.4.1", "jquery-textcomplete": "^1.8.5", + "jquery-touchswipe": "^1.6.19", "jquery-ui-npm": "1.12.0", "lru_map": "^0.3.3", "marked": "^0.8.0", @@ -61,6 +64,7 @@ "devDependencies": { "chai": "^4.2.0", "command-exists": "^1.2.8", + "cordova-lib": "^9.0.1", "del": "^5.0.0", "follow-redirects": "^1.10.0", "fs-extra": "^8.1.0", @@ -68,7 +72,10 @@ "gulp-concat": "~2.6.1", "gulp-debian": "~0.1.8", "gulp-git": "^2.10.0", + "gulp-json-editor": "^2.5.4", "gulp-rename": "^2.0.0", + "gulp-replace": "^1.0.0", + "gulp-xml-transformer": "^3.0.0", "gulp-yarn": "^2.0.0", "gulp-zip": "^5.0.0", "karma": "^4.0.1", diff --git a/src/css/dark-theme.css b/src/css/dark-theme.css index 6bb0d699..62fb504f 100644 --- a/src/css/dark-theme.css +++ b/src/css/dark-theme.css @@ -298,15 +298,15 @@ button { } .tab-failsafe .pro1 { - background-image: url(../../images/icons/cf_failsafe_procedure1-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure1-dark.svg); } .tab-failsafe .pro2 { - background-image: url(../../images/icons/cf_failsafe_procedure2-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure2-dark.svg); } .tab-failsafe .pro4 { - background-image: url(../../images/icons/cf_failsafe_procedure4-dark.svg); + background-image: url(../images/icons/cf_failsafe_procedure4-dark.svg); } @@ -381,7 +381,7 @@ progress[value]::-webkit-progress-bar { } .tab-landing .logowrapper img { - content:url(/images/cf_logo_black.svg); + content:url(../images/cf_logo_black.svg); } .tab-landing .content_mid .text3 .wrap2 { @@ -494,7 +494,7 @@ progress[value]::-webkit-progress-bar { } .tab-osd .preview { - background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url(../../images/osd-bg-1.jpg); + background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url(../images/osd-bg-1.jpg); background-size: cover; } @@ -523,7 +523,7 @@ progress[value]::-webkit-progress-bar { .tab-pid_tuning .profile .helpicon, .tab-pid_tuning .rate_profile .helpicon, .tab-pid_tuning .pid_titlebar .helpicon { - background-image: url(../../images/icons/cf_icon_info_grey.svg); + background-image: url(../images/icons/cf_icon_info_grey.svg); opacity: 0.4; } .tab-pid_tuning .profile .helpicon:hover, diff --git a/src/css/main.css b/src/css/main.css index 1813d09c..b969c48e 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -35,8 +35,8 @@ body { font-size: 12px; color: #303030; background-color: #3d3f3e; - margin: 0px; - padding: 0px; + margin: 0; + padding: 0; overflow: hidden; } @@ -94,7 +94,7 @@ a.disabled { font-weight: bold; font-size: 10px; line-height: 17px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); text-transform: uppercase; letter-spacing: 0.03em; display: block; @@ -123,11 +123,6 @@ input[type="number"]::-webkit-inner-spin-button { float: right; } -#main-wrapper { - padding: 0px 0px 0 0px; /* padding: 5px 5px 0 5px; */ - height: calc(100% - 7px); -} - .margin-top { margin-top: 20px; } @@ -145,45 +140,94 @@ input[type="number"]::-webkit-inner-spin-button { font-weight: bold !important; } -.headerbar { - height:115px; - width:100%; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15)); + + +/** Main wrapper **/ +#main-wrapper { + padding: 0; + height: 100%; } + +/** Background **/ +#background { + background: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 1500; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: none; +} +#side_menu_swipe { + display: none; + position: fixed; + top: 0; + left: 0; + width: 15px; + height: 100%; + z-index: 1999; +} +@media all and (max-width: 575px) { + #side_menu_swipe { + display: block; + } +} + + + +/** Header **/ +.headerbar { + height: 115px; + background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15)); + display: flex; + align-items: center; + padding: 0 15px; +} + +#menu_btn, #reveal_btn { + display: none; + width: 24px; + height: 24px; + font-size: 20px; + color: #ffffff; + line-height: 24px; + text-align: center; +} + +#menu_btn { + margin-right: 15px; +} + +#reveal_btn { + margin-left: 15px; +} + #logo { - position: relative; - float: left; height: 70px; - z-index: 0; + width: 240px; background-image: url(../images/light-wide-2.svg); background-repeat: no-repeat; - width: 240px; background-position: left center; background-size: contain; - margin-left: 15px; - margin-top: 14px; + position: relative; + margin-top: -25px; } .logo_text { position: absolute; - height: 20px; - width: 300px; left: 80px; - top: 50px; + top: 49px; color: #949494; opacity: 0.5; font-size: 10px; -} - -.logo_text .version { - float: right; + min-width: 210px; } @media all and (min-width: 1125px) { #logo { - margin-top: 9px; width: 340px; } @@ -193,67 +237,147 @@ input[type="number"]::-webkit-inner-spin-button { } #port-picker { - position: relative; - width: 100%; + display: flex; + align-items: center; + margin-left: auto; } #portsinput { - float: right; - margin-top: 20px; - margin-right: 20px; - /*width:180px;*/ + width: 180px; + margin-right: 15px; } #portsinput .dropdown { margin-bottom: 5px; } +#port-picker .auto_connect, .gray { + color: var(--subtleAccent); +} -#port-override { - background-color: rgba(0, 0, 0, 0.1); - color: #888888; - width: 140px; - margin-left: 2px; - margin-top: 0px; - padding: 1px; - border-radius: 3px; - height: 15px; - float: right; - font-size: 12px; +#port-override-option { + height: 76px; + margin-top: 7px; + margin-right: 15px; } #port-override-option label { background-color: #2b2b2b; border-radius: 3px; padding: 3px; - margin-bottom: 5px; - color: var(--subtleAccent); - position: absolute; - margin-top: -59px; - margin-left: -187px; -} - -#port-override input { - width: 136px; -} - -#port-picker .auto_connect, .gray { color: var(--subtleAccent); } -#header_dataflash { - display: none; +#port-override { + background-color: rgba(0, 0, 0, 0.1); + color: #888888; + width: 140px; + margin-left: 2px; + padding: 1px; + border-radius: 3px; + height: 15px; + font-size: 12px; +} + +#header_btns { + display: flex; + align-items: center; +} + +.open_firmware_flasher, .connect_controls { + position: relative; + width: 80px; + text-align: center; + height: 84px; +} + +.firmware_b, .connect_b { + width: 52px; + margin: 0 14px; + height: 52px; +} + +@media all and (min-width: 1125px) { + .open_firmware_flasher, .connect_controls { + width: 100px; + } + + .firmware_b, .connect_b { + margin: 0 24px; + } +} + +.firmware_b a.flash, .connect_b a.connect { + background-color: var(--accent); + border: 1px solid #dba718; + background-repeat: no-repeat; + height: 50px; + width: 50px; + border-radius: 100px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + float: left; + transition: none; +} + +.firmware_b a.flash { + background-image: url(../images/icons/cf_icon_flasher_white.svg); + background-size: 30px; + background-position: center 10px; +} + +.connect_b a.connect { + background-image: url(../images/icons/cf_icon_usb2_white.svg); + background-size: 44px; + background-position: center 6px; +} + +.firmware_b a.flash.disabled, .connect_b a.connect.disabled { + background-color: #808080; + pointer-events: none; + cursor: default; +} + +.firmware_b a.flash:hover, .connect_b a.connect:hover { + background-color: #ffcc3f; +} + +.firmware_b a.flash.active, .connect_b a.connect.active { + background-color: #e60000; + border: 1px solid #fe0000; + transition: none; +} + +.firmware_b a.flash.active { + background-image: url(../images/icons/cf_icon_flasher_white.svg); +} + +.connect_b a.connect.active { + background-image: url(../images/icons/cf_icon_usb1_white.svg); +} + +.firmware_b a.flash.active:hover, .connect_b a.connect.active:hover { + background-color: #f21212; +} + +.flash_state, .connect_state { + color: #fff; + font-size: 12px; + font-weight: normal; + text-shadow: 0 1px rgba(0, 0, 0, 0.25); + padding: 0 10px; +} + +.header-wrapper { + display: flex; } #sensor-status { - margin-top: 20px; - float: right; margin-right: 10px; line-height: 2px; height: 67px; border-radius: 5px; border: 1px solid #272727; - box-shadow: 0px 2px 0px rgba(92, 92, 92, 0.5); + box-shadow: 0 2px 0 rgba(92, 92, 92, 0.5); background-color: #434343; background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); } @@ -278,125 +402,91 @@ input[type="number"]::-webkit-inner-spin-button { background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); padding-left: 5px; padding-right: 5px; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); + text-shadow: 0 1px rgba(0, 0, 0, 1.0); +} + +.gyroicon, .accicon, .magicon, .gpsicon, .baroicon, .sonaricon { + background-repeat: no-repeat; + height: 30px; + margin-top: 3px; + width: 100%; + padding-top: 40px; + color: #4f4f4f; + text-align: center; +} + +.gyroicon.active, .accicon.active, .magicon.active, .gpsicon.active, .baroicon.active, .sonaricon.active { + color: #818181; } .gyroicon { background-image: url(../images/icons/sensor_gyro_off.png); background-size: 43px; background-position: top; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .gyroicon.active { background-image: url(../images/icons/sensor_gyro_on.png); - color: #818181; } .accicon { background-image: url(../images/icons/sensor_acc_off.png); background-size: 40px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .accicon.active { background-image: url(../images/icons/sensor_acc_on.png); - color: #818181; } .magicon { background-image: url(../images/icons/sensor_mag_off.png); background-size: 42px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .magicon.active { background-image: url(../images/icons/sensor_mag_on.png); - color: #818181; } .gpsicon { background-image: url(../images/icons/sensor_sat_off.png); background-size: 42px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .gpsicon.active { background-image: url(../images/icons/sensor_sat_on.png); - color: #818181; } .baroicon { background-image: url(../images/icons/sensor_baro_off.png); background-size: 40px; background-position: -5px 2px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .baroicon.active { background-image: url(../images/icons/sensor_baro_on.png); - color: #818181; } .sonaricon { background-image: url(../images/icons/sensor_sonar_off.png); background-size: 41px; background-position: -4px 1px; - background-repeat: no-repeat; - height: 30px; - margin-top: 3px; - width: 100%; - padding-top: 40px; - color: #4f4f4f; - text-align: center; } .sonaricon.active { background-image: url(../images/icons/sensor_sonar_on.png); - color: #818181; } #sensor-status li:last-child { - border-right: 0px solid #c0c0c0; + border-right: 0 solid #c0c0c0; border-top-right-radius: 5px; border-bottom-right-radius: 5px; } #sensor-status li:first-child { - border-left: 0px solid #c0c0c0; + border-left: 0 solid #c0c0c0; border-top-left-radius: 5px; border-bottom-left-radius: 5px; } @@ -406,83 +496,349 @@ input[type="number"]::-webkit-inner-spin-button { background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45)); } -#options { - float: right; - width: 20px; - height: 20px; - margin-top: 10px; - margin-right: 10px; - background-image: url(../images/CF_settings_white.svg); - background-position: -1px -1px; - background-repeat: no-repeat; - opacity: 0.4; -} +/* Dataflash element styling*/ -#options:hover { - opacity: 0.65; -} - -#options.active { - opacity: 0.65; -} - -#options.active:hover { - opacity: 0.75; -} - -#options-window { - display: none; - position: fixed; - right: 35px; - top: 25px; - padding: 5px; - line-height: 20px; - border: 1px solid var(--subtleAccent); - background-color: white; +#dataflash_wrapper_global { + color:white; + font-size:10px; + width:125px; + margin-right: 5px; + line-height: 12px; + height: 33px; border-radius: 5px; - z-index: 10000; + border: 1px solid #272727; + box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); + background-color: #434343; + background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); + padding-top:5px; + display:none; + text-shadow: 0 1px rgba(0, 0, 0, 1.0); + } -#options-window input { - float: left; - margin-top: 4px; - margin-right: 5px; +@media all and (min-width: 1125px) { + #dataflash_wrapper_global { + margin-right: 10px; + } } -#options-window .separator { - padding-bottom: 10px; - margin-bottom: 10px; - border-bottom: 2px solid var(--subtleAccent); -} - -#options-window .dropdown { - float: left; - width: auto; - margin-right: 5px; -} - -#options-window select { - margin-right: 2px; - background: var(--boxBackground); - color: var(--defaultText); - border: 1px solid var(--subtleAccent); +.dataflash-contents_global { + margin-top: 18px; + border: 1px solid #4A4A4A; + background-color: #4A4A4A; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; border-radius: 3px; + margin-left: 5px; + margin-right: 5px; } -#options-window span { - vertical-align: text-bottom; + +.dataflash-free_global { + background-color: var(--accent); + border-radius: 4px; } -/* Log setup*/ + +.dataflash-contents_global .notsupported_global { + display: none; +} + +.dataflash-contents_global li { + height: 5px; + position: relative; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); + border-radius: 2px; + +} + +.dataflash-contents_global li div { + position: absolute; + top: -18px; + margin-top: 0; + left: 0; + right: 0; + width:120px; + text-align: left; + color:silver; +} + +.dataflash-contents_global progress::-webkit-progress-bar { + height: 8px; + background-color: #eee; +} + +.dataflash-contents progress::-webkit-progress-value { + background-color: #bcf; +} + +.noflash_global { + display:none; + color: #868686; + text-align: center; + text-shadow: 0 1px rgba(0, 0, 0, 1.0); + margin-top:2px; +} + +#expertMode { + color: var(--subtleAccent); + margin-top: 27px; + width:125px; + float: right; + margin-right: 0; + line-height: 12px; +} + +/* Battery element styling*/ + +#quad-status_wrapper { + display:none; + color: white; + font-size: 10px; + min-width: 90px; + margin-right: 10px; + line-height: 12px; + height: 67px; + border-radius: 5px; + border: 1px solid #272727; + box-shadow: 0 1px 0 rgba(92, 92, 92, 0.5); + background-color: #434343; + background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); + text-shadow: 0 1px rgba(0, 0, 0, 1.0); +} + +@media all and (min-width: 1125px) { + #quad-status_wrapper { + margin-right: 20px; + } +} + +.quad-status-contents { + display: none; + margin-top: 10px; + margin-left: 14px; + height: 10px; + width: 31px; +} + + +.battery-legend { + display: inline; + position: relative; + top: -2px; + margin-top: 0; + left: 0; + right: 0; + width: 40px; + text-align: left; + color: silver; + margin-left: -8px; + padding-right: 4px +} + +.quad-status-contents progress::-webkit-progress-bar { + height: 12px; + background-color: #eee; +} + +.quad-status-contents progress::-webkit-progress-value { + background-color: #bcf; +} + +.battery-status { + height: 11px; +} + +.battery-status.state-ok { + background-color: #59AA29; +} +.battery-status.state-warning { + background-color: var(--error); +} + +.battery-status.state-empty { + animation: error-blinker 1s linear infinite; +} + +@keyframes error-blinker { + 0% { + background-color: transparent; + } + 50% { + background-color: var(--error); + } +} + +.battery-icon { + background-image: url(../images/icons/cf_icon_bat_grey.svg); + background-size: contain; + background-position: center; + display: inline-block; + height: 30px; + width: 60px; + transition: none; + margin-top: 4px; + margin-left: -4px; + background-repeat: no-repeat; +} + + +.armedicon, +.failsafeicon, +.linkicon { + margin-left: 8px; + margin-right: 8px; + margin-top: 6px; + height: 18px; + width: 18px; + opacity: 0.8; + background-size: contain; + background-position: center; + transition: none; +} + +.armedicon { + background-image: url(../images/icons/cf_icon_armed_grey.svg); +} +.armedicon.active { + background-image: url(../images/icons/cf_icon_armed_active.svg); +} + +.failsafeicon { + background-image: url(../images/icons/cf_icon_failsafe_grey.svg); +} +.failsafeicon.active { + background-image: url(../images/icons/cf_icon_failsafe_active.svg); +} + +.linkicon { + background-image: url(../images/icons/cf_icon_link_grey.svg); +} +.linkicon.active { + background-image: url(../images/icons/cf_icon_link_active.svg); +} + +/** Header (phones) **/ +@media all and (max-width: 575px) { + .headerbar { + height: 56px; + background: rgba(0, 0, 0, 0.15); + flex-wrap: wrap; + align-content: flex-start; + padding-top: 12px; + box-sizing: border-box; + transition: all 0.2s; + } + + .headerbar.expand { + height: 154px; + } + + .headerbar.expand2 { + height: 118px; + } + + #menu_btn, #reveal_btn { + display: block; + } + + #menu_btn { + order: 1; + } + + #logo { + height: 24px; + width: 150px; + background-image: url(../images/light-wide-2-compact.svg); + background-position: left center; + order: 2; + margin-top: 0; + } + + #header_btns { + margin-left: auto; + order: 3; + } + + .open_firmware_flasher, .connect_controls { + width: 31px; + height: 31px; + margin-left: 15px; + } + + .firmware_b, .connect_b { + margin: 0; + zoom: 0.6; + } + + .logo_text, #port-picker, .header-wrapper, .flash_state, .connect_state { + display: none !important; + } + + #reveal_btn { + order: 4; + } + + #port-picker { + order: 5; + justify-content: space-between; + margin-top: 15px; + transition: all 0.2s; + } + + #port-picker.reveal { + display: flex !important; + width: 100%; + margin-left: 0; + } + + #port-override-option, #portsinput { + flex-grow: 1; + } + + #portsinput { + margin-right: 0; + } + + #port-override { + width: calc(100% - 40px); + } + + .header-wrapper { + order: 5; + zoom: 62%; + justify-content: space-around; + } + + .header-wrapper.reveal { + display: flex !important; + width: 100%; + margin-top: 24px; + } + + #dataflash_wrapper_global, #sensor-status, #quad-status_wrapper { + margin-right: 0; + } +} + + + +/** Log **/ #log { - margin-bottom: 0px; - border: 0px solid silver; /* was 1px*/ background-color: #242424; - color: #ccc; color: rgba(255, 255, 255, 0.60); line-height: 21px; - height: 27px; /* was 65*/ - overflow-y: hidden; /* scroll*/ + height: 27px; + overflow-y: hidden; + transition: all 0.2s; +} + +#log.active { + overflow-y: auto; + box-shadow: inset 0 0 15px #000000; + height: 111px; } #scrollicon { @@ -491,36 +847,24 @@ input[type="number"]::-webkit-inner-spin-button { top: 113px; height: 27px; width: 27px; - background-image: url(../images/icons/scroll.svg); background-repeat: no-repeat; - background-size: 100%; + background-image: url(../images/icons/scroll.svg); opacity: 0.0; - transition: all ease 0.3s; + transition: all ease 0.2s; } #scrollicon.active { - height: 110px; - margin-top: 10px; + height: 88px; + margin-top: 13px; margin-right: 20px; - width: 110px; + width: 88px; opacity: 0.15; - background-size: 80%; - box-shadow: inset 0 0 5px #000000; - transition: all ease 0.3s; -} - -#log.active { - overflow-y: auto; - box-shadow: inset 0 0 15px #000000; } #log .wrapper { - padding: 5px; /* was 5*/ - padding-left: 10px; - padding-bottom: 4px; - -webkit-user-select: text; + padding: 5px 5px 4px 10px; position: relative; - bottom: 0px; + bottom: 0; } #log a { @@ -532,43 +876,102 @@ input[type="number"]::-webkit-inner-spin-button { text-decoration: underline; } -/* Log switch */ .logswitch { position: absolute; right: 20px; - margin-top: -1px; - float: right; padding: 2px; z-index: 10; } .logswitch a { color: #656565 !important; - transition: all 0.3s; + transition: all 0.2s; } .logswitch a:hover { color: #959595 !important; text-decoration: none !important; - transition: all 0.3s; } +/** Log (phones) **/ +@media all and (max-width: 575px) { + #log.active { + box-shadow: none; + } + .logswitch { + background-color: #242424; + } + #scrollicon { + display: none; + } +} + + + +/** Tabs & content container **/ +#tab-content-container { + display: flex; + height: calc(100% - 162px); + align-items: stretch; +} + +#tab-content-container.logopen { + height: calc(100% - 247px); +} + +#tab-content-container, .tab_container, #content { + transition: all 0.2s; +} + +.tab_container.logopen, #content { + overflow-x: hidden; + overflow-y: auto; +} + +/** Tabs & content container (phones) **/ +@media all and (max-width: 575px) { + #tab-content-container { + height: calc(100% - 83px); + } + #tab-content-container.logopen { + height: calc(100% - 167px); + } + #tab-content-container.header_expanded { + height: calc(100% - 181px); + } + #tab-content-container.header_expanded2 { + height: calc(100% - 145px); + } + #tab-content-container.logopen.header_expanded { + height: calc(100% - 265px); + } + #tab-content-container.logopen.header_expanded2 { + height: calc(100% - 229px); + } +} + + +/** Tabs **/ .tab_container { - float: left; - height: calc(100% - 150px); width: 200px; border-right: 4px solid var(--accent); background-color: #2e2e2e; - transition: all 0.2s; - } -.tab_container.logopen { - height: calc(100% - 235px); - overflow-x: hidden; - overflow-y: auto; - transition: all 0.5s; - +#tab_logoversion { + display: none; + background-image: url(../images/light-wide-2.svg); + background-repeat: no-repeat; + background-position: center 20px; + background-size: 80%; + height: 120px; + position: relative; + border-bottom: 1px solid rgba(0, 0, 0, 0.30); +} +#tab_logoversion .logo_text { + display: block !important; + left: 100px; + top: 62px; } #tabs { @@ -592,11 +995,11 @@ input[type="number"]::-webkit-inner-spin-button { } #tabs li:first-child { - border-top: 0px; + border-top: 0; } #tabs li:last-child { - border-bottom: 0px; + border-bottom: 0; } #tabs li a { @@ -608,7 +1011,7 @@ input[type="number"]::-webkit-inner-spin-button { color: #999999; height: 23px; display: block; - text-shadow: 0px 1px rgba(0, 0, 0, 0.45); + text-shadow: 0 1px rgba(0, 0, 0, 0.45); transition: none; border-top: solid 1px rgba(255, 255, 255, 0.05); /* following is just for a graceful degradation */ @@ -633,7 +1036,7 @@ input[type="number"]::-webkit-inner-spin-button { background-color: var(--accent); color: #000; transition: none; - text-shadow: 0px 1px rgba(255, 255, 255, 0.45); + text-shadow: 0 1px rgba(255, 255, 255, 0.45); } @@ -648,6 +1051,53 @@ input[type="number"]::-webkit-inner-spin-button { background-position: 13px 7px; } +@media only screen and (max-height: 750px) , only screen and (max-device-height: 750px) { + .tab_container { + overflow-x: hidden; + overflow-y: auto; + } +} + +@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { + #tabs li a { + font-weight: normal; + font-size: 12px; + padding-left: 60px; + padding-top: 6px; + padding-bottom: 2px; + content: ""; + text-shadow: none; + transition: none; + /* following is just for a graceful degradation */ + text-overflow: clip; + white-space: nowrap; + overflow: hidden; + } + + .tab_container { + width: 42px; + } +} + +/** Tabs (phones) **/ +@media all and (max-width: 575px) { + .tab_container { + position: fixed; + z-index: 2000; + top: 0; + left: -304px; + bottom: 0; + width: 300px; + transition: all 0.3s; + } + .tab_container.reveal { + left: 0; + } + #tab_logoversion { + display: block; + } +} + /* Tab-Icons */ .ic_setup { background-image: url(../images/icons/cf_icon_setup_grey.svg); @@ -964,35 +1414,34 @@ li.active .ic_mission { background-image: url(../images/icons/cf_icon_mission_white.svg); } + + +/** Content **/ #content { - margin-top: 0px; - padding: 0px; - height: calc(100% - 156px); - /* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/ background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0px solid #848484; -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.3s; + width: calc(100% - 202px); } -#content.logopen { - margin-top: 0px; - padding: 0px; - height: calc(100% - 240px); /* (port picker, log OPEN, status bar: 20px + padding) - was: calc(100% - 171px)*/ - background-color: white; - overflow-x: hidden; - overflow-y: auto; - border: 0px solid #848484; - -webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */ - transition: all 0.5s; - /* Cause the height to shrink to contain its floated contents while log is open */ +@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { + #content { + width: calc(100% - 42px); + } } +/** Content (phones) **/ +@media all and (max-width: 575px) { + #content { + width: 100%; + } +} + + + +/** Status bar **/ #status-bar { position: fixed; - bottom: 0px; + bottom: 0; width: calc(100% - 20px); height: 20px; line-height: 20px; @@ -1015,6 +1464,15 @@ li.active .ic_mission { border: 0; } +/** Status bar (phones) **/ +@media all and (max-width: 575px) { + #status-bar { + display: none; + } +} + + + #cache { display: none; } @@ -1047,8 +1505,8 @@ dialog { dialog .dialog_toolbar .btn a { /* common styles for content toolbar buttons */ - margin-top: 0px; - margin-bottom: 0px; + margin-top: 0; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1057,13 +1515,11 @@ dialog .dialog_toolbar .btn a { float: left; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1075,7 +1531,7 @@ dialog .dialog_toolbar .btn a:hover { dialog .dialog_toolbar .btn a:active { background-color: var(--accent); transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } dialog .dialog_toolbar .btn a.disabled { @@ -1087,6 +1543,18 @@ dialog .dialog_toolbar .btn a.disabled { text-shadow: none; opacity: 0.5; } + +@media all and (max-width: 575px) { + dialog { + position: fixed; + width: calc(100% - 2em); + bottom: 0; + top: 56px; + border-radius: unset; + border: none; + overflow: auto; + } +} /* Border of the Tab */ /* Tab Title */ @@ -1104,7 +1572,7 @@ dialog .dialog_toolbar .btn a.disabled { background-color: #fff7cd; border: 1px solid #ffe55f; margin-bottom: 10px; - margin-top: 0px; + margin-top: 0; border-radius: 3px; font-size: 11px; font-weight: normal; @@ -1116,7 +1584,7 @@ dialog .dialog_toolbar .btn a.disabled { } .content_wrapper { - padding: 20px; + padding: 20px 20px 20px 19px; position: relative; } @@ -1133,8 +1601,8 @@ dialog .dialog_toolbar .btn a.disabled { .content_toolbar .btn a { /* common styles for content toolbar buttons */ - margin-top: 0px; - margin-bottom: 0px; + margin-top: 0; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1143,13 +1611,11 @@ dialog .dialog_toolbar .btn a.disabled { float: right; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1161,7 +1627,7 @@ dialog .dialog_toolbar .btn a.disabled { .content_toolbar .btn a:active { background-color: var(--accent); transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .content_toolbar .btn a.disabled { @@ -1193,6 +1659,7 @@ dialog .dialog_toolbar .btn a.disabled { .toolbar_fixed_bottom .content_toolbar { display: flex; + flex-wrap: wrap; position: absolute; bottom: 0; left: 0; @@ -1203,6 +1670,50 @@ dialog .dialog_toolbar .btn a.disabled { margin-left: auto; } +.toolbar_fixed_bottom .content_toolbar.xs-compressed { + flex-direction: row-reverse; +} + +.toolbar_fixed_bottom .content_toolbar.xs-compressed div:first-child { + margin-left: 0; +} + +.toolbar_fixed_bottom .content_toolbar.xs-compressed div:last-child { + margin-left: auto; +} + +.toolbar_expand_btn { + display: none; + position: absolute; + bottom: 15px; + left: 15px; + width: 20px; + height: 20px; + font-size: 20px; + line-height: 20px; + text-align: center; + z-index: 2000; +} + +@media all and (max-width: 575px) { + .toolbar_fixed_bottom .content_toolbar.xs-compressed { + padding-left: 60px; + box-sizing: border-box; + height: 50px; + } + .toolbar_fixed_bottom .content_toolbar.xs-compressed.expanded { + padding-left: 15px; + padding-bottom: 0; + height: auto; + } + .toolbar_fixed_bottom .content_toolbar.xs-compressed div { + margin-bottom: 10px; + } + .toolbar_expand_btn { + display: block; + } +} + /** Hack to change the "display: none" by a "visibility:hidden", to apply the margin-left: auto needed by the first element to align to the right the buttons */ .toolbar_fixed_bottom .content_toolbar div[style='display: none;']:first-child { @@ -1213,7 +1724,7 @@ dialog .dialog_toolbar .btn a.disabled { /* Colums START> */ .cf_column { min-height: 20px; - margin-bottom: 0px; + margin-bottom: 0; } .full { @@ -1331,11 +1842,11 @@ dialog .dialog_toolbar .btn a.disabled { .gui_box_titlebar { background-color: var(--quietHeader); color: var(--quietText); - border-radius: 3px 3px 0px 0px; + border-radius: 3px 3px 0 0; font-size: 13px; width: 100%; height: 27px; - padding-bottom: 0px; + padding-bottom: 0; float: left; margin-bottom: 7px; font-weight: 600; @@ -1343,11 +1854,11 @@ dialog .dialog_toolbar .btn a.disabled { .gui_box_bottombar { background-color: #e4e4e4; - border-radius: 0px 0px 3px 3px; + border-radius: 0 0 3px 3px; font-size: 13px; width: 100%; height: 27px; - padding-top: 0px; + padding-top: 0; float: left; font-weight: 600; } @@ -1361,7 +1872,7 @@ dialog .dialog_toolbar .btn a.disabled { padding-left: 10px; padding-right: 10px; padding-top: 4px; - margin-bottom: 0px; + margin-bottom: 0; float: left; } @@ -1373,13 +1884,13 @@ dialog .dialog_toolbar .btn a.disabled { width: calc(100% + 40px); margin-left: -20px; box-shadow: rgba(0, 0, 0, 0.00) 0 -3px 8px; - bottom: 0px; - margin-bottom: 0px; + bottom: 0; + margin-bottom: 0; } .fixed_band .save_btn a { margin-top: 9px; - margin-bottom: 0px; + margin-bottom: 0; margin-right: 20px; background-color: var(--accent); border-radius: 3px; @@ -1388,13 +1899,11 @@ dialog .dialog_toolbar .btn a.disabled { float: right; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 1px rgba(0, 0, 0, 0.25); display: block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1408,12 +1917,12 @@ dialog .dialog_toolbar .btn a.disabled { width: 100%; position: relative; margin-bottom: 10px; - margin-top: 0px; + margin-top: 0; float: left; } .default_btn a { - padding: 5px 0px 5px 0px; + padding: 5px 0 5px 0; text-align: center; background-color: var(--accent); border-radius: 4px; @@ -1437,7 +1946,7 @@ dialog .dialog_toolbar .btn a.disabled { .default_btn a:hover { background-color: #ffcc3f; color: #000; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); transition: all ease 0.2s; text-decoration:none; @@ -1446,7 +1955,7 @@ dialog .dialog_toolbar .btn a.disabled { .default_btn a:active { background-color: #ffcc3f; transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .margin-top5 { @@ -1463,13 +1972,11 @@ dialog .dialog_toolbar .btn a.disabled { color: #000; font-weight: bold; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: inline-block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } @@ -1477,7 +1984,7 @@ dialog .dialog_toolbar .btn a.disabled { width: auto; position: relative; margin-bottom: 7px; - margin-top: 0px; + margin-top: 0; margin-right: 5px; float: left; } @@ -1485,7 +1992,7 @@ dialog .dialog_toolbar .btn a.disabled { .small a { padding: 3px 4px 4px 4px; text-align: center; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 1px rgba(0, 0, 0, 0.25); background-color: #acacac; border-radius: 3px; border: 1px solid #949494; @@ -1500,7 +2007,7 @@ dialog .dialog_toolbar .btn a.disabled { .small a:hover { background-color: var(--accent); color: #000; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); border: 1px solid var(--accent); transition: all ease 0.2s; } @@ -1508,12 +2015,12 @@ dialog .dialog_toolbar .btn a.disabled { .small a:active { background-color: #878787; transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .green a { background-color: var(--accent); - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); color: #000; border: 1px solid #dba718; transition: all ease 0.2s; @@ -1522,7 +2029,7 @@ dialog .dialog_toolbar .btn a.disabled { .green a:hover { background-color: #ffcc3f; border: 1px solid #dba718; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); color: #000; transition: all ease 0.2s; } @@ -1537,14 +2044,13 @@ dialog .dialog_toolbar .btn a.disabled { } .cf_table td { - border: 0px; + border: 0; padding-top: 2px; padding-bottom: 5px; } .cf_table tr:not(:last-child) td { - border-bottom: solid 1px var(--subtleAccent); - border-style: dotted; + border-bottom: dotted 1px var(--subtleAccent); } .third { @@ -1577,160 +2083,6 @@ dialog .dialog_toolbar .btn a.disabled { margin-left: 3px; } -/* connect button */ -.connect_controls { - position: relative; - float: right; - left: 0px; - top: 19px; - height: 70px; - width: 60px; - margin-right: 20px; - margin-left: 20px; -} - -@media all and (min-width: 1125px) { - .connect_controls { - margin-left: 10px; - margin-right: 15px; - } -} - -/* firmware update button */ -.open_firmware_flasher { - position: relative; - float: right; - left: 0px; - top: 19px; - height: 70px; - width: 60px; - margin-right: 10px; - margin-left: 10px; -} - -@media all and (min-width: 1125px) { - .open_firmware_flasher { - margin-right: 20px; - margin-left: 20px; - } -} - -.connect_b { - float: left; -} - -.connect_b a { - height: 50px; - width: 50px; - border-radius: 100px; - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); - float: left; - margin-left: 5px; - margin-bottom: 7px; - transition: none; -} - -.connect_b a.connect.disabled { - background-color: #808080; - pointer-events: none; - cursor: default; - } - -.connect_b a.connect { - background-color: var(--accent); - border: 1px solid #dba718; - background-image: url(../images/icons/cf_icon_usb2_white.svg); - background-repeat: no-repeat; - background-size: 44px; - background-position: center 6px; - transition: none; -} - -.connect_b a.connect:hover { - background-color: #ffcc3f; -} - -.connect_b a.connect.active { - background-color: #e60000; - border: 1px solid #fe0000; - background-image: url(../images/icons/cf_icon_usb1_white.svg); - transition: none; -} - -.connect_b a.connect.active:hover { - background-color: #f21212; -} - -.firmware_b { - float: left; -} - -.firmware_b a { - height: 50px; - width: 50px; - border-radius: 100px; - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); - float: left; - margin-left: 5px; - margin-bottom: 7px; - transition: none; -} - -.firmware_b a.flash.disabled { - background-color: #808080; - pointer-events: none; - cursor: default; - } - -.firmware_b a.flash { - background-color: var(--accent); - border: 1px solid #dba718; - background-image: url(../images/icons/cf_icon_flasher_white.svg); - background-repeat: no-repeat; - background-size: 30px; - background-position: center 10px; - transition: none; -} - -.firmware_b a.flash:hover { - background-color: #ffcc3f; -} - -.firmware_b a.flash.active { - background-color: #e60000; - border: 1px solid #fe0000; - background-image: url(../images/icons/cf_icon_flasher_white.svg); - transition: none; -} - -.firmware_b a.flash.active:hover { - background-color: #f21212; -} - -.connect_state { - float: left; - height: 20px; - width: 100%; - text-align: center; - color: #fff; - font-size: 12px; - font-weight: normal; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); - margin-top: -1px; -} - -.flash_state { - float: left; - height: 20px; - width: 100%; - text-align: center; - color: #fff; - font-size: 12px; - font-weight: normal; - text-shadow: 0px 1px rgba(0, 0, 0, 0.25); - margin-top: -1px; -} - /* fixing padding for all Tabs*/ .tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-firmware_flasher, .tab-gps, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning, .tab-ports, .tab-receiver, @@ -1756,9 +2108,7 @@ dialog .dialog_toolbar .btn a.disabled { /* GPS Fix styling*/ .fixtrue { background-color: #56ac1d; - padding: 2px; - padding-left: 5px; - padding-right: 5px; + padding: 2px 5px; border-radius: 3px; color: #fff; font-size: 10px; @@ -1766,245 +2116,16 @@ dialog .dialog_toolbar .btn a.disabled { .fixfalse { background-color: #e60000; - padding: 2px; - padding-left: 5px; - padding-right: 5px; + padding: 2px 5px; border-radius: 3px; color: #fff; font-size: 10px; } -/* Dataflash element styling*/ - -#dataflash_wrapper_global { - color:white; - font-size:10px; - margin-top: 20px; - width:125px; - float: right; - margin-right: 5px; - line-height: 12px; - height: 33px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0px 1px 0px rgba(92, 92, 92, 0.5); - background-color: #434343; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - padding-top:5px; - display:none; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); - -} - -@media all and (min-width: 1125px) { - #dataflash_wrapper_global { - margin-right: 10px; - } -} - -.dataflash-contents_global { - margin-top: 18px; - border: 1px solid #4A4A4A; - background-color: #4A4A4A; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: flex-start; - border-radius: 3px; - margin-left: 5px; - margin-right: 5px; -} - - -.dataflash-free_global { - background-color: var(--accent); - border-radius: 4px; -} - - -.dataflash-contents_global .notsupported_global { - display: none; -} - -.dataflash-contents_global li { - height: 5px; - position: relative; - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20); - border-radius: 2px; - -} - -.dataflash-contents_global li div { - position: absolute; - top: -18px; - margin-top: 0px; - left: 0; - right: 0; - width:120px; - text-align: left; - color:silver; -} - -.dataflash-contents_global progress::-webkit-progress-bar { - height: 8px; - background-color: #eee; -} - -.dataflash-contents progress::-webkit-progress-value { - background-color: #bcf; -} - -.noflash_global { - display:none; - color: #868686; - text-align: center; - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); - margin-top:2px; -} .cf_tooltiptext { display:none; } -#expertMode { - color: var(--subtleAccent); - margin-top: 27px; - width:125px; - float: right; - margin-right: 0px; - line-height: 12px; -} - -/* Battery element styling*/ - -#quad-status_wrapper { - display:none; - color: white; - font-size: 10px; - margin-top: 20px; - min-width: 90px; - float: right; - margin-right: 10px; - line-height: 12px; - height: 67px; - border-radius: 5px; - border: 1px solid #272727; - box-shadow: 0px 1px 0px rgba(92, 92, 92, 0.5); - background-color: #434343; - background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55)); - text-shadow: 0px 1px rgba(0, 0, 0, 1.0); -} - -@media all and (min-width: 1125px) { - #quad-status_wrapper { - margin-right: 20px; - } -} - -.quad-status-contents { - display: none; - margin-top: 10px; - margin-left: 14px; - height: 10px; - width: 31px; -} - - -.battery-legend { - display: inline; - position: relative; - top: -2px; - margin-top: 0px; - left: 0; - right: 0; - width: 40px; - text-align: left; - color: silver; - margin-left: -8px; - padding-right: 4px -} - -.quad-status-contents progress::-webkit-progress-bar { - height: 12px; - background-color: #eee; -} - -.quad-status-contents progress::-webkit-progress-value { - background-color: #bcf; -} - -.battery-status { - height: 11px; -} - -.battery-status.state-ok { - background-color: #59AA29; -} -.battery-status.state-warning { - background-color: var(--error); -} - -.battery-status.state-empty { - animation: error-blinker 1s linear infinite; -} - -@keyframes error-blinker { - 0% { - background-color: none; - } - 50% { - background-color: var(--error); - } -} - -.battery-icon { - background-image: url(../images/icons/cf_icon_bat_grey.svg); - background-size: contain; - background-position: center; - display: inline-block; - height: 30px; - width: 60px; - transition: none; - margin-top: 4px; - margin-left: -4px; - background-repeat: no-repeat; -} - - -.armedicon, -.failsafeicon, -.linkicon { - margin-left: 8px; - margin-right: 8px; - margin-top: 6px; - height: 18px; - width: 18px; - opacity: 0.8; - background-size: contain; - background-position: center; - transition: none; -} - -.armedicon { - background-image: url(../images/icons/cf_icon_armed_grey.svg); -} -.armedicon.active { - background-image: url(../images/icons/cf_icon_armed_active.svg); -} - -.failsafeicon { - background-image: url(../images/icons/cf_icon_failsafe_grey.svg); -} -.failsafeicon.active { - background-image: url(../images/icons/cf_icon_failsafe_active.svg); -} - -.linkicon { - background-image: url(../images/icons/cf_icon_link_grey.svg); -} -.linkicon.active { - background-image: url(../images/icons/cf_icon_link_active.svg); -} - .bottomStatusIcons { display: flex; justify-content: space-between; @@ -2043,7 +2164,7 @@ button.active { @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .content_wrapper { - padding: 15px; + padding: 15px 15px 15px 14px; } .tab_title { @@ -2061,10 +2182,6 @@ button.active { line-height: 15px; } -#content { - height: calc(100% - 151px); -} - .cf_table td { padding-top: 2px; padding-bottom: 2px; @@ -2074,29 +2191,10 @@ button.active { margin-bottom: 10px; } -#tabs li a { - font-weight: normal; - font-size: 12px; - padding-left: 60px; - padding-top: 6px; - padding-bottom: 2px; - content: ""; - text-shadow: none; - transition: none; - /* following is just for a graceful degradation */ - text-overflow: clip; - white-space: nowrap; - overflow: hidden; -} - -.tab_container { - width: 42px; -} - .gui_box_titlebar { font-size: 12px; height: 24px; - padding-bottom: 0px; + padding-bottom: 0; margin-bottom: 5px; float: left; } @@ -2105,7 +2203,7 @@ button.active { padding-left: 10px; padding-right: 10px; padding-top: 3px; - margin-bottom: 0px; + margin-bottom: 0; float: left; } @@ -2123,12 +2221,12 @@ input { } .gps_false { - padding: 0px 3px 0px 3px; + padding: 0 3px 0 3px; font-size: 10px; } .gps_true { - padding: 0px 3px 0px 3px; + padding: 0 3px 0 3px; font-size: 10px; } @@ -2151,15 +2249,6 @@ input { display: none; } -@media only screen and (max-height: 750px) , only screen and (max-device-height: 750px) { - -.tab_container { - overflow-x: hidden; - overflow-y: auto; -} - -} - .darkgrey_box { background-color: #575757; color: white; @@ -2210,8 +2299,7 @@ input { } .dialogReportProblems-listItem { - list-style: initial; - list-style-type: circle; + list-style: circle; margin-left: 20px; margin-bottom: 5px; } @@ -2249,3 +2337,156 @@ input { .noUi-connect { box-shadow: none; } + +/** Responsive grid **/ +@media all and (max-width: 575px) { + .sm, .md, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 576px) and (max-width: 767px) { + .xs, .md, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 768px) and (max-width: 991px) { + .xs, .sm, .lg, .xl { + display: none !important; + } +} +@media all and (min-width: 992px) and (max-width: 1139px) { + .xs, .sm, .md, .xl { + display: none !important; + } +} +@media all and (min-width: 1140px) { + .xs, .sm, .md, .lg { + display: none !important; + } +} +@media all and (min-width: 576px) { + .sm-max { + display: none !important; + } +} +@media all and (min-width: 768px) { + .md-max { + display: none !important; + } +} +@media all and (min-width: 992px) { + .lg-max { + display: none !important; + } +} +@media all and (max-width: 1139px) { + .lg-min { + display: none !important; + } +} +@media all and (max-width: 991px) { + .md-min { + display: none !important; + } +} +@media all and (max-width: 767px) { + .sm-min { + display: none !important; + } +} +.grid-row { + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + box-sizing: border-box; +} +.grid-col { + margin-left: 7px; + margin-right: 7px; +} +.grid-col.col1 { + width: calc(8.33% - 14px); +} +.grid-col.col2 { + width: calc(16.67% - 14px); +} +.grid-col.col3 { + width: calc(25% - 14px); +} +.grid-col.col4 { + width: calc(33.33% - 14px); +} +.grid-col.col5 { + width: calc(41.67% - 14px); +} +.grid-col.col6 { + width: calc(50% - 14px); +} +.grid-col.col7 { + width: calc(58.33% - 14px); +} +.grid-col.col8 { + width: calc(66.67% - 14px); +} +.grid-col.col9 { + width: calc(75% - 14px); +} +.grid-col.col10 { + width: calc(83.33% - 14px); +} +.grid-col.col11 { + width: calc(91.67% - 14px); +} +.grid-col.col12 { + width: calc(100% - 14px); +} +.grid-col:first-child { + margin-left: 0; +} +.grid-col:last-child { + margin-right: 0; +} +.grid-col.col1:first-child, .grid-col.col1:last-child { + width: calc(8.33% - 7px); +} +.grid-col.col2:first-child, .grid-col.col2:last-child { + width: calc(16.67% - 7px); +} +.grid-col.col3:first-child, .grid-col.col3:last-child { + width: calc(25% - 7px); +} +.grid-col.col4:first-child, .grid-col.col4:last-child { + width: calc(33.33% - 7px); +} +.grid-col.col5:first-child, .grid-col.col5:last-child { + width: calc(41.67% - 7px); +} +.grid-col.col6:first-child, .grid-col.col6:last-child { + width: calc(50% - 7px); +} +.grid-col.col7:first-child, .grid-col.col7:last-child { + width: calc(58.33% - 7px); +} +.grid-col.col8:first-child, .grid-col.col8:last-child { + width: calc(66.67% - 7px); +} +.grid-col.col9:first-child, .grid-col.col9:last-child { + width: calc(75% - 7px); +} +.grid-col.col10:first-child, .grid-col.col10:last-child { + width: calc(83.33% - 7px); +} +.grid-col.col11:first-child, .grid-col.col11:last-child { + width: calc(91.67% - 7px); +} +.grid-col.col12:first-child, .grid-col.col12:last-child { + width: calc(100% - 7px); +} +@media all and (max-width: 575px) { + .grid-col.col1, .grid-col.col2, .grid-col.col3, .grid-col.col4, .grid-col.col5, .grid-col.col6, .grid-col.col7, .grid-col.col8, .grid-col.col9, .grid-col.col10, .grid-col.col11, .grid-col.col12 { + width: 100% !important; + margin-left: 0 !important; + margin-right: 0 !important; + } +} diff --git a/src/css/main_cordova.css b/src/css/main_cordova.css new file mode 100644 index 00000000..4b83daf6 --- /dev/null +++ b/src/css/main_cordova.css @@ -0,0 +1,102 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} +html, body, #loading, #webview_troubleshooting { + width: 100%; + height: 100%; +} +body { + display: flex; + flex-direction: column; + font-family: 'Open Sans', 'Segoe UI', Tahoma, sans-serif; + font-size: 12px; + color: #303030; + background-color: #3d3f3e; +} +#headerbar { + display: flex; + align-items: center; + justify-content: center; + height: 56px; + padding: 0 20px; + background: rgba(0, 0, 0, 0.15); +} +#headerbar img { + height: 20px; +} +#loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: #ffffff; +} +#loading p { + font-weight: bold; + margin-top: 20px; +} +#webview_troubleshooting { + display: none; + background: #ffffff; + padding: 20px; +} +#webview_apps { + list-style: inside; +} +#webview_step_btn1, #webview_step_btn2 { + margin-top: 10px; +} +#webview_step_btn2 { + display: none; +} +.box { + border: 1px solid #ccc; + border-radius: 4px; + width: 100%; + margin-bottom: 20px; + background-color: #f9f9f9; + overflow: hidden; +} +.box .box_titlebar { + width: 100%; + background-color: #828885; + color: #ffffff; + font-size: 13px; + height: 27px; + line-height: 27px; + font-weight: 600; + padding: 0 10px; +} +.box .box_titlebar.warning { + background-color: #ffbb00; +} +.box .box_body { + padding: 10px; +} +.divider { + margin: 10px 0 9px 0; + border-top: 1px solid #ccc; +} +.btn { + padding: 5px; + text-align: center; + background-color: #ffbb00; + border-radius: 4px; + border: 1px solid #dba718; + color: #ffffff; + font-weight: 600; + font-size: 12px; + line-height: 13px; + transition: all ease 0.2s; +} +.btn:hover { + background-color: #ffcc3f; + text-shadow: 0 1px rgba(255, 255, 255, 0.25); +} +.btn:focus { + outline: none; + background-color: #ffcc3f; + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); +} diff --git a/src/css/tabs/adjustments.css b/src/css/tabs/adjustments.css index 28ebed88..e5edbf9f 100644 --- a/src/css/tabs/adjustments.css +++ b/src/css/tabs/adjustments.css @@ -108,3 +108,13 @@ .tab-adjustments .adjustment .functionSwitchChannel { width: 5%; } + +@media all and (max-width: 575px) { + .tab-adjustments .overflow { + overflow: auto; + } + + .tab-adjustments .range { + min-width: 300px; + } +} diff --git a/src/css/tabs/auxiliary.css b/src/css/tabs/auxiliary.css index 5f0cf7bf..f06311da 100644 --- a/src/css/tabs/auxiliary.css +++ b/src/css/tabs/auxiliary.css @@ -30,13 +30,11 @@ } .tab-auxiliary .mode.off .info { - background: #cb4747; background: #828885; color: white; } .tab-auxiliary .mode.off:nth-child(odd) .info { - background: #cb4747; background: #828885; } @@ -54,18 +52,17 @@ .tab-auxiliary .modes { width: 100%; - border-spacing: 0px; } .tab-auxiliary .mode { background-color: #f9f9f9; vertical-align: top; - border-bottom: 1px solid #000000; + display: flex; } .tab-auxiliary .mode .name { min-height: 80px; - padding: 5px 0px; + padding: 5px 0; } .tab-auxiliary .mode .info { @@ -76,7 +73,7 @@ background-color: #e4e4e4; border-bottom: 5px solid white; color: grey; - min-width: 100px; + min-width: 140px; } .tab-auxiliary .mode .info .name { @@ -86,7 +83,7 @@ .tab-auxiliary .mode .info .buttons { position: absolute; - bottom: 0px; + bottom: 0; width: 100%; } @@ -103,16 +100,17 @@ } .tab-auxiliary .ranges { - margin: 10px; - padding-right: 0px; + padding-right: 0; border-bottom: 5px solid white; + width: 90%; + max-width: calc(100% - 140px); } .tab-auxiliary .range { position: relative; height: 70px; padding-top: 15px; - padding-left: 0px; + padding-left: 0; border-top: 1px solid #fff; border-bottom: 1px solid var(--subtleAccent); background-color: #ececec; @@ -131,25 +129,25 @@ } .tab-auxiliary .range:first-child { - border-top: 0px; + border-top: 0; } .tab-auxiliary .range:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-auxiliary .link:first-child { - border-top: 0px; + border-top: 0; } .tab-auxiliary .link:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-auxiliary .range>.buttons { position: absolute; - top: 0px; - right: 0px; + top: 0; + right: 0; } .tab-auxiliary .range>.buttons .a { @@ -252,7 +250,7 @@ } .tab-auxiliary .fixed_band { - bottom: 0px; + bottom: 0; } .tab-auxiliary .save_btn a { @@ -261,11 +259,67 @@ @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-auxiliary .fixed_band { - margin: 0px; width: calc(100% - -30px); - margin-left: -15px; + margin: 0 0 0 -15px; } .tab-auxiliary .fixed_band .save_btn a { margin-right: 15px; } } + +@media all and (max-width: 575px) { + .tab-auxiliary .mode { + flex-wrap: wrap; + } + .tab-auxiliary .mode .info { + width: 100%; + border-bottom: 0; + } + .tab-auxiliary .mode .info .name { + text-align: left; + padding-left: 10px; + min-height: auto; + } + .tab-auxiliary .mode .info .buttons { + right: 0; + width: auto; + display: flex; + } + .tab-auxiliary .mode .ranges { + width: 100%; + max-width: 100%; + } + .tab-auxiliary .range { + display: flex; + height: auto; + flex-wrap: wrap; + } + .tab-auxiliary .mode .range .channelInfo { + display: flex; + margin: 0 10px; + width: 100%; + flex-wrap: wrap; + } + .tab-auxiliary .limits { + width: 100%; + justify-content: space-between; + display: flex; + } + .tab-auxiliary .range .channel-slider { + width: 100%; + margin: 10px 10px 45px 10px; + } + .tab-auxiliary .delete a { + margin-top: 15px; + margin-right: 10px; + position: absolute; + float: none; + top: 0; + right: 0; + } + .tab-auxiliary .link { + height: auto; + display: flex; + padding-bottom: 10px; + } +} diff --git a/src/css/tabs/cli.css b/src/css/tabs/cli.css index ce64304c..d52cbf56 100644 --- a/src/css/tabs/cli.css +++ b/src/css/tabs/cli.css @@ -7,21 +7,21 @@ } .tab-cli p { - padding: 0px; - border: 0px dotted var(--subtleAccent); + padding: 0; + border: 0 dotted var(--subtleAccent); } .tab-cli .backdrop { border: 1px solid var(--subtleAccent); background-color: rgba(0, 0, 0, 0.75); - margin-top: 0px; + margin-top: 0; height: calc(100% - 90px); /* - (p, textarea) */ background-image: url("../../images/light-wide-1.svg"); background-repeat: no-repeat; background-position: 50% 80%; background-size: 600px; border-radius: 5px; - box-shadow: inset 0px 0px 20px rgba(0, 0, 0, 0.80); + box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.80); width: 100%; } @@ -137,3 +137,9 @@ font-weight: bold; } /* End AutoComplete */ + +@media all and (max-width: 575px) { + .tab-cli .backdrop { + background-size: 100%; + } +} diff --git a/src/css/tabs/configuration.css b/src/css/tabs/configuration.css index 6420f4bd..66b83928 100644 --- a/src/css/tabs/configuration.css +++ b/src/css/tabs/configuration.css @@ -1,12 +1,42 @@ +.tab-configuration .ui-grid-col { + margin-bottom: 0; +} +.tab-configuration .mixerPreview { + max-width: 230px; + background-color: #eeeeee; + text-align: center; + float: left; + border-radius: 5px; + margin-top: 5px; +} +.tab-configuration .mixerPreview img { + width: 90%; + height: 90%; + padding: 5%; +} +.tab-configuration select.batterymetertype { + margin-right: 5px; + float: left; + width: 150px; +} +.tab-configuration input, +.tab-configuration select { + border: 1px solid var(--subtleAccent); + width: 230px; + height: 20px; + float: left; + margin-right: 15px; + border-radius: 3px; +} + .tab-configuration table { - margin-bottom: 0px; + margin-bottom: 0; width: 100%; float: left; } .tab-configuration table, .tab-configuration table th, .tab-configuration table td { - padding: 0px; - padding-left: 0px; + padding: 0; text-align: left; } @@ -40,17 +70,6 @@ border-bottom: 1px solid var(--subtleAccent); } -.tab-configuration .leftWrapper { - float: left; - width: calc(50% - 20px); -} - -.tab-configuration .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 20px; -} - .tab-configuration .mixerList { width: 100%; height: 20px; @@ -62,7 +81,7 @@ border-collapse: collapse; margin-bottom: 5px; margin-top: -5px; - padding: 0px; + padding: 0; } .tab-configuration dl.features dt { @@ -96,12 +115,12 @@ .tab-configuration .number .disabled { width: 48px; - padding: 0px 5px; + padding: 0 5px; background-color: #ececec; } .tab-configuration .number span { - margin-left: 0px; + margin-left: 0; } .tab-configuration .gps .line { @@ -117,9 +136,9 @@ } .tab-configuration .gps .select > div:first-child { - float: left; - height: 20px; - margin-right: 15px; + float: left; + height: 20px; + margin-right: 15px; margin-left: 3px; } @@ -128,7 +147,7 @@ } .tab-configuration .current .checkbox { - margin-top: 0px; + margin-top: 0; float: left; } @@ -138,7 +157,7 @@ } .tab-configuration .current .checkbox div input { - margin: 0px; + margin: 0; float: left; } @@ -153,17 +172,17 @@ } .tab-configuration .disarm .checkbox div { - margin-bottom: 0px; - margin-top: 0px; + margin-bottom: 0; + margin-top: 0; } .tab-configuration .disarm .checkbox div input { - margin: 0px; + margin: 0; float: left; } .tab-configuration .disarm .checkbox span { - margin-left: 0px; + margin-left: 0; } .tab-configuration .freelabel { @@ -176,12 +195,12 @@ } .tab-configuration span { - margin: 0px; + margin: 0; } .tab-configuration .disarm .checkbox { float: left; - padding-left: 0px; + padding-left: 0; margin-top: -5px; padding-bottom: 5px; border-bottom: 1px solid var(--subtleAccent); @@ -210,14 +229,14 @@ .tab-configuration .number, .tab-configuration .select - { +{ margin-bottom: 5px; clear: left; padding-bottom: 5px; border-bottom: 1px solid var(--subtleAccent); width: 100%; float: left; - } +} .tab-configuration .board_align_inputs, .tab-configuration .gyro_alignment_inputs { @@ -254,12 +273,12 @@ .tab-configuration .number:last-child, .tab-configuration .select:last-child { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .gui_box_titlebar { - margin-bottom: 0px; + margin-bottom: 0; } .tab-configuration .numberspacer { @@ -279,8 +298,8 @@ .tab-configuration .rssi td { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { @@ -312,12 +331,6 @@ width: 30px; } -.tab-configuration select.batterymetertype { - margin-right: 5px; - float: left; - width: 150px; -} - .tab-configuration .currentmetertype { float: left; width: 150px; @@ -340,17 +353,7 @@ } .tab-configuration .serialRXBox, .spiRxBox { - padding-top: 0px; -} - -.tab-configuration input, -.tab-configuration select { - border: 1px solid var(--subtleAccent); - width: 230px; - height: 20px; - float: left; - margin-right: 15px; - border-radius: 3px; + padding-top: 0; } @@ -361,24 +364,9 @@ .tab-configuration .beeper-configuration tr:last-child td, .tab-configuration .dshotBeaconConditions tr:last-child td, .tab-configuration .other tr:last-child td { - border-bottom: 0px; - padding-bottom: 0px; - margin-bottom: 0px; -} - -.tab-configuration .mixerPreview { - max-width: 230px; - background-color: #eeeeee; - text-align: center; - float: left; - border-radius: 5px; - margin-top: 5px; -} - -.tab-configuration .mixerPreview img { - width: 90%; - height: 90%; - padding: 5%; + border-bottom: 0; + padding-bottom: 0; + margin-bottom: 0; } .tab-configuration .gui_box { @@ -463,26 +451,13 @@ } .tab-configuration .gpsSettings .note { - margin-top: 10px; -} - -.tab-configuration .note.note_adjust { - margin-left: 5px; - margin-right: 5px; + margin-top: 10px; } @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-configuration .gui_box span { line-height: 17px; } - .tab-configuration .leftWrapper { - width: calc(50% - 15px); - } - .tab-configuration .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 15px; - } .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { float: left; } @@ -499,3 +474,36 @@ float: left; } } +@media all and (max-width: 575px) { + .tab-configuration .mixerPreview { + max-width: none; + } + .tab-configuration select.escprotocol { + width: 100%; + margin-right: 0; + } + .tab-configuration .rssi .gui_box, .tab-configuration .system .gui_box { + min-height: auto; + } + .tab-configuration .current td:nth-child(2) { + width: auto; + } + .tab-configuration .voltage td:nth-child(2) { + width: auto; + } + .tab-configuration .rssi td:nth-child(2) { + width: auto; + } + .tab-configuration .rxFailsafe td:nth-child(2) { + width: auto; + } + .tab-configuration .gps td:nth-child(2) { + width: auto; + } + select.features.rxMode, select.serialRX, .dshotbeacon > td > div.select > div, .dshotbeacon select.dshotBeeperBeaconTone { + width: 100%; + } + .tab-configuration .mixer .gui_box, .tab-configuration .motorstop .gui_box { + min-height: auto; + } +} diff --git a/src/css/tabs/failsafe.css b/src/css/tabs/failsafe.css index 47dcc74f..821383aa 100644 --- a/src/css/tabs/failsafe.css +++ b/src/css/tabs/failsafe.css @@ -254,8 +254,7 @@ width: 100%; border-bottom: 1px solid var(--subtleAccent); float: left; - padding: 0px; - padding-bottom: 6px; + padding: 0 0 6px; margin-bottom: 3px; } @@ -265,7 +264,7 @@ .tab-failsafe .featuresNew td:last-child { width: calc(100% - 125px); - margin-right: 0px; + margin-right: 0; } .tab-failsafe .featuresNew td { diff --git a/src/css/tabs/help.css b/src/css/tabs/help.css index 09b2b0c4..b3c5544a 100644 --- a/src/css/tabs/help.css +++ b/src/css/tabs/help.css @@ -1,11 +1,6 @@ -.tab-help .twothird { - width: calc(67% - 15px); - margin-right: 15px; -} - .tab-help .gui_box { min-height: 500px; - margin-bottom: 0px; + margin-bottom: 0; } .tab-help ul { @@ -18,7 +13,7 @@ padding-bottom: 5px; background-image: url(../../images/arrow.svg); background-repeat: no-repeat; - background-position: 0px 8px; + background-position: 0 8px; background-size: 12px; } @@ -33,4 +28,12 @@ .tab-help .subline { margin-bottom: 5px; -} \ No newline at end of file +} + +/** (phones) **/ +@media all and (max-width: 575px) { + .tab-help .gui_box { + min-height: auto; + margin-bottom: 15px; + } +} diff --git a/src/css/tabs/landing.css b/src/css/tabs/landing.css index 73393ef8..cbb6f580 100644 --- a/src/css/tabs/landing.css +++ b/src/css/tabs/landing.css @@ -14,21 +14,20 @@ .tab-landing .content_top { height: 140px; - background: #fff; padding: 20px; - background-image: url(../../images/pattern.png); + background: #fff url(../../images/pattern.png); background-size: 300px; } .tab-landing .content_mid { background-color: var(--accent); overflow: hidden; + padding: 0 15px; } .tab-landing .content_foot { clear: both; - padding: 20px; - padding-bottom: 5px; + padding: 20px 20px 5px; } /* hero block */ @@ -60,16 +59,8 @@ } /* text columns */ -.tab-landing .content_mid .column .wrap { - padding: 15px; - padding-bottom: 0px; - padding-top: 0px; -} - .tab-landing .content_mid .column .wrap2 { padding: 10px; - padding-bottom: 10px; - padding-top: 10px; } .tab-landing .content_mid h2 { @@ -83,18 +74,6 @@ } -.tab-landing .content_mid .text1 .wrap { - margin-left: 0px; -} - -.tab-landing .content_mid .text1 { - width: 37%; -} - -.tab-landing .content_mid .text2 { - width: 40%; -} - .tab-landing .content_mid .text2 ul { margin-top: 2px; } @@ -106,17 +85,10 @@ margin-left: 30px; } -.tab-landing .content_mid .text3 { - width: 23%; -} - .tab-landing .content_mid .text3 .wrap2 { border: 1px solid var(--subtleAccent); border-radius: 5px; background: white; - margin-right: 20px; - margin-left: 10px; - margin-top: 5px; min-height: 187px; font-size: 11px; } @@ -127,11 +99,7 @@ } .tab-landing .content_mid_bottom { - padding: 15px; - padding-top: 0px; - padding-bottom: 0px; - overflow: hidden; - float: left; + padding: 0 15px; } .tab-landing .content_mid_bottom .logo { @@ -140,7 +108,7 @@ } .tab-landing .content_mid_bottom .text4 { - margin-top: 0px; + margin-top: 0; margin-left: 5px; display: inline-block; } @@ -163,3 +131,10 @@ content: ", "; font-weight: normal; } + +/** (phones) **/ +@media all and (max-width: 575px) { + .tab-landing .logowrapper, .tab-landing .logowrapper img { + width: auto; + } +} diff --git a/src/css/tabs/led_strip.css b/src/css/tabs/led_strip.css index ac29ee16..de197d43 100644 --- a/src/css/tabs/led_strip.css +++ b/src/css/tabs/led_strip.css @@ -442,3 +442,9 @@ z-index: 100; border: 1px dotted white; } + +@media all and (max-width: 575px) { + .tab-led-strip .controls { + width: 100%; + } +} diff --git a/src/css/tabs/logging.css b/src/css/tabs/logging.css index 55a8b859..cb096634 100644 --- a/src/css/tabs/logging.css +++ b/src/css/tabs/logging.css @@ -50,7 +50,7 @@ .tab-logging .fixed_band { width: 100%; - bottom: 0px; + bottom: 0; } .tab-logging .save_btn .back { @@ -67,3 +67,13 @@ height: 22px; } } + +@media all and (max-width: 575px) { + .tab-logging .properties dd { + width: 100%; + height: auto; + } + .tab-logging .properties { + width: auto; + } +} diff --git a/src/css/tabs/motors.css b/src/css/tabs/motors.css index b08f0dcf..fa4ab8eb 100644 --- a/src/css/tabs/motors.css +++ b/src/css/tabs/motors.css @@ -1,7 +1,7 @@ .tab-motors .modelAndGraph { float: left; width: 100%; - margin-bottom: 0px; + margin-bottom: 0; } .tab-motors .spacer { @@ -30,7 +30,7 @@ .tab-motors .plot_control { float: right; width: 160px; - margin: 0px; + margin: 0; background-color: #ECECEC; border-top-right-radius: 3px; border-bottom-right-radius: 3px; @@ -56,7 +56,7 @@ color: #000; font-size: 10px; line-height: 17px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); text-transform: uppercase; letter-spacing: 0.03em; display: block; @@ -172,7 +172,7 @@ } .tab-motors .motorblock { - margin-bottom: 0px; + margin-bottom: 0; background-color: #ECECEC; /*background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.15));*/ } @@ -291,7 +291,7 @@ } .tab-motors .motor_testing .sliders input:first-child { - margin-left: 0px; + margin-left: 0; } .tab-motors .motor_testing .values { @@ -309,7 +309,7 @@ .tab-motors .motor_testing .values li:first-child, .tab-motors .motor_testing .telemetry li:first-child { - margin-left: 0px; + margin-left: 0; } .tab-motors .motor_testing .values li, @@ -342,3 +342,86 @@ .tab-motors .motor_testing .notice .motorsEnableTestMode { margin-left: 10px; } + +@media all and (max-width: 575px) { + .tab-motors .modelAndGraph { + display: flex; + flex-wrap: wrap; + } + .tab-motors .mixerPreview { + order: 1; + width: calc(100% - 160px); + } + .tab-motors .mixerPreview img { + width: calc(100% - 20px); + } + .tab-motors #graph { + width: 100%; + order: 3; + } + .tab-motors .plot_control { + order: 2; + } + .tab-motors .power_info { + order: 4; + width: 100%; + margin-top: 10px; + } + .tab-motors .motorblock { + margin-bottom: 15px; + } + .tab-motors .motorblock > .spacer { + display: flex; + flex-wrap: wrap; + } + .tab-motors .left.motors { + width: 100%; + order: 1; + } + .tab-motors .right.servos { + width: 100%; + order: 3; + margin-top: 15px; + } + .tab-motors .motor_testing { + width: 100%; + display: flex; + flex-wrap: wrap; + order: 2; + } + .tab-motors .motor_testing .notice { + width: 100%; + margin-top: 15px; + } + .tab-motors .titles li, .tab-motors .m-block { + width: calc((100% - 80px) / 9); + } + .tab-motors .titles li:last-child, .tab-motors .m-block:last-child { + margin-right: 0; + } + .tab-motors .motor_testing .left { + width: 100%; + } + .tab-motors .servos .m-block, .tab-motors .servos .titles li { + width: calc((100% - 70px) / 8); + } + .tab-motors .servos .m-block:last-child, .tab-motors .servos .titles li:last-child { + margin-left: 0; + } + .tab-motors .motor_testing .sliders { + margin-left: 2px; + margin-right: -2px; + } + .tab-motors .motor_testing .sliders input { + width: calc((100% - 108px) / 9); + } + .tab-motors .motor_testing .values li, .tab-motors .motor_testing .telemetry li { + width: calc((100% - 80px) / 9); + } + .tab-motors .motor_testing .values li:last-child { + margin-left: 4px; + } + .tab-motors .motor_testing .telemetry li { + font-size: 6px; + } +} diff --git a/src/css/tabs/onboard_logging.css b/src/css/tabs/onboard_logging.css index 3b720ef5..487971e3 100644 --- a/src/css/tabs/onboard_logging.css +++ b/src/css/tabs/onboard_logging.css @@ -139,6 +139,13 @@ margin-bottom: 0.5em; } +@media all and (max-width: 575px) { + .tab-onboard_logging dialog { + width: calc(100% - 2em); + border-radius: unset; + } +} + .dataflash-confirm-erase .dataflash-erase-progress { height: 125px; display: none; @@ -150,10 +157,7 @@ } .tab-onboard_logging .save-flash .helpicon { - margin-left: 7px; - margin-right: 0px; - margin-top: 4px; - margin-bottom: 0px; + margin: 4px 0 0 7px; display: inline-block; float: unset; } @@ -290,7 +294,7 @@ border: 1px solid #5bbb1b; } .tab-onboard_logging .sdcard-icon { - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); width: 90px; height: 90px; background-image: url(../../images/icons/cf_icon_sdcard.svg); @@ -303,3 +307,9 @@ border-radius: 45px; } + +@media all and (max-width: 575px) { + .tab-onboard_logging .blackboxRate select, .tab-onboard_logging .blackboxDebugMode select, .tab-onboard_logging .blackboxDevice select { + width: 120px; + } +} diff --git a/src/css/tabs/options.css b/src/css/tabs/options.css new file mode 100644 index 00000000..5cdee88d --- /dev/null +++ b/src/css/tabs/options.css @@ -0,0 +1,16 @@ +.tab-options .freelabel { + margin-left: 10px; + position: relative; +} +.tab-options .switchery { + float: left; +} +.tab-options .margin-bottom { + margin-bottom: 10px; +} +.tab-options select { + background: var(--boxBackground); + color: var(--defaultText); + border: 1px solid var(--subtleAccent); + border-radius: 3px; +} diff --git a/src/css/tabs/osd.css b/src/css/tabs/osd.css index d5899f69..be10a4b1 100644 --- a/src/css/tabs/osd.css +++ b/src/css/tabs/osd.css @@ -7,7 +7,7 @@ position: absolute; width: 100%; height: 26px; - top: 0px; + top: 0; left: 0; text-align: center; line-height: 24px; @@ -57,7 +57,7 @@ .info .progress::-webkit-progress-bar { background-color: #4f4f4f; border-radius: 4px; - box-shadow: inset 0px 0px 5px #2f2f2f; + box-shadow: inset 0 0 5px #2f2f2f; } .info .progress::-webkit-progress-value { @@ -86,9 +86,8 @@ } .tab-osd ul li { - list-style: initial; - list-style-type: circle; - margin-left: 30px; + list-style: circle; + margin-left: 30px; } .tab-osd .options { @@ -129,7 +128,7 @@ .tab-osd .options .description { position: relative; - left: 0px; + left: 0; font-style: italic; color: #818181; } @@ -310,8 +309,7 @@ #font-logo-preview-container { background:rgba(0, 255, 0, 0.4); margin-bottom: 10px; - width: 45%; - float: left; + box-sizing: border-box; } #font-logo-preview { @@ -321,11 +319,8 @@ } #font-logo-info { - width: 45%; - margin-left: 18px; font-size: 125%; line-height: 150%; - float: left; } #font-logo-info h3 { @@ -414,7 +409,7 @@ button { line-height: 23px; height: 23px; box-sizing: border-box; - padding-right: 0px; + padding-right: 0; } .tab-osd .switchable-field label { @@ -443,7 +438,7 @@ button { .tab-osd .switchable-field:last-child { - border-bottom: 0px; + border-bottom: 0; } .tab-osd input, @@ -458,11 +453,13 @@ button { width: 360px; float: left; position: sticky; - top: 0px; + top: 0; + margin-left: calc((100% - 362px) / 2); - /* please don't copy the generic background image from another project - * and replace the one that @nathantsoi took :) - */ + +/* please don't copy the generic background image from another project + * and replace the one that @nathantsoi took :) + */ background: url(../../images/osd-bg-1.jpg); background-size: cover; border-bottom-left-radius: 3px; @@ -479,7 +476,7 @@ button { .tab-osd .alarms label:last-child { border-bottom: none; - padding-bottom: 0px + padding-bottom: 0 } .tab-osd .alarms input { @@ -510,3 +507,56 @@ button { height: calc(100% - 30px); } } + +.tab-osd .grid-col.col4:first-child, .tab-osd .grid-col.col4:last-child { + width: calc((100% - 390px) / 2); +} + +.tab-osd .grid-row { + margin-bottom: 40px; +} + +.tab-osd .grid-col.col4 { + width: auto; +} + +@media all and (max-width: 575px) { + .tab-osd .osd-preview { + order: 1; + } + .tab-osd .osd-feature { + order: 2; + } + .tab-osd .osd-profile { + order: 3; + } + .tab-osd .preview.requires-osd-feature { + width: 100%; + max-width: 363px; + margin-left: 0; + } + .tab-osd .osd-feature, .tab-osd .osd-profile { + max-width: 100%; + } + #fontmanagercontent { + max-width: 100%; + } + .content_wrapper.font-preview { + padding: 15px 0; + } + #fontmanagercontent .grid-row { + margin-bottom: 15px; + } + .fontpresets_wrapper { + display: block; + position: relative; + right: 0; + top: 0; + margin-bottom: 15px; + } +} +@media all and (max-width: 575px) and (min-width: 390px) { + .tab-osd .preview.requires-osd-feature { + margin-left: calc((100% - 363px) / 2); + } +} diff --git a/src/css/tabs/pid_tuning.css b/src/css/tabs/pid_tuning.css index 59c0679f..6f389dd0 100644 --- a/src/css/tabs/pid_tuning.css +++ b/src/css/tabs/pid_tuning.css @@ -17,7 +17,7 @@ } .tab-pid_tuning .cf th:last-child { - border-right: 0px; + border-right: 0; border-top-right-radius: 3px; } @@ -27,8 +27,8 @@ .tab-pid_tuning .cf td:last-child { border-bottom-right-radius: 3px; - border-right: 0px; - padding-bottom: 0px; + border-right: 0; + padding-bottom: 0; } .tab-pid_tuning .cf input { @@ -69,7 +69,7 @@ .tab-pid_tuning table { float: left; - margin: 0px; + margin: 0; border-collapse: collapse; width: 100%; table-layout: fixed; @@ -90,12 +90,12 @@ .tab-pid_tuning table, .tab-pid_tuning table td { padding: 1px; - border-bottom: 0px solid var(--subtleAccent); + border-bottom: 0 solid var(--subtleAccent); } .tab-pid_tuning table th { - padding: 0px; - border: 0px; + padding: 0; + border: 0; height: 10px; font-weight: normal; text-overflow: ellipsis; @@ -124,7 +124,7 @@ } .tab-pid_tuning table tr td:last-child { - border-right: 0px solid var(--subtleAccent); + border-right: 0 solid var(--subtleAccent); } .tab-pid_tuning #pid_optional table th { @@ -219,8 +219,7 @@ } .tab-pid_tuning table td { - padding: 1px; - padding-left: 5px; + padding: 1px 1px 1px 5px; border-right: 1px solid var(--subtleAccent); } @@ -266,22 +265,20 @@ .tab-pid_tuning .tab-container { border-bottom: 3px solid var(--accent); - border-right-width: 0px; + border-right-width: 0; display: flex; flex-direction: row; flex-wrap: nowrap; - height: 29px; justify-content: start; width: 100%; } .tab-pid_tuning .tab-container > div { - display: flex; - justify-content: center; - align-items: center; background-color: #2e2e2e; - padding: 0 12px; + padding: 6px 12px; border-right: 1px solid white; + box-sizing: border-box; + text-align: center; } .tab-pid_tuning .tab-container > div:first-child { @@ -294,7 +291,6 @@ .tab-pid_tuning .tab-container > div a { display: block; - white-space: nowrap; color: #999999; } @@ -318,8 +314,7 @@ color: var(--quietText); height: 19px; font-weight: normal; - padding: 2px; - padding-left: 6px; + padding: 2px 2px 2px 6px; border-top-left-radius: 3px; border-top-right-radius: 3px; } @@ -335,7 +330,7 @@ .tab-pid_tuning .fixed_band { position: absolute; width: 100%; - bottom: 0px; + bottom: 0; } .fancy.header { @@ -358,12 +353,10 @@ height: 18px; background-color: #D6D6D6; float: left; - margin: 0px; - padding: 0px; + margin: 0; text-align: left; - padding-left: 5px; line-height: 13px; - padding-top: 5px; + padding: 5px 0 0 5px; font-size: 12px; border-bottom: 1px solid var(--subtleAccent); color: #828282; @@ -381,7 +374,7 @@ } .tab-pid_tuning .pid_mode .helpicon { - margin-top: 0px; + margin-top: 0; } .tab-pid_tuning .pid_titlebar { @@ -393,11 +386,11 @@ } .tab-pid_tuning .pid_titlebar.pid_titlebar_extended { - border-radius: 0px; + border-radius: 0; } .tab-pid_tuning .cf .throttleCurvePreview { - padding: 0px; + padding: 0; } .pid_roll { @@ -419,15 +412,9 @@ .show { width:130px; - float:right; margin-right:3px; } -.show a { - margin-left: 10px; - width: calc(100% - 10px); -} - .tab-pid_tuning .helpicon { margin-top: 1px; } @@ -439,7 +426,7 @@ .tab-pid_tuning .number .helpicon { margin-top: 3px; - margin-right: 0px; + margin-right: 0; } .tab-pid_tuning .gui_box_titlebar .helpicon { @@ -448,7 +435,7 @@ } .tab-pid_tuning .spacer_left { - padding-left: 0px; + padding-left: 0; float: right; width: calc(100% - 20px) } @@ -470,7 +457,7 @@ .tab-pid_tuning .number:last-child { padding-bottom: 5px; - border-bottom: 0px; + border-bottom: 0; } .tab-pid_tuning .number input { @@ -495,18 +482,16 @@ .tab-pid_tuning .resetbt { width: 140px; - float: right; + margin-right: 10px; } .tab-pid_tuning .copyprofilebtn { width: 150px; - float: right; margin-right:10px; } .tab-pid_tuning .copyrateprofilebtn { width: 150px; - float: right; margin-right:10px; } @@ -520,7 +505,7 @@ } .tab-pid_tuning .leftzero { - padding-left: 0px; + padding-left: 0; } .tab-pid_tuning .roll { @@ -626,7 +611,7 @@ .tab-pid_tuning .pidTuning tr { width: 100%; border-bottom: 1px solid var(--subtleAccent); - padding: 0px; + padding: 0; } .tab-pid_tuning .pidTuning td:first-child { @@ -644,16 +629,16 @@ } .tab-pid_tuning .new_rates td:first-child { - border-bottom-left-radius: 0px; + border-bottom-left-radius: 0; padding-left: 10px; } .tab-pid_tuning .new_rates td:last-child { - border-bottom-right-radius: 0px; + border-bottom-right-radius: 0; } .tab-pid_tuning .rc_curve .cf tr td { - padding: 0px; + padding: 0; } .tab-pid_tuning .rc_curve_bg { @@ -694,7 +679,7 @@ border: 1px solid var(--subtleAccent); border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; - border-top: 0px solid var(--subtleAccent); + border-top: 0 solid var(--subtleAccent); background: #f9f9f9; } @@ -718,6 +703,13 @@ width: 120px; } +@media all and (max-width: 575px) { + .tab-pid_tuning dialog { + width: calc(100% - 2em); + border-radius: unset; + } +} + .tab-pid_tuning .tuningSlider { -webkit-appearance: none; width: calc(100% - 14px); @@ -935,3 +927,98 @@ .tab-pid_tuning .float-left { float: left; } + +.tab-pid_tuning .content_wrapper_header { + display: flex; +} + +.tab-pid_tuning .content_wrapper_header_btns { + margin-left: auto; +} + +@media all and (max-width: 575px) { + .tab-pid_tuning .content_wrapper_header { + flex-wrap: wrap; + } + + .tab-pid_tuning .profile, .tab-pid_tuning .rate_profile, + .tab-pid_tuning .copyprofilebtn, .tab-pid_tuning .copyrateprofilebtn, + .tab-pid_tuning .resetbt, .tab-pid_tuning .show { + width: calc(50% - 5px); + } + + .tab-pid_tuning .rate_profile { + margin-left: 5px; + } + + .tab-pid_tuning .rate_profile, .tab-pid_tuning .controller, + .tab-pid_tuning .copyrateprofilebtn, .tab-pid_tuning .show { + margin-right: 0; + } + + .tab-pid_tuning .controller { + width: 100%; + } + + .tab-pid_tuning .content_wrapper_header_btns { + display: flex; + flex-wrap: wrap; + } + + .tab-pid_tuning .tab-container > div { + width: calc(100% / 3); + } + + .tab-pid_tuning .subtab-pid .cf_column, .tab-pid_tuning .subtab-rates .cf_column { + min-width: 100%; + width: 100%; + } + + .tab-pid_tuning .spacer_left { + width: 100%; + } + + .subtab-filter .two_columns { + flex-wrap: wrap; + } + + .subtab-filter .two_columns .two_columns_first { + margin-right: 0; + } + + .subtab-filter .two_columns .two_columns_second { + margin-left: 0; + } + + .tab-pid_tuning .sliderHeaders { + height: 18px; + background-color: #D6D6D6; + line-height: 13px; + font-size: 12px; + border-bottom: 1px solid var(--subtleAccent); + color: #828282; + font-weight: normal; + background-image: linear-gradient(315deg, rgba(255, 255, 255, .2) 10%, transparent 10%, transparent 20%, + rgba(255, 255, 255, .2) 20%, rgba(255, 255, 255, .2) 30%, transparent 30%, transparent 40%, + rgba(255, 255, 255, .2) 40%, rgba(255, 255, 255, .2) 50%, transparent 50%, transparent 60%, + rgba(255, 255, 255, .2) 60%, rgba(255, 255, 255, .2) 70%, transparent 70%, transparent 80%, + rgba(255, 255, 255, .2) 80%, rgba(255, 255, 255, .2) 90%, transparent 90%, transparent 100%, + rgba(255, 255, 255, .2) 100%, transparent); + } + + .tab-pid_tuning .sliderHeaders span { + color: #828282; + } + + .tab-pid_tuning .sliderLabels tr.sliderHeaders td:first-child { + text-align: left; + } + + .tab-pid_tuning .tuningPIDSliders .pid_titlebar th:last-child, .tab-pid_tuning .tuningFilterSliders .pid_titlebar th:last-child { + width: 20%; + } + + .tab-pid_tuning .tuningPIDSliders .pid_titlebar th:nth-child(2), .tab-pid_tuning .tuningFilterSliders .pid_titlebar th:nth-child(2) { + width: 20%; + } +} diff --git a/src/css/tabs/ports.css b/src/css/tabs/ports.css index 7ba9a364..c3eb8a3a 100644 --- a/src/css/tabs/ports.css +++ b/src/css/tabs/ports.css @@ -13,9 +13,9 @@ } .tab-ports table, .tab-ports table th, .tab-ports table td { - border-left: 0px; - border-right: 0px; - border-top: 0px; + border-left: 0; + border-right: 0; + border-top: 0; } .tab-ports table tr td:first-child { @@ -37,9 +37,9 @@ .tab-ports table thead tr:first-child { font-size: 12px; height: 25px; - border-top: 0px; - border-right: 0px; - border-left: 0px; + border-top: 0; + border-right: 0; + border-left: 0; } .tab-ports .function input { @@ -99,12 +99,12 @@ .tab-ports .ports thead td:first-child { text-align: left; border-top-left-radius: 5px; - border-left: 0px; + border-left: 0; } .tab-ports .ports thead td:last-child { border-top-right-radius: 5px; - border-right: 0px; + border-right: 0; } @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { @@ -113,3 +113,45 @@ height: 22px; } } + +@media all and (max-width: 575px) { + .tab-ports .config { + text-align: left; + border-top-left-radius: 5px; + border-left: 0; + } + .tab-ports table td { + padding: 0; + } + .tab-ports .ports select { + margin: 0; + width: 100%; + border: none; + height: 25px; + border-radius: unset; + } + .tab-ports .portIdentifier td { + height: 18px; + background-color: #D6D6D6; + padding: 2px 5px; + font-size: 12px; + color: #828282; + font-weight: normal; + background-image: linear-gradient(315deg, rgba(255, 255, 255, .2) 10%, transparent 10%, transparent 20%, + rgba(255, 255, 255, .2) 20%, rgba(255, 255, 255, .2) 30%, transparent 30%, transparent 40%, + rgba(255, 255, 255, .2) 40%, rgba(255, 255, 255, .2) 50%, transparent 50%, transparent 60%, + rgba(255, 255, 255, .2) 60%, rgba(255, 255, 255, .2) 70%, transparent 70%, transparent 80%, + rgba(255, 255, 255, .2) 80%, rgba(255, 255, 255, .2) 90%, transparent 90%, transparent 100%, + rgba(255, 255, 255, .2) 100%, transparent); + } + .tab-ports .ports select[name=function-peripherals], .tab-ports .ports select[name=function-telemetry], + .tab-ports .ports select[name=function-sensors] { + border-bottom: 1px solid var(--subtleAccent); + } + .tab-ports .ports thead td { + font-size: 8px; + width: calc(100% / 5); + word-break: break-word; + white-space: unset; + } +} diff --git a/src/css/tabs/power.css b/src/css/tabs/power.css index 8f4e4220..c3a28167 100644 --- a/src/css/tabs/power.css +++ b/src/css/tabs/power.css @@ -2,15 +2,8 @@ display: none; } -.tab-power .leftWrapper { - float: left; - width:calc(50% - 20px) -} - -.tab-power .rightWrapper { - float: left; - width: calc(50% - 0px); - margin: 0 0 10px 20px; +.tab-power .ui-grid-col { + margin-bottom: 0; } .tab-power td.configuration { @@ -19,7 +12,7 @@ } .tab-power .battery-state .configuration { - border-bottom: 0px; + border-bottom: 0; } .tab-power td.value { @@ -49,7 +42,7 @@ .tab-power .number, .tab-power .select - { +{ margin-bottom: 5px; clear: left; padding-bottom: 5px; @@ -69,8 +62,8 @@ .tab-power .number:last-child, .tab-power .select:last-child { border-bottom: none; - padding-bottom: 0px; - margin-bottom: 0px; + padding-bottom: 0; + margin-bottom: 0; } .tab-power .require-support { diff --git a/src/css/tabs/receiver.css b/src/css/tabs/receiver.css index e40c5af0..92b3e179 100644 --- a/src/css/tabs/receiver.css +++ b/src/css/tabs/receiver.css @@ -13,8 +13,6 @@ } .tab-receiver .bars { - float: left; - width: calc(50% - 20px); font-weight: bold; } @@ -136,16 +134,10 @@ background-color: #14407a; } -.tab-receiver .fc_column { - float: right; - width: 50%; - margin-left: 20px; -} - .tab-receiver .tunings { float: right; position: relative; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; width: 100%; border-top-left-radius: 5px; border-bottom-left-radius: 5px; @@ -153,9 +145,8 @@ .tab-receiver .tunings .head { height: 15px; - padding: 4px; text-align: left; - padding-left: 6px; + padding: 4px 4px 4px 6px; font-weight: normal; background: #828885; color: white; @@ -168,9 +159,8 @@ } .tab-receiver .tunings table, .tab-receiver .tunings table th, .tab-receiver .tunings table td { - padding: 4px; text-align: left; - padding-left: 6px; + padding: 4px 4px 4px 6px; } .tab-receiver .tunings table th { @@ -186,7 +176,7 @@ .tab-receiver .tunings table th:last-child { border-top-right-radius: 3px; - border-right: 0px; + border-right: 0; } .tab-receiver .tunings table td { @@ -200,7 +190,7 @@ .tab-receiver .tunings table td:last-child { border-bottom-right-radius: 3px; - border-right: 0px; + border-right: 0; } .tab-receiver .tunings table input { @@ -231,7 +221,7 @@ .tab-receiver .rssi_channel_wrapper { float: right; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; border-left: 0; width: 30%; box-sizing: border-box; @@ -244,7 +234,7 @@ .tab-receiver .rcmap_wrapper { float: right; position: relative; - margin: 0px 0px 10px 0; + margin: 0 0 10px 0; width: 70%; box-sizing: border-box; border-top-left-radius: 5px; @@ -293,11 +283,9 @@ width: calc(100% - 36px); height: 20px; z-index: 2; - border-radius: 0px; border: 1px solid var(--subtleAccent); margin: 4px; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; + border-radius: 3px 0 0 3px; } .tab-receiver select { @@ -333,7 +321,7 @@ } .tab-receiver .rcSmoothing table .helpicon { - margin-top: 0px; + margin-top: 0; } .tab-receiver .rcSmoothing td:first-child { @@ -478,3 +466,9 @@ border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } + +@media all and (max-width: 575px) { + .tab-receiver .bars { + margin-bottom: 10px; + } +} diff --git a/src/css/tabs/sensors.css b/src/css/tabs/sensors.css index bb21c0d4..e9a2816b 100644 --- a/src/css/tabs/sensors.css +++ b/src/css/tabs/sensors.css @@ -21,9 +21,8 @@ float: right; width: 160px; /* border: 1px solid silver; */ - height: 100%; height: 160px; - margin: 0px; + margin: 0; background-color: #ECECEC; border-top-right-radius: 3px; border-bottom-right-radius: 3px; @@ -170,3 +169,26 @@ .tab-sensors .legend .item:nth-child(4) { fill: #4DA74D; } + +@media all and (max-width: 575px) { + .tab-sensors .plot_control { + width: 130px; + } + .tab-sensors .plot_control dt { + width: 60px; + } + .tab-sensors .plot_control dd { + width: 50px; + } + .tab-sensors .plot_control dd select { + width: 100%; + } + .tab-sensors .plot_control .x, .tab-sensors .plot_control .y, .tab-sensors .plot_control .z { + height: 18px; + box-sizing: border-box; + } + .tab-sensors svg { + width: calc(100% - 130px); + margin-left: 0; + } +} diff --git a/src/css/tabs/servos.css b/src/css/tabs/servos.css index 28656709..6edfc6ec 100644 --- a/src/css/tabs/servos.css +++ b/src/css/tabs/servos.css @@ -1,5 +1,5 @@ .tab-servos .title { - margin-top: 0px; + margin-top: 0; line-height: 30px; text-align: center; font-weight: bold; @@ -18,9 +18,9 @@ } .tab-servos table, .tab-servos table th, .tab-servos table td { - border-left: 0px; - border-right: 0px; - border-top: 0px; + border-left: 0; + border-right: 0; + border-top: 0; } .tab-servos input[type="number"]::-webkit-inner-spin-button { @@ -130,7 +130,7 @@ .tab-servos .live { float: left; - margin-top: 0px; + margin-top: 0; } .tab-servos .live span { @@ -175,3 +175,16 @@ .tab-servos .short { width: 40px; } + +.tab-servos .table_overflow { + overflow: auto; +} + +@media all and (max-width: 575px) { + .tab-servos table th { + min-width: 30px; + } + .tab-servos .min, .tab-servos .max, .tab-servos .middle { + min-width: 60px; + } +} diff --git a/src/css/tabs/setup.css b/src/css/tabs/setup.css index f3f42576..5c521b30 100644 --- a/src/css/tabs/setup.css +++ b/src/css/tabs/setup.css @@ -1,45 +1,60 @@ -.tab_setup .model-and-info { - float: left; +.tab-setup .ui-grid-col { + margin-bottom: 0; } - -.tab_setup .default_btn { +.tab-setup .content_wrapper { + position: initial; +} +.tab-setup .default_btn { margin-bottom: 10px; } +.tab-setup .cell_setup { + border-bottom: solid 1px var(--subtleAccent); + padding-bottom: 8px; + padding-top: 7px; +} +#accel_calib_running, #mag_calib_running { + display: none; + width: 100%; + position: relative; + margin-bottom: 0; + margin-top: 0; + float: left; + padding: 5px 0 5px 0; + text-align: center; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ffbb00; + color: #ffbb00; + font-weight: bold; + font-size: 12px; + line-height: 13px; + transition: all ease 0.2s; + text-decoration:none; +} +.tab-setup .data-loading-setup { + width: 100%; + height: 100%; +} +.tab-setup .modelwrapper { + clear: both; + margin-bottom: 5px; +} +.tab-setup .model-and-info { + position: relative; + height: 400px; + margin-bottom: 10px; +} .tab-setup #interactive_block { position: absolute; - width: calc(75% - 30px); - height: calc(100% - 245px); + top: 0; + left: 0; + right: 0; + bottom: 0; background-color: #f9f9f9; border-radius: 5px; border: 1px solid #e4e4e4; - margin-bottom: 10px; } - -.attitude_info { - position: absolute; - top: 10px; - left: 10px; - width: 120px; - margin: 0px 0px 0px 0px; - font-weight: normal; - color: var(--mutedText); -} - -.attitude_info dl { - width: 100%; -} - -.attitude_info dt { - width: 50%; - float: left; -} - -.attitude_info dd { - width: 50%; - float: left; -} - .tab-setup #interactive_block a.reset { position: absolute; display: block; @@ -56,11 +71,9 @@ background-color: #ececec; z-index: 100; } - .tab-setup #interactive_block a.reset:hover { background-color: #dedcdc; } - .tab-setup #canvas_wrapper { position: absolute; width: 100%; @@ -69,11 +82,48 @@ left: 0; border-radius: 5px; } - #canvas { width: 100% !important; height: 100% !important; } +.attitude_info { + position: absolute; + top: 10px; + left: 10px; + width: 120px; + margin: 0 0 0 0; + font-weight: normal; + color: var(--mutedText); +} +.attitude_info dl { + width: 100%; +} +.attitude_info dt { + width: 50%; + float: left; +} +.attitude_info dd { + width: 50%; + float: left; +} +.instrumentsbox { + margin-bottom: 0; +} +@media all and (max-width: 575px) { + .tab-setup .cell_setup { + border-bottom: none; + padding-bottom: 15px; + padding-top: 0; + } + .tab-setup .default_btn { + margin-bottom: 5px; + } + .tab-setup .model-and-info { + height: 200px; + } +} + + .block.info .fields { padding: 5px 5px 3px 5px; @@ -120,42 +170,6 @@ bottom: 20px; } -.cell_setup { - border-bottom: solid 1px var(--subtleAccent); - padding-bottom: 8px; - padding-top: 7px; -} - -.tab_setup .content_wrapper { - position: initial; -} - -.initialstyle { - position: initial; -} - -.buttonarea { - min-height: 100px; - width: 20%; -} - -.halfbuttons { - width: calc(100% - 10px); -} - -.setupinfo { - width: 80%; -} - -.modelwrapper { - clear: both; - margin-bottom: 5px; -} - -.instrumentsbox { - margin-bottom: 0px; -} - @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .block.instrument .attitude { width: 50px !important; @@ -165,62 +179,6 @@ width: 50px; height: 50px; } - .tab-setup #interactive_block { - position: absolute; - width: calc(75% - 20px); - height: calc(100% - 218px); - } -} - -#accel_calib_running { - display: none; - - width: 100%; - position: relative; - margin-bottom: 0px; - margin-top: 0px; - float: left; - - padding: 5px 0px 5px 0px; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #ffbb00; - color: #ffbb00; - font-weight: bold; - font-size: 12px; - line-height: 13px; - transition: all ease 0.2s; - text-decoration:none; - -} - -#mag_calib_running { - display: none; - - width: 100%; - position: relative; - margin-bottom: 0px; - margin-top: 0px; - float: left; - - padding: 5px 0px 5px 0px; - text-align: center; - background-color: #fff; - border-radius: 4px; - border: 1px solid #ffbb00; - color: #ffbb00; - font-weight: bold; - font-size: 12px; - line-height: 13px; - transition: all ease 0.2s; - text-decoration:none; -} - -.data-loading-setup { - width: 100%; - height: 100%; - } .tab-setup .regular-button { @@ -232,13 +190,11 @@ border: 1px solid #dba718; color: #000; font-size: 12px; - text-shadow: 0px 1px rgba(255, 255, 255, 0.25); + text-shadow: 0 1px rgba(255, 255, 255, 0.25); display: inline-block; cursor: pointer; transition: all ease 0.2s; - padding: 0px; - padding-left: 9px; - padding-right: 9px; + padding: 0 9px; line-height: 28px; } .tab-setup .regular-button:hover { @@ -248,7 +204,7 @@ .tab-setup .regular-button:active { background-color: #ffcc3e; transition: all ease 0.0s; - box-shadow: inset 0px 1px 5px rgba(0, 0, 0, 0.35); + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35); } .tab-setup .regular-button.disabled { cursor: default; @@ -274,8 +230,13 @@ margin-bottom: 0.5em; } +@media all and (max-width: 575px) { + .tab-setup dialog { + width: calc(100% - 2em); + border-radius: unset; + } +} + .disarm-flag { padding-left: 5px; } - -} diff --git a/src/css/tabs/static_tab.css b/src/css/tabs/static_tab.css index e79e4301..2708a381 100644 --- a/src/css/tabs/static_tab.css +++ b/src/css/tabs/static_tab.css @@ -1,6 +1,6 @@ #tab-static { background-color: inherit; - background-image: url(/images/osd-bg-1.jpg); + background-image: url(../../images/osd-bg-1.jpg); background-attachment: fixed; background-size: cover; background-position: bottom right; diff --git a/src/css/tabs/vtx.css b/src/css/tabs/vtx.css index 87598479..c8c6e135 100644 --- a/src/css/tabs/vtx.css +++ b/src/css/tabs/vtx.css @@ -114,7 +114,7 @@ .tab-vtx .table_vtx_bands td, .tab-vtx .table_vtx_powerlevels td { - padding: 0px 1px; + padding: 0 1px; text-align: center; } @@ -144,3 +144,22 @@ #tab-vtx-templates { display: none; } + +@media all and (max-width: 575px) { + .tab-vtx .columnsWrapper { + flex-wrap: wrap; + } + + .tab-vtx .columnsWrapper .leftColumn { + width: 100%; + } + + .tab-vtx .columnsWrapper .rightColumn { + width: 100%; + flex-basis: auto; + } + .tab-vtx .leftWrapper { + width: 100%; + overflow: auto; + } +} diff --git a/src/images/light-wide-2-compact.svg b/src/images/light-wide-2-compact.svg new file mode 100644 index 00000000..e232060e --- /dev/null +++ b/src/images/light-wide-2-compact.svg @@ -0,0 +1,133 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/js/Clipboard.js b/src/js/Clipboard.js index 60dac41b..fff7f0e8 100644 --- a/src/js/Clipboard.js +++ b/src/js/Clipboard.js @@ -36,7 +36,7 @@ Clipboard._configureClipboardAsNwJs = function(nwGui) { if (onSuccess) { onSuccess(text); } - } + }; this.readText = function(onSuccess, onError) { @@ -54,8 +54,8 @@ Clipboard._configureClipboardAsNwJs = function(nwGui) { if (onSuccess) { onSuccess(text); } - } -} + }; +}; Clipboard._configureClipboardAsChrome = function() { @@ -69,15 +69,33 @@ Clipboard._configureClipboardAsChrome = function() { navigator.clipboard.writeText(text) .then(onSuccess) .catch(onError); - } + }; this.readText = function(onSuccess, onError) { navigator.clipboard.readText() .then(onSuccess) .catch(onError); - } + }; -} +}; + +Clipboard._configureClipboardAsCordova = function() { + + console.log('Cordova Clipboard available'); + + this.available = true; + this.readAvailable = true; + this.writeAvailable = true; + + this.writeText = function(text, onSuccess, onError) { + cordova.plugins.clipboard.copy(text, onSuccess, onError); + }; + + this.readText = function(onSuccess, onError) { + cordova.plugins.clipboard.paste(onSuccess, onError); + }; + +}; Clipboard._configureClipboardAsOther = function() { @@ -89,12 +107,12 @@ Clipboard._configureClipboardAsOther = function() { this.writeText = function(text, onSuccess, onError) { onError('Clipboard not available'); - } + }; this.readText = function(onSuccess, onError) { onError('Clipboard not available'); - } -} + }; +}; switch (GUI.Mode) { @@ -106,6 +124,10 @@ case GUI_Modes.ChromeApp: Clipboard._configureClipboardAsChrome(); break; +case GUI_Modes.Cordova: + Clipboard._configureClipboardAsCordova(); + break; + default: Clipboard._configureClipboardAsOther(); } diff --git a/src/js/Features.js b/src/js/Features.js index ad5e4857..8d29b889 100644 --- a/src/js/Features.js +++ b/src/js/Features.js @@ -172,9 +172,10 @@ Features.prototype.generateElements = function (featuresElements) { + self._features[i].name + '" title="' + self._features[i].name - + '" type="checkbox"/>' + + '" type="checkbox"/>
' + featureName - + '' + + '
' + + '' + feature_tip_html + ''); var feature_e = newElement.find('input.feature'); diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index 9c80e4a4..f21865c2 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -318,7 +318,8 @@ function configuration_restore(callback) { }; reader.onloadend = function (e) { - if (e.total != 0 && e.total == e.loaded) { + if ((e.total != 0 && e.total == e.loaded) || GUI.isCordova()) { + // Cordova: Ignore verification : seem to have a bug with progressEvent returned console.log('Read SUCCESSFUL'); try { // check if string provided is a valid JSON diff --git a/src/js/cordova_chromeapi.js b/src/js/cordova_chromeapi.js new file mode 100644 index 00000000..73cead40 --- /dev/null +++ b/src/js/cordova_chromeapi.js @@ -0,0 +1,418 @@ +'use strict'; + +const chromeCallbackWithError = function(message, callback) { + let err; + if (typeof message === 'string') { + err = { 'message' : message }; + } else { + err = message; + } + if (typeof callback !== 'function') { + console.error(err.message); + return; + } + try { + if (typeof chrome.runtime !== 'undefined') { + chrome.runtime.lastError = err; + } else { + console.error(err.message); + } + callback.apply(null, Array.prototype.slice.call(arguments, 2)); + } finally { + if (typeof chrome.runtime !== 'undefined') { + delete chrome.runtime.lastError; + } + } +}; +const chromeCallbackWithSuccess = function(argument, callback) { + if (typeof callback === 'function') { + if (typeof argument === 'undefined') { + callback(); + } else { + callback(argument); + } + } +}; + +const removeItemOfAnArray = async function (array, item) { + for (let i = (array.length - 1); i >= 0; i--) { + if (array[i] === item) { + return array.splice(i, 1); + } + } + return array; +}; + + +const chromeapiSerial = { + logHeader: 'SERIAL (adapted from Cordova): ', + connection: { + connectionId: 1, // Only one connection possible + paused: false, + persistent: false, + name, + bufferSize: 4096, + receiveTimeout: 0, + sendTimeout: 0, + bitrate: 9600, + dataBits: 'eight', + parityBit: 'no', + stopBits: 'one', + ctsFlowControl: false, + }, + setConnectionOptions: function(ConnectionOptions) { + if (ConnectionOptions.persistent) { + this.connection.persistent = ConnectionOptions.persistent; + } + if (ConnectionOptions.name) { + this.connection.name = ConnectionOptions.name; + } + if (ConnectionOptions.bufferSize) { + this.connection.bufferSize = ConnectionOptions.bufferSize; + } + if (ConnectionOptions.receiveTimeout) { + this.connection.receiveTimeout = ConnectionOptions.receiveTimeout; + } + if (ConnectionOptions.sendTimeout) { + this.connection.sendTimeout = ConnectionOptions.sendTimeout; + } + if (ConnectionOptions.bitrate) { + this.connection.bitrate = ConnectionOptions.bitrate; + } + if (ConnectionOptions.dataBits) { + this.connection.dataBits = ConnectionOptions.dataBits; + } + if (ConnectionOptions.parityBit) { + this.connection.parityBit = ConnectionOptions.parityBit; + } + if (ConnectionOptions.stopBits) { + this.connection.stopBits = ConnectionOptions.stopBits; + } + if (ConnectionOptions.ctsFlowControl) { + this.connection.ctsFlowControl = ConnectionOptions.ctsFlowControl; + } + }, + getCordovaSerialConnectionOptions: function() { + let dataBits, stopBits, parityBit; + if (this.connection.dataBits === 'seven') { + dataBits = 7; + } else { + dataBits = 8; + } + if (this.connection.stopBits === 'two') { + stopBits = 2; + } else { + stopBits = 1; + } + if (this.connection.parityBit === 'odd') { + parityBit = 0; + } else if (this.connection.parityBit === 'even') { + parityBit = 1; + } + return { + baudRate: this.connection.bitrate, + dataBits: dataBits, + stopBits: stopBits, + parity: parityBit, + sleepOnPause: false, + }; + }, + + // Chrome serial API methods + getDevices: async function(callback) { + const self = this; + cordova.plugins.usbevent.listDevices(function(list) { + const devices = []; + if (list.devices !== undefined) { + let count = 0; + list.devices.forEach(device => { + count++; + devices.push({ + path: `${device.vendorId}/${device.productId}`, + vendorId: device.vendorId, + productId: device.productId, + displayName: `${device.vendorId}/${device.productId}`, + }); + if (count === list.devices.length) { + if (callback) { + callback(devices); + } + } + }); + } else { + if (callback) { + callback(devices); + } + } + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, + connect: function(path, ConnectionOptions, callback) { + const self = this; + if (typeof ConnectionOptions !== 'undefined') { + self.setConnectionOptions(ConnectionOptions); + } + const pathSplit = path.split('/'); + if (pathSplit.length === 2) { + const vid = parseInt(pathSplit[0]); + const pid = parseInt(pathSplit[1]); + console.log(`${self.logHeader}request permission (vid=${vid} / pid=${pid})`); + cordova_serial.requestPermission({vid: vid, pid: pid}, function() { + const options = self.getCordovaSerialConnectionOptions(); + cordova_serial.open(options, function () { + cordova_serial.registerReadCallback(function (data) { + const info = { + connectionId: self.connection.connectionId, + data: data, + }; + self.onReceive.receiveData(info); + }, function () { + console.warn(`${self.logHeader}failed to register read callback`); + }); + chromeCallbackWithSuccess(self.connection, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + } else { + chromeCallbackWithError(`${self.logHeader} invalid vendor id / product id`, callback); + } + }, + disconnect: function(connectionId, callback) { + const self = this; + cordova_serial.close(function () { + chromeCallbackWithSuccess(true, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback(false)); + }); + }, + setPaused: function(connectionId, paused, callback) { + this.connection.paused = paused; // Change connectionInfo but don't pause the connection + chromeCallbackWithSuccess(undefined, callback); + }, + getInfo: function(callback) { + chromeCallbackWithSuccess(this.connection, callback); + }, + send: function(connectionId, data, callback) { + const string = Array.prototype.map.call(new Uint8Array(data), x => (`00${x.toString(16)}`).slice(-2)).join(''); + cordova_serial.writeHex(string, function () { + chromeCallbackWithSuccess({ + bytesSent: string.length >> 1, + }, callback); + }, function(error) { + const info = { + bytesSent: 0, + error: 'undefined', + }; + chrome.serial.onReceiveError.receiveError(info); + chromeCallbackWithError(`SERIAL (adapted from Cordova): ${error}`, callback(info)); + }); + }, + getControlSignals: function(connectionId, callback) { + // Not supported yet + console.warn('chrome.serial.getControlSignals not supported yet'); + chromeCallbackWithSuccess({}, callback); + }, + setControlSignals: function(connectionId, signals, callback) { + // Not supported yet + console.warn('chrome.serial.setControlSignals not supported yet'); + chromeCallbackWithSuccess({ + result: false, + }, callback); + }, + // update: function() { }, + // getConnections: function() { }, + // flush: function() { }, + // setBreak: function() { }, + // clearBreak: function() { }, + + onReceive: { + listeners: [], + addListener: function(functionReference) { + this.listeners.push(functionReference); + }, + removeListener: async function(functionReference) { + this.listeners = await removeItemOfAnArray(this.listeners, functionReference); + }, + receiveData: function(data) { + if (data.data.byteLength > 0) { + for (let i = (this.listeners.length - 1); i >= 0; i--) { + this.listeners[i](data); + } + } + }, + }, + onReceiveError: { + listeners: [], + addListener: function(functionReference) { + this.listeners.push(functionReference); + }, + removeListener: async function(functionReference) { + this.listeners = await removeItemOfAnArray(this.listeners, functionReference); + }, + receiveError: function(error) { + for (let i = (this.listeners.length - 1); i >= 0; i--) { + this.listeners[i](error); + } + }, + }, +}; + + +const chromeapiFilesystem = { + logHeader: 'FILESYSTEM (adapted from Cordova): ', + savedEntries: [], + getFileExtension: function(fileName) { + const re = /(?:\.([^.]+))?$/; + return re.exec(fileName)[1]; + }, + + // Chrome fileSystem API methods + getDisplayPath: function(entry, callback) { + chromeCallbackWithSuccess(entry.fullPath, callback); + }, + getWritableEntry: function(entry, callback) { + // Entry returned by chooseEntry method is writable on Android + chromeCallbackWithSuccess(entry, callback); + }, + isWritableEntry: function(entry, callback) { + // Entry returned by chooseEntry method is writable on Android + chromeCallbackWithSuccess(true, callback); + }, + chooseEntryOpenFile: function(options, callback) { + const self = this; + fileChooser.open(function(uri) { + window.resolveLocalFileSystemURL(uri, function(entry) { + if (options.accepts && options.accepts[0].extensions && options.accepts[0].extensions && options.accepts[0].extensions.length > 0) { + self.getDisplayPath(entry, function(fileName) { + const extension = self.getFileExtension(fileName); + if (options.accepts[0].extensions.indexOf(extension) > -1) { + chromeCallbackWithSuccess(entry, callback); + } else { + navigator.notification.alert('Invalid file extension', function() { + chromeCallbackWithError(`${self.logHeader}file opened has an incorrect extension`, callback); + }, 'Choose a file', 'Ok'); + } + }); + } else { + console.log('no extensions : any type of file accepted'); + chromeCallbackWithSuccess(entry, callback); + } + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, + chooseEntrySaveFile: function(options, callback) { + const self = this; + if (!options.suggestedName) { + options.suggestedName = 'newfile'; + } + const extension = self.getFileExtension(options.suggestedName); + const folder = 'Betaflight configurator'; + navigator.notification.prompt(i18n.getMessage('dialogFileNameDescription', { + folder: folder, + }), function(res) { + if (res.buttonIndex === 1) { + const newExtension = self.getFileExtension(res.input1); + let fileName = res.input1; + if (newExtension === undefined) { + fileName += `.${extension}`; + } + window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(rootEntry) { + rootEntry.getDirectory(folder, { create: true }, function(directoryEntry) { + directoryEntry.getFile(fileName, { create: false }, function(fileEntry) { + console.log(fileEntry); + navigator.notification.confirm(i18n.getMessage('dialogFileAlreadyExistsDescription'), function(resp) { + if (resp === 1) { + chromeCallbackWithSuccess(fileEntry, callback); + } else { + chromeCallbackWithError(`${self.logHeader}Canceled: file already exists`, callback); + } + }, i18n.getMessage('dialogFileAlreadyExistsTitle'), [i18n.getMessage('yes'), i18n.getMessage('cancel')]); + }, function() { + directoryEntry.getFile(fileName, { create: true }, function(fileEntry) { + chromeCallbackWithSuccess(fileEntry, callback); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + }, function(error) { + chromeCallbackWithError(self.logHeader+error, callback); + }); + } else { + chromeCallbackWithError(`${self.logHeader}Canceled: no file name`, callback); + } + }, i18n.getMessage('dialogFileNameTitle'), [i18n.getMessage('initialSetupButtonSave'), i18n.getMessage('cancel')], options.suggestedName); + }, + chooseEntry: function(options, callback) { + const self = this; + if (typeof options === 'undefined' || typeof options.type === 'undefined') { + self.chooseEntryOpenFile(options, callback); + } else if (options.type === 'openDirectory') { + // not supported yet + console.warn('chrome.fileSystem.chooseEntry: options.type = openDirectory not supported yet'); + chromeCallbackWithSuccess(undefined, callback); + } else if (options.type === 'openWritableFile') { + // Entry returned by chooseEntry method is writable on Android + self.chooseEntryOpenFile(options, callback); + } else if (options.type === 'saveFile') { + self.chooseEntrySaveFile(options, callback); + } else { + self.chooseEntryOpenFile(options, callback); + } + }, + restoreEntry: function(id, callback) { + this.isRestorable(id, function(isRestorable) { + if (isRestorable) { + chromeCallbackWithSuccess(this.savedEntries[id], callback); + } else { + chromeCallbackWithError(`${self.logHeader}This entry can't be restored`, callback); + } + }); + }, + isRestorable: function(id, callback) { + if (typeof this.savedEntries[id] !== 'undefined') { + chromeCallbackWithSuccess(true, callback); + } else { + chromeCallbackWithSuccess(false, callback); + } + }, + retainEntry: function(entry) { + const id = this.savedEntries.length; + if (id >= 500) { + for (let i=0 ; i<500 ; i++) { + if (i < 499) { + this.savedEntries[i] = this.savedEntries[i+1]; + } else { + this.savedEntries[i] = entry; + } + } + return 499; + } else { + this.savedEntries[id] = entry; + return id; + } + }, + /**requestFileSystem: function(options, callback) { }, + getVolumeList: function(callback) { },*/ +}; + + +const cordovaChromeapi = { + init: function(callback) { + chrome.serial = chromeapiSerial; + chrome.fileSystem = chromeapiFilesystem; + if (callback) { + callback(); + } + }, +}; diff --git a/src/js/cordova_startup.js b/src/js/cordova_startup.js new file mode 100644 index 00000000..5650df1e --- /dev/null +++ b/src/js/cordova_startup.js @@ -0,0 +1,67 @@ +'use strict'; + +const cordovaUI = { + uiZoom: 1, + canChangeUI: true, + init: async function() { + const self = this; + const screenWidth = $(window).width(); + const screenHeight = $(window).height(); + let length; + let orientation; + if (screenWidth > screenHeight) { + length = screenWidth; + orientation = 'landscape'; + } else { + length = screenHeight; + orientation = 'portrait'; + } + if (length < 1024) { + self.uiZoom = length/1024; + } + if (screenWidth > 575 && screenHeight > 575) { + self.canChangeUI = false; + } + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI === undefined) { + if ((orientation === 'landscape' && screenHeight <= 575) + || (orientation === 'portrait' && screenWidth <= 575)) { + ConfigStorage.set({'cordovaForceComputerUI': false}); + } else { + ConfigStorage.set({'cordovaForceComputerUI': true}); + } + } + }); + self.set(); + }, + set: function() { + const self = this; + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI) { + window.screen.orientation.lock('landscape'); + $('body').css('zoom', self.uiZoom); + } else { + window.screen.orientation.lock('portrait'); + $('body').css('zoom', 1); + } + }); + }, +}; + +const cordovaApp = { + initialize: function() { + this.bindEvents(); + }, + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + onDeviceReady: function() { + $('.open_firmware_flasher, .tab_firmware_flasher').hide(); + cordovaUI.init(); + navigator.splashscreen.hide(); + cordovaChromeapi.init(); + appReady(); + }, +}; + +cordovaApp.initialize(); diff --git a/src/js/gui.js b/src/js/gui.js index e723563d..d56ffcbf 100644 --- a/src/js/gui.js +++ b/src/js/gui.js @@ -19,6 +19,7 @@ var GUI_control = function () { 'changelog', 'firmware_flasher', 'privacy_policy', + 'options', 'help' ]; this.defaultAllowedFCTabsWhenConnected = [ @@ -48,33 +49,51 @@ var GUI_control = function () { this.allowedTabs = this.defaultAllowedTabsWhenDisconnected; // check which operating system is user running - if (navigator.appVersion.indexOf("Win") != -1) this.operating_system = "Windows"; - else if (navigator.appVersion.indexOf("Mac") != -1) this.operating_system = "MacOS"; - else if (navigator.appVersion.indexOf("CrOS") != -1) this.operating_system = "ChromeOS"; - else if (navigator.appVersion.indexOf("Linux") != -1) this.operating_system = "Linux"; - else if (navigator.appVersion.indexOf("X11") != -1) this.operating_system = "UNIX"; - else this.operating_system = "Unknown"; + this.operating_system = GUI_checkOperatingSystem(); // Check the method of execution this.nwGui = null; try { - this.nwGui = require('nw.gui'); - this.Mode = GUI_Modes.NWJS; + this.nwGui = require('nw.gui'); + this.Mode = GUI_Modes.NWJS; } catch (ex) { - if (window.chrome && chrome.storage && chrome.storage.local) { - this.Mode = GUI_Modes.ChromeApp; - } else { - this.Mode = GUI_Modes.Other; - } + if (typeof cordovaApp !== 'undefined') { + this.Mode = GUI_Modes.Cordova; + } else { + if (window.chrome && chrome.storage && chrome.storage.local) { + this.Mode = GUI_Modes.ChromeApp; + } else { + this.Mode = GUI_Modes.Other; + } + } } }; const GUI_Modes = { NWJS: "NW.js", ChromeApp: "Chrome", + Cordova: "Cordova", Other: "Other" }; +function GUI_checkOperatingSystem() { + if (navigator.appVersion.indexOf("Win") !== -1) { + return "Windows"; + } else if (navigator.appVersion.indexOf("Mac") !== -1) { + return "MacOS"; + } else if (navigator.appVersion.indexOf("CrOS") !== -1) { + return "ChromeOS"; + } else if (navigator.appVersion.indexOf("Android") !== -1) { + return "Android"; + } else if (navigator.appVersion.indexOf("Linux") !== -1) { + return "Linux"; + } else if (navigator.appVersion.indexOf("X11") !== -1) { + return "UNIX"; + } else { + return "Unknown"; + } +} + // Timer managing methods // name = string @@ -363,13 +382,16 @@ GUI_control.prototype.selectDefaultTabWhenConnected = function() { }; GUI_control.prototype.isChromeApp = function () { - return this.Mode == GUI_Modes.ChromeApp; + return this.Mode === GUI_Modes.ChromeApp; }; GUI_control.prototype.isNWJS = function () { - return this.Mode == GUI_Modes.NWJS; + return this.Mode === GUI_Modes.NWJS; }; +GUI_control.prototype.isCordova = function () { + return this.Mode === GUI_Modes.Cordova; + }; GUI_control.prototype.isOther = function () { - return this.Mode == GUI_Modes.Other; + return this.Mode === GUI_Modes.Other; }; diff --git a/src/js/localization.js b/src/js/localization.js index af52f543..280b52d3 100644 --- a/src/js/localization.js +++ b/src/js/localization.js @@ -51,10 +51,12 @@ i18n.init = function(cb) { }; i18n.changeLanguage = function(languageSelected) { - ConfigStorage.set({'userLanguageSelect': languageSelected}); - i18next.changeLanguage(getValidLocale(languageSelected)); - i18n.selectedLanguage = languageSelected; - GUI.log(i18n.getMessage('language_changed')); + if (typeof ConfigStorage !== 'undefined') { + ConfigStorage.set({'userLanguageSelect': languageSelected}); + } + i18next.changeLanguage(getValidLocale(languageSelected)); + i18n.selectedLanguage = languageSelected; + GUI.log(i18n.getMessage('language_changed')); }; i18n.getMessage = function(messageID, parameters) { @@ -159,17 +161,22 @@ i18n.localizePage = function(forceReTranslate) { * returns the current locale to the callback */ function getStoredUserLocale(cb) { - ConfigStorage.get('userLanguageSelect', function (result) { - let userLanguage = 'DEFAULT'; - if (result.userLanguageSelect) { - userLanguage = result.userLanguageSelect; - } - i18n.selectedLanguage = userLanguage; + if (typeof ConfigStorage !== 'undefined') { + ConfigStorage.get('userLanguageSelect', function (result) { + let userLanguage = 'DEFAULT'; + if (result.userLanguageSelect) { + userLanguage = result.userLanguageSelect; + } + i18n.selectedLanguage = userLanguage; - userLanguage = getValidLocale(userLanguage); + userLanguage = getValidLocale(userLanguage); + cb(userLanguage); + }); + } else { + const userLanguage = getValidLocale('DEFAULT'); cb(userLanguage); - }); + } } function getValidLocale(userLocale) { diff --git a/src/js/main.js b/src/js/main.js index 6b9f3ed4..0c9cd9da 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -4,6 +4,12 @@ window.googleAnalytics = analytics; window.analytics = null; $(document).ready(function () { + if (typeof cordovaApp === 'undefined') { + appReady(); + } +}); + +function appReady() { $.getJSON('version.json', function(data) { CONFIGURATOR.version = data.version; CONFIGURATOR.gitChangesetId = data.gitChangesetId; @@ -29,7 +35,7 @@ $(document).ready(function () { initializeSerialBackend(); }); }); -}); +} function checkSetupAnalytics(callback) { if (!analytics) { @@ -143,13 +149,17 @@ function closeSerial() { } function closeHandler() { - this.hide(); + if (!GUI.isCordova()) { + this.hide(); + } analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppClose', { sessionControl: 'end' }); closeSerial(); - this.close(true); + if (!GUI.isCordova()) { + this.close(true); + } } //Process to execute to real start the app @@ -171,14 +181,16 @@ function startProcess() { GUI.nwGui.Shell.openExternal(url); }); nwWindow.on('close', closeHandler); - } else if (!GUI.isOther()) { + } else if (GUI.isChromeApp()) { chrome.app.window.onClosed.addListener(closeHandler); // This event does not actually get fired: chrome.runtime.onSuspend.addListener(closeHandler); + } else if (GUI.isCordova()) { + window.addEventListener('beforeunload', closeHandler); } $('.connect_b a.connect').removeClass('disabled'); - $('#logo .version').text(CONFIGURATOR.version); + $('#logo .version, #tab_logoversion .version').text(CONFIGURATOR.version); updateStatusBarVersion(); updateTopBarVersion(); @@ -202,6 +214,10 @@ function startProcess() { ); }); + if (GUI.isCordova()) { + UI_PHONES.init(); + } + const ui_tabs = $('#tabs > ul'); $('a', ui_tabs).click(function () { if ($(this).parent().hasClass('active') === false && !GUI.tab_switch_in_progress) { // only initialize when the tab isn't already active @@ -274,6 +290,9 @@ function startProcess() { case 'privacy_policy': TABS.staticTab.initialize('privacy_policy', content_ready); break; + case 'options': + TABS.options.initialize(content_ready); + break; case 'firmware_flasher': TABS.firmware_flasher.initialize(content_ready); break; @@ -354,117 +373,6 @@ function startProcess() { $('#tabs ul.mode-disconnected li a:first').click(); - // options - $('a#options').click(function () { - const el = $(this); - - if (!el.hasClass('active')) { - el.addClass('active'); - el.after('
'); - - $('div#options-window').load('./tabs/options.html', function () { - // translate to user-selected language - i18n.localizePage(); - - ConfigStorage.get('permanentExpertMode', function (result) { - if (result.permanentExpertMode) { - $('div.permanentExpertMode input').prop('checked', true); - } - - $('div.permanentExpertMode input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'permanentExpertMode': checked}); - - $('input[name="expertModeCheckbox"]').prop('checked', checked).change(); - }).change(); - }); - - ConfigStorage.get('rememberLastTab', function (result) { - $('div.rememberLastTab input') - .prop('checked', !!result.rememberLastTab) - .change(function() { ConfigStorage.set({rememberLastTab: $(this).is(':checked')}); }) - .change(); - }); - - if (GUI.operating_system !== 'ChromeOS') { - ConfigStorage.get('checkForConfiguratorUnstableVersions', function (result) { - if (result.checkForConfiguratorUnstableVersions) { - $('div.checkForConfiguratorUnstableVersions input').prop('checked', true); - } - - $('div.checkForConfiguratorUnstableVersions input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'checkForConfiguratorUnstableVersions': checked}); - - checkForConfiguratorUpdates(); - }); - }); - } else { - $('div.checkForConfiguratorUnstableVersions').hide(); - } - - ConfigStorage.get('analyticsOptOut', function (result) { - if (result.analyticsOptOut) { - $('div.analyticsOptOut input').prop('checked', true); - } - - $('div.analyticsOptOut input').change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'analyticsOptOut': checked}); - - checkSetupAnalytics(function (analyticsService) { - if (checked) { - analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptOut'); - } - - analyticsService.setOptOut(checked); - - if (!checked) { - analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptIn'); - } - }); - }).change(); - }); - - $('div.cliAutoComplete input') - .prop('checked', CliAutoComplete.configEnabled) - .change(function () { - const checked = $(this).is(':checked'); - - ConfigStorage.set({'cliAutoComplete': checked}); - CliAutoComplete.setEnabled(checked); - }).change(); - - $('#darkThemeSelect') - .val(DarkTheme.configEnabled) - .change(function () { - const value = parseInt($(this).val()); - - ConfigStorage.set({'darkTheme': value}); - setDarkTheme(value); - }).change(); - - function close_and_cleanup(e) { - if (e.type === 'click' && !$.contains($('div#options-window')[0], e.target) || e.type === 'keyup' && e.keyCode === 27) { - $(document).unbind('click keyup', close_and_cleanup); - - $('div#options-window').slideUp(250, function () { - el.removeClass('active'); - $(this).empty().remove(); - }); - } - } - - $(document).bind('click keyup', close_and_cleanup); - - $(this).slideDown(250); - }); - } - }); - // listen to all input change events and adjust the value within limits if necessary $("#content").on('focus', 'input[type="number"]', function () { const element = $(this); @@ -535,22 +443,19 @@ function startProcess() { $("#showlog").on('click', function () { let state = $(this).data('state'); if (state) { - $("#log").animate({height: 27}, 200, function () { + setTimeout(function() { const command_log = $('div#log'); command_log.scrollTop($('div.wrapper', command_log).height()); - }); + }, 200); $("#log").removeClass('active'); - $("#content").removeClass('logopen'); - $(".tab_container").removeClass('logopen'); + $("#tab-content-container").removeClass('logopen'); $("#scrollicon").removeClass('active'); ConfigStorage.set({'logopen': false}); state = false; } else { - $("#log").animate({height: 111}, 200); $("#log").addClass('active'); - $("#content").addClass('logopen'); - $(".tab_container").addClass('logopen'); + $("#tab-content-container").addClass('logopen'); $("#scrollicon").addClass('active'); ConfigStorage.set({'logopen': true}); @@ -567,11 +472,12 @@ function startProcess() { }); ConfigStorage.get('permanentExpertMode', function (result) { + const experModeCheckbox = 'input[name="expertModeCheckbox"]'; if (result.permanentExpertMode) { - $('input[name="expertModeCheckbox"]').prop('checked', true); + $(experModeCheckbox).prop('checked', true); } - $('input[name="expertModeCheckbox"]').change(function () { + $(experModeCheckbox).change(function () { const checked = $(this).is(':checked'); checkSetupAnalytics(function (analyticsService) { analyticsService.setDimension(analyticsService.DIMENSIONS.CONFIGURATOR_EXPERT_MODE, checked ? 'On' : 'Off'); @@ -816,7 +722,7 @@ function updateTopBarVersion(firmwareVersion, firmwareId, hardwareId) { const versionText = `${configuratorVersion}
${firmwareVersionAndId}
${targetVersion}`; - $('#logo .logo_text').html(versionText); + $('#logo .logo_text, #tab_logoversion .version').html(versionText); } function updateStatusBarVersion(firmwareVersion, firmwareId, hardwareId) { diff --git a/src/js/main_cordova.js b/src/js/main_cordova.js new file mode 100644 index 00000000..bd7ce0e6 --- /dev/null +++ b/src/js/main_cordova.js @@ -0,0 +1,251 @@ +'use strict'; + +const REQUIRED_WEBVIEW_VERSION = 72; +const WEBVIEW = { + chromeVersion: '', + majorChromeVersion: 0, + appsId: { + androidWebview: 'com.android.webview', + googleWebview: 'com.google.android.webview', + chrome: 'com.android.chrome', + }, + apps: { + 'com.android.webview': { }, + 'com.google.android.webview': { + name: 'Android System WebView', + displayName: 'Google Android Webview', + }, + 'com.android.chrome': { + name: 'Google Chrome', + displayName: 'Chrome', + }, + }, + matchingVersion: 0, + usedApp: null, + uptodateApps: [], + htmlElements: { + webview_step_msg: '#webview_step_msg', + webview_step_btn1: '#webview_step_btn1', + webview_step_btn2: '#webview_step_btn2', + }, + advices: { + installGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewInstall', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $('#webview_step_btn1').text(i18n.getMessage('cordovaWebviewInstallBtn')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + callback(); + }, + updateGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUpdate', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUpdateBtn')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + callback(); + }, + updateAndroidChrome: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUpdate', { + app: WEBVIEW.apps[WEBVIEW.appsId.chrome].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUpdateBtn')) + .attr('app_id', WEBVIEW.appsId.chrome); + callback(); + }, + uninstallGoogleAndroidWebview: function(callback) { + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewUninstall', { + app: WEBVIEW.apps[WEBVIEW.appsId.googleWebview].name, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).text(i18n.getMessage('cordovaWebviewUninstallBtn1')) + .attr('app_id', WEBVIEW.appsId.googleWebview); + $(WEBVIEW.htmlElements.webview_step_btn2).text(i18n.getMessage('cordovaWebviewUninstallBtn2')) + .attr('app_id', WEBVIEW.appsId.googleWebview) + .show(); + callback(); + }, + selectWebview: function(id, callback) { + let app; + if (id === WEBVIEW.appsId.googleWebview) { + app = WEBVIEW.apps[WEBVIEW.appsId.googleWebview].displayName; + } else if (id === WEBVIEW.appsId.chrome) { + app = WEBVIEW.apps[WEBVIEW.appsId.chrome].displayName; + } + $(WEBVIEW.htmlElements.webview_step_msg).html(i18n.getMessage('cordovaWebviewEnable', { + app: app, + })); + $(WEBVIEW.htmlElements.webview_step_btn1).hide(); + $(WEBVIEW.htmlElements.webview_step_btn2).text(i18n.getMessage('cordovaWebviewEnableBtn')).show(); + callback(); + }, + }, + getAdvice1: function(callback) { + const self = this; + if (self.usedApp === WEBVIEW.appsId.googleWebview) { + self.advices.updateGoogleAndroidWebview(callback); + } else if (self.usedApp === WEBVIEW.appsId.chrome) { + self.advices.updateAndroidChrome(callback); + } + }, + getAdvice2: function(callback) { + const self = this; + if (self.uptodateApps.length > 0) { + self.advices.selectWebview(callback); + } else { + if ((self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled) + && (self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled)) { + self.advices.uninstallGoogleAndroidWebview(callback); + } else if (!(self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled) + && !(self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled)) { + self.advices.installGoogleAndroidWebview(callback); + } else { + self.getAdvice3(callback); + } + } + }, + getAdvice3: function(callback) { + const self = this; + if (self.apps[WEBVIEW.appsId.googleWebview].installed && self.apps[WEBVIEW.appsId.googleWebview].enabled + && !self.apps[WEBVIEW.appsId.googleWebview].uptodate) { + self.advices.updateGoogleAndroidWebview(callback); + } else if (self.apps[WEBVIEW.appsId.chrome].installed && self.apps[WEBVIEW.appsId.chrome].enabled + && !self.apps[WEBVIEW.appsId.chrome].uptodate) { + self.advices.updateAndroidChrome(callback); + } + }, + getAdvice: function(callback) { + const self = this; + if (self.usedApp && self.usedApp !== WEBVIEW.appsId.androidWebview) { + this.getAdvice1(callback); + } else { + this.getAdvice2(callback); + } + }, + tryToFindUsedApp: function(callback) { + const self = this; + const appsId = Object.keys(self.apps); + for (let i=0; i${i18n.getMessage('cordovaWebviewUsed')})`); + } + if (i === appsId.length-1) { + callback(); + } + } + }, + checkInstalledApps: function(callback) { + const self = this; + const appsId = Object.keys(self.apps); + let installedApps = 0; + + function checkAvailability(id, i) { + appAvailability.check(id, function(info) { + appInstalled(info, id, i); + }, function() { + appNotInstalled(id, i); + }); + } + function end(i) { + if (i === appsId.length-1) { + if (installedApps === 0) { + $('#webview_apps').append('
  • '); + } + i18n.localizePage(); + console.log('callback'); + callback(); + } + } + function appInstalled(info, id, i) { + installedApps++; + self.apps[id].installed = true; + self.apps[id].enabled = info.enabled; + self.apps[id].version = info.version; + self.apps[id].majorVersion = parseInt(info.version.split('.')[0]); + if (self.chromeVersion === self.apps[id].version) { + self.apps[id].used = 'could'; + self.matchingVersion++; + } else { + self.apps[id].used = 'no'; + } + let color; + if (self.apps[id].majorVersion >= REQUIRED_WEBVIEW_VERSION) { + color = 'green'; + self.apps[id].uptodate = true; + self.uptodateApps.push(id); + } else { + color = 'red'; + self.apps[id].uptodate = false; + } + let app = `
  • ${id} (${self.apps[id].version})`; + if (!self.apps[id].enabled) { + app += ' ()'; + } + app += '
  • '; + $('#webview_apps').append(app); + end(i); + } + function appNotInstalled(id, i) { + self.apps[id].installed = false; + end(i); + } + + for (let i=0; i= REQUIRED_WEBVIEW_VERSION) { + navigator.splashscreen.show(); + document.location.href = 'main.html'; + } else { + navigator.splashscreen.hide(); + self.checkInstalledApps(function() { + self.tryToFindUsedApp(function() { + self.getAdvice(function() { + $('#loading').hide(); + $('#webview_troubleshooting').show(); + }); + }); + }); + } + }, +}; + + +const cordovaApp = { + initialize: function() { + this.bindEvents(); + }, + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + onDeviceReady: function() { + i18n.init(function() { + i18n.localizePage(); + WEBVIEW.exec(); + }); + }, +}; +cordovaApp.initialize(); + +$(WEBVIEW.htmlElements.webview_step_btn1).on('click', function() { + const appId = $(WEBVIEW.htmlElements.webview_step_btn1).attr('app_id'); + cordova.plugins.market.open(appId); +}); +$(WEBVIEW.htmlElements.webview_step_btn2).on('click', function() { + if ($(WEBVIEW.htmlElements.webview_step_btn2).attr('app_id') !== undefined) { + const appId = $(WEBVIEW.htmlElements.webview_step_btn2).attr('app_id'); + window.cordova.plugins.settings.open(['application_details', false, appId]); + } else { + window.cordova.plugins.settings.open('settings'); + } +}); diff --git a/src/js/model.js b/src/js/model.js index 57a35ea3..2ff3ac30 100644 --- a/src/js/model.js +++ b/src/js/model.js @@ -146,6 +146,8 @@ Model.prototype.resize = function () { }; Model.prototype.dispose = function () { - this.renderer.forceContextLoss(); - this.renderer.dispose(); + if (this.canUseWebGLRenderer()) { + this.renderer.forceContextLoss(); + this.renderer.dispose(); + } }; diff --git a/src/js/phones_ui.js b/src/js/phones_ui.js new file mode 100644 index 00000000..202d2772 --- /dev/null +++ b/src/js/phones_ui.js @@ -0,0 +1,87 @@ +'use strict'; + +const UI_PHONES = { + background: '#background', + tabContainer: '.tab_container', + tabContentContainer: '#tab-content-container', + headerbar: '.headerbar', + init: function() { + const self = this; + $('#menu_btn').click(function() { + self.openSideMenu(); + }); + $(this.background).click(function() { + self.closeSideMenu(); + }); + $('#tabs a').click(function() { + if ($('.tab_container').hasClass('reveal')) { + self.closeSideMenu(); + } + }); + $('#reveal_btn').click(function() { + self.expandHeader(); + }); + $(`${this.background}, ${this.tabContainer}`).swipe( { + swipeLeft: function() { + self.closeSideMenu(); + }, + }); + $('#side_menu_swipe').swipe( { + swipeRight: function() { + self.openSideMenu(); + }, + }); + }, + initToolbar: function() { + $('.toolbar_expand_btn').click(this.expandToolbar); + }, + openSideMenu: function() { + $(this.background).fadeIn(300); + $(this.tabContainer).addClass('reveal'); + }, + closeSideMenu: function() { + $(this.background).fadeOut(300); + $(this.tabContainer).removeClass('reveal'); + }, + expandHeader: function() { + const self = this; + let expand, headerExpanded, reveal; + if (GUI.connected_to) { + expand = 'expand2'; + headerExpanded = 'header_expanded2'; + reveal = '.header-wrapper'; + } else { + expand = 'expand'; + headerExpanded = 'headerExpanded'; + reveal = '#port-picker'; + } + if ($(self.headerbar).hasClass(expand)) { + $(reveal).removeClass('reveal'); + setTimeout(function() { + $(self.tabContentContainer).removeClass(headerExpanded); + $(self.headerbar).removeClass(expand); + }, 100); + } else { + $(self.tabContentContainer).addClass(headerExpanded); + $(self.headerbar).addClass(expand); + setTimeout(function() { + $(reveal).addClass('reveal'); + }, 100); + } + }, + expandToolbar: function() { + const toolbar = $('.content_toolbar.xs-compressed'); + if (toolbar.length > 0) { + if ($('.content_toolbar.xs-compressed').hasClass('expanded')) { + toolbar.removeClass('expanded'); + } else { + toolbar.addClass('expanded'); + } + } + }, + reset: function() { + $(this.tabContentContainer).removeClass('header_expanded2 header_expanded'); + $('#port-picker, .header-wrapper').removeClass('reveal'); + $(this.headerbar).removeClass('expand2 expand'); + }, +}; diff --git a/src/js/port_handler.js b/src/js/port_handler.js index 838ff177..1c2f26f9 100644 --- a/src/js/port_handler.js +++ b/src/js/port_handler.js @@ -40,7 +40,7 @@ PortHandler.check = function () { if (GUI.connected_to) { for (var i = 0; i < removed_ports.length; i++) { if (removed_ports[i] == GUI.connected_to) { - $('div#port-picker a.connect').click(); + $('div#header_btns a.connect').click(); } } } @@ -116,7 +116,7 @@ PortHandler.check = function () { // we need firmware flasher protection over here if (GUI.active_tab != 'firmware_flasher') { GUI.timeout_add('auto-connect_timeout', function () { - $('div#port-picker a.connect').click(); + $('div#header_btns a.connect').click(); }, 100); // timeout so bus have time to initialize after being detected by the system } } @@ -164,7 +164,6 @@ PortHandler.check_usb_devices = function (callback) { } self.dfu_available = false; } - if(callback) callback(self.dfu_available); if (!$('option:selected', portPickerElement).data().isDFU) { diff --git a/src/js/serial_backend.js b/src/js/serial_backend.js index ed18a570..2235276f 100644 --- a/src/js/serial_backend.js +++ b/src/js/serial_backend.js @@ -68,7 +68,7 @@ function initializeSerialBackend() { // lock port select & baud while we are connecting / connected $('div#port-picker #port, div#port-picker #baud, div#port-picker #delay').prop('disabled', true); - $('div.connect_controls a.connect_state').text(i18n.getMessage('connecting')); + $('div.connect_controls div.connect_state').text(i18n.getMessage('connecting')); serial.connect(portName, {bitrate: selected_baud}, onOpen); @@ -107,7 +107,7 @@ function initializeSerialBackend() { // auto-connect ConfigStorage.get('auto_connect', function (result) { - if (result.auto_connect === 'undefined' || result.auto_connect) { + if (result.auto_connect === undefined || result.auto_connect) { // default or enabled by user GUI.auto_connect = true; @@ -147,6 +147,10 @@ function initializeSerialBackend() { } function finishClose(finishedCallback) { + if (GUI.isCordova()) { + UI_PHONES.reset(); + } + var wasConnected = CONFIGURATOR.connectionValid; analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Disconnected'); @@ -183,7 +187,7 @@ function finishClose(finishedCallback) { // reset connect / disconnect button $('div.connect_controls a.connect').removeClass('active'); - $('div.connect_controls a.connect_state').text(i18n.getMessage('connect')); + $('div.connect_controls div.connect_state').text(i18n.getMessage('connect')); // reset active sensor indicators sensor_status(0); @@ -309,7 +313,7 @@ function onOpen(openInfo) { } function abortConnect() { - $('div#connectbutton a.connect_state').text(i18n.getMessage('connect')); + $('div#connectbutton div.connect_state').text(i18n.getMessage('connect')); $('div#connectbutton a.connect').removeClass('active'); // unlock port select & baud @@ -409,6 +413,7 @@ function checkReportProblems() { }); problemDialog.showModal(); + $('#dialogReportProblems').scrollTop(0); } processUid(); @@ -456,6 +461,10 @@ function finishOpen() { GUI.allowedTabs.splice(GUI.allowedTabs.indexOf('led_strip'), 1); } + if (GUI.isCordova()) { + UI_PHONES.reset(); + } + onConnect(); GUI.selectDefaultTabWhenConnected(); @@ -474,7 +483,7 @@ function onConnect() { $('div#flashbutton a.flash').removeClass('active'); } GUI.timeout_remove('connecting'); // kill connecting timer - $('div#connectbutton a.connect_state').text(i18n.getMessage('disconnect')).addClass('active'); + $('div#connectbutton div.connect_state').text(i18n.getMessage('disconnect')).addClass('active'); $('div#connectbutton a.connect').addClass('active'); $('#tabs ul.mode-disconnected').hide(); diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index bc9538a4..359502f5 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -176,9 +176,13 @@ TABS.auxiliary.initialize = function (callback) { $(elementName + ' .channel-slider').Link('lower').to($(elementName + ' .lowerLimitValue')); $(elementName + ' .channel-slider').Link('upper').to($(elementName + ' .upperLimitValue')); + let sliderValues = [900, 1000, 1200, 1400, 1500, 1600, 1800, 2000, 2100]; + if ($(window).width() < 575) { + sliderValues = [1000, 1200, 1400, 1600, 1800, 2000]; + } $(rangeElement).find(".pips-channel-range").noUiSlider_pips({ mode: 'values', - values: [900, 1000, 1200, 1400, 1500, 1600, 1800, 2000, 2100], + values: sliderValues, density: 4, stepped: true }); @@ -250,7 +254,7 @@ TABS.auxiliary.initialize = function (callback) { configureRangeTemplate(auxChannelCount); configureLinkTemplate(); - var modeTableBodyElement = $('.tab-auxiliary .modes tbody') + const modeTableBodyElement = $('.tab-auxiliary .modes'); for (var modeIndex = 0; modeIndex < AUX_CONFIG.length; modeIndex++) { var modeId = AUX_CONFIG_IDS[modeIndex]; diff --git a/src/js/tabs/cli.js b/src/js/tabs/cli.js index 775e8c94..50b39280 100644 --- a/src/js/tabs/cli.js +++ b/src/js/tabs/cli.js @@ -111,6 +111,8 @@ TABS.cli.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + TABS.cli.adaptPhones(); + CONFIGURATOR.cliActive = true; var textarea = $('.tab-cli textarea[name="commands"]'); @@ -320,6 +322,17 @@ TABS.cli.initialize = function (callback) { }); }; +TABS.cli.adaptPhones = function() { + if ($(window).width() < 575) { + const backdropHeight = $('.note').height() + 22 + 38; + $('.backdrop').css('height', `calc(100% - ${backdropHeight}px)`); + } + + if (GUI.isCordova()) { + UI_PHONES.initToolbar(); + } +}; + TABS.cli.history = { history: [], index: 0 diff --git a/src/js/tabs/led_strip.js b/src/js/tabs/led_strip.js index 43ba635b..46b04434 100644 --- a/src/js/tabs/led_strip.js +++ b/src/js/tabs/led_strip.js @@ -593,6 +593,11 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { updateBulkCmd(); + if ($(window).width() < 575) { + const gridZoom = $('.tab_title').width() / 496; + $('.mainGrid, .gridSections').css('zoom', gridZoom); + } + GUI.content_ready(callback); } diff --git a/src/js/tabs/options.js b/src/js/tabs/options.js new file mode 100644 index 00000000..c3e3e8ad --- /dev/null +++ b/src/js/tabs/options.js @@ -0,0 +1,143 @@ +'use strict'; + +TABS.options = {}; +TABS.options.initialize = function (callback) { + if (GUI.active_tab !== 'options') { + GUI.active_tab = 'options'; + } + + $('#content').load("./tabs/options.html", function () { + i18n.localizePage(); + + TABS.options.initPermanentExpertMode(); + TABS.options.initRememberLastTab(); + TABS.options.initCheckForConfiguratorUnstableVersions(); + TABS.options.initAnalyticsOptOut(); + TABS.options.initCliAutoComplete(); + TABS.options.initCordovaForceComputerUI(); + TABS.options.initDarkTheme(); + + GUI.content_ready(callback); + }); +}; + +TABS.options.cleanup = function (callback) { + if (callback) { + callback(); + } +}; + +TABS.options.initPermanentExpertMode = function () { + ConfigStorage.get('permanentExpertMode', function (result) { + if (result.permanentExpertMode) { + $('div.permanentExpertMode input').prop('checked', true); + } + + $('div.permanentExpertMode input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'permanentExpertMode': checked}); + + $('input[name="expertModeCheckbox"]').prop('checked', checked).change(); + }).change(); + }); +}; + +TABS.options.initRememberLastTab = function () { + ConfigStorage.get('rememberLastTab', function (result) { + $('div.rememberLastTab input') + .prop('checked', !!result.rememberLastTab) + .change(function() { ConfigStorage.set({rememberLastTab: $(this).is(':checked')}); }) + .change(); + }); +}; + +TABS.options.initCheckForConfiguratorUnstableVersions = function () { + if (GUI.operating_system !== 'ChromeOS') { + ConfigStorage.get('checkForConfiguratorUnstableVersions', function (result) { + if (result.checkForConfiguratorUnstableVersions) { + $('div.checkForConfiguratorUnstableVersions input').prop('checked', true); + } + + $('div.checkForConfiguratorUnstableVersions input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'checkForConfiguratorUnstableVersions': checked}); + + checkForConfiguratorUpdates(); + }); + }); + } else { + $('div.checkForConfiguratorUnstableVersions').hide(); + } +}; + +TABS.options.initAnalyticsOptOut = function () { + ConfigStorage.get('analyticsOptOut', function (result) { + if (result.analyticsOptOut) { + $('div.analyticsOptOut input').prop('checked', true); + } + + $('div.analyticsOptOut input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'analyticsOptOut': checked}); + + checkSetupAnalytics(function (analyticsService) { + if (checked) { + analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptOut'); + } + + analyticsService.setOptOut(checked); + + if (!checked) { + analyticsService.sendEvent(analyticsService.EVENT_CATEGORIES.APPLICATION, 'OptIn'); + } + }); + }).change(); + }); +}; + +TABS.options.initCliAutoComplete = function () { + $('div.cliAutoComplete input') + .prop('checked', CliAutoComplete.configEnabled) + .change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'cliAutoComplete': checked}); + CliAutoComplete.setEnabled(checked); + }).change(); +}; + +TABS.options.initCordovaForceComputerUI = function () { + if (GUI.isCordova() && cordovaUI.canChangeUI) { + ConfigStorage.get('cordovaForceComputerUI', function (result) { + if (result.cordovaForceComputerUI) { + $('div.cordovaForceComputerUI input').prop('checked', true); + } + + $('div.cordovaForceComputerUI input').change(function () { + const checked = $(this).is(':checked'); + + ConfigStorage.set({'cordovaForceComputerUI': checked}); + + if (typeof cordovaUI.set === 'function') { + cordovaUI.set(); + } + }); + }); + } else { + $('div.cordovaForceComputerUI').hide(); + } +}; + +TABS.options.initDarkTheme = function () { + $('#darkThemeSelect') + .val(DarkTheme.configEnabled) + .change(function () { + const value = parseInt($(this).val()); + + ConfigStorage.set({'darkTheme': value}); + setDarkTheme(value); + }).change(); +}; diff --git a/src/js/tabs/osd.js b/src/js/tabs/osd.js index 0a9207a8..766b514e 100644 --- a/src/js/tabs/osd.js +++ b/src/js/tabs/osd.js @@ -2200,6 +2200,12 @@ TABS.osd.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + if ($(window).width() < 390) { + const previewZoom = ($(window).width() - 30) / 360; + $('.display-layout .preview').css('zoom', previewZoom); + } + + // Open modal window OSD.GUI.fontManager = new jBox('Modal', { width: 750, diff --git a/src/js/tabs/pid_tuning.js b/src/js/tabs/pid_tuning.js index 1abee7a3..c64bfa77 100644 --- a/src/js/tabs/pid_tuning.js +++ b/src/js/tabs/pid_tuning.js @@ -2549,28 +2549,28 @@ TABS.pid_tuning.changeRatesTypeLogo = function() { switch(self.currentRatesType) { case self.RATES_TYPE.RACEFLIGHT: - ratesLogoElement.attr("src", "../images/rate_logos/raceflight.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/raceflight.svg"); break; case self.RATES_TYPE.KISS: - ratesLogoElement.attr("src", "../images/rate_logos/kiss.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/kiss.svg"); break; case self.RATES_TYPE.ACTUAL: - ratesLogoElement.attr("src", "../images/rate_logos/actual.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/actual.svg"); break; case self.RATES_TYPE.QUICKRATES: - ratesLogoElement.attr("src", "../images/rate_logos/quickrates.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/quickrates.svg"); break; // add future rates types here default: // BetaFlight - ratesLogoElement.attr("src", "../images/rate_logos/betaflight.svg"); + ratesLogoElement.attr("src", "./images/rate_logos/betaflight.svg"); break; } diff --git a/src/js/tabs/ports.js b/src/js/tabs/ports.js index 41595145..8203f5a2 100644 --- a/src/js/tabs/ports.js +++ b/src/js/tabs/ports.js @@ -184,9 +184,11 @@ TABS.ports.initialize = function (callback, scrollPosition) { let lastVtxControlSelected; var ports_e = $('.tab-ports .ports'); + const portIdentifierTemplateE = $('#tab-ports-templates .portIdentifier'); var port_configuration_template_e = $('#tab-ports-templates .portConfiguration'); for (var portIndex = 0; portIndex < SERIAL_CONFIG.ports.length; portIndex++) { + const portIdentifierE = portIdentifierTemplateE.clone(); var port_configuration_e = port_configuration_template_e.clone(); var serialPort = SERIAL_CONFIG.ports[portIndex]; @@ -216,6 +218,7 @@ TABS.ports.initialize = function (callback, scrollPosition) { var blackbox_baudrate_e = port_configuration_e.find('select.blackbox_baudrate'); blackbox_baudrate_e.val(blackboxBaudrate); + portIdentifierE.find('.identifier').text(portIdentifierToNameMapping[serialPort.identifier]); port_configuration_e.find('.identifier').text(portIdentifierToNameMapping[serialPort.identifier]); port_configuration_e.data('index', portIndex); @@ -288,6 +291,7 @@ TABS.ports.initialize = function (callback, scrollPosition) { } } + ports_e.find('tbody').append(portIdentifierE); ports_e.find('tbody').append(port_configuration_e); } diff --git a/src/js/tabs/vtx.js b/src/js/tabs/vtx.js index 1346b0c3..1336fc84 100644 --- a/src/js/tabs/vtx.js +++ b/src/js/tabs/vtx.js @@ -41,6 +41,10 @@ TABS.vtx.initialize = function (callback) { // translate to user-selected language i18n.localizePage(); + if (GUI.isCordova()) { + UI_PHONES.initToolbar(); + } + self.updating = false; GUI.content_ready(callback); } @@ -112,8 +116,9 @@ TABS.vtx.initialize = function (callback) { // Load schema const urlVtxSchema = chrome.runtime.getURL(`resources/jsonschema/vtxconfig_schema-${vtxConfig.version}.json`); - if (GUI.Mode === GUI_Modes.ChromeApp) { + if (GUI.Mode === GUI_Modes.ChromeApp || GUI.isCordova()) { // FIXME the ChromeOs don't let us use a Schema Validator because almost all of them use eval, and/or use require + // On android : Fetch API cannot load : URL scheme "file" is not supported callback_valid(); } else { fetch(urlVtxSchema) diff --git a/src/main.html b/src/main.html index 675c948b..5dc77e21 100644 --- a/src/main.html +++ b/src/main.html @@ -33,12 +33,16 @@ + + + + @@ -118,6 +122,7 @@ + @@ -128,30 +133,30 @@ + +
    +
    +
    + -
    -
    -
    - -
    - -
    -
    -
    - -
    - +
    +
    -
    - -
    + class="auto_connect" i18n="autoConnect">
    -
    -
    -
      -
    • -
      -
    • -
    -
    - +
    +
    +
    +
    +
    +
    +
    Battery voltage
    +
    +
    +
    +
    -
    +
    • @@ -224,22 +224,39 @@
    -
    -
    -
    -
    -
    -
    -
    Battery voltage
    -
    -
    -
    -
    +
    +
    +
      +
    • +
      +
    • +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    -
    @@ -247,67 +264,76 @@
    -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    -
      -
    • -
    • +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
        +
      • +
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      • - -
      -
        -
      • - -
      • -
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • + +
    +
      +
    • + +
    • +
    +
    +
    -
    +
    -
    D: 0% + diff --git a/src/main_cordova.html b/src/main_cordova.html new file mode 100644 index 00000000..e1e828e9 --- /dev/null +++ b/src/main_cordova.html @@ -0,0 +1,48 @@ + + + + + + Betaflight configurator + + + + +
    + +
    +
    + +

    +
    +
    +
    +
    + +
    +
    +

    +

    +
    +

    + + +
    +
    +
    +
    + +
    +
    +
      +
      +
      +
      + + + + + + + + diff --git a/src/tabs/adjustments.html b/src/tabs/adjustments.html index 90b60745..69afd8d1 100644 --- a/src/tabs/adjustments.html +++ b/src/tabs/adjustments.html @@ -14,20 +14,22 @@
      - - +
      +
      + - + - - - -
      + + + + +
      diff --git a/src/tabs/auxiliary.html b/src/tabs/auxiliary.html index d27d0eab..14872a1b 100644 --- a/src/tabs/auxiliary.html +++ b/src/tabs/auxiliary.html @@ -15,10 +15,7 @@
      - - - -
      +
      @@ -27,20 +24,24 @@
      - - - - - - - -
      -

      -
      - - -
      -
      +
      +
      +
      +

      +
      + + + + + + + + +
      +
      +
      +
      +
      diff --git a/src/tabs/cli.html b/src/tabs/cli.html index 70a40dfa..1e17b91f 100644 --- a/src/tabs/cli.html +++ b/src/tabs/cli.html @@ -1,4 +1,4 @@ -
      +

      @@ -11,15 +11,25 @@
      -
      -
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + -
      \ No newline at end of file +
      diff --git a/src/tabs/configuration.html b/src/tabs/configuration.html index a6f8142f..cce43d6e 100644 --- a/src/tabs/configuration.html +++ b/src/tabs/configuration.html @@ -4,365 +4,361 @@
      -
      +

      - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      -
      -
      -
      -
      -
      -
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      -
      +
      -
      -
      -
      - -
      - -
      -
      -
      -
      -
      - - -
      -
      -
      -
      -
      -
      -
      -

      +
      +
      +
      +
      -
      + +
      +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +

      +
      +
      +
      + +
      + +
      +
      +
      + + + +
      +
      + + +
      +
      +
      +
      - +
      - -
      +
      - - - +
      + +
      +
      -
      - - -
      -
      -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - +
      +
      +
      +
      -
      -
      -
      +
      +
      +
      +
      +
      +
      +
      +
      -
      -
      -
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      +
      +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      + +
      + +
      +
      +
      -
      -
      -
      -
      + + + + +
      + + + + +
      + +
      +
      + +
      + +
      -
      -
      -
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      - -
      - - - -
      -
      -
      -
      +
      +
      +
      +
      +
      +
      +
      -
      -
      -

      -

      -
      - -
      -
      -
      - -
      - -
      -
      - -
      -
      -
      -
      - -
      - -
      -
      - -
      - - - - -
      - - - - -
      - -
      -
      - -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - -
      -
      - -
      +
      +
      - - -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      -
      - -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      +
      +
      +
      +
      -
      -
      -
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      +
      +
      -
      - -
      - - - - -
      -
      -
      -
      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +

      -
      - - + + +
      +
      +
      +

      -
      -
      -

      + + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      +
      + + + + + + + + + + + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      +
      - - -
      -
      -
      -

      +
      +
      - - -
      -
      -
      - -
      - - - -
      -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      -
      -
      - -
      - - - -
      -
      -
      -
      -
      -
      -
      -

      +
      +
      - - - - - - - - - - - -
      +
      -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      -
      - + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      +
      +

      -
      - -
      -
      - -
      -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - -
      -
      -
      -
      -

      -
      - -
      - - -
      -
      - - - + + +
      +
      + + +
      +
      +
      +
      -
      -
      - -
      - + +
      +
      +
      +
      -
      -
      - -
      - + +
      +
      +
      +
      -
      -
      - -
      - -
      -
      -
      -
      - -
      - -
      -
      -
      - - + +
      +
      +
      +
      +
      + +
      +
      +
      + +
      - -
      - - - -
      -
      -
      -
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      -
      - - - - - - - - - - - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      - -
      - - - -
      -
      -
      -
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + +
      +
      +
      -
      - - - - - - - - - - - -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      - -
      - -
      - - - - -
      -
      -
      -
      -
      -
      -
      - - - - - - - - - -
      -
      -
      - -
      - -
      -
      -
      -
      - -
      - -
      -
      - - - - -
      -
      -
      -
      -
      - - - -
      -
      -
      -
      -
      -
      - - - - - - - - - -
      +
      -
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      + +
      +
      + + + + +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + +
      +
      +
      +
      +
      +
      diff --git a/src/tabs/failsafe.html b/src/tabs/failsafe.html index 71b6d7ef..d672c567 100644 --- a/src/tabs/failsafe.html +++ b/src/tabs/failsafe.html @@ -7,190 +7,192 @@

      -
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      +
      +
      +
      +
      -
      - +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      +
      +
      +
      +
      +
      + +
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - +
      +
      +
      -
      -
      -
      -
      -
      -
      -
      - - +
      +
      + - -
      -
      -
      - -
      - -
      -
      -
      - -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      - + + +
      +
      +
      -
      - -
      + +
      +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      +
      -
      -
      -
      - +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      -
      -
      - +
      +
      +
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      diff --git a/src/tabs/gps.html b/src/tabs/gps.html index 096b88f9..90392e76 100644 --- a/src/tabs/gps.html +++ b/src/tabs/gps.html @@ -6,8 +6,8 @@
      -
      -
      +
      +
      @@ -46,10 +46,8 @@
      -
      -
      -
      -
      +
      +
      @@ -144,26 +142,26 @@
      -
      -
      -
      -
      +
      +
      +
      -
      -
      - -
      -
      -
      -
      -
      -
      - -
      - + - –
      -
      +
      + +
      +
      +
      +
      +
      +
      + +
      + + + – +
      +
      +
      diff --git a/src/tabs/help.html b/src/tabs/help.html index 568d0af0..aaed0304 100644 --- a/src/tabs/help.html +++ b/src/tabs/help.html @@ -1,6 +1,6 @@
      -
      -
      +
      +
      @@ -14,7 +14,7 @@
      -
      +
      @@ -38,4 +38,4 @@
      -
      \ No newline at end of file +
      diff --git a/src/tabs/landing.html b/src/tabs/landing.html index 052cb5b8..bb031557 100644 --- a/src/tabs/landing.html +++ b/src/tabs/landing.html @@ -2,24 +2,25 @@
      - +
      -
      -
      +
      + +

      -
      +

      -
      +

      diff --git a/src/tabs/motors.html b/src/tabs/motors.html index 8e023d61..8e622737 100644 --- a/src/tabs/motors.html +++ b/src/tabs/motors.html @@ -184,9 +184,10 @@
      -
      +
      +
      diff --git a/src/tabs/onboard_logging.html b/src/tabs/onboard_logging.html index 89b8953a..8e8cc4c7 100644 --- a/src/tabs/onboard_logging.html +++ b/src/tabs/onboard_logging.html @@ -1,4 +1,4 @@ -
      +
      @@ -114,43 +114,44 @@
      -
      -
      -
      -
      - -

      +
      +
      +
      +
      + +

      -
      -
        -
      • -
        -
      • -
      • -
        -
      • -
      -
      +
      +
        +
      • +
        +
      • +
      • +
        +
      • +
      -
      -
      -
      -
      -
      -
      -
      -

      - -
      - -
      -
      - -

      -
      -
      +
      +
      +
      +
      +
      +
      +
      +

      + +
      + +
      +
      + +

      +
      +
      +
      +
      diff --git a/src/tabs/options.html b/src/tabs/options.html index 1c0048b8..1bf9b0f4 100644 --- a/src/tabs/options.html +++ b/src/tabs/options.html @@ -1,23 +1,55 @@ -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - -
      -
      - - +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + + +
      +
      +
      +
      diff --git a/src/tabs/osd.html b/src/tabs/osd.html index 7c2af76d..719dfd73 100644 --- a/src/tabs/osd.html +++ b/src/tabs/osd.html @@ -17,8 +17,8 @@

      -
      -
      +
      +
      @@ -33,13 +33,11 @@
      -
      -
      +
      +
      -
      - -
      -
      +
      +
      -
      -
      - -
      -
      -
      -
      -
      -
      - +
      +
      +
      +
      +
      -
      +
      +
      + +
      +
      + +
      -
      +
      @@ -113,7 +112,7 @@