diff --git a/.editorconfig b/.editorconfig
new file mode 100755
index 00000000..9a3e06f4
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,8 @@
+root = true
+
+[{src, translations}/*]
+end_of_line = crlf
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+charset = utf-8
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 61b4b3c3..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1,4 +0,0 @@
-*.wav filter=lfs diff=lfs merge=lfs -text
-*.webm filter=lfs diff=lfs merge=lfs -text
-*.mp3 filter=lfs diff=lfs merge=lfs -text
-*.psd filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e6063e3e..40053d64 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -35,19 +35,23 @@ jobs:
cd gulp/
yarn
cd ..
-
- name: Lint
run: |
yarn lint
-
- - name: YAML Lint
- uses: ibiqlik/action-yamllint@v1.0.0
- with:
- file_or_dir: translations/*.yaml
-
- name: TSLint
run: |
cd gulp
yarn gulp translations.fullBuild
cd ..
yarn tslint
+
+ yaml-lint:
+ name: yaml-lint
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v2
+ - name: YAML Lint
+ uses: ibiqlik/action-yamllint@v1.0.0
+ with:
+ file_or_dir: translations/*.yaml
diff --git a/.gitignore b/.gitignore
index 46dc1fd1..a0e08a62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,34 +15,11 @@ pids
*.seed
*.pid.lock
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
-jspm_packages/
-
-# TypeScript v1 declaration files
-typings/
# TypeScript cache
*.tsbuildinfo
@@ -53,18 +30,9 @@ typings/
# Optional eslint cache
.eslintcache
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
# Optional REPL history
.node_repl_history
-# Output of 'npm pack'
-*.tgz
-
# Yarn Integrity file
.yarn-integrity
@@ -72,41 +40,11 @@ typings/
.env
.env.test
-# parcel-bundler cache (https://parceljs.org/)
-.cache
-
-# Next.js build output
-.next
-
-# Nuxt.js build / generate output
-.nuxt
-dist
-
-# Gatsby files
-.cache/
-# Comment in the public line in if your project uses Gatsby and *not* Next.js
-# https://nextjs.org/blog/next-9-1#public-directory-support
-# public
-
-# vuepress build output
-.vuepress/dist
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
-
# Buildfiles
build
+res_built
+gulp/runnable-texturepacker.jar
tmp_standalone_files
# Local config
diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile
new file mode 100644
index 00000000..41956947
--- /dev/null
+++ b/.gitpod.Dockerfile
@@ -0,0 +1,4 @@
+FROM gitpod/workspace-full
+
+RUN sudo apt-get update \
+ && sudo apt install ffmpeg -yq
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 00000000..18373c95
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,10 @@
+image:
+ file: .gitpod.Dockerfile
+tasks:
+ - init: yarn && gp sync-done boot
+ - before: cd gulp
+ init: gp sync-await boot && yarn
+ command: yarn gulp
+ports:
+ - port: 3005
+ onOpen: open-preview
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 335f886a..e47654f3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,5 @@
{
- "editor.defaultFormatter": "esbenp.prettier-vscode"
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "files.trimTrailingWhitespace": true,
+ "editor.formatOnSave": true
}
\ No newline at end of file
diff --git a/.yamllint b/.yamllint
index 98e73204..bb79d866 100644
--- a/.yamllint
+++ b/.yamllint
@@ -4,3 +4,4 @@ rules:
line-length:
level: warning
max: 200
+ document-start: disable
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..61d54684
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,31 @@
+FROM node:12 as base
+
+EXPOSE 3001 3005
+
+WORKDIR /shapez.io
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ ffmpeg default-jre \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY package.json yarn.lock ./
+RUN yarn
+
+COPY gulp ./gulp
+WORKDIR /shapez.io/gulp
+RUN yarn
+
+WORKDIR /shapez.io
+COPY res ./res
+COPY src/html ./src/html
+COPY src/css ./src/css
+COPY version ./version
+COPY sync-translations.js ./
+COPY translations ./translations
+COPY src/js ./src/js
+COPY res_raw ./res_raw
+COPY .git ./.git
+
+WORKDIR /shapez.io/gulp
+ENTRYPOINT ["yarn", "gulp"]
diff --git a/README.md b/README.md
index 32e09d59..85b5d26b 100644
--- a/README.md
+++ b/README.md
@@ -22,15 +22,24 @@ Your goal is to produce shapes by cutting, rotating, merging and painting parts
## Building
-- Make sure git `git lfs` extension is on your path
-- Run `git lfs pull` to download sound assets
- Make sure `ffmpeg` is on your path
- Install Node.js and Yarn
+- Install Java (required for textures)
- Run `yarn` in the root folder
- Cd into `gulp` folder
- Run `yarn` and then `yarn gulp` - it should now open in your browser
-**Notice**: This will produce a debug build with several debugging flags enabled. If you want to disable them, modify `config.js`.
+**Notice**: This will produce a debug build with several debugging flags enabled. If you want to disable them, modify [`src/js/core/config.js`](src/js/core/config.js).
+
+## Build Online with one-click setup
+
+You can use [Gitpod](https://www.gitpod.io/) (an Online Open Source VS Code-like IDE which is free for Open Source) for working on issues and making PRs to this project. With a single click it will start a workspace and automatically:
+
+- clone the `shapez.io` repo.
+- install all of the dependencies.
+- start `gulp` in `gulp/` directory.
+
+[](https://gitpod.io/from-referrer/)
## Helping translate
@@ -64,7 +73,7 @@ This project is based on ES5. Some ES2015 features are used but most of them are
5. Add a constructor. **The constructor must be called with optional parameters only!** `new MyFancyComponent({})` should always work.
6. Add any props you need in the constructor.
7. Add the component in `src/js/game/component_registry.js`
-8. Add the componetn in `src/js/game/entity_components.js`
+8. Add the component in `src/js/game/entity_components.js`
9. Done! You can use your component now
#### Adding a new building
@@ -81,7 +90,7 @@ This project is based on ES5. Some ES2015 features are used but most of them are
8. In `translations/base-en.yaml` add it to two sections: `buildings.[my_building].XXX` (See other buildings) and also `keybindings.mappings.[my_building]`. Be sure to do it the same way as other buildings do!
9. Create a icon (128x128, [prefab](https://github.com/tobspr/shapez.io-artwork/blob/master/ui/toolbar-icons.psd)) for your building and save it in `res/ui/buildings_icons` with the id of your building
10. Create a tutorial image (600x600) for your building and save it in `res/ui/building_tutorials`
-11. In `src/css/icons.scss` add your building to `$buildings` as well as `$buildingAndVariants`
+11. In `src/css/resources.scss` add your building to `$buildings` as well as `$buildingAndVariants`
12. Done! Optional: Add a new reward for unlocking your building at some point.
#### Adding a new game system
@@ -92,10 +101,32 @@ This project is based on ES5. Some ES2015 features are used but most of them are
4. Add the system in `src/js/game/game_system_manager.js` (To `this.systems` and also call `add` in the `internalInitSystems()` method)
5. If your system should draw stuff, this is a bit more complicated. Have a look at existing systems on how they do it.
+#### Checklist for a new building / testing it
+
+This is a quick checklist, if a new building is added this points should be fulfilled:
+
+2. The translation for all variants is done and finalized
+3. The artwork (regular sprite) is finalized
+4. The blueprint sprite has been generated and is up to date
+5. The building has been added to the appropriate toolbar
+6. The building has a keybinding which makes sense
+7. The building has a reward assigned and is unlocked at a meaningful point
+8. The reward for the building has a proper translation
+9. The reward for the building has a proper image
+10. The building has a proper tutorial image assigned
+11. The buliding has a proper toolbar icon
+12. The reward requires a proper shape
+13. The building has a proper silhouette color
+14. The building has a proper matrix for being rendered on the minimap
+15. The building has proper statistics in the dialog
+16. The building properly contributes to the shapes produced analytics
+17. The building is properly persisted in the savegame
+18. The building is explained properly, ideally via an interactive tutorial
+
### Assets
-For most assets I use Adobe Photoshop, you can find them in `assets/`.
+For most assets I use Adobe Photoshop, you can find them here .
-You will need a Texture Packer license in order to regenerate the atlas. If you don't have one but want to contribute assets, let me know and I might compile it for you. I'm currently switching to an open source solution but I can't give an estimate when thats done.
+All assets will be automatically rebuilt into the atlas once changed (Thanks to dengr1065!)
diff --git a/artwork/README.md b/artwork/README.md
deleted file mode 100644
index dab59a98..00000000
--- a/artwork/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-The artwork can be found here:
-
-https://github.com/tobspr/shapez.io-artwork
diff --git a/electron/index.js b/electron/index.js
index 7b9377df..91ab8e9e 100644
--- a/electron/index.js
+++ b/electron/index.js
@@ -4,7 +4,7 @@ const { app, BrowserWindow, Menu, MenuItem, session } = require("electron");
const path = require("path");
const url = require("url");
const childProcess = require("child_process");
-const { ipcMain } = require("electron");
+const { ipcMain, shell } = require("electron");
const fs = require("fs");
const isDev = process.argv.indexOf("--dev") >= 0;
const isLocal = process.argv.indexOf("--local") >= 0;
@@ -67,11 +67,7 @@ function createWindow() {
win.webContents.on("new-window", (event, pth) => {
event.preventDefault();
- if (process.platform == "win32") {
- childProcess.execSync("start " + pth);
- } else if (process.platform == "linux") {
- childProcess.execSync("xdg-open " + pth);
- }
+ shell.openExternal(pth);
});
win.on("closed", () => {
diff --git a/electron/package.json b/electron/package.json
index a67249a0..c8d3a124 100644
--- a/electron/package.json
+++ b/electron/package.json
@@ -1,16 +1,16 @@
-{
- "name": "electron",
- "version": "1.0.0",
- "main": "index.js",
- "license": "MIT",
- "private": true,
- "scripts": {
- "startDev": "electron --disable-direct-composition --in-process-gpu . --dev --local",
- "startDevGpu": "electron --enable-gpu-rasterization --enable-accelerated-2d-canvas --num-raster-threads=8 --enable-zero-copy . --dev --local",
- "start": "electron --disable-direct-composition --in-process-gpu ."
- },
- "devDependencies": {
- "electron": "^6.1.12"
- },
- "dependencies": {}
-}
+{
+ "name": "electron",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "private": true,
+ "scripts": {
+ "startDev": "electron --disable-direct-composition --in-process-gpu . --dev --local",
+ "startDevGpu": "electron --enable-gpu-rasterization --enable-accelerated-2d-canvas --num-raster-threads=8 --enable-zero-copy . --dev --local",
+ "start": "electron --disable-direct-composition --in-process-gpu ."
+ },
+ "devDependencies": {
+ "electron": "10.1.3"
+ },
+ "dependencies": {}
+}
diff --git a/electron/yarn.lock b/electron/yarn.lock
index 01214c92..fa92ec46 100644
--- a/electron/yarn.lock
+++ b/electron/yarn.lock
@@ -1,961 +1,572 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node@^10.12.18":
- version "10.17.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944"
- integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==
-
-ajv@^6.5.5:
- version "6.12.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
- integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
- 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"
-
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
- integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-
-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=
-
-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=
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-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==
-
-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"
-
-buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
-
-camelcase-keys@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
- integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
- dependencies:
- camelcase "^2.0.0"
- map-obj "^1.0.0"
-
-camelcase@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
- integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
-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"
-
-concat-stream@1.6.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
- dependencies:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^2.2.2"
- typedarray "^0.0.6"
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-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.1.3, debug@^2.2.0:
- 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"
-
-debug@^3.0.0:
- version "3.2.6"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
- integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
- dependencies:
- ms "^2.1.1"
-
-decamelize@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
-
-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==
-
-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=
-
-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"
-
-electron-download@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8"
- integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==
- dependencies:
- debug "^3.0.0"
- env-paths "^1.0.0"
- fs-extra "^4.0.1"
- minimist "^1.2.0"
- nugget "^2.0.1"
- path-exists "^3.0.0"
- rc "^1.2.1"
- semver "^5.4.1"
- sumchecker "^2.0.2"
-
-electron@^6.1.12:
- version "6.1.12"
- resolved "https://registry.yarnpkg.com/electron/-/electron-6.1.12.tgz#a7aee6dfa75b57f32b3645ef8e14dcef6d5f31a9"
- integrity sha512-RUPM8xJfTcm53V9EKMBhvpLu1+CQkmuvWDmVCypR5XbUG1OOrOLiKl0CqUZ9+tEDuOmC+DmzmJP2MZXScBU5IA==
- dependencies:
- "@types/node" "^10.12.18"
- electron-download "^4.1.0"
- extract-zip "^1.0.3"
-
-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=
-
-error-ex@^1.2.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.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==
-
-extract-zip@^1.0.3:
- version "1.6.7"
- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
- integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=
- dependencies:
- concat-stream "1.6.2"
- debug "2.6.9"
- mkdirp "0.5.1"
- yauzl "2.4.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-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==
-
-fd-slicer@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
- integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=
- dependencies:
- pend "~1.2.0"
-
-find-up@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
- integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
- dependencies:
- path-exists "^2.0.0"
- pinkie-promise "^2.0.0"
-
-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"
-
-fs-extra@^4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
- integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-get-stdin@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
- integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
-
-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"
-
-graceful-fs@^4.1.2:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
- integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
-
-graceful-fs@^4.1.6:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
- integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
-
-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"
-
-hosted-git-info@^2.1.4:
- 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-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"
-
-indent-string@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
- integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
- dependencies:
- repeating "^2.0.0"
-
-inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-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==
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
-is-finite@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
- integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
-
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
- dependencies:
- number-is-nan "^1.0.0"
-
-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-utf8@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
- integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-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-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"
-
-load-json-file@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
- integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
- strip-bom "^2.0.0"
-
-loud-rejection@^1.0.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
- integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
- dependencies:
- currently-unhandled "^0.4.1"
- signal-exit "^3.0.0"
-
-map-obj@^1.0.0, map-obj@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
- integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-
-meow@^3.1.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
- integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
- dependencies:
- camelcase-keys "^2.0.0"
- decamelize "^1.1.2"
- loud-rejection "^1.0.0"
- map-obj "^1.0.1"
- minimist "^1.1.3"
- normalize-package-data "^2.3.4"
- object-assign "^4.0.1"
- read-pkg-up "^1.0.1"
- redent "^1.0.0"
- trim-newlines "^1.0.0"
-
-mime-db@1.44.0:
- version "1.44.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
- integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
-
-mime-types@^2.1.12, mime-types@~2.1.19:
- version "2.1.27"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
- integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
- dependencies:
- mime-db "1.44.0"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
- integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
-minimist@^1.1.0, minimist@^1.1.3, 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==
-
-mkdirp@0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
- dependencies:
- minimist "0.0.8"
-
-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.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
- 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"
-
-nugget@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
- integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=
- dependencies:
- debug "^2.1.3"
- minimist "^1.1.0"
- pretty-bytes "^1.0.2"
- progress-stream "^1.1.0"
- request "^2.45.0"
- single-line-log "^1.1.2"
- throttleit "0.0.2"
-
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
-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-assign@^4.0.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-keys@~0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
- integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
-
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
- dependencies:
- error-ex "^1.2.0"
-
-path-exists@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
- integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
- dependencies:
- pinkie-promise "^2.0.0"
-
-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-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-type@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
- integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
- dependencies:
- graceful-fs "^4.1.2"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-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@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
-pinkie-promise@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
- integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
- dependencies:
- pinkie "^2.0.0"
-
-pinkie@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
- integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
-pretty-bytes@^1.0.2:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"
- integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=
- dependencies:
- get-stdin "^4.0.1"
- meow "^3.1.0"
-
-process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-progress-stream@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77"
- integrity sha1-LNPP6jO6OonJwSHsM0er6asSX3c=
- dependencies:
- speedometer "~0.1.2"
- through2 "~0.2.3"
-
-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==
-
-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==
-
-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==
-
-rc@^1.2.1:
- 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-pkg-up@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
- integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
- dependencies:
- find-up "^1.0.0"
- read-pkg "^1.0.0"
-
-read-pkg@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
- integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
- dependencies:
- load-json-file "^1.0.0"
- normalize-package-data "^2.3.2"
- path-type "^1.0.0"
-
-readable-stream@^2.2.2:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
- integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-readable-stream@~1.1.9:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-redent@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
- integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
- dependencies:
- indent-string "^2.1.0"
- strip-indent "^1.0.1"
-
-repeating@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
- integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
- dependencies:
- is-finite "^1.0.0"
-
-request@^2.45.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@^1.10.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
- integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
- dependencies:
- path-parse "^1.0.6"
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.2:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-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==
-
-"semver@2 || 3 || 4 || 5", semver@^5.4.1:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-signal-exit@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
- integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-
-single-line-log@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
- integrity sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=
- dependencies:
- string-width "^1.0.1"
-
-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.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
-
-spdx-expression-parse@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
- integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
- 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==
-
-speedometer@~0.1.2:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d"
- integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=
-
-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"
-
-string-width@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-strip-ansi@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
- dependencies:
- ansi-regex "^2.0.0"
-
-strip-bom@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
- integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
- dependencies:
- is-utf8 "^0.2.0"
-
-strip-indent@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
- integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
- dependencies:
- get-stdin "^4.0.1"
-
-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=
-
-sumchecker@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e"
- integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=
- dependencies:
- debug "^2.2.0"
-
-throttleit@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
- integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8=
-
-through2@~0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f"
- integrity sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=
- dependencies:
- readable-stream "~1.1.9"
- xtend "~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"
-
-trim-newlines@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
- integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
-
-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=
-
-typedarray@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-
-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==
-
-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"
-
-util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-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==
-
-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"
-
-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"
-
-xtend@~2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
- integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
- dependencies:
- object-keys "~0.4.0"
-
-yauzl@2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
- integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=
- dependencies:
- fd-slicer "~1.0.1"
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@electron/get@^1.0.1":
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.2.tgz#6442066afb99be08cefb9a281e4b4692b33764f3"
+ integrity sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==
+ dependencies:
+ debug "^4.1.1"
+ env-paths "^2.2.0"
+ fs-extra "^8.1.0"
+ got "^9.6.0"
+ progress "^2.0.3"
+ sanitize-filename "^1.6.2"
+ sumchecker "^3.0.1"
+ optionalDependencies:
+ global-agent "^2.0.2"
+ global-tunnel-ng "^2.7.1"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@types/node@^12.0.12":
+ version "12.12.62"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.62.tgz#733923d73669188d35950253dd18a21570085d2b"
+ integrity sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg==
+
+boolean@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f"
+ integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+concat-stream@1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+config-chain@^1.1.11:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
+ integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+core-js@^3.6.5:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
+ integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+debug@2.6.9:
+ 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"
+
+debug@^4.1.0, debug@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
+ integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
+ dependencies:
+ ms "2.1.2"
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+detect-node@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
+ integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+electron@10.1.3:
+ version "10.1.3"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-10.1.3.tgz#7e276e373bf30078bd4cb1184850a91268dc0e6c"
+ integrity sha512-CR8LrlG47MdAp317SQ3vGYa2o2cIMdMSMPYH46OVitFLk35dwE9fn3VqvhUIXhCHYcNWIAPzMhkVHpkoFdKWuw==
+ dependencies:
+ "@electron/get" "^1.0.1"
+ "@types/node" "^12.0.12"
+ extract-zip "^1.0.3"
+
+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"
+
+env-paths@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
+ integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
+
+es6-error@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+extract-zip@^1.0.3:
+ version "1.6.7"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
+ integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=
+ dependencies:
+ concat-stream "1.6.2"
+ debug "2.6.9"
+ mkdirp "0.5.1"
+ yauzl "2.4.1"
+
+fd-slicer@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+ integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=
+ dependencies:
+ pend "~1.2.0"
+
+fs-extra@^8.1.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"
+
+get-stream@^4.1.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-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+global-agent@^2.0.2:
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195"
+ integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==
+ dependencies:
+ boolean "^3.0.1"
+ core-js "^3.6.5"
+ es6-error "^4.1.1"
+ matcher "^3.0.0"
+ roarr "^2.15.3"
+ semver "^7.3.2"
+ serialize-error "^7.0.1"
+
+global-tunnel-ng@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
+ integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
+ dependencies:
+ encodeurl "^1.0.2"
+ lodash "^4.17.10"
+ npm-conf "^1.1.3"
+ tunnel "^0.0.6"
+
+globalthis@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9"
+ integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==
+ dependencies:
+ define-properties "^1.1.3"
+
+got@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+graceful-fs@^4.1.6:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
+ integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
+
+graceful-fs@^4.2.0:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+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"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+lodash@^4.17.10:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+matcher@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
+ integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+mkdirp@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+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.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+normalize-url@^4.1.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
+ integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+
+npm-conf@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+object-keys@^1.0.12:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+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"
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
+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=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+
+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"
+
+readable-stream@^2.2.2:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+roarr@^2.15.3:
+ version "2.15.4"
+ resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
+ integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
+ dependencies:
+ boolean "^3.0.1"
+ detect-node "^2.0.4"
+ globalthis "^1.0.1"
+ json-stringify-safe "^5.0.1"
+ semver-compare "^1.0.0"
+ sprintf-js "^1.1.2"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+sanitize-filename@^1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
+ integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+
+semver@^7.3.2:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+sprintf-js@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+sumchecker@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
+ integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
+ dependencies:
+ debug "^4.1.0"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys=
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+tunnel@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+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==
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+utf8-byte-length@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+ integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+yauzl@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+ integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=
+ dependencies:
+ fd-slicer "~1.0.1"
diff --git a/gulp/.gitattributes b/gulp/.gitattributes
deleted file mode 100644
index d899f655..00000000
--- a/gulp/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.wav filter=lfs diff=lfs merge=lfs -text
diff --git a/gulp/.gitignore b/gulp/.gitignore
index aa92ef40..80dc3c89 100644
--- a/gulp/.gitignore
+++ b/gulp/.gitignore
@@ -1,2 +1 @@
-additional_build_files
-steampipe
+additional_build_files
diff --git a/gulp/atlas2json.js b/gulp/atlas2json.js
new file mode 100644
index 00000000..b77a47f3
--- /dev/null
+++ b/gulp/atlas2json.js
@@ -0,0 +1,127 @@
+const { join, resolve } = require("path");
+const { readFileSync, readdirSync, writeFileSync } = require("fs");
+
+const suffixToScale = {
+ lq: "0.25",
+ mq: "0.5",
+ hq: "0.75"
+};
+
+function convert(srcDir) {
+ const full = resolve(srcDir);
+ const srcFiles = readdirSync(full)
+ .filter(n => n.endsWith(".atlas"))
+ .map(n => join(full, n));
+
+ for (const atlas of srcFiles) {
+ console.log(`Processing: ${atlas}`);
+
+ // Read all text, split it into line array
+ // and filter all empty lines
+ const lines = readFileSync(atlas, "utf-8")
+ .split("\n")
+ .filter(n => n.trim());
+
+ // Get source image name
+ const image = lines.shift();
+ const srcMeta = {};
+
+ // Read all metadata (supports only one page)
+ while (true) {
+ const kv = lines.shift().split(":");
+ if (kv.length != 2) {
+ lines.unshift(kv[0]);
+ break;
+ }
+
+ srcMeta[kv[0]] = kv[1].trim();
+ }
+
+ const frames = {};
+ let current = null;
+
+ lines.push("Dummy line to make it convert last frame");
+
+ for (const line of lines) {
+ if (!line.startsWith(" ")) {
+ // New frame, convert previous if it exists
+ if (current != null) {
+ let { name, rotate, xy, size, orig, offset, index } = current;
+
+ // Convert to arrays because Node.js doesn't
+ // support latest JS features
+ xy = xy.split(",").map(v => Number(v));
+ size = size.split(",").map(v => Number(v));
+ orig = orig.split(",").map(v => Number(v));
+ offset = offset.split(",").map(v => Number(v));
+
+ // GDX TexturePacker removes index suffixes
+ const indexSuff = index != -1 ? `_${index}` : "";
+ const isTrimmed = size != orig;
+
+ frames[`${name}${indexSuff}.png`] = {
+ // Bounds on atlas
+ frame: {
+ x: xy[0],
+ y: xy[1],
+ w: size[0],
+ h: size[1]
+ },
+
+ // Whether image was rotated
+ rotated: rotate == "true",
+ trimmed: isTrimmed,
+
+ // How is the image trimmed
+ spriteSourceSize: {
+ x: offset[0],
+ y: (orig[1] - size[1]) - offset[1],
+ w: size[0],
+ h: size[1]
+ },
+
+ sourceSize: {
+ w: orig[0],
+ h: orig[1]
+ }
+ }
+ }
+
+ // Simple object that will hold other metadata
+ current = {
+ name: line
+ };
+ } else {
+ // Read and set current image metadata
+ const kv = line.split(":").map(v => v.trim());
+ current[kv[0]] = isNaN(Number(kv[1])) ? kv[1] : Number(kv[1]);
+ }
+ }
+
+ const atlasSize = srcMeta.size.split(",").map(v => Number(v));
+ const atlasScale = suffixToScale[atlas.match(/_(\w+)\.atlas$/)[1]];
+
+ const result = JSON.stringify({
+ frames,
+ meta: {
+ image,
+ format: srcMeta.format,
+ size: {
+ w: atlasSize[0],
+ h: atlasSize[1]
+ },
+ scale: atlasScale.toString()
+ }
+ });
+
+ writeFileSync(atlas.replace(".atlas", ".json"), result, {
+ encoding: "utf-8"
+ });
+ }
+}
+
+if (require.main == module) {
+ convert(process.argv[2]);
+}
+
+module.exports = { convert };
diff --git a/gulp/buildutils.js b/gulp/buildutils.js
index 041c8b1d..ea253773 100644
--- a/gulp/buildutils.js
+++ b/gulp/buildutils.js
@@ -25,6 +25,14 @@ module.exports = {
});
},
+ getTag() {
+ try {
+ return execSync("git describe --tag --exact-match").toString("ascii");
+ } catch (e) {
+ throw new Error('Current git HEAD is not a version tag');
+ }
+ },
+
getVersion() {
return trim(fs.readFileSync(path.join(__dirname, "..", "version")).toString());
},
diff --git a/gulp/convert_atlas.js b/gulp/convert_atlas.js
deleted file mode 100644
index 8e0ba990..00000000
--- a/gulp/convert_atlas.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// Converts the atlas description to a JSON file
-
-String.prototype.replaceAll = function (search, replacement) {
- var target = this;
- return target.split(search).join(replacement);
-};
-
-const fs = require("fs");
-const path = require("path");
-
-const folder = path.join(__dirname, "res_built", "atlas");
-const files = fs.readdirSync(folder);
-
-const metadata = [];
-
-files.forEach(filename => {
- if (filename.endsWith(".atlas")) {
- // Read content
-
- const content = fs.readFileSync(path.join(folder, filename), "ascii");
-
- const lines = content.replaceAll("\r", "").replaceAll("\t", "").split("\n");
-
- const readLine = () => lines.splice(0, 1)[0];
- const readValue = () => readLine().replaceAll(" ", "").split(":")[1];
- const readVector = () =>
- readValue()
- .split(",")
- .map(d => parseInt(d, 10));
-
- let maxAtlas = 100;
-
- atlasLoop: while (maxAtlas-- > 0 && lines.length >= 7) {
- const result = {
- entries: [],
- };
-
- // Extract header
- const header_fileStart = readLine();
- const header_fileName = readLine();
- const header_size = readVector();
- const header_format = readLine();
- const header_filter = readLine();
- const header_repeat = readLine();
- const baseAtlasName = header_fileName.replace(".png", "");
-
- // Store size
- result.size = header_size;
-
- lineLoop: while (lines.length >= 7) {
- const entryResult = {};
-
- const nextLine = lines[0];
- if (nextLine.length === 0) {
- break;
- }
-
- const entry_fileName = readLine() + ".png";
-
- const entry_rotate = readValue();
- const entry_xy = readVector();
- const entry_size = readVector();
- const entry_orig = readVector();
- const entry_offset = readVector();
- const entry_index = readValue();
-
- entryResult.filename = entry_fileName;
- entryResult.xy = entry_xy;
- entryResult.size = entry_size;
- // entryResult.offset = entry_offset;
-
- entryResult.origSize = entry_orig;
-
- let offset = [0, 0];
-
- // GDX Atlas packer uses 1 - y coordinates. This sucks, and we have to convert it
- offset[0] = entry_offset[0];
- offset[1] = entry_orig[1] - entry_offset[1] - entry_size[1];
-
- entryResult.offset = offset;
-
- result.entries.push(entryResult);
- }
-
- console.log("[Atlas]", "'" + baseAtlasName + "'", "has", result.entries.length, "entries");
- // fs.writeFileSync(path.join(folder, baseAtlasName + ".gen.json"), JSON.stringify(result));
-
- metadata.push({
- filename: baseAtlasName + ".png",
- entries: result,
- });
- }
- }
-});
-
-fs.writeFileSync(path.join(folder, "meta.gen.json"), JSON.stringify(metadata, null, 4));
diff --git a/gulp/css.js b/gulp/css.js
index 6734f1ae..73a0a7cf 100644
--- a/gulp/css.js
+++ b/gulp/css.js
@@ -1,99 +1,137 @@
-const path = require("path");
-const buildUtils = require("./buildutils");
-
-function gulptasksCSS($, gulp, buildFolder, browserSync) {
- // The assets plugin copies the files
- const commitHash = buildUtils.getRevision();
- const postcssAssetsPlugin = cachebust =>
- $.postcssAssets({
- loadPaths: [path.join(buildFolder, "res", "ui")],
- basePath: buildFolder,
- baseUrl: ".",
- cachebuster: cachebust
- ? (filePath, urlPathname) => ({
- pathname: buildUtils.cachebust(urlPathname, commitHash),
- })
- : "",
- });
-
- // Postcss configuration
- const postcssPlugins = (prod, { cachebust = false }) => {
- const plugins = [postcssAssetsPlugin(cachebust)];
- if (prod) {
- plugins.unshift(
- $.postcssUnprefix(),
- $.postcssPresetEnv({
- browsers: ["> 0.1%"],
- })
- );
-
- plugins.push(
- $.cssMqpacker({
- sort: true,
- }),
- $.cssnano({
- preset: [
- "advanced",
- {
- cssDeclarationSorter: false,
- discardUnused: true,
- mergeIdents: false,
- reduceIdents: true,
- zindex: true,
- },
- ],
- }),
- $.postcssRoundSubpixels()
- );
- }
- return plugins;
- };
-
- // Performs linting on css
- gulp.task("css.lint", () => {
- return gulp
- .src(["../src/css/**/*.scss"])
- .pipe($.sassLint({ configFile: ".sasslint.yml" }))
- .pipe($.sassLint.format())
- .pipe($.sassLint.failOnError());
- });
-
- // Builds the css in dev mode
- gulp.task("css.dev", () => {
- return gulp
- .src(["../src/css/main.scss"])
- .pipe($.plumber())
- .pipe($.sass.sync().on("error", $.sass.logError))
- .pipe($.postcss(postcssPlugins(false, {})))
- .pipe(gulp.dest(buildFolder))
- .pipe(browserSync.stream());
- });
-
- // Builds the css in production mode (=minified)
- gulp.task("css.prod", () => {
- return (
- gulp
- .src("../src/css/main.scss", { cwd: __dirname })
- .pipe($.plumber())
- .pipe($.sass.sync({ outputStyle: "compressed" }).on("error", $.sass.logError))
- .pipe($.postcss(postcssPlugins(true, { cachebust: true })))
- .pipe(gulp.dest(buildFolder))
- );
- });
-
- // Builds the css in production mode (=minified), without cachebusting
- gulp.task("css.prod-standalone", () => {
- return (
- gulp
- .src("../src/css/main.scss", { cwd: __dirname })
- .pipe($.plumber())
- .pipe($.sass.sync({ outputStyle: "compressed" }).on("error", $.sass.logError))
- .pipe($.postcss(postcssPlugins(true, { cachebust: false })))
- .pipe(gulp.dest(buildFolder))
- );
- });
-}
-
-module.exports = {
- gulptasksCSS,
-};
+const path = require("path");
+const buildUtils = require("./buildutils");
+
+function gulptasksCSS($, gulp, buildFolder, browserSync) {
+ // The assets plugin copies the files
+ const commitHash = buildUtils.getRevision();
+ const postcssAssetsPlugin = cachebust =>
+ $.postcssAssets({
+ loadPaths: [path.join(buildFolder, "res", "ui")],
+ basePath: buildFolder,
+ baseUrl: ".",
+ cachebuster: cachebust
+ ? (filePath, urlPathname) => ({
+ pathname: buildUtils.cachebust(urlPathname, commitHash),
+ })
+ : "",
+ });
+
+ // Postcss configuration
+ const postcssPlugins = (prod, { cachebust = false }) => {
+ const plugins = [postcssAssetsPlugin(cachebust)];
+ if (prod) {
+ plugins.unshift(
+ $.postcssUnprefix(),
+ $.postcssPresetEnv({
+ browsers: ["> 0.1%"],
+ })
+ );
+
+ plugins.push(
+ $.cssMqpacker({
+ sort: true,
+ }),
+ $.cssnano({
+ preset: [
+ "advanced",
+ {
+ cssDeclarationSorter: false,
+ discardUnused: true,
+ mergeIdents: false,
+ reduceIdents: true,
+ zindex: true,
+ },
+ ],
+ }),
+ $.postcssRoundSubpixels()
+ );
+ }
+ return plugins;
+ };
+
+ // Performs linting on css
+ gulp.task("css.lint", () => {
+ return gulp
+ .src(["../src/css/**/*.scss"])
+ .pipe($.sassLint({ configFile: ".sasslint.yml" }))
+ .pipe($.sassLint.format())
+ .pipe($.sassLint.failOnError());
+ });
+
+ function resourcesTask({ cachebust, isProd }) {
+ return gulp
+ .src("../src/css/main.scss", { cwd: __dirname })
+ .pipe($.plumber())
+ .pipe($.sass.sync().on("error", $.sass.logError))
+ .pipe(
+ $.postcss([
+ $.postcssCriticalSplit({
+ blockTag: "@load-async",
+ }),
+ ])
+ )
+ .pipe($.rename("async-resources.css"))
+ .pipe($.postcss(postcssPlugins(isProd, { cachebust })))
+ .pipe(gulp.dest(buildFolder))
+ .pipe(browserSync.stream());
+ }
+
+ // Builds the css resources
+ gulp.task("css.resources.dev", () => {
+ return resourcesTask({ cachebust: false, isProd: false });
+ });
+
+ // Builds the css resources in prod (=minified)
+ gulp.task("css.resources.prod", () => {
+ return resourcesTask({ cachebust: true, isProd: true });
+ });
+
+ // Builds the css resources in prod (=minified), without cachebusting
+ gulp.task("css.resources.prod-standalone", () => {
+ return resourcesTask({ cachebust: false, isProd: true });
+ });
+
+ function mainTask({ cachebust, isProd }) {
+ return gulp
+ .src("../src/css/main.scss", { cwd: __dirname })
+ .pipe($.plumber())
+ .pipe($.sass.sync().on("error", $.sass.logError))
+ .pipe(
+ $.postcss([
+ $.postcssCriticalSplit({
+ blockTag: "@load-async",
+ output: "rest",
+ }),
+ ])
+ )
+ .pipe($.postcss(postcssPlugins(isProd, { cachebust })))
+ .pipe(gulp.dest(buildFolder))
+ .pipe(browserSync.stream());
+ }
+
+ // Builds the css main
+ gulp.task("css.main.dev", () => {
+ return mainTask({ cachebust: false, isProd: false });
+ });
+
+ // Builds the css main in prod (=minified)
+ gulp.task("css.main.prod", () => {
+ return mainTask({ cachebust: true, isProd: true });
+ });
+
+ // Builds the css main in prod (=minified), without cachebusting
+ gulp.task("css.main.prod-standalone", () => {
+ return mainTask({ cachebust: false, isProd: true });
+ });
+
+ gulp.task("css.dev", gulp.parallel("css.main.dev", "css.resources.dev"));
+ gulp.task("css.prod", gulp.parallel("css.main.prod", "css.resources.prod"));
+ gulp.task(
+ "css.prod-standalone",
+ gulp.parallel("css.main.prod-standalone", "css.resources.prod-standalone")
+ );
+}
+
+module.exports = {
+ gulptasksCSS,
+};
diff --git a/gulp/entitlements.plist b/gulp/entitlements.plist
new file mode 100644
index 00000000..8f574f5f
--- /dev/null
+++ b/gulp/entitlements.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.cs.allow-unsigned-executable-memory
+
+ com.apple.security.cs.debugger
+
+
+
diff --git a/gulp/gulpfile.js b/gulp/gulpfile.js
index 0db3f729..7b0416ca 100644
--- a/gulp/gulpfile.js
+++ b/gulp/gulpfile.js
@@ -1,325 +1,335 @@
-/* eslint-disable */
-
-require("colors");
-
-const gulp = require("gulp");
-const browserSync = require("browser-sync").create({});
-const path = require("path");
-const deleteEmpty = require("delete-empty");
-const execSync = require("child_process").execSync;
-
-const lfsOutput = execSync("git lfs install", { encoding: "utf-8" });
-if (!lfsOutput.toLowerCase().includes("git lfs initialized")) {
- console.error(`
- Git LFS is not installed, unable to build.
-
- To install Git LFS on Linux:
- - Arch:
- sudo pacman -S git-lfs
- - Debian/Ubuntu:
- sudo apt install git-lfs
-
- For other systems, see:
- https://github.com/git-lfs/git-lfs/wiki/Installation
- `);
- process.exit(1);
-}
-
-// Load other plugins dynamically
-const $ = require("gulp-load-plugins")({
- scope: ["devDependencies"],
- pattern: "*",
-});
-
-// Check environment variables
-
-const envVars = [
- "SHAPEZ_CLI_SERVER_HOST",
- // "SHAPEZ_CLI_PHONEGAP_KEY",
- "SHAPEZ_CLI_ALPHA_FTP_USER",
- "SHAPEZ_CLI_ALPHA_FTP_PW",
- "SHAPEZ_CLI_STAGING_FTP_USER",
- "SHAPEZ_CLI_STAGING_FTP_PW",
- "SHAPEZ_CLI_LIVE_FTP_USER",
- "SHAPEZ_CLI_LIVE_FTP_PW",
-];
-
-for (let i = 0; i < envVars.length; ++i) {
- if (!process.env[envVars[i]]) {
- console.warn("Please set", envVars[i]);
- // process.exit(1);
- }
-}
-
-const baseDir = path.join(__dirname, "..");
-const buildFolder = path.join(baseDir, "build");
-
-const imgres = require("./image-resources");
-imgres.gulptasksImageResources($, gulp, buildFolder);
-
-const css = require("./css");
-css.gulptasksCSS($, gulp, buildFolder, browserSync);
-
-const sounds = require("./sounds");
-sounds.gulptasksSounds($, gulp, buildFolder);
-
-const js = require("./js");
-js.gulptasksJS($, gulp, buildFolder, browserSync);
-
-const html = require("./html");
-html.gulptasksHTML($, gulp, buildFolder, browserSync);
-
-const ftp = require("./ftp");
-ftp.gulptasksFTP($, gulp, buildFolder);
-
-const docs = require("./docs");
-docs.gulptasksDocs($, gulp, buildFolder);
-
-const standalone = require("./standalone");
-standalone.gulptasksStandalone($, gulp, buildFolder);
-
-const translations = require("./translations");
-translations.gulptasksTranslations($, gulp, buildFolder);
-
-// FIXME
-// const cordova = require("./cordova");
-// cordova.gulptasksCordova($, gulp, buildFolder);
-
-///////////////////// BUILD TASKS /////////////////////
-
-// Cleans up everything
-gulp.task("utils.cleanBuildFolder", () => {
- return gulp.src(buildFolder, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
-});
-gulp.task("utils.cleanBuildTempFolder", () => {
- return gulp
- .src(path.join(__dirname, "..", "src", "js", "built-temp"), { read: false, allowEmpty: true })
- .pipe($.clean({ force: true }));
-});
-
-gulp.task("utils.cleanup", gulp.series("utils.cleanBuildFolder", "utils.cleanBuildTempFolder"));
-
-// Requires no uncomitted files
-gulp.task("utils.requireCleanWorkingTree", cb => {
- let output = $.trim(execSync("git status -su").toString("ascii")).replace(/\r/gi, "").split("\n");
-
- // Filter files which are OK to be untracked
- output = output
- .map(x => x.replace(/[\r\n]+/gi, ""))
- .filter(x => x.indexOf(".local.js") < 0)
- .filter(x => x.length > 0);
- if (output.length > 0) {
- console.error("\n\nYou have unstaged changes, please commit everything first!");
- console.error("Unstaged files:");
- console.error(output.map(x => "'" + x + "'").join("\n"));
- process.exit(1);
- }
- cb();
-});
-
-gulp.task("utils.copyAdditionalBuildFiles", cb => {
- const additionalFolder = path.join("additional_build_files");
- const additionalSrcGlobs = [
- path.join(additionalFolder, "**/*.*"),
- path.join(additionalFolder, "**/.*"),
- path.join(additionalFolder, "**/*"),
- ];
-
- return gulp.src(additionalSrcGlobs).pipe(gulp.dest(buildFolder));
-});
-
-// Starts a webserver on the built directory (useful for testing prod build)
-gulp.task("main.webserver", () => {
- return gulp.src(buildFolder).pipe(
- $.webserver({
- livereload: {
- enable: true,
- },
- directoryListing: false,
- open: true,
- port: 3005,
- })
- );
-});
-
-function serve({ standalone }) {
- browserSync.init({
- server: buildFolder,
- port: 3005,
- ghostMode: {
- clicks: false,
- scroll: false,
- location: false,
- forms: false,
- },
- logLevel: "info",
- logPrefix: "BS",
- online: false,
- xip: false,
- notify: false,
- reloadDebounce: 100,
- reloadOnRestart: true,
- watchEvents: ["add", "change"],
- });
-
- // Watch .scss files, those trigger a css rebuild
- gulp.watch(["../src/**/*.scss"], gulp.series("css.dev"));
-
- // Watch .html files, those trigger a html rebuild
- gulp.watch("../src/**/*.html", gulp.series(standalone ? "html.standalone-dev" : "html.dev"));
-
- // Watch sound files
- // gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], gulp.series("sounds.dev"));
-
- // Watch translations
- gulp.watch("../translations/**/*.yaml", gulp.series("translations.convertToJson"));
-
- gulp.watch(
- ["../res_raw/sounds/sfx/*.mp3", "../res_raw/sounds/sfx/*.wav"],
- gulp.series("sounds.sfx", "sounds.copy")
- );
- gulp.watch(
- ["../res_raw/sounds/music/*.mp3", "../res_raw/sounds/music/*.wav"],
- gulp.series("sounds.music", "sounds.copy")
- );
-
- // Watch resource files and copy them on change
- gulp.watch(imgres.nonImageResourcesGlobs, gulp.series("imgres.copyNonImageResources"));
- gulp.watch(imgres.imageResourcesGlobs, gulp.series("imgres.copyImageResources"));
-
- // Watch .atlas files and recompile the atlas on change
- gulp.watch("../res_built/atlas/*.json", gulp.series("imgres.atlas"));
-
- // Watch the build folder and reload when anything changed
- const extensions = ["html", "js", "png", "gif", "jpg", "svg", "mp3", "ico", "woff2", "json"];
- gulp.watch(extensions.map(ext => path.join(buildFolder, "**", "*." + ext))).on("change", function (path) {
- return gulp.src(path).pipe(browserSync.reload({ stream: true }));
- });
-
- gulp.watch("../src/js/built-temp/*.json").on("change", function (path) {
- return gulp.src(path).pipe(browserSync.reload({ stream: true }));
- });
-
- // Start the webpack watching server (Will never return)
- if (standalone) {
- gulp.series("js.standalone-dev.watch")(() => true);
- } else {
- gulp.series("js.dev.watch")(() => true);
- }
-}
-
-///////////////////// RUNNABLE TASKS /////////////////////
-
-// Pre and postbuild
-gulp.task("step.baseResources", gulp.series("imgres.allOptimized"));
-gulp.task("step.deleteEmpty", cb => {
- deleteEmpty.sync(buildFolder);
- cb();
-});
-
-gulp.task("step.postbuild", gulp.series("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty"));
-
-// Builds everything (dev)
-gulp.task(
- "build.dev",
- gulp.series(
- "utils.cleanup",
- "utils.copyAdditionalBuildFiles",
- "imgres.atlas",
- "sounds.dev",
- "imgres.copyImageResources",
- "imgres.copyNonImageResources",
- "translations.fullBuild",
- "css.dev",
- "html.dev"
- )
-);
-
-// Builds everything (standalone -dev)
-gulp.task(
- "build.standalone.dev",
- gulp.series(
- "utils.cleanup",
- "imgres.atlas",
- "sounds.dev",
- "imgres.copyImageResources",
- "imgres.copyNonImageResources",
- "translations.fullBuild",
- "js.standalone-dev",
- "css.dev",
- "html.standalone-dev"
- )
-);
-
-// Builds everything (staging)
-gulp.task("step.staging.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.staging"));
-gulp.task(
- "step.staging.mainbuild",
- gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code")
-);
-gulp.task("step.staging.all", gulp.series("step.staging.mainbuild", "css.prod", "html.staging"));
-gulp.task("build.staging", gulp.series("utils.cleanup", "step.staging.all", "step.postbuild"));
-
-// Builds everything (prod)
-gulp.task("step.prod.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.prod"));
-gulp.task(
- "step.prod.mainbuild",
- gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code")
-);
-gulp.task("step.prod.all", gulp.series("step.prod.mainbuild", "css.prod", "html.prod"));
-gulp.task("build.prod", gulp.series("utils.cleanup", "step.prod.all", "step.postbuild"));
-
-// Builds everything (standalone-beta)
-gulp.task(
- "step.standalone-beta.code",
- gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-beta")
-);
-gulp.task("step.standalone-beta.mainbuild", gulp.parallel("step.baseResources", "step.standalone-beta.code"));
-gulp.task(
- "step.standalone-beta.all",
- gulp.series("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta")
-);
-gulp.task(
- "build.standalone-beta",
- gulp.series("utils.cleanup", "step.standalone-beta.all", "step.postbuild")
-);
-
-// Builds everything (standalone-prod)
-gulp.task(
- "step.standalone-prod.code",
- gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-prod")
-);
-gulp.task("step.standalone-prod.mainbuild", gulp.parallel("step.baseResources", "step.standalone-prod.code"));
-gulp.task(
- "step.standalone-prod.all",
- gulp.series("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
-);
-gulp.task(
- "build.standalone-prod",
- gulp.series("utils.cleanup", "step.standalone-prod.all", "step.postbuild")
-);
-
-// Deploying!
-gulp.task(
- "main.deploy.alpha",
- gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.alpha")
-);
-gulp.task(
- "main.deploy.staging",
- gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging")
-);
-gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod"));
-gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod"));
-gulp.task("main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
-
-// Live-development
-gulp.task(
- "main.serveDev",
- gulp.series("build.dev", () => serve({ standalone: false }))
-);
-gulp.task(
- "main.serveStandalone",
- gulp.series("build.standalone.dev", () => serve({ standalone: true }))
-);
-
-gulp.task("default", gulp.series("main.serveDev"));
+/* eslint-disable */
+
+require("colors");
+
+const gulp = require("gulp");
+const browserSync = require("browser-sync").create({});
+const path = require("path");
+const deleteEmpty = require("delete-empty");
+const execSync = require("child_process").execSync;
+
+// Load other plugins dynamically
+const $ = require("gulp-load-plugins")({
+ scope: ["devDependencies"],
+ pattern: "*",
+});
+
+// Check environment variables
+
+const envVars = [
+ "SHAPEZ_CLI_SERVER_HOST",
+ // "SHAPEZ_CLI_PHONEGAP_KEY",
+ "SHAPEZ_CLI_ALPHA_FTP_USER",
+ "SHAPEZ_CLI_ALPHA_FTP_PW",
+ "SHAPEZ_CLI_STAGING_FTP_USER",
+ "SHAPEZ_CLI_STAGING_FTP_PW",
+ "SHAPEZ_CLI_LIVE_FTP_USER",
+ "SHAPEZ_CLI_LIVE_FTP_PW",
+ "SHAPEZ_CLI_APPLE_ID",
+ "SHAPEZ_CLI_APPLE_CERT_NAME",
+ "SHAPEZ_CLI_GITHUB_USER",
+ "SHAPEZ_CLI_GITHUB_TOKEN",
+];
+
+for (let i = 0; i < envVars.length; ++i) {
+ if (!process.env[envVars[i]]) {
+ console.warn("Please set", envVars[i]);
+ // process.exit(1);
+ }
+}
+
+const baseDir = path.join(__dirname, "..");
+const buildFolder = path.join(baseDir, "build");
+
+const imgres = require("./image-resources");
+imgres.gulptasksImageResources($, gulp, buildFolder);
+
+const css = require("./css");
+css.gulptasksCSS($, gulp, buildFolder, browserSync);
+
+const sounds = require("./sounds");
+sounds.gulptasksSounds($, gulp, buildFolder);
+
+const js = require("./js");
+js.gulptasksJS($, gulp, buildFolder, browserSync);
+
+const html = require("./html");
+html.gulptasksHTML($, gulp, buildFolder, browserSync);
+
+const ftp = require("./ftp");
+ftp.gulptasksFTP($, gulp, buildFolder);
+
+const docs = require("./docs");
+docs.gulptasksDocs($, gulp, buildFolder);
+
+const standalone = require("./standalone");
+standalone.gulptasksStandalone($, gulp, buildFolder);
+
+const releaseUploader = require("./release-uploader");
+releaseUploader.gulptasksReleaseUploader($, gulp, buildFolder);
+
+const translations = require("./translations");
+translations.gulptasksTranslations($, gulp, buildFolder);
+
+///////////////////// BUILD TASKS /////////////////////
+
+// Cleans up everything
+gulp.task("utils.cleanBuildFolder", () => {
+ return gulp.src(buildFolder, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
+});
+gulp.task("utils.cleanBuildTempFolder", () => {
+ return gulp
+ .src(path.join(__dirname, "..", "src", "js", "built-temp"), { read: false, allowEmpty: true })
+ .pipe($.clean({ force: true }));
+});
+gulp.task("utils.cleanImageBuildFolder", () => {
+ return gulp
+ .src(path.join(__dirname, "res_built"), { read: false, allowEmpty: true })
+ .pipe($.clean({ force: true }));
+});
+
+gulp.task(
+ "utils.cleanup",
+ gulp.series("utils.cleanBuildFolder", "utils.cleanImageBuildFolder", "utils.cleanBuildTempFolder")
+);
+
+// Requires no uncomitted files
+gulp.task("utils.requireCleanWorkingTree", cb => {
+ let output = $.trim(execSync("git status -su").toString("ascii")).replace(/\r/gi, "").split("\n");
+
+ // Filter files which are OK to be untracked
+ output = output
+ .map(x => x.replace(/[\r\n]+/gi, ""))
+ .filter(x => x.indexOf(".local.js") < 0)
+ .filter(x => x.length > 0);
+ if (output.length > 0) {
+ console.error("\n\nYou have unstaged changes, please commit everything first!");
+ console.error("Unstaged files:");
+ console.error(output.map(x => "'" + x + "'").join("\n"));
+ process.exit(1);
+ }
+ cb();
+});
+
+gulp.task("utils.copyAdditionalBuildFiles", cb => {
+ const additionalFolder = path.join("additional_build_files");
+ const additionalSrcGlobs = [
+ path.join(additionalFolder, "**/*.*"),
+ path.join(additionalFolder, "**/.*"),
+ path.join(additionalFolder, "**/*"),
+ ];
+
+ return gulp.src(additionalSrcGlobs).pipe(gulp.dest(buildFolder));
+});
+
+// Starts a webserver on the built directory (useful for testing prod build)
+gulp.task("main.webserver", () => {
+ return gulp.src(buildFolder).pipe(
+ $.webserver({
+ livereload: {
+ enable: true,
+ },
+ directoryListing: false,
+ open: true,
+ port: 3005,
+ })
+ );
+});
+
+function serve({ standalone }) {
+ browserSync.init({
+ server: buildFolder,
+ port: 3005,
+ ghostMode: {
+ clicks: false,
+ scroll: false,
+ location: false,
+ forms: false,
+ },
+ logLevel: "info",
+ logPrefix: "BS",
+ online: false,
+ xip: false,
+ notify: false,
+ reloadDebounce: 100,
+ reloadOnRestart: true,
+ watchEvents: ["add", "change"],
+ });
+
+ // Watch .scss files, those trigger a css rebuild
+ gulp.watch(["../src/**/*.scss"], gulp.series("css.dev"));
+
+ // Watch .html files, those trigger a html rebuild
+ gulp.watch("../src/**/*.html", gulp.series(standalone ? "html.standalone-dev" : "html.dev"));
+
+ // Watch sound files
+ // gulp.watch(["../res_raw/sounds/**/*.mp3", "../res_raw/sounds/**/*.wav"], gulp.series("sounds.dev"));
+
+ // Watch translations
+ gulp.watch("../translations/**/*.yaml", gulp.series("translations.convertToJson"));
+
+ gulp.watch(
+ ["../res_raw/sounds/sfx/*.mp3", "../res_raw/sounds/sfx/*.wav"],
+ gulp.series("sounds.sfx", "sounds.copy")
+ );
+ gulp.watch(
+ ["../res_raw/sounds/music/*.mp3", "../res_raw/sounds/music/*.wav"],
+ gulp.series("sounds.music", "sounds.copy")
+ );
+
+ // Watch resource files and copy them on change
+ gulp.watch(imgres.rawImageResourcesGlobs, gulp.series("imgres.buildAtlas"));
+ gulp.watch(imgres.nonImageResourcesGlobs, gulp.series("imgres.copyNonImageResources"));
+ gulp.watch(imgres.imageResourcesGlobs, gulp.series("imgres.copyImageResources"));
+
+ // Watch .atlas files and recompile the atlas on change
+ gulp.watch("../res_built/atlas/*.atlas", gulp.series("imgres.atlasToJson"));
+ gulp.watch("../res_built/atlas/*.json", gulp.series("imgres.atlas"));
+
+ // Watch the build folder and reload when anything changed
+ const extensions = ["html", "js", "png", "gif", "jpg", "svg", "mp3", "ico", "woff2", "json"];
+ gulp.watch(extensions.map(ext => path.join(buildFolder, "**", "*." + ext))).on("change", function (path) {
+ return gulp.src(path).pipe(browserSync.reload({ stream: true }));
+ });
+
+ gulp.watch("../src/js/built-temp/*.json").on("change", function (path) {
+ return gulp.src(path).pipe(browserSync.reload({ stream: true }));
+ });
+
+ // Start the webpack watching server (Will never return)
+ if (standalone) {
+ gulp.series("js.standalone-dev.watch")(() => true);
+ } else {
+ gulp.series("js.dev.watch")(() => true);
+ }
+}
+
+///////////////////// RUNNABLE TASKS /////////////////////
+
+// Pre and postbuild
+gulp.task("step.baseResources", gulp.series("imgres.allOptimized"));
+gulp.task("step.deleteEmpty", cb => {
+ deleteEmpty.sync(buildFolder);
+ cb();
+});
+
+gulp.task("step.postbuild", gulp.series("imgres.cleanupUnusedCssInlineImages", "step.deleteEmpty"));
+
+// Builds everything (dev)
+gulp.task(
+ "build.dev",
+ gulp.series(
+ "utils.cleanup",
+ "utils.copyAdditionalBuildFiles",
+ "imgres.buildAtlas",
+ "imgres.atlasToJson",
+ "imgres.atlas",
+ "sounds.dev",
+ "imgres.copyImageResources",
+ "imgres.copyNonImageResources",
+ "translations.fullBuild",
+ "css.dev",
+ "html.dev"
+ )
+);
+
+// Builds everything (standalone -dev)
+gulp.task(
+ "build.standalone.dev",
+ gulp.series(
+ "utils.cleanup",
+ "imgres.buildAtlas",
+ "imgres.atlasToJson",
+ "imgres.atlas",
+ "sounds.dev",
+ "imgres.copyImageResources",
+ "imgres.copyNonImageResources",
+ "translations.fullBuild",
+ "css.dev",
+ "html.standalone-dev"
+ )
+);
+
+// Builds everything (staging)
+gulp.task("step.staging.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.staging"));
+gulp.task(
+ "step.staging.mainbuild",
+ gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.staging.code")
+);
+gulp.task("step.staging.all", gulp.series("step.staging.mainbuild", "css.prod", "html.staging"));
+gulp.task("build.staging", gulp.series("utils.cleanup", "step.staging.all", "step.postbuild"));
+
+// Builds everything (prod)
+gulp.task("step.prod.code", gulp.series("sounds.fullbuild", "translations.fullBuild", "js.prod"));
+gulp.task(
+ "step.prod.mainbuild",
+ gulp.parallel("utils.copyAdditionalBuildFiles", "step.baseResources", "step.prod.code")
+);
+gulp.task("step.prod.all", gulp.series("step.prod.mainbuild", "css.prod", "html.prod"));
+gulp.task("build.prod", gulp.series("utils.cleanup", "step.prod.all", "step.postbuild"));
+
+// Builds everything (standalone-beta)
+gulp.task(
+ "step.standalone-beta.code",
+ gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-beta")
+);
+gulp.task("step.standalone-beta.mainbuild", gulp.parallel("step.baseResources", "step.standalone-beta.code"));
+gulp.task(
+ "step.standalone-beta.all",
+ gulp.series("step.standalone-beta.mainbuild", "css.prod-standalone", "html.standalone-beta")
+);
+gulp.task(
+ "build.standalone-beta",
+ gulp.series("utils.cleanup", "step.standalone-beta.all", "step.postbuild")
+);
+
+// Builds everything (standalone-prod)
+gulp.task(
+ "step.standalone-prod.code",
+ gulp.series("sounds.fullbuildHQ", "translations.fullBuild", "js.standalone-prod")
+);
+gulp.task("step.standalone-prod.mainbuild", gulp.parallel("step.baseResources", "step.standalone-prod.code"));
+gulp.task(
+ "step.standalone-prod.all",
+ gulp.series("step.standalone-prod.mainbuild", "css.prod-standalone", "html.standalone-prod")
+);
+gulp.task(
+ "build.standalone-prod",
+ gulp.series("utils.cleanup", "step.standalone-prod.all", "step.postbuild")
+);
+
+// OS X build and release upload
+gulp.task(
+ "build.darwin64-prod",
+ gulp.series(
+ "build.standalone-prod",
+ "standalone.prepare",
+ "standalone.package.prod.darwin64",
+ "standalone.uploadRelease.darwin64"
+ )
+);
+
+// Deploying!
+gulp.task(
+ "main.deploy.alpha",
+ gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.alpha")
+);
+gulp.task(
+ "main.deploy.staging",
+ gulp.series("utils.requireCleanWorkingTree", "build.staging", "ftp.upload.staging")
+);
+gulp.task("main.deploy.prod", gulp.series("utils.requireCleanWorkingTree", "build.prod", "ftp.upload.prod"));
+gulp.task("main.deploy.all", gulp.series("main.deploy.staging", "main.deploy.prod"));
+gulp.task("main.standalone", gulp.series("build.standalone-prod", "standalone.package.prod"));
+
+// Live-development
+gulp.task(
+ "main.serveDev",
+ gulp.series("build.dev", () => serve({ standalone: false }))
+);
+gulp.task(
+ "main.serveStandalone",
+ gulp.series("build.standalone.dev", () => serve({ standalone: true }))
+);
+
+gulp.task("default", gulp.series("main.serveDev"));
diff --git a/gulp/html.js b/gulp/html.js
index b49fc1b2..0ba58a15 100644
--- a/gulp/html.js
+++ b/gulp/html.js
@@ -1,283 +1,301 @@
-const buildUtils = require("./buildutils");
-const fs = require("fs");
-const path = require("path");
-const crypto = require("crypto");
-
-function computeIntegrityHash(fullPath, algorithm = "sha256") {
- const file = fs.readFileSync(fullPath);
- const hash = crypto.createHash(algorithm).update(file).digest("base64");
- return algorithm + "-" + hash;
-}
-
-function gulptasksHTML($, gulp, buildFolder) {
- const commitHash = buildUtils.getRevision();
- async function buildHtml(
- apiUrl,
- { analytics = false, standalone = false, app = false, integrity = true, enableCachebust = true }
- ) {
- function cachebust(url) {
- if (enableCachebust) {
- return buildUtils.cachebust(url, commitHash);
- }
- return url;
- }
-
- const hasLocalFiles = standalone || app;
-
- return gulp
- .src("../src/html/" + (standalone ? "index.standalone.html" : "index.html"))
- .pipe(
- $.dom(/** @this {Document} **/ function () {
- const document = this;
-
- // Preconnect to api
- const prefetchLink = document.createElement("link");
- prefetchLink.rel = "preconnect";
- prefetchLink.href = apiUrl;
- prefetchLink.setAttribute("crossorigin", "anonymous");
- document.head.appendChild(prefetchLink);
-
- // Append css
- const css = document.createElement("link");
- css.rel = "stylesheet";
- css.type = "text/css";
- css.media = "none";
- css.setAttribute("onload", "this.media='all'");
- css.href = cachebust("main.css");
- if (integrity) {
- css.setAttribute(
- "integrity",
- computeIntegrityHash(path.join(buildFolder, "main.css"))
- );
- }
- document.head.appendChild(css);
-
- if (app) {
- // Append cordova link
- const cdv = document.createElement("script");
- cdv.src = "cordova.js";
- cdv.type = "text/javascript";
- document.head.appendChild(cdv);
- }
-
- // Google analytics
- if (analytics) {
- const tagManagerScript = document.createElement("script");
- tagManagerScript.src = "https://www.googletagmanager.com/gtag/js?id=UA-165342524-1";
- tagManagerScript.setAttribute("async", "");
- document.head.appendChild(tagManagerScript);
-
- const initScript = document.createElement("script");
- initScript.textContent = `
- window.dataLayer = window.dataLayer || [];
- function gtag(){dataLayer.push(arguments);}
- gtag('js', new Date());
- gtag('config', 'UA-165342524-1', { anonymize_ip: true });
- `;
- document.head.appendChild(initScript);
-
- const abTestingScript = document.createElement("script");
- abTestingScript.setAttribute(
- "src",
- "https://www.googleoptimize.com/optimize.js?id=OPT-M5NHCV7"
- );
- abTestingScript.setAttribute("async", "");
- document.head.appendChild(abTestingScript);
- }
-
- // Do not need to preload in app or standalone
- if (!hasLocalFiles) {
- // Preload essentials
- const preloads = ["fonts/GameFont.woff2"];
-
- preloads.forEach(src => {
- const preloadLink = document.createElement("link");
- preloadLink.rel = "preload";
- preloadLink.href = cachebust("res/" + src);
- if (src.endsWith(".woff2")) {
- preloadLink.setAttribute("crossorigin", "anonymous");
- preloadLink.setAttribute("as", "font");
- } else {
- preloadLink.setAttribute("as", "image");
- }
- document.head.appendChild(preloadLink);
- });
- }
-
- const loadingSvg = `background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIgZGlzcGxheT0iYmxvY2siPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzM5Mzc0NyIgc3Ryb2tlLXdpZHRoPSIzIiByPSI0MiIgc3Ryb2tlLWRhc2hhcnJheT0iMTk3LjkyMDMzNzE3NjE1Njk4IDY3Ljk3MzQ0NTcyNTM4NTY2IiB0cmFuc2Zvcm09InJvdGF0ZSg0OC4yNjUgNTAgNTApIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGR1cj0iNS41NTU1NTU1NTU1NTU1NTVzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+")`;
-
- const loadingCss = `
- @font-face {
- font-family: 'GameFont';
- font-style: normal;
- font-weight: normal;
- font-display: swap;
- src: url('${cachebust("res/fonts/GameFont.woff2")}') format('woff2');
- }
-
- #ll_fp {
- font-family: GameFont;
- font-size: 14px;
- position: fixed;
- z-index: -1;
- top: 0;
- left: 0;
- opacity: 0.05;
- }
-
- #ll_p {
- display: flex;
- position: fixed;
- z-index: 99999;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- justify-content:
- center;
- align-items: center;
- }
-
- #ll_p > div {
- position: absolute;
- text-align: center;
- bottom: 40px;
- left: 20px;
- right: 20px;
- color: #393747;
- font-family: 'GameFont', sans-serif;
- font-size: 20px;
- }
-
- #ll_p > span {
- width: 60px;
- height: 60px;
- display: inline-flex;
- background: center center / contain no-repeat;
- ${loadingSvg};
- }
- `;
-
- const style = document.createElement("style");
- style.setAttribute("type", "text/css");
- style.textContent = loadingCss;
- document.head.appendChild(style);
-
- // Append loader, but not in standalone (directly include bundle there)
- if (standalone) {
- const bundleScript = document.createElement("script");
- bundleScript.type = "text/javascript";
- bundleScript.src = "bundle.js";
- if (integrity) {
- bundleScript.setAttribute(
- "integrity",
- computeIntegrityHash(path.join(buildFolder, "bundle.js"))
- );
- }
- document.head.appendChild(bundleScript);
- } else {
- const loadJs = document.createElement("script");
- loadJs.type = "text/javascript";
- let scriptContent = "";
- scriptContent += `var bundleSrc = '${cachebust("bundle.js")}';\n`;
- scriptContent += `var bundleSrcTranspiled = '${cachebust(
- "bundle-transpiled.js"
- )}';\n`;
-
- if (integrity) {
- scriptContent +=
- "var bundleIntegrity = '" +
- computeIntegrityHash(path.join(buildFolder, "bundle.js")) +
- "';\n";
- scriptContent +=
- "var bundleIntegrityTranspiled = '" +
- computeIntegrityHash(path.join(buildFolder, "bundle-transpiled.js")) +
- "';\n";
- } else {
- scriptContent += "var bundleIntegrity = null;\n";
- scriptContent += "var bundleIntegrityTranspiled = null;\n";
- }
-
- scriptContent += fs.readFileSync("./bundle-loader.js").toString();
- loadJs.textContent = scriptContent;
- document.head.appendChild(loadJs);
- }
-
- const bodyContent = `
-
_
-
-
-
${hasLocalFiles ? "Loading" : "Downloading"} Game Files
-
- `;
-
- document.body.innerHTML = bodyContent;
- })
- )
- .pipe(
- $.htmlmin({
- caseSensitive: true,
- collapseBooleanAttributes: true,
- collapseInlineTagWhitespace: true,
- collapseWhitespace: true,
- preserveLineBreaks: true,
- minifyJS: true,
- minifyCSS: true,
- quoteCharacter: '"',
- useShortDoctype: true,
- })
- )
- .pipe($.htmlBeautify())
- .pipe($.rename("index.html"))
- .pipe(gulp.dest(buildFolder));
- }
-
- gulp.task("html.dev", () => {
- return buildHtml("http://localhost:5005", {
- analytics: false,
- integrity: false,
- enableCachebust: false,
- });
- });
-
- gulp.task("html.staging", () => {
- return buildHtml("https://api-staging.shapez.io", {
- analytics: true,
- });
- });
-
- gulp.task("html.prod", () => {
- return buildHtml("https://analytics.shapez.io", {
- analytics: true,
- });
- });
-
- gulp.task("html.standalone-dev", () => {
- return buildHtml("https://localhost:5005", {
- analytics: false,
- standalone: true,
- integrity: false,
- enableCachebust: false,
- });
- });
-
- gulp.task("html.standalone-beta", () => {
- return buildHtml("https://api-staging.shapez.io", {
- analytics: false,
- standalone: true,
- enableCachebust: false,
- });
- });
-
- gulp.task("html.standalone-prod", () => {
- return buildHtml("https://analytics.shapez.io", {
- analytics: false,
- standalone: true,
- enableCachebust: false,
- });
- });
-}
-
-module.exports = {
- gulptasksHTML,
-};
+const buildUtils = require("./buildutils");
+const fs = require("fs");
+const path = require("path");
+const crypto = require("crypto");
+
+function computeIntegrityHash(fullPath, algorithm = "sha256") {
+ const file = fs.readFileSync(fullPath);
+ const hash = crypto.createHash(algorithm).update(file).digest("base64");
+ return algorithm + "-" + hash;
+}
+
+function gulptasksHTML($, gulp, buildFolder) {
+ const commitHash = buildUtils.getRevision();
+ async function buildHtml(
+ apiUrl,
+ { analytics = false, standalone = false, app = false, integrity = true, enableCachebust = true }
+ ) {
+ function cachebust(url) {
+ if (enableCachebust) {
+ return buildUtils.cachebust(url, commitHash);
+ }
+ return url;
+ }
+
+ const hasLocalFiles = standalone || app;
+
+ return gulp
+ .src("../src/html/" + (standalone ? "index.standalone.html" : "index.html"))
+ .pipe(
+ $.dom(
+ /** @this {Document} **/ function () {
+ const document = this;
+
+ // Preconnect to api
+ const prefetchLink = document.createElement("link");
+ prefetchLink.rel = "preconnect";
+ prefetchLink.href = apiUrl;
+ prefetchLink.setAttribute("crossorigin", "anonymous");
+ document.head.appendChild(prefetchLink);
+
+ // Append css
+ const css = document.createElement("link");
+ css.rel = "stylesheet";
+ css.type = "text/css";
+ css.media = "none";
+ css.setAttribute("onload", "this.media='all'");
+ css.href = cachebust("main.css");
+ if (integrity) {
+ css.setAttribute(
+ "integrity",
+ computeIntegrityHash(path.join(buildFolder, "main.css"))
+ );
+ }
+ document.head.appendChild(css);
+
+ // Append async css
+ // const asyncCss = document.createElement("link");
+ // asyncCss.rel = "stylesheet";
+ // asyncCss.type = "text/css";
+ // asyncCss.media = "none";
+ // asyncCss.setAttribute("onload", "this.media='all'");
+ // asyncCss.href = cachebust("async-resources.css");
+ // if (integrity) {
+ // asyncCss.setAttribute(
+ // "integrity",
+ // computeIntegrityHash(path.join(buildFolder, "async-resources.css"))
+ // );
+ // }
+ // document.head.appendChild(asyncCss);
+
+ if (app) {
+ // Append cordova link
+ const cdv = document.createElement("script");
+ cdv.src = "cordova.js";
+ cdv.type = "text/javascript";
+ document.head.appendChild(cdv);
+ }
+
+ // Google analytics
+ if (analytics) {
+ const tagManagerScript = document.createElement("script");
+ tagManagerScript.src =
+ "https://www.googletagmanager.com/gtag/js?id=UA-165342524-1";
+ tagManagerScript.setAttribute("async", "");
+ document.head.appendChild(tagManagerScript);
+
+ const initScript = document.createElement("script");
+ initScript.textContent = `
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+ gtag('config', 'UA-165342524-1', { anonymize_ip: true });
+ `;
+ document.head.appendChild(initScript);
+
+ const abTestingScript = document.createElement("script");
+ abTestingScript.setAttribute(
+ "src",
+ "https://www.googleoptimize.com/optimize.js?id=OPT-M5NHCV7"
+ );
+ abTestingScript.setAttribute("async", "");
+ document.head.appendChild(abTestingScript);
+ }
+
+ // Do not need to preload in app or standalone
+ if (!hasLocalFiles) {
+ // Preload essentials
+ const preloads = ["fonts/GameFont.woff2"];
+
+ preloads.forEach(src => {
+ const preloadLink = document.createElement("link");
+ preloadLink.rel = "preload";
+ preloadLink.href = cachebust("res/" + src);
+ if (src.endsWith(".woff2")) {
+ preloadLink.setAttribute("crossorigin", "anonymous");
+ preloadLink.setAttribute("as", "font");
+ } else {
+ preloadLink.setAttribute("as", "image");
+ }
+ document.head.appendChild(preloadLink);
+ });
+ }
+
+ const loadingSvg = `background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIgZGlzcGxheT0iYmxvY2siPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzM5Mzc0NyIgc3Ryb2tlLXdpZHRoPSIzIiByPSI0MiIgc3Ryb2tlLWRhc2hhcnJheT0iMTk3LjkyMDMzNzE3NjE1Njk4IDY3Ljk3MzQ0NTcyNTM4NTY2IiB0cmFuc2Zvcm09InJvdGF0ZSg0OC4yNjUgNTAgNTApIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGR1cj0iNS41NTU1NTU1NTU1NTU1NTVzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+")`;
+
+ const loadingCss = `
+ @font-face {
+ font-family: 'GameFont';
+ font-style: normal;
+ font-weight: normal;
+ font-display: swap;
+ src: url('${cachebust("res/fonts/GameFont.woff2")}') format('woff2');
+ }
+
+ #ll_fp {
+ font-family: GameFont;
+ font-size: 14px;
+ position: fixed;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ opacity: 0.05;
+ }
+
+ #ll_p {
+ display: flex;
+ position: fixed;
+ z-index: 99999;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ justify-content:
+ center;
+ align-items: center;
+ }
+
+ #ll_p > div {
+ position: absolute;
+ text-align: center;
+ bottom: 40px;
+ left: 20px;
+ right: 20px;
+ color: #393747;
+ font-family: 'GameFont', sans-serif;
+ font-size: 20px;
+ }
+
+ #ll_p > span {
+ width: 60px;
+ height: 60px;
+ display: inline-flex;
+ background: center center / contain no-repeat;
+ ${loadingSvg};
+ }
+ `;
+
+ const style = document.createElement("style");
+ style.setAttribute("type", "text/css");
+ style.textContent = loadingCss;
+ document.head.appendChild(style);
+
+ // Append loader, but not in standalone (directly include bundle there)
+ if (standalone) {
+ const bundleScript = document.createElement("script");
+ bundleScript.type = "text/javascript";
+ bundleScript.src = "bundle.js";
+ if (integrity) {
+ bundleScript.setAttribute(
+ "integrity",
+ computeIntegrityHash(path.join(buildFolder, "bundle.js"))
+ );
+ }
+ document.head.appendChild(bundleScript);
+ } else {
+ const loadJs = document.createElement("script");
+ loadJs.type = "text/javascript";
+ let scriptContent = "";
+ scriptContent += `var bundleSrc = '${cachebust("bundle.js")}';\n`;
+ scriptContent += `var bundleSrcTranspiled = '${cachebust(
+ "bundle-transpiled.js"
+ )}';\n`;
+
+ if (integrity) {
+ scriptContent +=
+ "var bundleIntegrity = '" +
+ computeIntegrityHash(path.join(buildFolder, "bundle.js")) +
+ "';\n";
+ scriptContent +=
+ "var bundleIntegrityTranspiled = '" +
+ computeIntegrityHash(path.join(buildFolder, "bundle-transpiled.js")) +
+ "';\n";
+ } else {
+ scriptContent += "var bundleIntegrity = null;\n";
+ scriptContent += "var bundleIntegrityTranspiled = null;\n";
+ }
+
+ scriptContent += fs.readFileSync("./bundle-loader.js").toString();
+ loadJs.textContent = scriptContent;
+ document.head.appendChild(loadJs);
+ }
+
+ const bodyContent = `
+ _
+
+
+
${hasLocalFiles ? "Loading" : "Downloading"} Game Files
+
+ `;
+
+ document.body.innerHTML = bodyContent;
+ }
+ )
+ )
+ .pipe(
+ $.htmlmin({
+ caseSensitive: true,
+ collapseBooleanAttributes: true,
+ collapseInlineTagWhitespace: true,
+ collapseWhitespace: true,
+ preserveLineBreaks: true,
+ minifyJS: true,
+ minifyCSS: true,
+ quoteCharacter: '"',
+ useShortDoctype: true,
+ })
+ )
+ .pipe($.htmlBeautify())
+ .pipe($.rename("index.html"))
+ .pipe(gulp.dest(buildFolder));
+ }
+
+ gulp.task("html.dev", () => {
+ return buildHtml("http://localhost:5005", {
+ analytics: false,
+ integrity: false,
+ enableCachebust: false,
+ });
+ });
+
+ gulp.task("html.staging", () => {
+ return buildHtml("https://api-staging.shapez.io", {
+ analytics: true,
+ });
+ });
+
+ gulp.task("html.prod", () => {
+ return buildHtml("https://analytics.shapez.io", {
+ analytics: true,
+ });
+ });
+
+ gulp.task("html.standalone-dev", () => {
+ return buildHtml("https://localhost:5005", {
+ analytics: false,
+ standalone: true,
+ integrity: false,
+ enableCachebust: false,
+ });
+ });
+
+ gulp.task("html.standalone-beta", () => {
+ return buildHtml("https://api-staging.shapez.io", {
+ analytics: false,
+ standalone: true,
+ enableCachebust: false,
+ });
+ });
+
+ gulp.task("html.standalone-prod", () => {
+ return buildHtml("https://analytics.shapez.io", {
+ analytics: false,
+ standalone: true,
+ enableCachebust: false,
+ });
+ });
+}
+
+module.exports = {
+ gulptasksHTML,
+};
diff --git a/gulp/image-resources.js b/gulp/image-resources.js
index 2d0d5fb1..33df234d 100644
--- a/gulp/image-resources.js
+++ b/gulp/image-resources.js
@@ -1,148 +1,205 @@
-// @ts-ignore
-const path = require("path");
-
-// Globs for non-ui resources
-const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/*.webm"];
-
-// Globs for ui resources
-const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg", "../res/**/*.gif"];
-
-function gulptasksImageResources($, gulp, buildFolder) {
- // Lossless options
- const minifyImagesOptsLossless = () => [
- $.imageminJpegtran({
- progressive: true,
- }),
- $.imagemin.svgo({}),
- $.imagemin.optipng({
- optimizationLevel: 3,
- }),
- $.imageminGifsicle({
- optimizationLevel: 3,
- colors: 128,
- }),
- ];
-
- // Lossy options
- const minifyImagesOpts = () => [
- $.imagemin.mozjpeg({
- quality: 80,
- maxMemory: 1024 * 1024 * 8,
- }),
- $.imagemin.svgo({}),
- $.imageminPngquant({
- speed: 1,
- strip: true,
- quality: [0.65, 0.9],
- dithering: false,
- verbose: false,
- }),
- $.imagemin.optipng({
- optimizationLevel: 3,
- }),
- $.imageminGifsicle({
- optimizationLevel: 3,
- colors: 128,
- }),
- ];
-
- // Where the resources folder are
- const resourcesDestFolder = path.join(buildFolder, "res");
-
- /**
- * Determines if an atlas must use lossless compression
- * @param {string} fname
- */
- function fileMustBeLossless(fname) {
- return fname.indexOf("lossless") >= 0;
- }
-
- /////////////// ATLAS /////////////////////
-
- // Copies the atlas to the final destination
- gulp.task("imgres.atlas", () => {
- return gulp
- .src(["../res_built/atlas/*.png"])
- .pipe($.cached("imgres.atlas"))
- .pipe(gulp.dest(resourcesDestFolder));
- });
-
- // Copies the atlas to the final destination after optimizing it (lossy compression)
- gulp.task("imgres.atlasOptimized", () => {
- return gulp
- .src(["../res_built/atlas/*.png"])
- .pipe($.cached("imgres.atlasOptimized"))
- .pipe(
- $.if(
- fname => fileMustBeLossless(fname.history[0]),
- $.imagemin(minifyImagesOptsLossless()),
- $.imagemin(minifyImagesOpts())
- )
- )
- .pipe(gulp.dest(resourcesDestFolder));
- });
-
- //////////////////// RESOURCES //////////////////////
-
- // Copies all resources which are no ui resources
- gulp.task("imgres.copyNonImageResources", () => {
- return gulp
- .src(nonImageResourcesGlobs)
- .pipe($.cached("imgres.copyNonImageResources"))
- .pipe(gulp.dest(resourcesDestFolder));
- });
-
- // Copies all ui resources
- gulp.task("imgres.copyImageResources", () => {
- return gulp
- .src(imageResourcesGlobs)
- .pipe($.cached("copyImageResources"))
- .pipe(gulp.dest(path.join(resourcesDestFolder)));
- });
-
- // Copies all ui resources and optimizes them
- gulp.task("imgres.copyImageResourcesOptimized", () => {
- return gulp
- .src(imageResourcesGlobs)
- .pipe($.cached("imgres.copyImageResourcesOptimized"))
- .pipe(
- $.if(
- fname => fileMustBeLossless(fname.history[0]),
- $.imagemin(minifyImagesOptsLossless()),
- $.imagemin(minifyImagesOpts())
- )
- )
- .pipe(gulp.dest(path.join(resourcesDestFolder)));
- });
-
- // Copies all resources and optimizes them
- gulp.task(
- "imgres.allOptimized",
- gulp.parallel(
- "imgres.atlasOptimized",
- "imgres.copyNonImageResources",
- "imgres.copyImageResourcesOptimized"
- )
- );
-
- // Cleans up unused images which are instead inline into the css
- gulp.task("imgres.cleanupUnusedCssInlineImages", () => {
- return gulp
- .src(
- [
- path.join(buildFolder, "res", "ui", "**", "*.png"),
- path.join(buildFolder, "res", "ui", "**", "*.jpg"),
- path.join(buildFolder, "res", "ui", "**", "*.svg"),
- path.join(buildFolder, "res", "ui", "**", "*.gif"),
- ],
- { read: false }
- )
- .pipe($.if(fname => fname.history[0].indexOf("noinline") < 0, $.clean({ force: true })));
- });
-}
-
-module.exports = {
- nonImageResourcesGlobs,
- imageResourcesGlobs,
- gulptasksImageResources,
-};
+const { existsSync } = require("fs");
+// @ts-ignore
+const path = require("path");
+const atlasToJson = require("./atlas2json");
+
+const execute = command =>
+ require("child_process").execSync(command, {
+ encoding: "utf-8",
+ });
+
+// Globs for atlas resources
+const rawImageResourcesGlobs = ["../res_raw/atlas.json", "../res_raw/**/*.png"];
+
+// Globs for non-ui resources
+const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/*.webm"];
+
+// Globs for ui resources
+const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg", "../res/**/*.gif"];
+
+// Link to download LibGDX runnable-texturepacker.jar
+const runnableTPSource = "https://libgdx.badlogicgames.com/ci/nightlies/runnables/runnable-texturepacker.jar";
+
+function gulptasksImageResources($, gulp, buildFolder) {
+ // Lossless options
+ const minifyImagesOptsLossless = () => [
+ $.imageminJpegtran({
+ progressive: true,
+ }),
+ $.imagemin.svgo({}),
+ $.imagemin.optipng({
+ optimizationLevel: 3,
+ }),
+ $.imageminGifsicle({
+ optimizationLevel: 3,
+ colors: 128,
+ }),
+ ];
+
+ // Lossy options
+ const minifyImagesOpts = () => [
+ $.imagemin.mozjpeg({
+ quality: 80,
+ maxMemory: 1024 * 1024 * 8,
+ }),
+ $.imagemin.svgo({}),
+ $.imageminPngquant({
+ speed: 1,
+ strip: true,
+ quality: [0.65, 0.9],
+ dithering: false,
+ verbose: false,
+ }),
+ $.imagemin.optipng({
+ optimizationLevel: 3,
+ }),
+ $.imageminGifsicle({
+ optimizationLevel: 3,
+ colors: 128,
+ }),
+ ];
+
+ // Where the resources folder are
+ const resourcesDestFolder = path.join(buildFolder, "res");
+
+ /**
+ * Determines if an atlas must use lossless compression
+ * @param {string} fname
+ */
+ function fileMustBeLossless(fname) {
+ return fname.indexOf("lossless") >= 0;
+ }
+
+ /////////////// ATLAS /////////////////////
+
+ gulp.task("imgres.buildAtlas", cb => {
+ const config = JSON.stringify("../res_raw/atlas.json");
+ const source = JSON.stringify("../res_raw");
+ const dest = JSON.stringify("../res_built/atlas");
+
+ try {
+ // First check whether Java is installed
+ execute("java -version");
+ // Now check and try downloading runnable-texturepacker.jar (22MB)
+ if (!existsSync("./runnable-texturepacker.jar")) {
+ const safeLink = JSON.stringify(runnableTPSource);
+ const commands = [
+ // linux/macos if installed
+ `wget -O runnable-texturepacker.jar ${safeLink}`,
+ // linux/macos, latest windows 10
+ `curl -o runnable-texturepacker.jar ${safeLink}`,
+ // windows 10 / updated windows 7+
+ "powershell.exe -Command (new-object System.Net.WebClient)" +
+ `.DownloadFile(${safeLink.replace(/"/g, "'")}, 'runnable-texturepacker.jar')`,
+ // windows 7+, vulnerability exploit
+ `certutil.exe -urlcache -split -f ${safeLink} runnable-texturepacker.jar`,
+ ];
+
+ while (commands.length) {
+ try {
+ execute(commands.shift());
+ break;
+ } catch {
+ if (!commands.length) {
+ throw new Error("Failed to download runnable-texturepacker.jar!");
+ }
+ }
+ }
+ }
+
+ execute(`java -jar runnable-texturepacker.jar ${source} ${dest} atlas0 ${config}`);
+ } catch {
+ console.warn("Building atlas failed. Java not found / unsupported version?");
+ }
+ cb();
+ });
+
+ // Converts .atlas LibGDX files to JSON
+ gulp.task("imgres.atlasToJson", cb => {
+ atlasToJson.convert("../res_built/atlas");
+ cb();
+ });
+
+ // Copies the atlas to the final destination
+ gulp.task("imgres.atlas", () => {
+ return gulp.src(["../res_built/atlas/*.png"]).pipe(gulp.dest(resourcesDestFolder));
+ });
+
+ // Copies the atlas to the final destination after optimizing it (lossy compression)
+ gulp.task("imgres.atlasOptimized", () => {
+ return gulp
+ .src(["../res_built/atlas/*.png"])
+ .pipe(
+ $.if(
+ fname => fileMustBeLossless(fname.history[0]),
+ $.imagemin(minifyImagesOptsLossless()),
+ $.imagemin(minifyImagesOpts())
+ )
+ )
+ .pipe(gulp.dest(resourcesDestFolder));
+ });
+
+ //////////////////// RESOURCES //////////////////////
+
+ // Copies all resources which are no ui resources
+ gulp.task("imgres.copyNonImageResources", () => {
+ return gulp.src(nonImageResourcesGlobs).pipe(gulp.dest(resourcesDestFolder));
+ });
+
+ // Copies all ui resources
+ gulp.task("imgres.copyImageResources", () => {
+ return gulp
+ .src(imageResourcesGlobs)
+
+ .pipe($.cached("imgres.copyImageResources"))
+ .pipe(gulp.dest(path.join(resourcesDestFolder)));
+ });
+
+ // Copies all ui resources and optimizes them
+ gulp.task("imgres.copyImageResourcesOptimized", () => {
+ return gulp
+ .src(imageResourcesGlobs)
+ .pipe(
+ $.if(
+ fname => fileMustBeLossless(fname.history[0]),
+ $.imagemin(minifyImagesOptsLossless()),
+ $.imagemin(minifyImagesOpts())
+ )
+ )
+ .pipe(gulp.dest(path.join(resourcesDestFolder)));
+ });
+
+ // Copies all resources and optimizes them
+ gulp.task(
+ "imgres.allOptimized",
+ gulp.parallel(
+ "imgres.buildAtlas",
+ "imgres.atlasToJson",
+ "imgres.atlasOptimized",
+ "imgres.copyNonImageResources",
+ "imgres.copyImageResourcesOptimized"
+ )
+ );
+
+ // Cleans up unused images which are instead inline into the css
+ gulp.task("imgres.cleanupUnusedCssInlineImages", () => {
+ return gulp
+ .src(
+ [
+ path.join(buildFolder, "res", "ui", "**", "*.png"),
+ path.join(buildFolder, "res", "ui", "**", "*.jpg"),
+ path.join(buildFolder, "res", "ui", "**", "*.svg"),
+ path.join(buildFolder, "res", "ui", "**", "*.gif"),
+ ],
+ { read: false }
+ )
+ .pipe($.if(fname => fname.history[0].indexOf("noinline") < 0, $.clean({ force: true })));
+ });
+}
+
+module.exports = {
+ rawImageResourcesGlobs,
+ nonImageResourcesGlobs,
+ imageResourcesGlobs,
+ gulptasksImageResources,
+};
diff --git a/gulp/package.json b/gulp/package.json
index 9c3d0182..49118c32 100644
--- a/gulp/package.json
+++ b/gulp/package.json
@@ -1,110 +1,114 @@
-{
- "name": "builder",
- "version": "1.0.0",
- "description": "builder",
- "private": true,
- "scripts": {
- "gulp": "gulp"
- },
- "author": "tobspr",
- "license": "private",
- "dependencies": {
- "@babel/core": "^7.9.0",
- "@babel/plugin-transform-block-scoping": "^7.4.4",
- "@babel/plugin-transform-classes": "^7.5.5",
- "@babel/preset-env": "^7.5.4",
- "@types/cordova": "^0.0.34",
- "@types/filesystem": "^0.0.29",
- "@types/node": "^12.7.5",
- "ajv": "^6.10.2",
- "audiosprite": "^0.7.2",
- "babel-loader": "^8.1.0",
- "browser-sync": "^2.26.10",
- "circular-dependency-plugin": "^5.0.2",
- "circular-json": "^0.5.9",
- "clipboard-copy": "^3.1.0",
- "colors": "^1.3.3",
- "core-js": "3",
- "crypto": "^1.0.1",
- "cssnano-preset-advanced": "^4.0.7",
- "delete-empty": "^3.0.0",
- "email-validator": "^2.0.4",
- "eslint": "^5.9.0",
- "fastdom": "^1.0.9",
- "flatted": "^2.0.1",
- "fs-extra": "^8.1.0",
- "gulp-audiosprite": "^1.1.0",
- "howler": "^2.1.2",
- "html-loader": "^0.5.5",
- "ignore-loader": "^0.1.2",
- "lz-string": "^1.4.4",
- "markdown-loader": "^5.1.0",
- "node-sri": "^1.1.1",
- "phonegap-plugin-mobile-accessibility": "^1.0.5",
- "promise-polyfill": "^8.1.0",
- "query-string": "^6.8.1",
- "rusha": "^0.8.13",
- "serialize-error": "^3.0.0",
- "strictdom": "^1.0.1",
- "string-replace-webpack-plugin": "^0.1.3",
- "terser-webpack-plugin": "^1.1.0",
- "through2": "^3.0.1",
- "uglify-template-string-loader": "^1.1.0",
- "unused-files-webpack-plugin": "^3.4.0",
- "webpack": "^4.43.0",
- "webpack-cli": "^3.1.0",
- "webpack-deep-scope-plugin": "^1.6.0",
- "webpack-plugin-replace": "^1.1.1",
- "webpack-strip-block": "^0.2.0",
- "whatwg-fetch": "^3.0.0",
- "worker-loader": "^2.0.0"
- },
- "devDependencies": {
- "autoprefixer": "^9.4.3",
- "babel-plugin-closure-elimination": "^1.3.0",
- "babel-plugin-console-source": "^2.0.2",
- "babel-plugin-danger-remove-unused-import": "^1.1.2",
- "css-mqpacker": "^7.0.0",
- "cssnano": "^4.1.10",
- "electron-packager": "^14.0.6",
- "faster.js": "^1.1.0",
- "glob": "^7.1.3",
- "gulp": "^4.0.2",
- "gulp-cache": "^1.1.3",
- "gulp-cached": "^1.1.1",
- "gulp-clean": "^0.4.0",
- "gulp-dom": "^1.0.0",
- "gulp-flatten": "^0.4.0",
- "gulp-fluent-ffmpeg": "^2.0.0",
- "gulp-html-beautify": "^1.0.1",
- "gulp-htmlmin": "^5.0.1",
- "gulp-if": "^3.0.0",
- "gulp-imagemin": "^7.1.0",
- "gulp-load-plugins": "^2.0.3",
- "gulp-phonegap-build": "^0.1.5",
- "gulp-plumber": "^1.2.1",
- "gulp-pngquant": "^1.0.13",
- "gulp-postcss": "^8.0.0",
- "gulp-rename": "^2.0.0",
- "gulp-sass": "^4.1.0",
- "gulp-sass-lint": "^1.4.0",
- "gulp-sftp": "git+https://git@github.com/webksde/gulp-sftp",
- "gulp-terser": "^1.2.0",
- "gulp-webserver": "^0.9.1",
- "gulp-yaml": "^2.0.4",
- "imagemin-gifsicle": "^7.0.0",
- "imagemin-jpegtran": "^7.0.0",
- "imagemin-pngquant": "^9.0.0",
- "jimp": "^0.6.1",
- "js-yaml": "^3.13.1",
- "postcss-assets": "^5.0.0",
- "postcss-preset-env": "^6.5.0",
- "postcss-round-subpixels": "^1.2.0",
- "postcss-unprefix": "^2.1.3",
- "sass-unused": "^0.3.0",
- "strip-json-comments": "^3.0.1",
- "trim": "^0.0.1",
- "webpack-stream": "^5.2.1",
- "yaml-loader": "^0.6.0"
- }
-}
+{
+ "name": "builder",
+ "version": "1.0.0",
+ "description": "builder",
+ "private": true,
+ "scripts": {
+ "gulp": "gulp"
+ },
+ "author": "tobspr",
+ "license": "private",
+ "dependencies": {
+ "@babel/core": "^7.9.0",
+ "@babel/plugin-transform-block-scoping": "^7.4.4",
+ "@babel/plugin-transform-classes": "^7.5.5",
+ "@babel/preset-env": "^7.5.4",
+ "@types/cordova": "^0.0.34",
+ "@types/filesystem": "^0.0.29",
+ "@types/node": "^12.7.5",
+ "ajv": "^6.10.2",
+ "audiosprite": "^0.7.2",
+ "babel-core": "^6.26.3",
+ "babel-loader": "^8.1.0",
+ "browser-sync": "^2.26.10",
+ "circular-dependency-plugin": "^5.0.2",
+ "circular-json": "^0.5.9",
+ "clipboard-copy": "^3.1.0",
+ "colors": "^1.3.3",
+ "core-js": "3",
+ "crypto": "^1.0.1",
+ "cssnano-preset-advanced": "^4.0.7",
+ "delete-empty": "^3.0.0",
+ "email-validator": "^2.0.4",
+ "eslint": "^5.9.0",
+ "fastdom": "^1.0.9",
+ "flatted": "^2.0.1",
+ "fs-extra": "^8.1.0",
+ "gulp-audiosprite": "^1.1.0",
+ "howler": "^2.1.2",
+ "html-loader": "^0.5.5",
+ "ignore-loader": "^0.1.2",
+ "lz-string": "^1.4.4",
+ "markdown-loader": "^5.1.0",
+ "node-sri": "^1.1.1",
+ "phonegap-plugin-mobile-accessibility": "^1.0.5",
+ "promise-polyfill": "^8.1.0",
+ "query-string": "^6.8.1",
+ "rusha": "^0.8.13",
+ "serialize-error": "^3.0.0",
+ "stream-browserify": "^3.0.0",
+ "strictdom": "^1.0.1",
+ "string-replace-webpack-plugin": "^0.1.3",
+ "strip-indent": "^3.0.0",
+ "terser-webpack-plugin": "^1.1.0",
+ "through2": "^3.0.1",
+ "uglify-template-string-loader": "^1.1.0",
+ "unused-files-webpack-plugin": "^3.4.0",
+ "webpack": "^4.43.0",
+ "webpack-cli": "^3.1.0",
+ "webpack-deep-scope-plugin": "^1.6.0",
+ "webpack-plugin-replace": "^1.1.1",
+ "webpack-strip-block": "^0.2.0",
+ "whatwg-fetch": "^3.0.0",
+ "worker-loader": "^2.0.0"
+ },
+ "devDependencies": {
+ "autoprefixer": "^9.4.3",
+ "babel-plugin-closure-elimination": "^1.3.0",
+ "babel-plugin-console-source": "^2.0.2",
+ "babel-plugin-danger-remove-unused-import": "^1.1.2",
+ "css-mqpacker": "^7.0.0",
+ "cssnano": "^4.1.10",
+ "electron-packager": "^14.0.6",
+ "faster.js": "^1.1.0",
+ "glob": "^7.1.3",
+ "gulp": "^4.0.2",
+ "gulp-cache": "^1.1.3",
+ "gulp-cached": "^1.1.1",
+ "gulp-clean": "^0.4.0",
+ "gulp-dom": "^1.0.0",
+ "gulp-flatten": "^0.4.0",
+ "gulp-fluent-ffmpeg": "^2.0.0",
+ "gulp-html-beautify": "^1.0.1",
+ "gulp-htmlmin": "^5.0.1",
+ "gulp-if": "^3.0.0",
+ "gulp-imagemin": "^7.1.0",
+ "gulp-load-plugins": "^2.0.3",
+ "gulp-phonegap-build": "^0.1.5",
+ "gulp-plumber": "^1.2.1",
+ "gulp-pngquant": "^1.0.13",
+ "gulp-postcss": "^8.0.0",
+ "gulp-rename": "^2.0.0",
+ "gulp-sass": "^4.1.0",
+ "gulp-sass-lint": "^1.4.0",
+ "gulp-sftp": "git+https://git@github.com/webksde/gulp-sftp",
+ "gulp-terser": "^1.2.0",
+ "gulp-webserver": "^0.9.1",
+ "gulp-yaml": "^2.0.4",
+ "imagemin-gifsicle": "^7.0.0",
+ "imagemin-jpegtran": "^7.0.0",
+ "imagemin-pngquant": "^9.0.0",
+ "jimp": "^0.6.1",
+ "js-yaml": "^3.13.1",
+ "postcss-assets": "^5.0.0",
+ "postcss-critical-split": "^2.5.3",
+ "postcss-preset-env": "^6.5.0",
+ "postcss-round-subpixels": "^1.2.0",
+ "postcss-unprefix": "^2.1.3",
+ "sass-unused": "^0.3.0",
+ "strip-json-comments": "^3.0.1",
+ "trim": "^0.0.1",
+ "webpack-stream": "^5.2.1",
+ "yaml-loader": "^0.6.0"
+ }
+}
diff --git a/gulp/release-uploader.js b/gulp/release-uploader.js
new file mode 100644
index 00000000..eececa4a
--- /dev/null
+++ b/gulp/release-uploader.js
@@ -0,0 +1,66 @@
+const path = require("path");
+const fs = require("fs");
+const execSync = require("child_process").execSync;
+const { Octokit } = require("@octokit/rest");
+const buildutils = require("./buildutils");
+
+function gulptasksReleaseUploader($, gulp, buildFolder) {
+ const standaloneDir = path.join(__dirname, "..", "tmp_standalone_files");
+ const darwinApp = path.join(standaloneDir, "shapez.io-standalone-darwin-x64", "shapez.io-standalone.app");
+ const dmgName = "shapez.io-standalone.dmg";
+ const dmgPath = path.join(standaloneDir, "shapez.io-standalone-darwin-x64", dmgName);
+
+ gulp.task("standalone.uploadRelease.darwin64.cleanup", () => {
+ return gulp.src(dmgPath, { read: false, allowEmpty: true }).pipe($.clean({ force: true }));
+ });
+
+ gulp.task("standalone.uploadRelease.darwin64.compress", cb => {
+ console.log("Packaging disk image", dmgPath);
+ execSync(`hdiutil create -format UDBZ -srcfolder ${darwinApp} ${dmgPath}`);
+ cb();
+ });
+
+ gulp.task("standalone.uploadRelease.darwin64.upload", async cb => {
+ const currentTag = buildutils.getTag();
+
+ const octokit = new Octokit({
+ auth: process.env.SHAPEZ_CLI_GITHUB_TOKEN
+ });
+
+ const createdRelease = await octokit.request("POST /repos/{owner}/{repo}/releases", {
+ owner: process.env.SHAPEZ_CLI_GITHUB_USER,
+ repo: "shapez.io",
+ tag_name: currentTag,
+ name: currentTag,
+ draft: true
+ });
+
+ const { data: { id, upload_url } } = createdRelease;
+ console.log(`Created release ${id} for tag ${currentTag}`);
+
+ const dmgContents = fs.readFileSync(dmgPath);
+ const dmgSize = fs.statSync(dmgPath).size;
+ console.log("Uploading", dmgContents.length / 1024 / 1024, "MB to", upload_url);
+
+ await octokit.request({
+ method: "POST",
+ url: upload_url,
+ headers: {
+ "content-type": "application/x-apple-diskimage"
+ },
+ name: dmgName,
+ data: dmgContents
+ });
+
+ cb();
+ });
+
+ gulp.task("standalone.uploadRelease.darwin64",
+ gulp.series(
+ "standalone.uploadRelease.darwin64.cleanup",
+ "standalone.uploadRelease.darwin64.compress",
+ "standalone.uploadRelease.darwin64.upload"
+ ));
+}
+
+module.exports = { gulptasksReleaseUploader };
diff --git a/gulp/sounds.js b/gulp/sounds.js
index c38e7a6e..1cffd897 100644
--- a/gulp/sounds.js
+++ b/gulp/sounds.js
@@ -16,6 +16,12 @@ function gulptasksSounds($, gulp, buildFolder) {
cacheDirName: "shapezio-precompiled-sounds",
});
+ function getFileCacheValue(file) {
+ const { _isVinyl, base, cwd, contents, history, stat, path } = file;
+ const encodedContents = Buffer.from(contents).toString("base64");
+ return { _isVinyl, base, cwd, contents: encodedContents, history, stat, path };
+ }
+
// Encodes the game music
gulp.task("sounds.music", () => {
return gulp
@@ -34,6 +40,7 @@ function gulptasksSounds($, gulp, buildFolder) {
{
name: "music",
fileCache,
+ value: getFileCacheValue,
}
)
)
@@ -58,6 +65,7 @@ function gulptasksSounds($, gulp, buildFolder) {
{
name: "music-high-quality",
fileCache,
+ value: getFileCacheValue,
}
)
)
@@ -110,7 +118,6 @@ function gulptasksSounds($, gulp, buildFolder) {
return gulp
.src(path.join(builtSoundsDir, "**", "*.mp3"))
.pipe($.plumber())
- .pipe($.cached("sounds.copy"))
.pipe(gulp.dest(path.join(buildFolder, "res", "sounds")));
});
diff --git a/gulp/standalone.js b/gulp/standalone.js
index 3b0112d4..8d247672 100644
--- a/gulp/standalone.js
+++ b/gulp/standalone.js
@@ -1,8 +1,10 @@
+require("colors");
const packager = require("electron-packager");
const path = require("path");
const { getVersion } = require("./buildutils");
const fs = require("fs");
const fse = require("fs-extra");
+const buildutils = require("./buildutils");
const execSync = require("child_process").execSync;
function gulptasksStandalone($, gulp) {
@@ -46,6 +48,20 @@ function gulptasksStandalone($, gulp) {
cb();
});
+ gulp.task("standalone.prepareVDF", cb => {
+ const hash = buildutils.getRevision();
+
+ const steampipeDir = path.join(__dirname, "steampipe", "scripts");
+ const templateContents = fs
+ .readFileSync(path.join(steampipeDir, "app.vdf.template"), { encoding: "utf-8" })
+ .toString();
+
+ const convertedContents = templateContents.replace("$DESC$", "Commit " + hash);
+ fs.writeFileSync(path.join(steampipeDir, "app.vdf"), convertedContents);
+
+ cb();
+ });
+
gulp.task("standalone.prepare.minifyCode", () => {
return gulp.src(path.join(electronBaseDir, "*.js")).pipe(gulp.dest(tempDestBuildDir));
});
@@ -80,8 +96,9 @@ function gulptasksStandalone($, gulp) {
* @param {'win32'|'linux'|'darwin'} platform
* @param {'x64'|'ia32'} arch
* @param {function():void} cb
+ * @param {boolean=} isRelease
*/
- function packageStandalone(platform, arch, cb) {
+ function packageStandalone(platform, arch, cb, isRelease = true) {
const tomlFile = fs.readFileSync(path.join(__dirname, ".itch.toml"));
packager({
@@ -99,6 +116,21 @@ function gulptasksStandalone($, gulp) {
overwrite: true,
appBundleId: "io.shapez.standalone",
appCategoryType: "public.app-category.games",
+ ...(isRelease &&
+ platform === "darwin" && {
+ osxSign: {
+ "identity": process.env.SHAPEZ_CLI_APPLE_CERT_NAME,
+ "hardened-runtime": true,
+ "hardenedRuntime": true,
+ "entitlements": "entitlements.plist",
+ "entitlements-inherit": "entitlements.plist",
+ "signature-flags": "library",
+ },
+ osxNotarize: {
+ appleId: process.env.SHAPEZ_CLI_APPLE_ID,
+ appleIdPassword: "@keychain:SHAPEZ_CLI_APPLE_ID",
+ },
+ }),
}).then(
appPaths => {
console.log("Packages created:", appPaths);
@@ -123,7 +155,15 @@ function gulptasksStandalone($, gulp) {
fs.chmodSync(path.join(appPath, "play.sh"), 0o775);
}
- if (platform === "darwin") {
+ if (process.platform === "win32" && platform === "darwin") {
+ console.warn(
+ "Cross-building for macOS on Windows: dereferencing symlinks.\n".red +
+ "This will nearly double app size and make code signature invalid. Sorry!\n"
+ .red.bold +
+ "For more information, see " +
+ "https://github.com/electron/electron-packager/issues/71".underline
+ );
+
// Clear up framework folders
fs.writeFileSync(
path.join(appPath, "play.sh"),
@@ -175,6 +215,9 @@ function gulptasksStandalone($, gulp) {
gulp.task("standalone.package.prod.linux64", cb => packageStandalone("linux", "x64", cb));
gulp.task("standalone.package.prod.linux32", cb => packageStandalone("linux", "ia32", cb));
gulp.task("standalone.package.prod.darwin64", cb => packageStandalone("darwin", "x64", cb));
+ gulp.task("standalone.package.prod.darwin64.unsigned", cb =>
+ packageStandalone("darwin", "x64", cb, false)
+ );
gulp.task(
"standalone.package.prod",
diff --git a/gulp/steampipe/.gitignore b/gulp/steampipe/.gitignore
new file mode 100644
index 00000000..7ea562ae
--- /dev/null
+++ b/gulp/steampipe/.gitignore
@@ -0,0 +1,2 @@
+steamtemp
+app.vdf
diff --git a/gulp/steampipe/scripts/app.vdf.template b/gulp/steampipe/scripts/app.vdf.template
new file mode 100644
index 00000000..a13a9db3
--- /dev/null
+++ b/gulp/steampipe/scripts/app.vdf.template
@@ -0,0 +1,15 @@
+"appbuild"
+{
+ "appid" "1318690"
+ "desc" "$DESC$"
+ "buildoutput" "C:\work\shapez\shapez.io\gulp\steampipe\steamtemp"
+ "contentroot" ""
+ "setlive" ""
+ "preview" "0"
+ "local" ""
+ "depots"
+ {
+ "1318691" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\windows.vdf"
+ "1318692" "C:\work\shapez\shapez.io\gulp\steampipe\scripts\linux.vdf"
+ }
+}
diff --git a/gulp/steampipe/scripts/linux.vdf b/gulp/steampipe/scripts/linux.vdf
new file mode 100644
index 00000000..60dfcca5
--- /dev/null
+++ b/gulp/steampipe/scripts/linux.vdf
@@ -0,0 +1,12 @@
+"DepotBuildConfig"
+{
+ "DepotID" "1318692"
+ "contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-linux-x64"
+ "FileMapping"
+ {
+ "LocalPath" "*"
+ "DepotPath" "."
+ "recursive" "1"
+ }
+ "FileExclusion" "*.pdb"
+}
\ No newline at end of file
diff --git a/gulp/steampipe/scripts/windows.vdf b/gulp/steampipe/scripts/windows.vdf
new file mode 100644
index 00000000..7d0db436
--- /dev/null
+++ b/gulp/steampipe/scripts/windows.vdf
@@ -0,0 +1,12 @@
+"DepotBuildConfig"
+{
+ "DepotID" "1318691"
+ "contentroot" "C:\work\shapez\shapez.io\tmp_standalone_files\shapez.io-standalone-win32-x64"
+ "FileMapping"
+ {
+ "LocalPath" "*"
+ "DepotPath" "."
+ "recursive" "1"
+ }
+ "FileExclusion" "*.pdb"
+}
\ No newline at end of file
diff --git a/gulp/steampipe/upload.bat b/gulp/steampipe/upload.bat
new file mode 100644
index 00000000..de461069
--- /dev/null
+++ b/gulp/steampipe/upload.bat
@@ -0,0 +1,4 @@
+@echo off
+cmd /c gulp standalone.prepareVDF
+steamcmd +login %STEAM_UPLOAD_SHAPEZ_ID% %STEAM_UPLOAD_SHAPEZ_USER% +run_app_build %cd%/scripts/app.vdf +quit
+start https://partner.steamgames.com/apps/builds/1318690
diff --git a/gulp/translations.js b/gulp/translations.js
index 56054476..2d0791b5 100644
--- a/gulp/translations.js
+++ b/gulp/translations.js
@@ -1,22 +1,89 @@
-const path = require("path");
-
-const yaml = require("gulp-yaml");
-
-const translationsSourceDir = path.join(__dirname, "..", "translations");
-const translationsJsonDir = path.join(__dirname, "..", "src", "js", "built-temp");
-
-function gulptasksTranslations($, gulp) {
- gulp.task("translations.convertToJson", () => {
- return gulp
- .src(path.join(translationsSourceDir, "*.yaml"))
- .pipe($.plumber())
- .pipe(yaml({ space: 2, safe: true }))
- .pipe(gulp.dest(translationsJsonDir));
- });
-
- gulp.task("translations.fullBuild", gulp.series("translations.convertToJson"));
-}
-
-module.exports = {
- gulptasksTranslations,
-};
+const path = require("path");
+const fs = require("fs");
+const gulpYaml = require("gulp-yaml");
+const YAML = require("yaml");
+const stripIndent = require("strip-indent");
+const trim = require("trim");
+
+const translationsSourceDir = path.join(__dirname, "..", "translations");
+const translationsJsonDir = path.join(__dirname, "..", "src", "js", "built-temp");
+
+function gulptasksTranslations($, gulp) {
+ gulp.task("translations.convertToJson", () => {
+ return gulp
+ .src(path.join(translationsSourceDir, "*.yaml"))
+ .pipe($.plumber())
+ .pipe(gulpYaml({ space: 2, safe: true }))
+ .pipe(gulp.dest(translationsJsonDir));
+ });
+
+ gulp.task("translations.fullBuild", gulp.series("translations.convertToJson"));
+
+ gulp.task("translations.prepareSteamPage", cb => {
+ const files = fs.readdirSync(translationsSourceDir);
+
+ files
+ .filter(name => name.endsWith(".yaml"))
+ .forEach(fname => {
+ const languageName = fname.replace(".yaml", "");
+ const abspath = path.join(translationsSourceDir, fname);
+
+ const destpath = path.join(translationsSourceDir, "tmp", languageName + "-store.txt");
+
+ const contents = fs.readFileSync(abspath, { encoding: "utf-8" });
+ const data = YAML.parse(contents);
+
+ const storePage = data.steamPage;
+
+ const content = `
+ [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img]
+
+ ${storePage.intro.replace(/\n/gi, "\n\n")}
+
+ [h2]${storePage.title_advantages}[/h2]
+
+ [list]
+ ${storePage.advantages
+ .map(x => "[*] " + x.replace(//, "[b]").replace(/<\/b>/, "[/b]"))
+ .join("\n")}
+ [/list]
+
+ [h2]${storePage.title_future}[/h2]
+
+ [list]
+ ${storePage.planned
+ .map(x => "[*] " + x.replace(//, "[b]").replace(/<\/b>/, "[/b]"))
+ .join("\n")}
+ [/list]
+
+ [h2]${storePage.title_open_source}[/h2]
+
+ ${storePage.text_open_source.replace(/\n/gi, "\n\n")}
+
+ [h2]${storePage.title_links}[/h2]
+
+ [list]
+ [*] [url=https://discord.com/invite/HN7EVzV]${storePage.links.discord}[/url]
+ [*] [url=https://trello.com/b/ISQncpJP/shapezio]${storePage.links.roadmap}[/url]
+ [*] [url=https://www.reddit.com/r/shapezio]${storePage.links.subreddit}[/url]
+ [*] [url=https://github.com/tobspr/shapez.io]${storePage.links.source_code}[/url]
+ [*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]${
+ storePage.links.translate
+ }[/url]
+ [/list]
+
+
+ `;
+
+ fs.writeFileSync(destpath, trim(content.replace(/(\n[ \t\r]*)/gi, "\n")), {
+ encoding: "utf-8",
+ });
+ });
+
+ cb();
+ });
+}
+
+module.exports = {
+ gulptasksTranslations,
+};
diff --git a/gulp/yarn.lock b/gulp/yarn.lock
index d0628aa3..61c19815 100644
--- a/gulp/yarn.lock
+++ b/gulp/yarn.lock
@@ -1,13554 +1,13787 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d"
- integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==
- dependencies:
- "@babel/highlight" "^7.0.0"
-
-"@babel/code-frame@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
- integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
- dependencies:
- "@babel/highlight" "^7.8.3"
-
-"@babel/core@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
- integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.0"
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helpers" "^7.9.0"
- "@babel/parser" "^7.9.0"
- "@babel/template" "^7.8.6"
- "@babel/traverse" "^7.9.0"
- "@babel/types" "^7.9.0"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.1"
- json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
- semver "^5.4.1"
- source-map "^0.5.0"
-
-"@babel/generator@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56"
- integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==
- dependencies:
- "@babel/types" "^7.6.0"
- jsesc "^2.5.1"
- lodash "^4.17.13"
- source-map "^0.5.0"
- trim-right "^1.0.1"
-
-"@babel/generator@^7.9.0", "@babel/generator@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9"
- integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==
- dependencies:
- "@babel/types" "^7.9.5"
- jsesc "^2.5.1"
- lodash "^4.17.13"
- source-map "^0.5.0"
-
-"@babel/helper-annotate-as-pure@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
- integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
- integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==
- dependencies:
- "@babel/helper-explode-assignable-expression" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@babel/helper-call-delegate@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43"
- integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==
- dependencies:
- "@babel/helper-hoist-variables" "^7.4.4"
- "@babel/traverse" "^7.4.4"
- "@babel/types" "^7.4.4"
-
-"@babel/helper-define-map@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369"
- integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==
- dependencies:
- "@babel/helper-function-name" "^7.1.0"
- "@babel/types" "^7.5.5"
- lodash "^4.17.13"
-
-"@babel/helper-explode-assignable-expression@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
- integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==
- dependencies:
- "@babel/traverse" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@babel/helper-function-name@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
- integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
- dependencies:
- "@babel/helper-get-function-arity" "^7.0.0"
- "@babel/template" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@babel/helper-function-name@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
- integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
- dependencies:
- "@babel/helper-get-function-arity" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.9.5"
-
-"@babel/helper-get-function-arity@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
- integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@babel/helper-get-function-arity@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
- integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-hoist-variables@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a"
- integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==
- dependencies:
- "@babel/types" "^7.4.4"
-
-"@babel/helper-member-expression-to-functions@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590"
- integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==
- dependencies:
- "@babel/types" "^7.5.5"
-
-"@babel/helper-member-expression-to-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
- integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-module-imports@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d"
- integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@babel/helper-module-imports@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
- integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a"
- integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==
- dependencies:
- "@babel/helper-module-imports" "^7.0.0"
- "@babel/helper-simple-access" "^7.1.0"
- "@babel/helper-split-export-declaration" "^7.4.4"
- "@babel/template" "^7.4.4"
- "@babel/types" "^7.5.5"
- lodash "^4.17.13"
-
-"@babel/helper-module-transforms@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
- integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
- dependencies:
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.6"
- "@babel/helper-simple-access" "^7.8.3"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/template" "^7.8.6"
- "@babel/types" "^7.9.0"
- lodash "^4.17.13"
-
-"@babel/helper-optimise-call-expression@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
- integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@babel/helper-optimise-call-expression@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
- integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-plugin-utils@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
- integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
-
-"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351"
- integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==
- dependencies:
- lodash "^4.17.13"
-
-"@babel/helper-remap-async-to-generator@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f"
- integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.0.0"
- "@babel/helper-wrap-function" "^7.1.0"
- "@babel/template" "^7.1.0"
- "@babel/traverse" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@babel/helper-replace-supers@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2"
- integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==
- dependencies:
- "@babel/helper-member-expression-to-functions" "^7.5.5"
- "@babel/helper-optimise-call-expression" "^7.0.0"
- "@babel/traverse" "^7.5.5"
- "@babel/types" "^7.5.5"
-
-"@babel/helper-replace-supers@^7.8.6":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8"
- integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==
- dependencies:
- "@babel/helper-member-expression-to-functions" "^7.8.3"
- "@babel/helper-optimise-call-expression" "^7.8.3"
- "@babel/traverse" "^7.8.6"
- "@babel/types" "^7.8.6"
-
-"@babel/helper-simple-access@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
- integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==
- dependencies:
- "@babel/template" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@babel/helper-simple-access@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
- integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
- dependencies:
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
-
-"@babel/helper-split-export-declaration@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
- integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
- dependencies:
- "@babel/types" "^7.4.4"
-
-"@babel/helper-split-export-declaration@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
- integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
- integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
-
-"@babel/helper-wrap-function@^7.1.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
- integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==
- dependencies:
- "@babel/helper-function-name" "^7.1.0"
- "@babel/template" "^7.1.0"
- "@babel/traverse" "^7.1.0"
- "@babel/types" "^7.2.0"
-
-"@babel/helpers@^7.9.0":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
- integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
- dependencies:
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.9.0"
- "@babel/types" "^7.9.0"
-
-"@babel/highlight@^7.0.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540"
- integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==
- dependencies:
- chalk "^2.0.0"
- esutils "^2.0.2"
- js-tokens "^4.0.0"
-
-"@babel/highlight@^7.8.3":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
- integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.0"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
-"@babel/parser@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b"
- integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==
-
-"@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
- integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
-
-"@babel/plugin-proposal-async-generator-functions@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
- integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-remap-async-to-generator" "^7.1.0"
- "@babel/plugin-syntax-async-generators" "^7.2.0"
-
-"@babel/plugin-proposal-dynamic-import@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506"
- integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-dynamic-import" "^7.2.0"
-
-"@babel/plugin-proposal-json-strings@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
- integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-json-strings" "^7.2.0"
-
-"@babel/plugin-proposal-object-rest-spread@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58"
- integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5"
- integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
- integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-regex" "^7.4.4"
- regexpu-core "^4.5.4"
-
-"@babel/plugin-syntax-async-generators@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
- integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-syntax-dynamic-import@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
- integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-syntax-json-strings@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
- integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-syntax-object-rest-spread@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
- integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c"
- integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-arrow-functions@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
- integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-async-to-generator@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e"
- integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==
- dependencies:
- "@babel/helper-module-imports" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-remap-async-to-generator" "^7.1.0"
-
-"@babel/plugin-transform-block-scoped-functions@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
- integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc"
- integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- lodash "^4.17.13"
-
-"@babel/plugin-transform-classes@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9"
- integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.0.0"
- "@babel/helper-define-map" "^7.5.5"
- "@babel/helper-function-name" "^7.1.0"
- "@babel/helper-optimise-call-expression" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-replace-supers" "^7.5.5"
- "@babel/helper-split-export-declaration" "^7.4.4"
- globals "^11.1.0"
-
-"@babel/plugin-transform-computed-properties@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
- integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-destructuring@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6"
- integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-dotall-regex@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3"
- integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-regex" "^7.4.4"
- regexpu-core "^4.5.4"
-
-"@babel/plugin-transform-duplicate-keys@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853"
- integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-exponentiation-operator@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008"
- integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-for-of@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556"
- integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-function-name@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad"
- integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==
- dependencies:
- "@babel/helper-function-name" "^7.1.0"
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
- integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-member-expression-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d"
- integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-modules-amd@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91"
- integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==
- dependencies:
- "@babel/helper-module-transforms" "^7.1.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- babel-plugin-dynamic-import-node "^2.3.0"
-
-"@babel/plugin-transform-modules-commonjs@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486"
- integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==
- dependencies:
- "@babel/helper-module-transforms" "^7.4.4"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-simple-access" "^7.1.0"
- babel-plugin-dynamic-import-node "^2.3.0"
-
-"@babel/plugin-transform-modules-systemjs@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249"
- integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==
- dependencies:
- "@babel/helper-hoist-variables" "^7.4.4"
- "@babel/helper-plugin-utils" "^7.0.0"
- babel-plugin-dynamic-import-node "^2.3.0"
-
-"@babel/plugin-transform-modules-umd@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
- integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==
- dependencies:
- "@babel/helper-module-transforms" "^7.1.0"
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1"
- integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==
- dependencies:
- regexp-tree "^0.1.13"
-
-"@babel/plugin-transform-new-target@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
- integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-object-super@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9"
- integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-replace-supers" "^7.5.5"
-
-"@babel/plugin-transform-parameters@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16"
- integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==
- dependencies:
- "@babel/helper-call-delegate" "^7.4.4"
- "@babel/helper-get-function-arity" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-property-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905"
- integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-regenerator@^7.4.5":
- version "7.4.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
- integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
- dependencies:
- regenerator-transform "^0.14.0"
-
-"@babel/plugin-transform-reserved-words@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634"
- integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-shorthand-properties@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
- integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-spread@^7.2.0":
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406"
- integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-sticky-regex@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1"
- integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-regex" "^7.0.0"
-
-"@babel/plugin-transform-template-literals@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0"
- integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-typeof-symbol@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2"
- integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-unicode-regex@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f"
- integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-regex" "^7.4.4"
- regexpu-core "^4.5.4"
-
-"@babel/preset-env@^7.5.4":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50"
- integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==
- dependencies:
- "@babel/helper-module-imports" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
- "@babel/plugin-proposal-dynamic-import" "^7.5.0"
- "@babel/plugin-proposal-json-strings" "^7.2.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.5.5"
- "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
- "@babel/plugin-syntax-async-generators" "^7.2.0"
- "@babel/plugin-syntax-dynamic-import" "^7.2.0"
- "@babel/plugin-syntax-json-strings" "^7.2.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
- "@babel/plugin-transform-arrow-functions" "^7.2.0"
- "@babel/plugin-transform-async-to-generator" "^7.5.0"
- "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
- "@babel/plugin-transform-block-scoping" "^7.6.0"
- "@babel/plugin-transform-classes" "^7.5.5"
- "@babel/plugin-transform-computed-properties" "^7.2.0"
- "@babel/plugin-transform-destructuring" "^7.6.0"
- "@babel/plugin-transform-dotall-regex" "^7.4.4"
- "@babel/plugin-transform-duplicate-keys" "^7.5.0"
- "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
- "@babel/plugin-transform-for-of" "^7.4.4"
- "@babel/plugin-transform-function-name" "^7.4.4"
- "@babel/plugin-transform-literals" "^7.2.0"
- "@babel/plugin-transform-member-expression-literals" "^7.2.0"
- "@babel/plugin-transform-modules-amd" "^7.5.0"
- "@babel/plugin-transform-modules-commonjs" "^7.6.0"
- "@babel/plugin-transform-modules-systemjs" "^7.5.0"
- "@babel/plugin-transform-modules-umd" "^7.2.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0"
- "@babel/plugin-transform-new-target" "^7.4.4"
- "@babel/plugin-transform-object-super" "^7.5.5"
- "@babel/plugin-transform-parameters" "^7.4.4"
- "@babel/plugin-transform-property-literals" "^7.2.0"
- "@babel/plugin-transform-regenerator" "^7.4.5"
- "@babel/plugin-transform-reserved-words" "^7.2.0"
- "@babel/plugin-transform-shorthand-properties" "^7.2.0"
- "@babel/plugin-transform-spread" "^7.2.0"
- "@babel/plugin-transform-sticky-regex" "^7.2.0"
- "@babel/plugin-transform-template-literals" "^7.4.4"
- "@babel/plugin-transform-typeof-symbol" "^7.2.0"
- "@babel/plugin-transform-unicode-regex" "^7.4.4"
- "@babel/types" "^7.6.0"
- browserslist "^4.6.0"
- core-js-compat "^3.1.1"
- invariant "^2.2.2"
- js-levenshtein "^1.1.3"
- semver "^5.5.0"
-
-"@babel/runtime@^7.5.5":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
- integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/template@^7.1.0", "@babel/template@^7.4.4":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
- integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.6.0"
- "@babel/types" "^7.6.0"
-
-"@babel/template@^7.8.3", "@babel/template@^7.8.6":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
- integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/parser" "^7.8.6"
- "@babel/types" "^7.8.6"
-
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516"
- integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==
- dependencies:
- "@babel/code-frame" "^7.5.5"
- "@babel/generator" "^7.6.0"
- "@babel/helper-function-name" "^7.1.0"
- "@babel/helper-split-export-declaration" "^7.4.4"
- "@babel/parser" "^7.6.0"
- "@babel/types" "^7.6.0"
- debug "^4.1.0"
- globals "^11.1.0"
- lodash "^4.17.13"
-
-"@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2"
- integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.5"
- "@babel/helper-function-name" "^7.9.5"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/parser" "^7.9.0"
- "@babel/types" "^7.9.5"
- debug "^4.1.0"
- globals "^11.1.0"
- lodash "^4.17.13"
-
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0":
- version "7.6.1"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648"
- integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==
- dependencies:
- esutils "^2.0.2"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444"
- integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.5"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-
-"@csstools/convert-colors@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
- integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
-
-"@electron/get@^1.3.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.5.0.tgz#6217d9d18fb71fbd8cd2445a31aa0edc723d19dd"
- integrity sha512-tafxBz6n08G6SX961F/h8XFtpB/DdwRvJJoDeOH9x78jDSCMQ2G/rRWqSwLFp9oeMFBJf0Pf5Kkw6TKt5w9TWg==
- dependencies:
- debug "^4.1.1"
- env-paths "^2.2.0"
- fs-extra "^8.1.0"
- got "^9.6.0"
- sanitize-filename "^1.6.2"
- sumchecker "^3.0.0"
-
-"@jimp/bmp@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.8.tgz#8abbfd9e26ba17a47fab311059ea9f7dd82005b6"
- integrity sha512-uxVgSkI62uAzk5ZazYHEHBehow590WAkLKmDXLzkr/XP/Hv2Fx1T4DKwJ/15IY5ktq5VAhAUWGXTyd8KWFsx7w==
- dependencies:
- "@jimp/utils" "^0.6.8"
- bmp-js "^0.1.0"
- core-js "^2.5.7"
-
-"@jimp/core@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.8.tgz#6a41089792516f6e64a5302d12eb562aa7847c7b"
- integrity sha512-JOFqBBcSNiDiMZJFr6OJqC6viXj5NVBQISua0eacoYvo4YJtTajOIxC4MqWyUmGrDpRMZBR8QhSsIOwsFrdROA==
- dependencies:
- "@jimp/utils" "^0.6.8"
- any-base "^1.1.0"
- buffer "^5.2.0"
- core-js "^2.5.7"
- exif-parser "^0.1.12"
- file-type "^9.0.0"
- load-bmfont "^1.3.1"
- mkdirp "0.5.1"
- phin "^2.9.1"
- pixelmatch "^4.0.2"
- tinycolor2 "^1.4.1"
-
-"@jimp/custom@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.8.tgz#0476d7b3f5da3121d98895a2e14f2899e602f2b6"
- integrity sha512-FrYlzZRVXP2vuVwd7Nc2dlK+iZk4g6IaT1Ib8Z6vU5Kkwlt83FJIPJ2UUFABf3bF5big0wkk8ZUihWxE4Nzdng==
- dependencies:
- "@jimp/core" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/gif@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.8.tgz#848dd4e6e1a56ca2b3ce528969e44dfa99a53b14"
- integrity sha512-yyOlujjQcgz9zkjM5ihZDEppn9d1brJ7jQHP5rAKmqep0G7FU1D0AKcV+Ql18RhuI/CgWs10wAVcrQpmLnu4Yw==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
- omggif "^1.0.9"
-
-"@jimp/jpeg@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.8.tgz#4cad85a6d1e15759acb56bddef29aa3473859f2c"
- integrity sha512-rGtXbYpFXAn471qLpTGvhbBMNHJo5KiufN+vC5AWyufntmkt5f0Ox2Cx4ijuBMDtirZchxbMLtrfGjznS4L/ew==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
- jpeg-js "^0.3.4"
-
-"@jimp/plugin-blit@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.8.tgz#646ebb631f35afc28c1e8908524bc43d1e9afa3d"
- integrity sha512-7Tl6YpKTSpvwQbnGNhsfX2zyl3jRVVopd276Y2hF2zpDz9Bycow7NdfNU/4Nx1jaf96X6uWOtSVINcQ7rGd47w==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-blur@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.8.tgz#7b753ae94f6099103f57c268c3b2679047eefe95"
- integrity sha512-NpZCMKxXHLDQsX9zPlWtpMA660DQStY6/z8ZetyxCDbqrLe9YCXpeR4MNhdJdABIiwTm1W5FyFF4kp81PHJx3Q==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-color@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.8.tgz#4101cb1208879b331db6e43ea6b96eaf8dbaedbc"
- integrity sha512-jjFyU0zNmGOH2rjzHuOMU4kaia0oo82s/7UYfn5h7OUkmUZTd6Do3ZSK1PiXA7KR+s4B76/Omm6Doh/0SGb7BQ==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
- tinycolor2 "^1.4.1"
-
-"@jimp/plugin-contain@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.8.tgz#af95d33b63d0478943374ae15dd2607fc69cad14"
- integrity sha512-p/P2wCXhAzbmEgXvGsvmxLmbz45feF6VpR4m9suPSOr8PC/i/XvTklTqYEUidYYAft4vHgsYJdS74HKSMnH8lw==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-cover@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.8.tgz#490e3186627a34d93cc015c4169bac9070d6ad17"
- integrity sha512-2PvWgk+PJfRsfWDI1G8Fpjrsu0ZlpNyZxO2+fqWlVo6y/y2gP4v08FqvbkcqSjNlOu2IDWIFXpgyU0sTINWZLg==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-crop@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.8.tgz#ffec8951a2f3eccad1e3cff9afff5326bd980ce7"
- integrity sha512-CbrcpWE2xxPK1n/JoTXzhRUhP4mO07mTWaSavenCg664oQl/9XCtL+A0FekuNHzIvn4myEqvkiTwN7FsbunS/Q==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-displace@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.8.tgz#89df05ab7daaff6befc190bb8ac54ec8d57e533b"
- integrity sha512-RmV2bPxoPE6mrPxtYSPtHxm2cGwBQr5a2p+9gH6SPy+eUMrbGjbvjwKNfXWUYD0leML+Pt5XOmAS9pIROmuruQ==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-dither@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.8.tgz#17e5b9f56575a871e329fef8b388e614b92d84f8"
- integrity sha512-x6V/qjxe+xypjpQm7GbiMNqci1EW5UizrcebOhHr8AHijOEqHd2hjXh5f6QIGfrkTFelc4/jzq1UyCsYntqz9Q==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-flip@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.8.tgz#153df0c677f79d4078bb9e4c1f2ac392b96dc3a1"
- integrity sha512-4il6Da6G39s9MyWBEee4jztEOUGJ40E6OlPjkMrdpDNvge6hYEAB31BczTYBP/CEY74j4LDSoY5LbcU4kv06yA==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-gaussian@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.8.tgz#100abc7ae1f19fe9c09ed41625b475aae7c6093c"
- integrity sha512-pVOblmjv7stZjsqloi4YzHVwAPXKGdNaHPhp4KP4vj41qtc6Hxd9z/+VWGYRTunMFac84gUToe0UKIXd6GhoKw==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-invert@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.8.tgz#f40bfaa3b592d21ff14ede0e49aabec88048cad0"
- integrity sha512-11zuLiXDHr6tFv4U8aieXqNXQEKbDbSBG/h+X62gGTNFpyn8EVPpncHhOqrAFtZUaPibBqMFlNJ15SzwC7ExsQ==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-mask@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.8.tgz#e64405f7dacf0672bff74f3b95b724d9ac517f86"
- integrity sha512-hZJ0OiKGJyv7hDSATwJDkunB1Ie80xJnONMgpUuUseteK45YeYNBOiZVUe8vum8QI1UwavgBzcvQ9u4fcgXc9g==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-normalize@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.8.tgz#a0180f2b8835e3638cdc5e057b44ac63f60db6ba"
- integrity sha512-Q4oYhU+sSyTJI7pMZlg9/mYh68ujLfOxXzQGEXuw0sHGoGQs3B0Jw7jmzGa6pIS06Hup5hD2Zuh1ppvMdjJBfQ==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-print@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.8.tgz#66309549e01896473111e3a0ad2cee428638bd6e"
- integrity sha512-2aokejGn4Drv1FesnZGqh5KEq0FQtR0drlmtyZrBH+r9cx7hh0Qgf4D1BOTDEgXkfSSngjGRjKKRW/fwOrVXYw==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
- load-bmfont "^1.4.0"
-
-"@jimp/plugin-resize@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.8.tgz#c26d9a973f7eec51ad9018fcbbac1146f7a73aa0"
- integrity sha512-27nPh8L1YWsxtfmV/+Ub5dOTpXyC0HMF2cu52RQSCYxr+Lm1+23dJF70AF1poUbUe+FWXphwuUxQzjBJza9UoA==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-rotate@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.8.tgz#2afda247984eeebed95c1bb1b13ccd3be5973299"
- integrity sha512-GbjETvL05BDoLdszNUV4Y0yLkHf177MnqGqilA113LIvx9aD0FtUopGXYfRGVvmtTOTouoaGJUc+K6qngvKxww==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugin-scale@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.8.tgz#5de403345859bb0b30bf3e242dedd8ceb6ecb96c"
- integrity sha512-GzIYWR/oCUK2jAwku23zt19V1ssaEU4pL0x2XsLNKuuJEU6DvEytJyTMXCE7OLG/MpDBQcQclJKHgiyQm5gIOQ==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
-
-"@jimp/plugins@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.8.tgz#5618170a986ced1ea795adcd9376122f2543b856"
- integrity sha512-fMcTI72Vn/Lz6JftezTURmyP5ml/xGMe0Ljx2KRJ85IWyP33vDmGIUuutFiBEbh2+y7lRT+aTSmjs0QGa/xTmQ==
- dependencies:
- "@jimp/plugin-blit" "^0.6.8"
- "@jimp/plugin-blur" "^0.6.8"
- "@jimp/plugin-color" "^0.6.8"
- "@jimp/plugin-contain" "^0.6.8"
- "@jimp/plugin-cover" "^0.6.8"
- "@jimp/plugin-crop" "^0.6.8"
- "@jimp/plugin-displace" "^0.6.8"
- "@jimp/plugin-dither" "^0.6.8"
- "@jimp/plugin-flip" "^0.6.8"
- "@jimp/plugin-gaussian" "^0.6.8"
- "@jimp/plugin-invert" "^0.6.8"
- "@jimp/plugin-mask" "^0.6.8"
- "@jimp/plugin-normalize" "^0.6.8"
- "@jimp/plugin-print" "^0.6.8"
- "@jimp/plugin-resize" "^0.6.8"
- "@jimp/plugin-rotate" "^0.6.8"
- "@jimp/plugin-scale" "^0.6.8"
- core-js "^2.5.7"
- timm "^1.6.1"
-
-"@jimp/png@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.8.tgz#ee06cf078b381137ec7206c4bb1b4cfcbe15ca6f"
- integrity sha512-JHHg/BZ7KDtHQrcG+a7fztw45rdf7okL/YwkN4qU5FH7Fcrp41nX5QnRviDtD9hN+GaNC7kvjvcqRAxW25qjew==
- dependencies:
- "@jimp/utils" "^0.6.8"
- core-js "^2.5.7"
- pngjs "^3.3.3"
-
-"@jimp/tiff@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.8.tgz#79bd22ed435edbe29d02a2c8c9bf829f988ebacc"
- integrity sha512-iWHbxd+0IKWdJyJ0HhoJCGYmtjPBOusz1z1HT/DnpePs/Lo3TO4d9ALXqYfUkyG74ZK5jULZ69KLtwuhuJz1bg==
- dependencies:
- core-js "^2.5.7"
- utif "^2.0.1"
-
-"@jimp/types@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.8.tgz#4510eb635cd00b201745d70e38f791748baa7075"
- integrity sha512-vCZ/Cp2osy69VP21XOBACfHI5HeR60Rfd4Jidj4W73UL+HrFWOtyQiJ7hlToyu1vI5mR/NsUQpzyQvz56ADm5A==
- dependencies:
- "@jimp/bmp" "^0.6.8"
- "@jimp/gif" "^0.6.8"
- "@jimp/jpeg" "^0.6.8"
- "@jimp/png" "^0.6.8"
- "@jimp/tiff" "^0.6.8"
- core-js "^2.5.7"
- timm "^1.6.1"
-
-"@jimp/utils@^0.6.8":
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.8.tgz#09f794945631173567aa50f72ac28170de58a63d"
- integrity sha512-7RDfxQ2C/rarNG9iso5vmnKQbcvlQjBIlF/p7/uYj72WeZgVCB+5t1fFBKJSU4WhniHX4jUMijK+wYGE3Y3bGw==
- dependencies:
- core-js "^2.5.7"
-
-"@nodelib/fs.scandir@2.1.3":
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
- integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
- dependencies:
- "@nodelib/fs.stat" "2.0.3"
- run-parallel "^1.1.9"
-
-"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
- integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
-
-"@nodelib/fs.walk@^1.2.3":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
- integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
- dependencies:
- "@nodelib/fs.scandir" "2.1.3"
- fastq "^1.6.0"
-
-"@sindresorhus/is@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
- integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
-
-"@sindresorhus/is@^0.7.0":
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
- integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
-
-"@szmarczak/http-timer@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
- integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
- dependencies:
- defer-to-connect "^1.0.1"
-
-"@types/color-name@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
- integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
-
-"@types/cordova@^0.0.34":
- version "0.0.34"
- resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04"
- integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ=
-
-"@types/filesystem@^0.0.29":
- version "0.0.29"
- resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748"
- integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw==
- dependencies:
- "@types/filewriter" "*"
-
-"@types/filewriter@*":
- version "0.0.28"
- resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3"
- integrity sha1-wFTor02d11205jq8dviFFocU1LM=
-
-"@types/glob@^7.1.1":
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987"
- integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==
- dependencies:
- "@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 "14.0.13"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9"
- integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==
-
-"@types/node@^12.7.5":
- version "12.7.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f"
- integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==
-
-"@types/q@^1.5.1":
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
- integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
-
-"@webassemblyjs/ast@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
- integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
- dependencies:
- "@webassemblyjs/helper-module-context" "1.9.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
- "@webassemblyjs/wast-parser" "1.9.0"
-
-"@webassemblyjs/floating-point-hex-parser@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
- integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
-
-"@webassemblyjs/helper-api-error@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
- integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
-
-"@webassemblyjs/helper-buffer@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
- integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
-
-"@webassemblyjs/helper-code-frame@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
- integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
- dependencies:
- "@webassemblyjs/wast-printer" "1.9.0"
-
-"@webassemblyjs/helper-fsm@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
- integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
-
-"@webassemblyjs/helper-module-context@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
- integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
-
-"@webassemblyjs/helper-wasm-bytecode@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
- integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
-
-"@webassemblyjs/helper-wasm-section@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
- integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-buffer" "1.9.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
- "@webassemblyjs/wasm-gen" "1.9.0"
-
-"@webassemblyjs/ieee754@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
- integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
- integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
- integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
-
-"@webassemblyjs/wasm-edit@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
- integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-buffer" "1.9.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
- "@webassemblyjs/helper-wasm-section" "1.9.0"
- "@webassemblyjs/wasm-gen" "1.9.0"
- "@webassemblyjs/wasm-opt" "1.9.0"
- "@webassemblyjs/wasm-parser" "1.9.0"
- "@webassemblyjs/wast-printer" "1.9.0"
-
-"@webassemblyjs/wasm-gen@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
- integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
- "@webassemblyjs/ieee754" "1.9.0"
- "@webassemblyjs/leb128" "1.9.0"
- "@webassemblyjs/utf8" "1.9.0"
-
-"@webassemblyjs/wasm-opt@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
- integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-buffer" "1.9.0"
- "@webassemblyjs/wasm-gen" "1.9.0"
- "@webassemblyjs/wasm-parser" "1.9.0"
-
-"@webassemblyjs/wasm-parser@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
- integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-api-error" "1.9.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
- "@webassemblyjs/ieee754" "1.9.0"
- "@webassemblyjs/leb128" "1.9.0"
- "@webassemblyjs/utf8" "1.9.0"
-
-"@webassemblyjs/wast-parser@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
- integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/floating-point-hex-parser" "1.9.0"
- "@webassemblyjs/helper-api-error" "1.9.0"
- "@webassemblyjs/helper-code-frame" "1.9.0"
- "@webassemblyjs/helper-fsm" "1.9.0"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/wast-printer@1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
- integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/wast-parser" "1.9.0"
- "@xtuc/long" "4.2.2"
-
-"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
-abab@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82"
- integrity sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==
-
-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.4:
- 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"
-
-acorn-globals@^4.3.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
- integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
- dependencies:
- acorn "^6.0.1"
- acorn-walk "^6.0.1"
-
-acorn-jsx@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
- integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
- dependencies:
- acorn "^3.0.4"
-
-acorn-jsx@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
- integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
-
-acorn-walk@^6.0.1:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
- integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
-
-acorn@^3.0.4:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
- integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
-
-acorn@^5.5.0:
- version "5.7.3"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
- integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
-
-acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
- integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
-
-acorn@^6.4.1:
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
- integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
-
-after@0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
- integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
-
-ajv-errors@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
- integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
-
-ajv-keywords@^1.0.0:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
- integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw=
-
-ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
- integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-
-ajv@^4.7.0:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
- integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
- dependencies:
- co "^4.6.0"
- json-stable-stringify "^1.0.1"
-
-ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1:
- version "6.10.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
- integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
- dependencies:
- fast-deep-equal "^2.0.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ajv@^6.12.0:
- 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"
-
-alphanum-sort@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
- integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-
-amdefine@>=0.0.4:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
- integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
-
-ansi-colors@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
- integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
- dependencies:
- ansi-wrap "^0.1.0"
-
-ansi-colors@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-cyan@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
- integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=
- dependencies:
- ansi-wrap "0.1.0"
-
-ansi-escapes@^1.1.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
- integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
-
-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-gray@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
- integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
- dependencies:
- ansi-wrap "0.1.0"
-
-ansi-red@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
- integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=
- dependencies:
- ansi-wrap "0.1.0"
-
-ansi-regex@^0.2.0, ansi-regex@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
- integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=
-
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
- integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-
-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-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
-
-ansi-styles@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
- integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=
-
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
- integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-
-ansi-styles@^3.2.0, 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-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
- integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
- dependencies:
- "@types/color-name" "^1.1.1"
- color-convert "^2.0.1"
-
-ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
- integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
-
-any-base@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
- integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==
-
-anymatch@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
- integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
- dependencies:
- micromatch "^3.1.4"
- normalize-path "^2.1.1"
-
-anymatch@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
- integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-append-buffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
- integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
- dependencies:
- buffer-equal "^1.0.0"
-
-aproba@^1.0.3, aproba@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
- integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
-
-arch@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
- integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
-
-archive-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
- integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=
- dependencies:
- file-type "^4.2.0"
-
-archiver@~0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690"
- integrity sha1-mBd9p6bAGSt/J5jzDNbquKvXZpA=
- dependencies:
- async "~0.9.0"
- buffer-crc32 "~0.2.1"
- glob "~3.2.6"
- lazystream "~0.1.0"
- lodash "~2.4.1"
- readable-stream "~1.0.26"
- tar-stream "~0.4.0"
- zip-stream "~0.4.0"
-
-archy@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
-
-are-we-there-yet@~1.1.2:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
- integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
- dependencies:
- delegates "^1.0.0"
- readable-stream "^2.0.6"
-
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
-
-arr-diff@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
- integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo=
- dependencies:
- arr-flatten "^1.0.1"
- array-slice "^0.2.3"
-
-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-filter@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee"
- integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=
- dependencies:
- make-iterator "^1.0.0"
-
-arr-flatten@^1.0.1, 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-map@^2.0.0, arr-map@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4"
- integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ=
- dependencies:
- make-iterator "^1.0.0"
-
-arr-union@^2.0.1:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
- integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=
-
-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-differ@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
- integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=
-
-array-each@^1.0.0, array-each@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
- integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
-
-array-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
- integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-
-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-initial@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795"
- integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U=
- dependencies:
- array-slice "^1.0.0"
- is-number "^4.0.0"
-
-array-last@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336"
- integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==
- dependencies:
- is-number "^4.0.0"
-
-array-slice@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
- integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU=
-
-array-slice@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
- integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
-
-array-sort@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
- integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
- dependencies:
- default-compare "^1.0.0"
- get-value "^2.0.6"
- kind-of "^5.0.2"
-
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
-array-uniq@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
- integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
-
-array-uniq@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98"
- integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==
-
-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=
-
-arraybuffer.slice@~0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
- integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
-
-asar@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/asar/-/asar-2.0.1.tgz#8518a1c62c238109c15a5f742213e83a09b9fd38"
- integrity sha512-Vo9yTuUtyFahkVMFaI6uMuX6N7k5DWa6a/8+7ov0/f8Lq9TVR0tUjzSzxQSxT1Y+RJIZgnP7BVb6Uhi+9cjxqA==
- dependencies:
- chromium-pickle-js "^0.2.0"
- commander "^2.20.0"
- cuint "^0.2.2"
- glob "^7.1.3"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- tmp-promise "^1.0.5"
-
-asn1.js@^4.0.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
- integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-asn1@~0.2.0, 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=
-
-assert@^1.1.1:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
- integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
- dependencies:
- object-assign "^4.1.1"
- util "0.10.3"
-
-assets@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/assets/-/assets-3.0.1.tgz#7a69f4bcc3aca9702760e2a73a7e76ca93e9e3e0"
- integrity sha512-fTyLNf/9V24y5zO83f4DAEuvaKj7MWBixbnqdZneAhsv1r21yQ/6ogZfvXHmphJAHsz4DhuOwHeJKVbGqqvk0Q==
- dependencies:
- async "^2.5.0"
- bluebird "^3.4.6"
- calipers "^2.0.0"
- calipers-gif "^2.0.0"
- calipers-jpeg "^2.0.0"
- calipers-png "^2.0.0"
- calipers-svg "^2.0.0"
- calipers-webp "^2.0.0"
- glob "^7.0.6"
- lodash "^4.15.0"
- mime "^2.4.0"
-
-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=
-
-ast-types@0.9.6:
- version "0.9.6"
- resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
- integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
-
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
-
-async-done@^1.2.0, async-done@^1.2.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2"
- integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.2"
- process-nextick-args "^2.0.0"
- stream-exhaust "^1.0.1"
-
-async-each-series@0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432"
- integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=
-
-async-each@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
- integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
-
-async-foreach@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
- integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
-
-async-limiter@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
- integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
-
-async-settle@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b"
- integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=
- dependencies:
- async-done "^1.2.2"
-
-async@1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
- integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
-
-async@>=0.2.9:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772"
- integrity sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==
-
-async@^2.5.0:
- 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"
-
-async@~0.2.10:
- version "0.2.10"
- resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
- integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
-
-async@~0.9.0:
- version "0.9.2"
- resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
- integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
-
-async@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
- integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
-
-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.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
- integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
-audiosprite@*, audiosprite@^0.7.2:
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/audiosprite/-/audiosprite-0.7.2.tgz#ac431a6c30c127bbb6ed743e5d178862ddf9e31e"
- integrity sha512-9Z6UwUuv4To5nUQNRIw5/Q3qA7HYm0ANzoW5EDGPEsU2oIRVgmIlLlm9YZfpPKoeUxt54vMStl2/762189VmJw==
- dependencies:
- async "~0.9.0"
- glob "^6.0.4"
- mkdirp "^0.5.0"
- optimist "~0.6.1"
- underscore "~1.8.3"
- winston "~1.0.0"
-
-author-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450"
- integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=
-
-autoprefixer@^9.4.3, autoprefixer@^9.4.7, autoprefixer@^9.6.1:
- version "9.6.1"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
- integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==
- dependencies:
- browserslist "^4.6.3"
- caniuse-lite "^1.0.30000980"
- chalk "^2.4.2"
- normalize-range "^0.1.2"
- num2fraction "^1.2.2"
- postcss "^7.0.17"
- postcss-value-parser "^4.0.0"
-
-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.8.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
- integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
-
-axios@0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"
- integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==
- dependencies:
- follow-redirects "1.5.10"
- is-buffer "^2.0.2"
-
-babel-loader@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
- integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
- dependencies:
- find-cache-dir "^2.1.0"
- loader-utils "^1.4.0"
- mkdirp "^0.5.3"
- pify "^4.0.1"
- schema-utils "^2.6.5"
-
-babel-plugin-closure-elimination@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-closure-elimination/-/babel-plugin-closure-elimination-1.3.0.tgz#3217fbf6d416dfdf14ff41a8a34e4d0a6bfc22b2"
- integrity sha512-ClKuSxKLLNhe69bvTMuONDI0dQDW49lXB2qtQyyKCzvwegRGel/q4/e+1EoDNDN97Hf1QkxGMbzpAGPmU4Tfjw==
-
-babel-plugin-console-source@^2.0.2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/babel-plugin-console-source/-/babel-plugin-console-source-2.0.4.tgz#263985b1d69b68e463358d087fa877dd967c5f41"
- integrity sha512-OGhrdhuMjiEW0Ma0P9e2B4dFddCpJ/xN/RRaM/4wwDLl+6ZKf+Xd77FtVjpNeDzNRNk8wjRdStA4hpZizXzl1g==
-
-babel-plugin-danger-remove-unused-import@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-danger-remove-unused-import/-/babel-plugin-danger-remove-unused-import-1.1.2.tgz#ac39c30edfe524ef8cfc411fec5edc479d19e132"
- integrity sha512-3bNmVAaakP3b1aROj7O3bOWj2kBa85sZR5naZ3Rn8L9buiZaAyZLgjfrPDL3zhX4wySOA5jrTm/wSmJPsMm3cg==
-
-babel-plugin-dynamic-import-node@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
- integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
- dependencies:
- object.assign "^4.1.0"
-
-babel-runtime@^7.0.0-beta.3:
- version "7.0.0-beta.3"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz#7c750de5514452c27612172506b49085a4a630f2"
- integrity sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg==
- dependencies:
- core-js "^2.4.0"
- regenerator-runtime "^0.11.0"
-
-bach@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880"
- integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=
- dependencies:
- arr-filter "^1.1.1"
- arr-flatten "^1.0.1"
- arr-map "^2.0.0"
- array-each "^1.0.0"
- array-initial "^1.0.0"
- array-last "^1.1.1"
- async-done "^1.2.2"
- async-settle "^1.0.0"
- now-and-later "^2.0.0"
-
-backo2@1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
- integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
-
-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-arraybuffer@0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
- integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
-
-base64-js@^1.0.2, 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==
-
-base64id@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
- integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=
-
-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"
-
-batch@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
- integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
-
-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"
-
-beeper@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
- integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=
-
-better-assert@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
- integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
- dependencies:
- callsite "1.0.0"
-
-big.js@^3.1.3:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
- integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
-
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-bin-build@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861"
- integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==
- dependencies:
- decompress "^4.0.0"
- download "^6.2.2"
- execa "^0.7.0"
- p-map-series "^1.0.0"
- tempfile "^2.0.0"
-
-bin-check@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49"
- integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==
- dependencies:
- execa "^0.7.0"
- executable "^4.1.0"
-
-bin-version-check@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71"
- integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==
- dependencies:
- bin-version "^3.0.0"
- semver "^5.6.0"
- semver-truncate "^1.1.2"
-
-bin-version@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839"
- integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==
- dependencies:
- execa "^1.0.0"
- find-versions "^3.0.0"
-
-bin-wrapper@^4.0.0, bin-wrapper@^4.0.1:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605"
- integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==
- dependencies:
- bin-check "^4.1.0"
- bin-version-check "^4.0.0"
- download "^7.1.0"
- import-lazy "^3.1.0"
- os-filter-obj "^2.0.0"
- pify "^4.0.1"
-
-binary-extensions@^1.0.0:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
- integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
-
-binary-extensions@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
- integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
-
-bl@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b"
- integrity sha1-P7BnBgKsKHjrdw3CA58YNr5irls=
- dependencies:
- readable-stream "~1.0.2"
-
-bl@^0.9.0:
- version "0.9.5"
- resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
- integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=
- dependencies:
- readable-stream "~1.0.26"
-
-bl@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
- integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
- dependencies:
- readable-stream "^2.3.5"
- safe-buffer "^5.1.1"
-
-blob@0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
- integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
-
-block-stream@*:
- version "0.0.9"
- resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
- integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
- dependencies:
- inherits "~2.0.0"
-
-bluebird@3.x.x, bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.5:
- version "3.5.5"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
- integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
-
-bmp-js@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
- integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
-
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
- integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
-
-body-parser@~1.8.0:
- version "1.8.4"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.8.4.tgz#d497e04bc13b3f9a8bd8c70bb0cdc16f2e028898"
- integrity sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg=
- dependencies:
- bytes "1.0.0"
- depd "0.4.5"
- iconv-lite "0.4.4"
- media-typer "0.3.0"
- on-finished "2.1.0"
- qs "2.2.4"
- raw-body "1.3.0"
- type-is "~1.5.1"
-
-boolbase@^1.0.0, boolbase@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
- integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-
-brace-expansion@^1.0.0, 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, braces@^2.3.2:
- 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"
-
-braces@^3.0.1, braces@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
- dependencies:
- fill-range "^7.0.1"
-
-brorand@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
- integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-
-browser-process-hrtime@^0.1.2:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
- integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==
-
-browser-sync-client@^2.26.10:
- version "2.26.10"
- resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.10.tgz#ca9309ba19f9695e7945b95062da8a7ef3156711"
- integrity sha512-8pYitKwpVva7hzXJI8lTljNDbA9fjMEobHSxWqegIUon/GjJAG3UgHB/+lBWnOLzTY8rGX66MvGqL1Aknyrj7g==
- dependencies:
- etag "1.8.1"
- fresh "0.5.2"
- mitt "^1.1.3"
- rxjs "^5.5.6"
-
-browser-sync-ui@^2.26.10:
- version "2.26.10"
- resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.10.tgz#7b4b378de204b3913d4b8a6f93b16b1ba769d4bc"
- integrity sha512-UfNSBItlXcmEvJ9RE4JooNtIsiIfHowp+7/52Jz4VFfQD4v78QK5/NV9DVrG41oMM3zLyhW4f/RliOb4ysStZg==
- dependencies:
- async-each-series "0.1.1"
- connect-history-api-fallback "^1"
- immutable "^3"
- server-destroy "1.0.1"
- socket.io-client "^2.0.4"
- stream-throttle "^0.1.3"
-
-browser-sync@^2.26.10:
- version "2.26.10"
- resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.10.tgz#f03c043f615cf53c9294ccb2a5a5e25cfe11a230"
- integrity sha512-JeVQP3CARvNA1DELj+ZGWj+/0pzE8+Omvq1WNgzaTXVdP3lNEbGxZbkjvLK7hHpQywjQ1sDJWlJQZT6V59XDTg==
- dependencies:
- browser-sync-client "^2.26.10"
- browser-sync-ui "^2.26.10"
- bs-recipes "1.3.4"
- bs-snippet-injector "^2.0.1"
- chokidar "^3.4.1"
- connect "3.6.6"
- connect-history-api-fallback "^1"
- dev-ip "^1.0.1"
- easy-extender "^2.3.4"
- eazy-logger "^3"
- etag "^1.8.1"
- fresh "^0.5.2"
- fs-extra "3.0.1"
- http-proxy "^1.18.1"
- immutable "^3"
- localtunnel "^2.0.0"
- micromatch "^4.0.2"
- opn "5.3.0"
- portscanner "2.1.1"
- qs "6.2.3"
- raw-body "^2.3.2"
- resp-modifier "6.0.2"
- rx "4.1.0"
- send "0.16.2"
- serve-index "1.9.1"
- serve-static "1.13.2"
- server-destroy "1.0.1"
- socket.io "2.1.1"
- ua-parser-js "^0.7.18"
- yargs "^15.4.1"
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
- integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
- dependencies:
- buffer-xor "^1.0.3"
- cipher-base "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.3"
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-browserify-cipher@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
- integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
- dependencies:
- browserify-aes "^1.0.4"
- browserify-des "^1.0.0"
- evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
- integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
- dependencies:
- cipher-base "^1.0.1"
- des.js "^1.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-browserify-rsa@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
- integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
- dependencies:
- bn.js "^4.1.0"
- randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
- integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
- dependencies:
- bn.js "^4.1.1"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.2"
- elliptic "^6.0.0"
- inherits "^2.0.1"
- parse-asn1 "^5.0.0"
-
-browserify-zlib@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
- integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
- dependencies:
- pako "~1.0.5"
-
-browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
- integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
- dependencies:
- caniuse-lite "^1.0.30000989"
- electron-to-chromium "^1.3.247"
- node-releases "^1.1.29"
-
-bs-recipes@1.3.4:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585"
- integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=
-
-bs-snippet-injector@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5"
- integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=
-
-buffer-alloc-unsafe@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
- integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
-
-buffer-alloc@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
- integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
- dependencies:
- buffer-alloc-unsafe "^1.1.0"
- buffer-fill "^1.0.0"
-
-buffer-crc32@~0.2.1, buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-buffer-equal@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
- integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
-
-buffer-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
- integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
-
-buffer-fill@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
- integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
-
-buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
-
-buffer-xor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
- integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
-
-buffer@^4.3.0:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
- integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
- isarray "^1.0.0"
-
-buffer@^5.2.0, buffer@^5.2.1:
- version "5.4.3"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115"
- integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
-
-bufferstreams@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-2.0.1.tgz#441b267c2fc3fee02bb1d929289da113903bd5ef"
- integrity sha512-ZswyIoBfFb3cVDsnZLLj2IDJ/0ppYdil/v2EGlZXvoefO689FokEmFEldhN5dV7R2QBxFneqTJOMIpfqhj+n0g==
- dependencies:
- readable-stream "^2.3.6"
-
-builtin-status-codes@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
- integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-
-bytes@1, bytes@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
- integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
-
-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==
-
-cacache@^12.0.2:
- version "12.0.3"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
- integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==
- dependencies:
- bluebird "^3.5.5"
- chownr "^1.1.1"
- figgy-pudding "^3.5.1"
- glob "^7.1.4"
- graceful-fs "^4.1.15"
- infer-owner "^1.0.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- move-concurrently "^1.0.1"
- promise-inflight "^1.0.1"
- rimraf "^2.6.3"
- ssri "^6.0.1"
- unique-filename "^1.1.1"
- y18n "^4.0.0"
-
-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"
-
-cache-swap@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/cache-swap/-/cache-swap-0.3.0.tgz#1c541aa108a50106f630bdd98fe1dec8ba133f51"
- integrity sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E=
- dependencies:
- graceful-fs "^4.1.2"
- mkdirp "^0.5.1"
- object-assign "^4.0.1"
- rimraf "^2.4.0"
-
-cacheable-request@^2.1.1:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
- integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=
- dependencies:
- clone-response "1.0.2"
- get-stream "3.0.0"
- http-cache-semantics "3.8.1"
- keyv "3.0.0"
- lowercase-keys "1.0.0"
- normalize-url "2.0.1"
- responselike "1.0.2"
-
-cacheable-request@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
- integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^3.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
- responselike "^1.0.2"
-
-calipers-gif@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/calipers-gif/-/calipers-gif-2.0.0.tgz#b5eefec3064a77c6dcdbd5bdc51735a01bafdc37"
- integrity sha1-te7+wwZKd8bc29W9xRc1oBuv3Dc=
- dependencies:
- bluebird "3.x.x"
-
-calipers-jpeg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/calipers-jpeg/-/calipers-jpeg-2.0.0.tgz#06d56a53f62717dd809cb956cf64423ce693465b"
- integrity sha1-BtVqU/YnF92AnLlWz2RCPOaTRls=
- dependencies:
- bluebird "3.x.x"
-
-calipers-png@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/calipers-png/-/calipers-png-2.0.0.tgz#1d0d20e5c1ae5f79b74d5286a2e97f59bb70b658"
- integrity sha1-HQ0g5cGuX3m3TVKGoul/Wbtwtlg=
- dependencies:
- bluebird "3.x.x"
-
-calipers-svg@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/calipers-svg/-/calipers-svg-2.0.1.tgz#cd9eaa58ef7428c1a14f5da57e56715fb60f6541"
- integrity sha512-3PROqHARmj8wWudUC7DzXm1+mSocqgY7jNuehFNHgrUVrKf8o7MqDjS92vJz5LvZsAofJsoAFMajkqwbxBROSQ==
- dependencies:
- bluebird "3.x.x"
-
-calipers-webp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/calipers-webp/-/calipers-webp-2.0.0.tgz#e126ece2f84cd71779612bfa2b2653cd95cea77a"
- integrity sha1-4Sbs4vhM1xd5YSv6KyZTzZXOp3o=
- dependencies:
- bluebird "3.x.x"
-
-calipers@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/calipers/-/calipers-2.0.1.tgz#0d3f303ce75ec5f1eda7fecfc7dba6736e35c926"
- integrity sha512-AP4Ui2Z8fZf69d8Dx4cfJgPjQHY3m+QXGFCaAGu8pfNQjyajkosS+Kkf1n6pQDMZcelN5h3MdcjweUqxcsS4pg==
- dependencies:
- bluebird "3.x.x"
-
-caller-callsite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
- dependencies:
- callsites "^2.0.0"
-
-caller-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
- integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
- dependencies:
- callsites "^0.2.0"
-
-caller-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
- dependencies:
- caller-callsite "^2.0.0"
-
-callsite@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
- integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
-
-callsites@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
- integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
-
-callsites@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
-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==
-
-camel-case@3.0.x:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
- integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
- dependencies:
- no-case "^2.2.0"
- upper-case "^1.1.1"
-
-camelcase-keys@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
- integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
- dependencies:
- camelcase "^2.0.0"
- map-obj "^1.0.0"
-
-camelcase@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
- integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-
-camelcase@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
- integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
-
-camelcase@^5.0.0:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-caniuse-api@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
- integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
- dependencies:
- browserslist "^4.0.0"
- caniuse-lite "^1.0.0"
- lodash.memoize "^4.1.2"
- lodash.uniq "^4.5.0"
-
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989:
- version "1.0.30000989"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
- integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-
-caw@^2.0.0, caw@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95"
- integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==
- dependencies:
- get-proxy "^2.0.0"
- isurl "^1.0.0-alpha5"
- tunnel-agent "^0.6.0"
- url-to-options "^1.0.1"
-
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, 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"
-
-chalk@^0.5.0:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174"
- integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=
- dependencies:
- ansi-styles "^1.1.0"
- escape-string-regexp "^1.0.0"
- has-ansi "^0.1.0"
- strip-ansi "^0.3.0"
- supports-color "^0.2.0"
-
-chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
- dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
-
-chalk@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
- integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.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==
-
-chokidar@^2.0.0, chokidar@^2.1.8:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
- integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
- dependencies:
- anymatch "^2.0.0"
- async-each "^1.0.1"
- braces "^2.3.2"
- glob-parent "^3.1.0"
- inherits "^2.0.3"
- is-binary-path "^1.0.0"
- is-glob "^4.0.0"
- normalize-path "^3.0.0"
- path-is-absolute "^1.0.0"
- readdirp "^2.2.1"
- upath "^1.1.1"
- optionalDependencies:
- fsevents "^1.2.7"
-
-chokidar@^3.4.0, chokidar@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
- integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
- dependencies:
- anymatch "~3.1.1"
- braces "~3.0.2"
- glob-parent "~5.1.0"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.4.0"
- optionalDependencies:
- fsevents "~2.1.2"
-
-chownr@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
- integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
-
-chrome-trace-event@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
- integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
- dependencies:
- tslib "^1.9.0"
-
-chromium-pickle-js@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
- integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
-
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-circular-dependency-plugin@^5.0.2:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93"
- integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==
-
-circular-json@^0.3.1:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
- integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
-
-circular-json@^0.5.9:
- version "0.5.9"
- resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d"
- integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==
-
-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"
-
-clean-css@4.2.x:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
- integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
- dependencies:
- source-map "~0.6.0"
-
-cli-cursor@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
- integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
- dependencies:
- restore-cursor "^1.0.1"
-
-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=
-
-clipboard-copy@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-3.1.0.tgz#4c59030a43d4988990564a664baeafba99f78ca4"
- integrity sha512-Xsu1NddBXB89IUauda5BIq3Zq73UWkjkaQlPQbLNvNsd5WBMnTWPNKYR6HGaySOxGYZ+BKxP2E9X4ElnI3yiPA==
-
-cliui@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
- integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wrap-ansi "^2.0.0"
-
-cliui@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
- integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
- dependencies:
- string-width "^3.1.0"
- strip-ansi "^5.2.0"
- wrap-ansi "^5.1.0"
-
-cliui@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
- integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^6.2.0"
-
-clone-buffer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
- integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
-
-clone-response@1.0.2, clone-response@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
- dependencies:
- mimic-response "^1.0.0"
-
-clone-stats@^0.0.1, clone-stats@~0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
- integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=
-
-clone-stats@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
- integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
-
-clone@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
- integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=
-
-clone@^1.0.0, clone@^1.0.2:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
- integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-
-clone@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
-cloneable-readable@^1.0.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
- integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
- dependencies:
- inherits "^2.0.1"
- process-nextick-args "^2.0.0"
- readable-stream "^2.3.5"
-
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
- integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
-
-coa@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
- integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
- dependencies:
- "@types/q" "^1.5.1"
- chalk "^2.4.1"
- q "^1.1.2"
-
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
-collection-map@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c"
- integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=
- dependencies:
- arr-map "^2.0.2"
- for-own "^1.0.0"
- make-iterator "^1.0.0"
-
-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, color-convert@^1.9.1:
- 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-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-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=
-
-color-name@^1.0.0, color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-color-string@^1.5.2:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
- integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
- dependencies:
- color-name "^1.0.0"
- simple-swizzle "^0.2.2"
-
-color-support@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
- integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-
-color@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
- integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
- dependencies:
- color-convert "^1.9.1"
- color-string "^1.5.2"
-
-colors@1.0.x:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
- integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
-
-colors@^1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
- integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
-
-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"
-
-commander@2.17.x:
- version "2.17.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
- integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
-
-commander@^2.19.0, commander@^2.2.0, commander@^2.20.0, commander@^2.8.1:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
- integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
-
-commander@~2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
- integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
-
-commander@~2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
- integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
- dependencies:
- graceful-readlink ">= 1.0.0"
-
-commondir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
- integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
-
-compare-version@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
- integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
-
-component-bind@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
- integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
-
-component-emitter@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
- integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
-
-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==
-
-component-inherit@0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
- integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
-
-compress-commons@~0.1.0:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3"
- integrity sha1-DHQIcP3ljLpRbwrAyCLjOguF36M=
- dependencies:
- buffer-crc32 "~0.2.1"
- crc32-stream "~0.3.1"
- readable-stream "~1.0.26"
-
-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=
-
-concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.0:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
- dependencies:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^2.2.2"
- typedarray "^0.0.6"
-
-concat-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1"
- integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
- dependencies:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.0.2"
- typedarray "^0.0.6"
-
-config-chain@^1.1.11, config-chain@^1.1.12:
- version "1.1.12"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
- integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
-connect-history-api-fallback@^1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
- integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
-
-connect-livereload@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.4.1.tgz#0f8a1a816bc9baffae4637ccea917462fe35917a"
- integrity sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo=
-
-connect@3.6.6:
- version "3.6.6"
- resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
- integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=
- dependencies:
- debug "2.6.9"
- finalhandler "1.1.0"
- parseurl "~1.3.2"
- utils-merge "1.0.1"
-
-connect@^3.0.1:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
- integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
- dependencies:
- debug "2.6.9"
- finalhandler "1.1.2"
- parseurl "~1.3.3"
- utils-merge "1.0.1"
-
-console-browserify@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
- integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
- dependencies:
- date-now "^0.1.4"
-
-console-control-strings@^1.0.0, console-control-strings@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-
-console-stream@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
- integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=
-
-constants-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
- integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-
-content-disposition@^0.5.2:
- 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"
-
-convert-source-map@^1.5.0, convert-source-map@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
- integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
- dependencies:
- safe-buffer "~5.1.1"
-
-cookie@0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
- integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
-
-copy-concurrently@^1.0.0:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
- integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
- dependencies:
- aproba "^1.1.1"
- fs-write-stream-atomic "^1.0.8"
- iferr "^0.1.5"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.0"
-
-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=
-
-copy-props@^2.0.1:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe"
- integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
- dependencies:
- each-props "^1.3.0"
- is-plain-object "^2.0.1"
-
-core-js-compat@^3.1.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150"
- integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==
- dependencies:
- browserslist "^4.6.6"
- semver "^6.3.0"
-
-core-js@3:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09"
- integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==
-
-core-js@^2.4.0, core-js@^2.5.7:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
- integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cosmiconfig@^5.0.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
- integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
- dependencies:
- import-fresh "^2.0.0"
- is-directory "^0.3.1"
- js-yaml "^3.13.1"
- parse-json "^4.0.0"
-
-crc32-stream@~0.3.1:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552"
- integrity sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI=
- dependencies:
- buffer-crc32 "~0.2.1"
- readable-stream "~1.0.24"
-
-create-ecdh@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
- integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
- dependencies:
- bn.js "^4.1.0"
- elliptic "^6.0.0"
-
-create-hash@^1.1.0, create-hash@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
- integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
- dependencies:
- cipher-base "^1.0.1"
- inherits "^2.0.1"
- md5.js "^1.3.4"
- ripemd160 "^2.0.1"
- sha.js "^2.4.0"
-
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
- integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
- dependencies:
- cipher-base "^1.0.3"
- create-hash "^1.1.0"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-cross-spawn@6.0.5, 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"
-
-cross-spawn@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
- integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
- dependencies:
- lru-cache "^4.0.1"
- which "^1.2.9"
-
-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@^7.0.0:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cross-zip@^2.1.5:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/cross-zip/-/cross-zip-2.1.6.tgz#344d3ba9488609942987d815bb84860cff3d9491"
- integrity sha512-xLIETNkzRcU6jGRzenJyRFxahbtP4628xEKMTI/Ql0Vu8m4h8M7uRLVi7E5OYHuJ6VQPsG4icJumKAFUvfm0+A==
- dependencies:
- rimraf "^3.0.0"
-
-crypto-browserify@^3.11.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
- dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
-
-crypto@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037"
- integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==
-
-css-blank-pseudo@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
- integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==
- dependencies:
- postcss "^7.0.5"
-
-css-color-names@0.0.4, css-color-names@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
- integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
-
-css-declaration-sorter@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
- integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
- dependencies:
- postcss "^7.0.1"
- timsort "^0.3.0"
-
-css-has-pseudo@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
- integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==
- dependencies:
- postcss "^7.0.6"
- postcss-selector-parser "^5.0.0-rc.4"
-
-css-loader@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.9.1.tgz#2e1aa00ce7e30ef2c6a7a4b300a080a7c979e0dc"
- integrity sha1-LhqgDOfjDvLGp6SzAKCAp8l54Nw=
- dependencies:
- csso "1.3.x"
- loader-utils "~0.2.2"
- source-map "~0.1.38"
-
-css-mqpacker@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/css-mqpacker/-/css-mqpacker-7.0.0.tgz#48f4a0ff45b81ec661c4a33ed80b9db8a026333b"
- integrity sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA==
- dependencies:
- minimist "^1.2.0"
- postcss "^7.0.0"
-
-css-prefers-color-scheme@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4"
- integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==
- dependencies:
- postcss "^7.0.5"
-
-css-select-base-adapter@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
- integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
-
-css-select@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede"
- integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==
- dependencies:
- boolbase "^1.0.0"
- css-what "^2.1.2"
- domutils "^1.7.0"
- nth-check "^1.0.2"
-
-css-tree@1.0.0-alpha.29:
- version "1.0.0-alpha.29"
- resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
- integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==
- dependencies:
- mdn-data "~1.1.0"
- source-map "^0.5.3"
-
-css-tree@1.0.0-alpha.33:
- version "1.0.0-alpha.33"
- resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e"
- integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==
- dependencies:
- mdn-data "2.0.4"
- source-map "^0.5.3"
-
-css-unit-converter@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
- integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
-
-css-what@^2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
- integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
-
-cssdb@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
- integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==
-
-cssesc@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
- integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
-
-cssnano-preset-advanced@^4.0.7:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88"
- integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw==
- dependencies:
- autoprefixer "^9.4.7"
- cssnano-preset-default "^4.0.7"
- postcss-discard-unused "^4.0.1"
- postcss-merge-idents "^4.0.1"
- postcss-reduce-idents "^4.0.2"
- postcss-zindex "^4.0.1"
-
-cssnano-preset-default@^4.0.7:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
- integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
- dependencies:
- css-declaration-sorter "^4.0.1"
- cssnano-util-raw-cache "^4.0.1"
- postcss "^7.0.0"
- postcss-calc "^7.0.1"
- postcss-colormin "^4.0.3"
- postcss-convert-values "^4.0.1"
- postcss-discard-comments "^4.0.2"
- postcss-discard-duplicates "^4.0.2"
- postcss-discard-empty "^4.0.1"
- postcss-discard-overridden "^4.0.1"
- postcss-merge-longhand "^4.0.11"
- postcss-merge-rules "^4.0.3"
- postcss-minify-font-values "^4.0.2"
- postcss-minify-gradients "^4.0.2"
- postcss-minify-params "^4.0.2"
- postcss-minify-selectors "^4.0.2"
- postcss-normalize-charset "^4.0.1"
- postcss-normalize-display-values "^4.0.2"
- postcss-normalize-positions "^4.0.2"
- postcss-normalize-repeat-style "^4.0.2"
- postcss-normalize-string "^4.0.2"
- postcss-normalize-timing-functions "^4.0.2"
- postcss-normalize-unicode "^4.0.1"
- postcss-normalize-url "^4.0.1"
- postcss-normalize-whitespace "^4.0.2"
- postcss-ordered-values "^4.1.2"
- postcss-reduce-initial "^4.0.3"
- postcss-reduce-transforms "^4.0.2"
- postcss-svgo "^4.0.2"
- postcss-unique-selectors "^4.0.1"
-
-cssnano-util-get-arguments@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
- integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
-
-cssnano-util-get-match@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
- integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
-
-cssnano-util-raw-cache@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
- integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
- dependencies:
- postcss "^7.0.0"
-
-cssnano-util-same-parent@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
- integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
-
-cssnano@^4.1.10:
- version "4.1.10"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
- integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
- dependencies:
- cosmiconfig "^5.0.0"
- cssnano-preset-default "^4.0.7"
- is-resolvable "^1.0.0"
- postcss "^7.0.0"
-
-csso@1.3.x:
- version "1.3.12"
- resolved "https://registry.yarnpkg.com/csso/-/csso-1.3.12.tgz#fc628694a2d38938aaac4996753218fd311cdb9e"
- integrity sha1-/GKGlKLTiTiqrEmWdTIY/TEc254=
-
-csso@^3.5.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
- integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==
- dependencies:
- css-tree "1.0.0-alpha.29"
-
-cssom@0.3.x, cssom@^0.3.4:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
- integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
-
-cssstyle@^1.1.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
- integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
- dependencies:
- cssom "0.3.x"
-
-cuint@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
- integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=
-
-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"
-
-cycle@1.0.x:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
- integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
-
-cyclist@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
- integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
-
-d@1, d@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
- integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
- dependencies:
- es5-ext "^0.10.50"
- type "^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"
-
-data-urls@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
- integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
- dependencies:
- abab "^2.0.0"
- whatwg-mimetype "^2.2.0"
- whatwg-url "^7.0.0"
-
-date-now@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
- integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
-
-dateformat@^1.0.7-1.2.3:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
- integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
- dependencies:
- get-stdin "^4.0.1"
- meow "^3.3.0"
-
-dateformat@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
- integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=
-
-debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
- 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"
-
-debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
-debug@=3.1.0, debug@~3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
- dependencies:
- ms "2.0.0"
-
-debug@^3.1.0, debug@^3.2.6:
- version "3.2.6"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
- integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
- dependencies:
- ms "^2.1.1"
-
-debug@~0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130"
- integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=
-
-decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
-
-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=
-
-decompress-response@^3.2.0, decompress-response@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
- integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
- dependencies:
- mimic-response "^1.0.0"
-
-decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
- integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
- dependencies:
- file-type "^5.2.0"
- is-stream "^1.1.0"
- tar-stream "^1.5.2"
-
-decompress-tarbz2@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
- integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
- dependencies:
- decompress-tar "^4.1.0"
- file-type "^6.1.0"
- is-stream "^1.1.0"
- seek-bzip "^1.0.5"
- unbzip2-stream "^1.0.9"
-
-decompress-targz@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
- integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
- dependencies:
- decompress-tar "^4.1.1"
- file-type "^5.2.0"
- is-stream "^1.1.0"
-
-decompress-unzip@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
- integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
- dependencies:
- file-type "^3.8.0"
- get-stream "^2.2.0"
- pify "^2.3.0"
- yauzl "^2.4.2"
-
-decompress@^4.0.0, decompress@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
- integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
- dependencies:
- decompress-tar "^4.0.0"
- decompress-tarbz2 "^4.0.0"
- decompress-targz "^4.0.0"
- decompress-unzip "^4.0.1"
- graceful-fs "^4.1.10"
- make-dir "^1.0.0"
- pify "^2.3.0"
- strip-dirs "^2.0.0"
-
-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==
-
-deep-is@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
- integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
-
-deep-scope-analyser@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/deep-scope-analyser/-/deep-scope-analyser-1.7.0.tgz#23015b3a1d23181b1d9cebd25b783a7378ead8da"
- integrity sha512-rl5Dmt2IZkFpZo6XbEY1zG8st2Wpq8Pi/dV2gz8ZF6BDYt3fnor2JNxHwdO1WLo0k6JbmYp0x8MNy8kE4l1NtA==
- dependencies:
- esrecurse "^4.2.1"
- estraverse "^4.2.0"
-
-default-compare@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f"
- integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
- dependencies:
- kind-of "^5.0.2"
-
-default-resolution@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684"
- integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=
-
-defaults@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
- dependencies:
- clone "^1.0.2"
-
-defer-to-connect@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e"
- integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==
-
-define-properties@^1.1.2, define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
- dependencies:
- object-keys "^1.0.12"
-
-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=
-
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
-
-delete-empty@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/delete-empty/-/delete-empty-3.0.0.tgz#f8040f2669f26fa7060bc2304e9859c593b685e8"
- integrity sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==
- dependencies:
- ansi-colors "^4.1.0"
- minimist "^1.2.0"
- path-starts-with "^2.0.0"
- rimraf "^2.6.2"
-
-depd@0.4.5:
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/depd/-/depd-0.4.5.tgz#1a664b53388b4a6573e8ae67b5f767c693ca97f1"
- integrity sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E=
-
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
- integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
-
-deprecated@^0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
- integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=
-
-des.js@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
- integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
- dependencies:
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-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-file@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
- integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
-detect-libc@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
- integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-
-dev-ip@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0"
- integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=
-
-diffie-hellman@^5.0.0:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
- integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
- dependencies:
- bn.js "^4.1.0"
- miller-rabin "^4.0.0"
- randombytes "^2.0.0"
-
-dir-glob@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
- integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
- dependencies:
- path-type "^4.0.0"
-
-doctrine@^1.2.2:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
- dependencies:
- esutils "^2.0.2"
- isarray "^1.0.0"
-
-doctrine@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
- integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
- dependencies:
- esutils "^2.0.2"
-
-dom-serializer@0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb"
- integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==
- dependencies:
- domelementtype "^2.0.1"
- entities "^2.0.0"
-
-dom-walk@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
- integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
-
-domain-browser@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
- integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
-
-domelementtype@1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
- integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
-
-domelementtype@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
- integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
-
-domexception@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
- integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
- dependencies:
- webidl-conversions "^4.0.2"
-
-domutils@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
- integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
- dependencies:
- dom-serializer "0"
- domelementtype "1"
-
-dot-prop@^4.1.1:
- 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"
-
-download@^6.2.2:
- version "6.2.5"
- resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
- integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==
- dependencies:
- caw "^2.0.0"
- content-disposition "^0.5.2"
- decompress "^4.0.0"
- ext-name "^5.0.0"
- file-type "5.2.0"
- filenamify "^2.0.0"
- get-stream "^3.0.0"
- got "^7.0.0"
- make-dir "^1.0.0"
- p-event "^1.0.0"
- pify "^3.0.0"
-
-download@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233"
- integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==
- dependencies:
- archive-type "^4.0.0"
- caw "^2.0.1"
- content-disposition "^0.5.2"
- decompress "^4.2.0"
- ext-name "^5.0.0"
- file-type "^8.1.0"
- filenamify "^2.0.0"
- get-stream "^3.0.0"
- got "^8.3.1"
- make-dir "^1.2.0"
- p-event "^2.1.0"
- pify "^3.0.0"
-
-duplexer2@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
- integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
- dependencies:
- readable-stream "~1.1.9"
-
-duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
-
-duplexify@^3.4.2, duplexify@^3.6.0:
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
- integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
- dependencies:
- end-of-stream "^1.0.0"
- inherits "^2.0.1"
- readable-stream "^2.0.0"
- stream-shift "^1.0.0"
-
-duplexify@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61"
- integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==
- dependencies:
- end-of-stream "^1.4.1"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
- stream-shift "^1.0.0"
-
-each-props@^1.3.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333"
- integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
- dependencies:
- is-plain-object "^2.0.1"
- object.defaults "^1.1.0"
-
-easy-extender@^2.3.4:
- version "2.3.4"
- resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f"
- integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==
- dependencies:
- lodash "^4.17.10"
-
-eazy-logger@^3:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc"
- integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=
- dependencies:
- tfunk "^3.0.1"
-
-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"
-
-editorconfig@^0.15.3:
- version "0.15.3"
- resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
- integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
- dependencies:
- commander "^2.19.0"
- lru-cache "^4.1.5"
- semver "^5.6.0"
- sigmund "^1.0.1"
-
-ee-first@1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.0.5.tgz#8c9b212898d8cd9f1a9436650ce7be202c9e9ff0"
- integrity sha1-jJshKJjYzZ8alDZlDOe+ICyen/A=
-
-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=
-
-electron-notarize@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.1.1.tgz#c3563d70c5e7b3315f44e8495b30050a8c408b91"
- integrity sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==
- dependencies:
- debug "^4.1.1"
- fs-extra "^8.0.1"
-
-electron-osx-sign@^0.4.11:
- version "0.4.13"
- resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.13.tgz#4f77f0ff2f5cd71b91c1e6ce550c3a2937ebbef2"
- integrity sha512-+44lasF26lSBLh9HDG6TGpPjuqqtWGD9Pcp+YglE8gyf1OGYdbW8UCIshKPh69O/AcdvDB0ohaTYQz3nbGPbtw==
- dependencies:
- bluebird "^3.5.0"
- compare-version "^0.1.2"
- debug "^2.6.8"
- isbinaryfile "^3.0.2"
- minimist "^1.2.0"
- plist "^3.0.1"
-
-electron-packager@^14.0.6:
- version "14.0.6"
- resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-14.0.6.tgz#e187f2ef83cc29a97a0f940b7c3bb5e4edc8a8e2"
- integrity sha512-X+ikV+TnnNkIrK93vOjsjPeykCQBFxBS7LXKMTE1s62rXWirGMdjWL+edVkBOMRkH0ROJyFmWM28Dpj6sfEg+A==
- dependencies:
- "@electron/get" "^1.3.0"
- asar "^2.0.1"
- cross-zip "^2.1.5"
- debug "^4.0.1"
- electron-notarize "^0.1.1"
- electron-osx-sign "^0.4.11"
- fs-extra "^8.1.0"
- galactus "^0.2.1"
- get-package-info "^1.0.0"
- junk "^3.1.0"
- parse-author "^2.0.0"
- plist "^3.0.0"
- rcedit "^2.0.0"
- resolve "^1.1.6"
- sanitize-filename "^1.6.0"
- semver "^6.0.0"
- yargs-parser "^13.0.0"
-
-electron-to-chromium@^1.3.247:
- version "1.3.264"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.264.tgz#ed837f44524d0601a7b2b7b6efd86e35753d0e27"
- integrity sha512-z8E7WkrrquCuGYv+kKyybuZIbdms+4PeHp7Zm2uIgEhAigP0bOwqXILItwj0YO73o+QyHY/7XtEfP5DsHOWQgQ==
-
-elliptic@^6.0.0:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b"
- integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==
- dependencies:
- bn.js "^4.4.0"
- brorand "^1.0.1"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.0"
-
-email-validator@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
- integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
-
-emoji-regex@^7.0.1:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-emojis-list@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
- integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
-
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-encodeurl@~1.0.1, 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.0.0, end-of-stream@^1.1.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
- integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
- dependencies:
- once "^1.4.0"
-
-end-of-stream@^1.4.1:
- 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"
-
-end-of-stream@~0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
- integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8=
- dependencies:
- once "~1.3.0"
-
-engine.io-client@~3.2.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
- integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==
- dependencies:
- component-emitter "1.2.1"
- component-inherit "0.0.3"
- debug "~3.1.0"
- engine.io-parser "~2.1.1"
- has-cors "1.1.0"
- indexof "0.0.1"
- parseqs "0.0.5"
- parseuri "0.0.5"
- ws "~3.3.1"
- xmlhttprequest-ssl "~1.5.4"
- yeast "0.1.2"
-
-engine.io-client@~3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700"
- integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==
- dependencies:
- component-emitter "1.2.1"
- component-inherit "0.0.3"
- debug "~4.1.0"
- engine.io-parser "~2.2.0"
- has-cors "1.1.0"
- indexof "0.0.1"
- parseqs "0.0.5"
- parseuri "0.0.5"
- ws "~6.1.0"
- xmlhttprequest-ssl "~1.5.4"
- yeast "0.1.2"
-
-engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6"
- integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==
- dependencies:
- after "0.8.2"
- arraybuffer.slice "~0.0.7"
- base64-arraybuffer "0.1.5"
- blob "0.0.5"
- has-binary2 "~1.0.2"
-
-engine.io-parser@~2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed"
- integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==
- dependencies:
- after "0.8.2"
- arraybuffer.slice "~0.0.7"
- base64-arraybuffer "0.1.5"
- blob "0.0.5"
- has-binary2 "~1.0.2"
-
-engine.io@~3.2.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2"
- integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==
- dependencies:
- accepts "~1.3.4"
- base64id "1.0.0"
- cookie "0.3.1"
- debug "~3.1.0"
- engine.io-parser "~2.1.0"
- ws "~3.3.1"
-
-enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
- integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.4.0"
- tapable "^1.0.0"
-
-entities@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
- integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
-
-env-paths@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
- integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
-
-errno@^0.1.3, errno@~0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
- integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
- dependencies:
- prr "~1.0.1"
-
-error-ex@^1.2.0, error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.1"
-
-es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.1:
- version "1.14.2"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497"
- integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==
- dependencies:
- es-to-primitive "^1.2.0"
- function-bind "^1.1.1"
- has "^1.0.3"
- has-symbols "^1.0.0"
- is-callable "^1.1.4"
- is-regex "^1.0.4"
- object-inspect "^1.6.0"
- object-keys "^1.1.1"
- string.prototype.trimleft "^2.0.0"
- string.prototype.trimright "^2.0.0"
-
-es-to-primitive@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
- integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
- dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
-
-es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14:
- version "0.10.51"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f"
- integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==
- dependencies:
- es6-iterator "~2.0.3"
- es6-symbol "~3.1.1"
- next-tick "^1.0.0"
-
-es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
- integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
- dependencies:
- d "1"
- es5-ext "^0.10.35"
- es6-symbol "^3.1.1"
-
-es6-map@^0.1.3:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
- integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
- es6-iterator "~2.0.1"
- es6-set "~0.1.5"
- es6-symbol "~3.1.1"
- event-emitter "~0.3.5"
-
-es6-set@~0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
- integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
- es6-iterator "~2.0.1"
- es6-symbol "3.1.1"
- event-emitter "~0.3.5"
-
-es6-symbol@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
- integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-es6-symbol@^3.1.1, es6-symbol@~3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1"
- integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==
- dependencies:
- d "^1.0.1"
- es5-ext "^0.10.51"
-
-es6-templates@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4"
- integrity sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=
- dependencies:
- recast "~0.11.12"
- through "~2.3.6"
-
-es6-weak-map@^2.0.1:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
- integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
- dependencies:
- d "1"
- es5-ext "^0.10.46"
- es6-iterator "^2.0.3"
- es6-symbol "^3.1.1"
-
-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.0, escape-string-regexp@^1.0.2, 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=
-
-escodegen@^1.11.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541"
- integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==
- dependencies:
- esprima "^3.1.3"
- estraverse "^4.2.0"
- esutils "^2.0.2"
- optionator "^0.8.1"
- optionalDependencies:
- source-map "~0.6.1"
-
-escope@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
- integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
- dependencies:
- es6-map "^0.1.3"
- es6-weak-map "^2.0.1"
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-scope@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
- integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-utils@^1.3.1:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
- integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
- dependencies:
- eslint-visitor-keys "^1.0.0"
-
-eslint-visitor-keys@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
- integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-
-eslint@^2.7.0:
- version "2.13.1"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11"
- integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=
- dependencies:
- chalk "^1.1.3"
- concat-stream "^1.4.6"
- debug "^2.1.1"
- doctrine "^1.2.2"
- es6-map "^0.1.3"
- escope "^3.6.0"
- espree "^3.1.6"
- estraverse "^4.2.0"
- esutils "^2.0.2"
- file-entry-cache "^1.1.1"
- glob "^7.0.3"
- globals "^9.2.0"
- ignore "^3.1.2"
- imurmurhash "^0.1.4"
- inquirer "^0.12.0"
- is-my-json-valid "^2.10.0"
- is-resolvable "^1.0.0"
- js-yaml "^3.5.1"
- json-stable-stringify "^1.0.0"
- levn "^0.3.0"
- lodash "^4.0.0"
- mkdirp "^0.5.0"
- optionator "^0.8.1"
- path-is-absolute "^1.0.0"
- path-is-inside "^1.0.1"
- pluralize "^1.2.1"
- progress "^1.1.8"
- require-uncached "^1.0.2"
- shelljs "^0.6.0"
- strip-json-comments "~1.0.1"
- table "^3.7.8"
- text-table "~0.2.0"
- user-home "^2.0.0"
-
-eslint@^5.9.0:
- version "5.16.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
- integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.9.1"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^4.0.3"
- eslint-utils "^1.3.1"
- eslint-visitor-keys "^1.0.0"
- espree "^5.0.1"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob "^7.1.2"
- globals "^11.7.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- inquirer "^6.2.2"
- js-yaml "^3.13.0"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.11"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.2"
- path-is-inside "^1.0.2"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^5.5.1"
- strip-ansi "^4.0.0"
- strip-json-comments "^2.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
-
-espree@^3.1.6:
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
- integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
- dependencies:
- acorn "^5.5.0"
- acorn-jsx "^3.0.0"
-
-espree@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
- integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
- dependencies:
- acorn "^6.0.7"
- acorn-jsx "^5.0.0"
- eslint-visitor-keys "^1.0.0"
-
-esprima@^3.1.3, esprima@~3.1.0:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
- integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-esquery@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
- integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
- dependencies:
- estraverse "^4.0.0"
-
-esrecurse@^4.1.0, esrecurse@^4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
- integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
- dependencies:
- estraverse "^4.1.0"
-
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-esutils@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
- integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-
-etag@1.8.1, etag@^1.8.1, etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
- integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-
-event-emitter@~0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
- integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-eventemitter3@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
- integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
-
-events@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
- integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
- integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
- dependencies:
- md5.js "^1.3.4"
- safe-buffer "^5.1.1"
-
-exec-buffer@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
- integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==
- dependencies:
- execa "^0.7.0"
- p-finally "^1.0.0"
- pify "^3.0.0"
- rimraf "^2.5.4"
- tempfile "^2.0.0"
-
-execa@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
- integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
- dependencies:
- cross-spawn "^6.0.0"
- 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@^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"
-
-execa@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240"
- integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==
- dependencies:
- cross-spawn "^7.0.0"
- get-stream "^5.0.0"
- human-signals "^1.1.1"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.0"
- onetime "^5.1.0"
- signal-exit "^3.0.2"
- strip-final-newline "^2.0.0"
-
-executable@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
- integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
- dependencies:
- pify "^2.2.0"
-
-exif-parser@^0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
- integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
-
-exit-hook@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
- integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
-
-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"
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
- integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
- dependencies:
- homedir-polyfill "^1.0.1"
-
-ext-list@^2.0.0:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
- integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
- dependencies:
- mime-db "^1.28.0"
-
-ext-name@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
- integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
- dependencies:
- ext-list "^2.0.0"
- sort-keys-length "^1.0.0"
-
-extend-shallow@^1.1.2:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
- integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=
- dependencies:
- kind-of "^1.1.0"
-
-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.0, 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=
-
-eyes@0.1.x:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
- integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
-
-fancy-log@^1.1.0, fancy-log@^1.2.0, fancy-log@^1.3.2, fancy-log@^1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
- integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
- dependencies:
- ansi-gray "^0.1.1"
- color-support "^1.1.3"
- parse-node-version "^1.0.0"
- time-stamp "^1.0.0"
-
-fast-deep-equal@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
- integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
-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@^3.0.3:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
- integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
- merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
-
-fast-json-stable-stringify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
- integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
-
-fast-levenshtein@~2.0.4:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
-
-fastdom@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.9.tgz#b395fab11a3701173c02a054fe769d8f596a0a26"
- integrity sha512-SSp4fbVzu8JkkG01NUX+0iOwe9M5PN3MGIQ84txLf4TkkJG4q30khkzumKgi4hUqO1+jX6wLHfnCPoZ6eSZ6Tg==
- dependencies:
- strictdom "^1.0.1"
-
-faster.js@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/faster.js/-/faster.js-1.1.1.tgz#8bbd7eefdb8f03faac26ad5025b059f94c5cfb4d"
- integrity sha512-vPThNSLL/E1f7cLHd9yuayxZR82o/Iic4S5ZY45iY5AgBLNIlr3b3c+VpDjoYqjY9a9C/FQVUQy9oTILVP7X0g==
-
-fastparse@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
- integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
-
-fastq@^1.6.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
- integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
- dependencies:
- reusify "^1.0.4"
-
-faye-websocket@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11"
- integrity sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=
- dependencies:
- websocket-driver ">=0.3.6"
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-figgy-pudding@^3.5.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
- integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-
-figures@^1.3.5:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
- integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
- dependencies:
- escape-string-regexp "^1.0.5"
- object-assign "^4.1.0"
-
-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"
-
-file-entry-cache@^1.1.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8"
- integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=
- dependencies:
- flat-cache "^1.2.1"
- object-assign "^4.0.1"
-
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
-file-loader@^0.8.1:
- version "0.8.5"
- resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b"
- integrity sha1-knXQMf54DyfUf19K8CvUNxPMFRs=
- dependencies:
- loader-utils "~0.2.5"
-
-file-type@5.2.0, file-type@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
- integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
-
-file-type@^10.4.0:
- version "10.11.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890"
- integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==
-
-file-type@^12.0.0:
- version "12.4.2"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
- integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
-
-file-type@^3.8.0:
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
- integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
-
-file-type@^4.2.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
- integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU=
-
-file-type@^6.1.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
- integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
-
-file-type@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c"
- integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==
-
-file-type@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
- integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==
-
-filename-reserved-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
- integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik=
-
-filenamify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
- integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==
- dependencies:
- filename-reserved-regex "^2.0.0"
- strip-outer "^1.0.0"
- trim-repeated "^1.0.0"
-
-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"
-
-fill-range@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
- dependencies:
- to-regex-range "^5.0.1"
-
-finalhandler@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
- integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=
- dependencies:
- debug "2.6.9"
- encodeurl "~1.0.1"
- escape-html "~1.0.3"
- on-finished "~2.3.0"
- parseurl "~1.3.2"
- statuses "~1.3.1"
- unpipe "~1.0.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-cache-dir@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
- integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
- dependencies:
- commondir "^1.0.1"
- make-dir "^2.0.0"
- pkg-dir "^3.0.0"
-
-find-index@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
- integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=
-
-find-up@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
- integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
- dependencies:
- path-exists "^2.0.0"
- pinkie-promise "^2.0.0"
-
-find-up@^2.0.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"
-
-find-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
- integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
- dependencies:
- locate-path "^3.0.0"
-
-find-up@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
-find-versions@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d"
- integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==
- dependencies:
- array-uniq "^2.1.0"
- semver-regex "^2.0.0"
-
-findup-sync@3.0.0, findup-sync@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
- integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
- dependencies:
- detect-file "^1.0.0"
- is-glob "^4.0.0"
- micromatch "^3.0.4"
- resolve-dir "^1.0.1"
-
-findup-sync@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
- integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
- dependencies:
- detect-file "^1.0.0"
- is-glob "^3.1.0"
- micromatch "^3.0.4"
- resolve-dir "^1.0.1"
-
-findup-sync@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
- integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
- dependencies:
- detect-file "^1.0.0"
- is-glob "^4.0.0"
- micromatch "^4.0.2"
- resolve-dir "^1.0.1"
-
-fined@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
- integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
- dependencies:
- expand-tilde "^2.0.2"
- is-plain-object "^2.0.3"
- object.defaults "^1.1.0"
- object.pick "^1.2.0"
- parse-filepath "^1.0.1"
-
-first-chunk-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
- integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=
-
-flagged-respawn@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
- integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
-
-flat-cache@^1.2.1:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
- integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
- dependencies:
- circular-json "^0.3.1"
- graceful-fs "^4.1.2"
- rimraf "~2.6.2"
- write "^0.2.1"
-
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
-flatted@^2.0.0, flatted@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
- integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
-
-flatten@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
- integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
-
-flora-colossus@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93"
- integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==
- dependencies:
- debug "^4.1.1"
- fs-extra "^7.0.0"
-
-fluent-ffmpeg@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74"
- integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=
- dependencies:
- async ">=0.2.9"
- which "^1.1.1"
-
-flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
- integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
- dependencies:
- inherits "^2.0.3"
- readable-stream "^2.3.6"
-
-follow-redirects@1.5.10:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
- integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
- dependencies:
- debug "=3.1.0"
-
-follow-redirects@^1.0.0:
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
- integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
-
-for-each@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
- integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
- dependencies:
- is-callable "^1.1.3"
-
-for-in@^1.0.1, 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=
-
-for-own@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
- integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
- dependencies:
- for-in "^1.0.1"
-
-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=
-
-fork-stream@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
- integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=
-
-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"
-
-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, fresh@^0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-
-from2@^2.1.0, from2@^2.1.1:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
- integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.0.0"
-
-front-matter@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb"
- integrity sha1-91mDufL0E75ljJPf172M5AePXNs=
- dependencies:
- js-yaml "^3.4.6"
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
-fs-extra@3.0.1, fs-extra@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
- integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^3.0.0"
- universalify "^0.1.0"
-
-fs-extra@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
- integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^7.0.0:
- 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.1, fs-extra@^8.1.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-minipass@^1.2.5:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
- integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
- dependencies:
- minipass "^2.6.0"
-
-fs-mkdirp-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
- integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
- dependencies:
- graceful-fs "^4.1.11"
- through2 "^2.0.3"
-
-fs-write-stream-atomic@^1.0.8:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
- integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
- dependencies:
- graceful-fs "^4.1.2"
- iferr "^0.1.5"
- imurmurhash "^0.1.4"
- readable-stream "1 || 2"
-
-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=
-
-fsevents@^1.2.7:
- version "1.2.9"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f"
- integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
- dependencies:
- nan "^2.12.1"
- node-pre-gyp "^0.12.0"
-
-fsevents@~2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
- integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
-
-fstream@^1.0.0, fstream@^1.0.12:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
- integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
- dependencies:
- graceful-fs "^4.1.2"
- inherits "~2.0.0"
- mkdirp ">=0.5 0"
- rimraf "2"
-
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-
-galactus@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9"
- integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=
- dependencies:
- debug "^3.1.0"
- flora-colossus "^1.0.0"
- fs-extra "^4.0.0"
-
-gauge@~2.7.3:
- version "2.7.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
- integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
- dependencies:
- aproba "^1.0.3"
- console-control-strings "^1.0.0"
- has-unicode "^2.0.0"
- object-assign "^4.1.0"
- signal-exit "^3.0.0"
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wide-align "^1.1.0"
-
-gaze@^0.5.1:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
- integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=
- dependencies:
- globule "~0.1.0"
-
-gaze@^1.0.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
- integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
- dependencies:
- globule "^1.0.0"
-
-generate-function@^2.0.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
- integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
- dependencies:
- is-property "^1.0.2"
-
-generate-object-property@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
- integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
- dependencies:
- is-property "^1.0.0"
-
-gensync@^1.0.0-beta.1:
- version "1.0.0-beta.1"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
- integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-
-get-caller-file@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
- integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
-get-caller-file@^2.0.1:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
- integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
-get-package-info@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c"
- integrity sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=
- dependencies:
- bluebird "^3.1.1"
- debug "^2.2.0"
- lodash.get "^4.0.0"
- read-pkg-up "^2.0.0"
-
-get-proxy@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93"
- integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==
- dependencies:
- npm-conf "^1.1.0"
-
-get-stdin@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
- integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
-
-get-stream@3.0.0, 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@^2.2.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
- integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
- dependencies:
- object-assign "^4.0.1"
- pinkie-promise "^2.0.0"
-
-get-stream@^4.0.0, get-stream@^4.1.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-stream@^5.0.0, get-stream@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
- integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
- 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"
-
-gifsicle@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.1.0.tgz#08f878e9048c70adf046185115a6350516a1fdc0"
- integrity sha512-hQsOH7yjC7fMokntysN6f2QuxrnX+zmKKKVy0sC3Vhtnk8WrOxLdfH/Z2PNn7lVVx+1+drzIeAe8ufcmdSC/8g==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.0"
- execa "^4.0.0"
- logalot "^2.0.0"
-
-glob-all@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
- integrity sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=
- dependencies:
- glob "^7.0.5"
- yargs "~1.2.6"
-
-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-parent@^5.1.0, glob-parent@~5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
- integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
- dependencies:
- is-glob "^4.0.1"
-
-glob-stream@^3.1.5:
- version "3.1.18"
- resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
- integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=
- dependencies:
- glob "^4.3.1"
- glob2base "^0.0.12"
- minimatch "^2.0.1"
- ordered-read-streams "^0.1.0"
- through2 "^0.6.1"
- unique-stream "^1.0.0"
-
-glob-stream@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
- integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
- dependencies:
- extend "^3.0.0"
- glob "^7.1.1"
- glob-parent "^3.1.0"
- is-negated-glob "^1.0.0"
- ordered-read-streams "^1.0.0"
- pumpify "^1.3.5"
- readable-stream "^2.1.5"
- remove-trailing-separator "^1.0.1"
- to-absolute-glob "^2.0.0"
- unique-stream "^2.0.2"
-
-glob-watcher@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
- integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=
- dependencies:
- gaze "^0.5.1"
-
-glob-watcher@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626"
- integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==
- dependencies:
- anymatch "^2.0.0"
- async-done "^1.2.0"
- chokidar "^2.0.0"
- is-negated-glob "^1.0.0"
- just-debounce "^1.0.0"
- object.defaults "^1.1.0"
-
-glob2base@^0.0.12:
- version "0.0.12"
- resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
- integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=
- dependencies:
- find-index "^0.1.1"
-
-glob@^4.3.1:
- version "4.5.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
- integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "^2.0.1"
- once "^1.3.0"
-
-glob@^6.0.4:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
- integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1:
- version "7.1.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
- integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
- 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"
-
-glob@^7.1.1:
- 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"
-
-glob@~3.1.21:
- version "3.1.21"
- resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
- integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=
- dependencies:
- graceful-fs "~1.2.0"
- inherits "1"
- minimatch "~0.2.11"
-
-glob@~3.2.6:
- version "3.2.11"
- resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
- integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=
- dependencies:
- inherits "2"
- minimatch "0.3"
-
-global-modules@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
- integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
- dependencies:
- global-prefix "^3.0.0"
-
-global-modules@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
- integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
- dependencies:
- global-prefix "^1.0.1"
- is-windows "^1.0.1"
- resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
- integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
- dependencies:
- expand-tilde "^2.0.2"
- homedir-polyfill "^1.0.1"
- ini "^1.3.4"
- is-windows "^1.0.1"
- which "^1.2.14"
-
-global-prefix@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
- integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
- dependencies:
- ini "^1.3.5"
- kind-of "^6.0.2"
- which "^1.3.1"
-
-global@~4.3.0:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
- integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
- dependencies:
- min-document "^2.19.0"
- process "~0.5.1"
-
-globals@^11.1.0, globals@^11.7.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-globals@^9.2.0:
- version "9.18.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
- integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
-
-globby@^10.0.0:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
- integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.0.3"
- glob "^7.1.3"
- ignore "^5.1.1"
- merge2 "^1.2.3"
- slash "^3.0.0"
-
-globule@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
- integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
- dependencies:
- glob "~7.1.1"
- lodash "~4.17.10"
- minimatch "~3.0.2"
-
-globule@~0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
- integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=
- dependencies:
- glob "~3.1.21"
- lodash "~1.0.1"
- minimatch "~0.2.11"
-
-glogg@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f"
- integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==
- dependencies:
- sparkles "^1.0.0"
-
-gonzales-pe-sl@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6"
- integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=
- dependencies:
- minimist "1.1.x"
-
-gonzales-pe@^4.2.3:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2"
- integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==
- dependencies:
- minimist "1.1.x"
-
-got@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
- integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
- dependencies:
- decompress-response "^3.2.0"
- duplexer3 "^0.1.4"
- get-stream "^3.0.0"
- is-plain-obj "^1.1.0"
- is-retry-allowed "^1.0.0"
- is-stream "^1.0.0"
- isurl "^1.0.0-alpha5"
- lowercase-keys "^1.0.0"
- p-cancelable "^0.3.0"
- p-timeout "^1.1.1"
- safe-buffer "^5.0.1"
- timed-out "^4.0.0"
- url-parse-lax "^1.0.0"
- url-to-options "^1.0.1"
-
-got@^8.3.1:
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
- integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
- dependencies:
- "@sindresorhus/is" "^0.7.0"
- cacheable-request "^2.1.1"
- decompress-response "^3.3.0"
- duplexer3 "^0.1.4"
- get-stream "^3.0.0"
- into-stream "^3.1.0"
- is-retry-allowed "^1.1.0"
- isurl "^1.0.0-alpha5"
- lowercase-keys "^1.0.0"
- mimic-response "^1.0.0"
- p-cancelable "^0.4.0"
- p-timeout "^2.0.1"
- pify "^3.0.0"
- safe-buffer "^5.1.1"
- timed-out "^4.0.1"
- url-parse-lax "^3.0.0"
- url-to-options "^1.0.1"
-
-got@^9.6.0:
- version "9.6.0"
- resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
- integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
- dependencies:
- "@sindresorhus/is" "^0.14.0"
- "@szmarczak/http-timer" "^1.1.2"
- cacheable-request "^6.0.0"
- decompress-response "^3.3.0"
- duplexer3 "^0.1.4"
- get-stream "^4.1.0"
- lowercase-keys "^1.0.1"
- mimic-response "^1.0.1"
- p-cancelable "^1.0.0"
- to-readable-stream "^1.0.0"
- url-parse-lax "^3.0.0"
-
-graceful-fs@^3.0.0:
- version "3.0.12"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef"
- integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==
- dependencies:
- natives "^1.1.3"
-
-graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
- integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
-
-graceful-fs@^4.2.2:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
- integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
-
-graceful-fs@~1.2.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
- integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=
-
-"graceful-readlink@>= 1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
- integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
-
-gulp-audiosprite@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/gulp-audiosprite/-/gulp-audiosprite-1.1.0.tgz#1762d7fb9a669f372b33c1511e3402d79b624892"
- integrity sha512-CwSfZjmNPlTyzcAFaE8RiKzh1dQFDLPPZMHshKwvGqNeTB86s30K8hMXGrrjFqHNF9xb0SUnXfbYT32MO4aNog==
- dependencies:
- audiosprite "*"
- through2 "*"
- vinyl "*"
-
-gulp-cache@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/gulp-cache/-/gulp-cache-1.1.3.tgz#7c427670aad4d25364c3cc9c53e492b348190d27"
- integrity sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA==
- dependencies:
- "@babel/runtime" "^7.5.5"
- cache-swap "^0.3.0"
- core-js "3"
- object.pick "^1.3.0"
- plugin-error "^1.0.1"
- through2 "3.0.1"
- vinyl "^2.2.0"
-
-gulp-cached@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce"
- integrity sha1-/nzU+H83YB5gc8/t7lwr2vi2rM4=
- dependencies:
- lodash.defaults "^4.2.0"
- through2 "^2.0.1"
-
-gulp-clean@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950"
- integrity sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==
- dependencies:
- fancy-log "^1.3.2"
- plugin-error "^0.1.2"
- rimraf "^2.6.2"
- through2 "^2.0.3"
- vinyl "^2.1.0"
-
-gulp-cli@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f"
- integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==
- dependencies:
- ansi-colors "^1.0.1"
- archy "^1.0.0"
- array-sort "^1.0.0"
- color-support "^1.1.3"
- concat-stream "^1.6.0"
- copy-props "^2.0.1"
- fancy-log "^1.3.2"
- gulplog "^1.0.0"
- interpret "^1.4.0"
- isobject "^3.0.1"
- liftoff "^3.1.0"
- matchdep "^2.0.0"
- mute-stdout "^1.0.0"
- pretty-hrtime "^1.0.0"
- replace-homedir "^1.0.0"
- semver-greatest-satisfied-range "^1.1.0"
- v8flags "^3.2.0"
- yargs "^7.1.0"
-
-gulp-dom@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/gulp-dom/-/gulp-dom-1.0.0.tgz#f834d5299c09b85e11c32505044a2ebe86ae1375"
- integrity sha512-hD2w2t3fsjPicX2mT6MFFb+eP3FyCVtEHdejGMMH4+w9EBFxA2xIZadqlzYdAEdE+39dP1aGatuhdHJteUvn1A==
- dependencies:
- jsdom "12.2.0"
- plugin-error "1.0.1"
- through2 "2.0.3"
-
-gulp-flatten@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/gulp-flatten/-/gulp-flatten-0.4.0.tgz#d9ac819416c30fd5dfb3dea9da79c83a1bcd61d1"
- integrity sha512-eg4spVTAiv1xXmugyaCxWne1oPtNG0UHEtABx5W8ScLiqAYceyYm6GYA36x0Qh8KOIXmAZV97L2aYGnKREG3Sg==
- dependencies:
- plugin-error "^0.1.2"
- through2 "^2.0.0"
-
-gulp-fluent-ffmpeg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/gulp-fluent-ffmpeg/-/gulp-fluent-ffmpeg-2.0.0.tgz#5b5ed180d317fd3d800ddbcd6376ffb46294b836"
- integrity sha512-pwG6N+NKwLzO/0ybzgcwiADKZ4OzpFjNR4drqCvbvluYcSh/yvsAW7wm63jFzpJIjfFnanYGPNWiUn8+TuTR/g==
- dependencies:
- concat-stream "^2.0.0"
- fluent-ffmpeg "^2.1.2"
- plugin-error "^1.0.1"
- through2 "^3.0.1"
-
-gulp-html-beautify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/gulp-html-beautify/-/gulp-html-beautify-1.0.1.tgz#2834c6f77669605726eee55e3205f63074b7a152"
- integrity sha1-KDTG93ZpYFcm7uVeMgX2MHS3oVI=
- dependencies:
- js-beautify "^1.5.10"
- rcloader "^0.1.4"
- through2 "^2.0.0"
-
-gulp-htmlmin@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz#90fc5e8ad0425a9e86d5d521427184e7276365e7"
- integrity sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==
- dependencies:
- html-minifier "^3.5.20"
- plugin-error "^1.0.1"
- through2 "^2.0.3"
-
-gulp-if@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-3.0.0.tgz#6c3e7edc8bafadc34f2ebecb314bf43324ba1e40"
- integrity sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==
- dependencies:
- gulp-match "^1.1.0"
- ternary-stream "^3.0.0"
- through2 "^3.0.1"
-
-gulp-imagemin@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz#d1810a908fb64b4fbf15a750d303d988443e68cf"
- integrity sha512-6xBTNybmPY2YrvrhhlS8Mxi0zn0ypusLon63p9XXxDtIf7U7c6KcViz94K7Skosucr3378A6IY2kJSjJyuwylQ==
- dependencies:
- chalk "^3.0.0"
- fancy-log "^1.3.2"
- imagemin "^7.0.0"
- plugin-error "^1.0.1"
- plur "^3.0.1"
- pretty-bytes "^5.3.0"
- through2-concurrent "^2.0.0"
- optionalDependencies:
- imagemin-gifsicle "^7.0.0"
- imagemin-mozjpeg "^8.0.0"
- imagemin-optipng "^7.0.0"
- imagemin-svgo "^7.0.0"
-
-gulp-load-plugins@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-2.0.3.tgz#5f275c0b7f1925d8a1ce57cbd5c346d6af6b64fb"
- integrity sha512-U/1Sml7UbyOu2kH6Fbpo+ka2xyp4DRH6+oDtHgC8oKsnlQRuiBQYQ/LS4k6HxBv1HJlucaNV/SdwZXtLBuvSqg==
- dependencies:
- array-unique "^0.3.2"
- fancy-log "^1.2.0"
- findup-sync "^4.0.0"
- gulplog "^1.0.0"
- has-gulplog "^0.1.0"
- micromatch "^4.0.2"
- resolve "^1.15.1"
-
-gulp-match@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f"
- integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==
- dependencies:
- minimatch "^3.0.3"
-
-gulp-phonegap-build@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/gulp-phonegap-build/-/gulp-phonegap-build-0.1.5.tgz#36c145e63cd204702be0f3b99be19e096712bcaf"
- integrity sha1-NsFF5jzSBHAr4PO5m+GeCWcSvK8=
- dependencies:
- archiver "~0.11.0"
- gulp "~3.8.7"
- gulp-util "~3.0.0"
- lodash "~2.4.1"
- needle ""
- read "~1.0.4"
- through2 "~0.6.1"
- vinyl-buffer "0.0.0"
- vinyl-source-stream "^0.1.1"
-
-gulp-plumber@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.1.tgz#d38700755a300b9d372318e4ffb5ff7ced0b2c84"
- integrity sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==
- dependencies:
- chalk "^1.1.3"
- fancy-log "^1.3.2"
- plugin-error "^0.1.2"
- through2 "^2.0.3"
-
-gulp-pngquant@^1.0.13:
- version "1.0.13"
- resolved "https://registry.yarnpkg.com/gulp-pngquant/-/gulp-pngquant-1.0.13.tgz#7160b4b51080898c9bed896ae0432546c46a8130"
- integrity sha512-oSo5Rw2Rb10eyGhc8XKbghq6yteMmxvsSAKGOZU0ssbylMHk3WoTWcEpNg0YWMyRjrY913y+B+PA4wHM1AL2wA==
- dependencies:
- chalk "^3.0.0"
- fancy-log "^1.3.3"
- plugin-error "^1.0.1"
- pngquant-bin "^5.0.2"
- through2 "^3.0.1"
-
-gulp-postcss@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-8.0.0.tgz#8d3772cd4d27bca55ec8cb4c8e576e3bde4dc550"
- integrity sha512-Wtl6vH7a+8IS/fU5W9IbOpcaLqKxd5L1DUOzaPmlnCbX1CrG0aWdwVnC3Spn8th0m8D59YbysV5zPUe1n/GJYg==
- dependencies:
- fancy-log "^1.3.2"
- plugin-error "^1.0.1"
- postcss "^7.0.2"
- postcss-load-config "^2.0.0"
- vinyl-sourcemaps-apply "^0.2.1"
-
-gulp-rename@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c"
- integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==
-
-gulp-sass-lint@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/gulp-sass-lint/-/gulp-sass-lint-1.4.0.tgz#6f7096c5abcbc0ce99ddf060c9e1a99067a47ebe"
- integrity sha512-XerYvHx7rznInkedMw5Ayif+p8EhysOVHUBvlgUa0FSl88H2cjNjaRZ3NGn5Efmp+2HxpXp4NHqMIbOSdwef3A==
- dependencies:
- plugin-error "^0.1.2"
- sass-lint "^1.12.0"
- through2 "^2.0.2"
-
-gulp-sass@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427"
- integrity sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==
- dependencies:
- chalk "^2.3.0"
- lodash "^4.17.11"
- node-sass "^4.8.3"
- plugin-error "^1.0.1"
- replace-ext "^1.0.0"
- strip-ansi "^4.0.0"
- through2 "^2.0.0"
- vinyl-sourcemaps-apply "^0.2.0"
-
-"gulp-sftp@git+https://git@github.com/webksde/gulp-sftp":
- version "0.1.6"
- resolved "git+https://git@github.com/webksde/gulp-sftp#c8dfb20e290477eeed66a867406576d0c3d4fc6b"
- dependencies:
- async "~0.9.0"
- gulp-util "~3.0.0"
- object-assign "~0.3.1"
- parents "~1.0.0"
- ssh2 "~0.6.1"
- through2 "~0.4.2"
-
-gulp-terser@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b"
- integrity sha512-lf+jE2DALg2w32p0HRiYMlFYRYelKZPNunHp2pZccCYrrdCLOs0ItbZcN63yr2pbz116IyhUG9mD/QbtRO1FKA==
- dependencies:
- plugin-error "^1.0.1"
- terser "^4.0.0"
- through2 "^3.0.1"
- vinyl-sourcemaps-apply "^0.2.1"
-
-gulp-util@^2.2.19:
- version "2.2.20"
- resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
- integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=
- dependencies:
- chalk "^0.5.0"
- dateformat "^1.0.7-1.2.3"
- lodash._reinterpolate "^2.4.1"
- lodash.template "^2.4.1"
- minimist "^0.2.0"
- multipipe "^0.1.0"
- through2 "^0.5.0"
- vinyl "^0.2.1"
-
-gulp-util@^3.0.0, gulp-util@~3.0.0:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
- integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08=
- dependencies:
- array-differ "^1.0.0"
- array-uniq "^1.0.2"
- beeper "^1.0.0"
- chalk "^1.0.0"
- dateformat "^2.0.0"
- fancy-log "^1.1.0"
- gulplog "^1.0.0"
- has-gulplog "^0.1.0"
- lodash._reescape "^3.0.0"
- lodash._reevaluate "^3.0.0"
- lodash._reinterpolate "^3.0.0"
- lodash.template "^3.0.0"
- minimist "^1.1.0"
- multipipe "^0.1.2"
- object-assign "^3.0.0"
- replace-ext "0.0.1"
- through2 "^2.0.0"
- vinyl "^0.5.0"
-
-gulp-webserver@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/gulp-webserver/-/gulp-webserver-0.9.1.tgz#e09992165d97c5865616d642a1601529b0367064"
- integrity sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ=
- dependencies:
- connect "^3.0.1"
- connect-livereload "^0.4.0"
- gulp-util "^2.2.19"
- isarray "0.0.1"
- node.extend "^1.0.10"
- open "^0.0.5"
- proxy-middleware "^0.5.0"
- serve-index "^1.1.4"
- serve-static "^1.3.0"
- through2 "^0.5.1"
- tiny-lr "0.1.4"
- watch "^0.11.0"
-
-gulp-yaml@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/gulp-yaml/-/gulp-yaml-2.0.4.tgz#86569e2becc9f5dfc95dc92db5a71a237f4b6ab4"
- integrity sha512-S/9Ib8PO+jGkCvWDwBUkmFkeW7QM0pp4PO8NNrMEfWo5Sk30P+KqpyXc4055L/vOX326T/b9MhM4nw5EenyX9g==
- dependencies:
- bufferstreams "^2.0.1"
- js-yaml "^3.13.1"
- object-assign "^4.1.1"
- plugin-error "^1.0.1"
- replace-ext "^1.0.0"
- through2 "^3.0.0"
-
-gulp@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa"
- integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==
- dependencies:
- glob-watcher "^5.0.3"
- gulp-cli "^2.2.0"
- undertaker "^1.2.1"
- vinyl-fs "^3.0.0"
-
-gulp@~3.8.7:
- version "3.8.11"
- resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.8.11.tgz#d557e0a7283eb4136491969b0497767972f1d28a"
- integrity sha1-1Vfgpyg+tBNkkZabBJd2eXLx0oo=
- dependencies:
- archy "^1.0.0"
- chalk "^0.5.0"
- deprecated "^0.0.1"
- gulp-util "^3.0.0"
- interpret "^0.3.2"
- liftoff "^2.0.1"
- minimist "^1.1.0"
- orchestrator "^0.3.0"
- pretty-hrtime "^0.2.0"
- semver "^4.1.0"
- tildify "^1.0.0"
- v8flags "^2.0.2"
- vinyl-fs "^0.3.0"
-
-gulplog@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
- integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U=
- dependencies:
- glogg "^1.0.0"
-
-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.0:
- 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-ansi@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e"
- integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=
- dependencies:
- ansi-regex "^0.2.0"
-
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
- integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
- dependencies:
- ansi-regex "^2.0.0"
-
-has-binary2@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
- integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
- dependencies:
- isarray "2.0.1"
-
-has-cors@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
- integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
-
-has-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
- integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
-
-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-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has-gulplog@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
- integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=
- dependencies:
- sparkles "^1.0.0"
-
-has-symbol-support-x@^1.4.1:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
- integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
-
-has-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
- integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
-
-has-to-string-tag-x@^1.2.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
- integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
- dependencies:
- has-symbol-support-x "^1.4.1"
-
-has-unicode@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
-
-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"
-
-has@^1.0.0, has@^1.0.1, has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
- dependencies:
- function-bind "^1.1.1"
-
-hash-base@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
- integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.1"
-
-he@1.2.x:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
- integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-
-hex-color-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
- integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
-
-hmac-drbg@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
- integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
- dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
-
-homedir-polyfill@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
- integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
- dependencies:
- parse-passwd "^1.0.0"
-
-hosted-git-info@^2.1.4:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
- integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
-
-howler@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.2.tgz#8433a09d8fe84132a3e726e05cb2bd352ef8bd49"
- integrity sha512-oKrTFaVXsDRoB/jik7cEpWKTj7VieoiuzMYJ7E/EU5ayvmpRhumCv3YQ3823zi9VTJkSWAhbryHnlZAionGAJg==
-
-hsl-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
- integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
-
-hsla-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
- integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
-
-html-comment-regex@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
- integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
-
-html-encoding-sniffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
- integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
- dependencies:
- whatwg-encoding "^1.0.1"
-
-html-loader@^0.5.5:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea"
- integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==
- dependencies:
- es6-templates "^0.2.3"
- fastparse "^1.1.1"
- html-minifier "^3.5.8"
- loader-utils "^1.1.0"
- object-assign "^4.1.1"
-
-html-minifier@^3.5.20, html-minifier@^3.5.8:
- version "3.5.21"
- resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
- integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
- dependencies:
- camel-case "3.0.x"
- clean-css "4.2.x"
- commander "2.17.x"
- he "1.2.x"
- param-case "2.1.x"
- relateurl "0.2.x"
- uglify-js "3.4.x"
-
-http-cache-semantics@3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
- integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
-
-http-cache-semantics@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5"
- integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==
-
-http-errors@1.7.3, 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-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
- integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
-"http-parser-js@>=0.4.0 <0.4.11":
- version "0.4.10"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
- integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=
-
-http-proxy@^1.18.1:
- version "1.18.1"
- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
- integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
- dependencies:
- eventemitter3 "^4.0.0"
- follow-redirects "^1.0.0"
- requires-port "^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"
-
-https-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
- integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-
-human-signals@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
- integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
- 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"
-
-iconv-lite@0.4.4:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8"
- integrity sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=
-
-ieee754@^1.1.4:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
- integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
-
-iferr@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
- integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-
-ignore-loader@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463"
- integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=
-
-ignore-walk@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b"
- integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==
- dependencies:
- minimatch "^3.0.4"
-
-ignore@^3.1.2:
- version "3.3.10"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
- integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
-
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.1:
- version "5.1.8"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
- integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
-
-imagemin-gifsicle@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0"
- integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==
- dependencies:
- execa "^1.0.0"
- gifsicle "^5.0.0"
- is-gif "^3.0.0"
-
-imagemin-jpegtran@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-7.0.0.tgz#7728f84876362d489b9a1656e0cc8e2009406e6f"
- integrity sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ==
- dependencies:
- exec-buffer "^3.0.0"
- is-jpg "^2.0.0"
- jpegtran-bin "^5.0.0"
-
-imagemin-mozjpeg@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz#d2ca4e8c982c7c6eda55069af89dee4c1cebcdfd"
- integrity sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==
- dependencies:
- execa "^1.0.0"
- is-jpg "^2.0.0"
- mozjpeg "^6.0.0"
-
-imagemin-optipng@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz#2225c82c35e5c29b7fa98d4f9ecee1161a68e888"
- integrity sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==
- dependencies:
- exec-buffer "^3.0.0"
- is-png "^2.0.0"
- optipng-bin "^6.0.0"
-
-imagemin-pngquant@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-9.0.0.tgz#f22ba4276cde1799fb15dd475e33984f8607e871"
- integrity sha512-9cqnTEaJwAHWUi+8EMTB3NUouWToCWxtL+QnoYr8bfVwuKilHvRVWKsa9lt+0c3aWaGxCAkHs++j8qINvSqomA==
- dependencies:
- execa "^4.0.0"
- is-png "^2.0.0"
- is-stream "^2.0.0"
- ow "^0.17.0"
- pngquant-bin "^6.0.0"
-
-imagemin-svgo@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-7.0.0.tgz#a22d0a5917a0d0f37e436932c30f5e000fa91b1c"
- integrity sha512-+iGJFaPIMx8TjFW6zN+EkOhlqcemdL7F3N3Y0wODvV2kCUBuUtZK7DRZc1+Zfu4U2W/lTMUyx2G8YMOrZntIWg==
- dependencies:
- is-svg "^3.0.0"
- svgo "^1.0.5"
-
-imagemin@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf"
- integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
- dependencies:
- file-type "^12.0.0"
- globby "^10.0.0"
- graceful-fs "^4.2.2"
- junk "^3.1.0"
- make-dir "^3.0.0"
- p-pipe "^3.0.0"
- replace-ext "^1.0.0"
-
-immutable@^3:
- version "3.8.2"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
- integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
-
-import-cwd@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
- integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
- dependencies:
- import-from "^2.1.0"
-
-import-fresh@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
- dependencies:
- caller-path "^2.0.0"
- resolve-from "^3.0.0"
-
-import-fresh@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
- integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-from@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
- integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
- dependencies:
- resolve-from "^3.0.0"
-
-import-lazy@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc"
- integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==
-
-import-local@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
- integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
- dependencies:
- pkg-dir "^3.0.0"
- resolve-cwd "^2.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-in-publish@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
- integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
-
-indent-string@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
- integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
- dependencies:
- repeating "^2.0.0"
-
-indexes-of@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
- integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
-
-indexof@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
- integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
-
-infer-owner@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
- integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
-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@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
- integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
-
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
- 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.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
- integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
-
-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.5, 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==
-
-inquirer@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
- integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=
- dependencies:
- ansi-escapes "^1.1.0"
- ansi-regex "^2.0.0"
- chalk "^1.0.0"
- cli-cursor "^1.0.1"
- cli-width "^2.0.0"
- figures "^1.3.5"
- lodash "^4.3.0"
- readline2 "^1.0.1"
- run-async "^0.1.0"
- rx-lite "^3.1.2"
- string-width "^1.0.1"
- strip-ansi "^3.0.0"
- through "^2.3.6"
-
-inquirer@^6.2.2:
- 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"
-
-interpret@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
- integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
-
-interpret@^0.3.2:
- version "0.3.10"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.3.10.tgz#088c25de731c6c5b112a90f0071cfaf459e5a7bb"
- integrity sha1-CIwl3nMcbFsRKpDwBxz69Fnlp7s=
-
-interpret@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
- integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
-
-into-stream@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
- integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=
- dependencies:
- from2 "^2.1.1"
- p-is-promise "^1.1.0"
-
-invariant@^2.2.2:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
- integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
- dependencies:
- loose-envify "^1.0.0"
-
-invert-kv@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
- integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-
-invert-kv@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
- integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
-irregular-plurals@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872"
- integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==
-
-is-absolute-url@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
- integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
-
-is-absolute@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
- integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
- dependencies:
- is-relative "^1.0.0"
- is-windows "^1.0.1"
-
-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-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
-is-arrayish@^0.3.1:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
- integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
-
-is-binary-path@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
- integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
- dependencies:
- binary-extensions "^1.0.0"
-
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.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-buffer@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
- integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
-
-is-callable@^1.1.3, is-callable@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
- integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
-
-is-color-stop@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
- integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
- dependencies:
- css-color-names "^0.0.4"
- hex-color-regex "^1.1.0"
- hsl-regex "^1.0.0"
- hsla-regex "^1.0.0"
- rgb-regex "^1.0.1"
- rgba-regex "^1.0.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-date-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
- integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
-
-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-directory@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
-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-finite@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
- integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
- dependencies:
- number-is-nan "^1.0.0"
-
-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-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-function@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
- integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
-
-is-gif@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1"
- integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==
- dependencies:
- file-type "^10.4.0"
-
-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, is-glob@^4.0.1, is-glob@~4.0.1:
- 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-jpg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97"
- integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=
-
-is-my-ip-valid@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
- integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==
-
-is-my-json-valid@^2.10.0:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a"
- integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==
- dependencies:
- generate-function "^2.0.0"
- generate-object-property "^1.1.0"
- is-my-ip-valid "^1.0.0"
- jsonpointer "^4.0.0"
- xtend "^4.0.0"
-
-is-natural-number@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
- integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
-
-is-negated-glob@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
- integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
-
-is-number-like@^1.0.3:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3"
- integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==
- dependencies:
- lodash.isfinite "^3.3.2"
-
-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-number@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
- integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-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-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
- integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
-
-is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
- integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
-
-is-plain-object@^2.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-png@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d"
- integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==
-
-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-property@^1.0.0, is-property@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
- integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
-
-is-regex@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
- integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
- dependencies:
- has "^1.0.1"
-
-is-relative@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
- integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
- dependencies:
- is-unc-path "^1.0.0"
-
-is-resolvable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
- integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
-
-is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.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-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
- integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
-
-is-svg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
- integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
- dependencies:
- html-comment-regex "^1.1.0"
-
-is-symbol@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
- integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
- dependencies:
- has-symbols "^1.0.0"
-
-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-unc-path@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
- integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
- dependencies:
- unc-path-regex "^0.1.2"
-
-is-utf8@^0.2.0, is-utf8@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
- integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-
-is-valid-glob@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
- integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
-
-is-windows@^1.0.1, 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=
-
-is@^3.2.1:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79"
- integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-isarray@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
- integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
-
-isbinaryfile@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
- integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
- dependencies:
- buffer-alloc "^1.2.0"
-
-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.x, 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=
-
-isurl@^1.0.0-alpha5:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
- integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
- dependencies:
- has-to-string-tag-x "^1.2.0"
- is-object "^1.0.1"
-
-jimp@^0.6.1:
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.6.8.tgz#63074984337cc469cd4030946e503e7c02a18b5c"
- integrity sha512-F7emeG7Hp61IM8VFbNvWENLTuHe0ghizWPuP4JS9ujx2r5mCVYEd/zdaz6M2M42ZdN41blxPajLWl9FXo7Mr2Q==
- dependencies:
- "@jimp/custom" "^0.6.8"
- "@jimp/plugins" "^0.6.8"
- "@jimp/types" "^0.6.8"
- core-js "^2.5.7"
- regenerator-runtime "^0.13.3"
-
-jpeg-js@^0.3.4:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c"
- integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==
-
-jpegtran-bin@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-5.0.1.tgz#3cecaa471726bbcb66adabeeb544c409b17c73e5"
- integrity sha512-xQoXWkIEt4ckmvcHd9xG3RcCIn00sf2TshDyFMOAE+46EspEqwqoPWotVI3e55FGWafMa9cEqaoIyrCeWDnFPw==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.0"
- logalot "^2.0.0"
-
-js-base64@^2.1.8, js-base64@^2.1.9:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
- integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
-
-js-beautify@^1.5.10:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178"
- integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==
- dependencies:
- config-chain "^1.1.12"
- editorconfig "^0.15.3"
- glob "^7.1.3"
- mkdirp "~0.5.1"
- nopt "~4.0.1"
-
-js-levenshtein@^1.1.3:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
- integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
-
-"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4:
- version "3.13.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
- integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-
-jsdom@12.2.0:
- version "12.2.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23"
- integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig==
- dependencies:
- abab "^2.0.0"
- acorn "^6.0.2"
- acorn-globals "^4.3.0"
- array-equal "^1.0.0"
- cssom "^0.3.4"
- cssstyle "^1.1.1"
- data-urls "^1.0.1"
- domexception "^1.0.1"
- escodegen "^1.11.0"
- html-encoding-sniffer "^1.0.2"
- nwsapi "^2.0.9"
- parse5 "5.1.0"
- pn "^1.1.0"
- request "^2.88.0"
- request-promise-native "^1.0.5"
- saxes "^3.1.3"
- symbol-tree "^3.2.2"
- tough-cookie "^2.4.3"
- w3c-hr-time "^1.0.1"
- webidl-conversions "^4.0.2"
- whatwg-encoding "^1.0.5"
- whatwg-mimetype "^2.2.0"
- whatwg-url "^7.0.0"
- ws "^6.1.0"
- xml-name-validator "^3.0.0"
-
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-
-json-buffer@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
- integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-
-json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
- 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-stable-stringify-without-jsonify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-
-json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
- integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
- dependencies:
- jsonify "~0.0.0"
-
-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=
-
-json5@^0.5.0:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
- integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
-
-json5@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
- integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
- dependencies:
- minimist "^1.2.0"
-
-json5@^2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
- integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
- dependencies:
- minimist "^1.2.5"
-
-jsonfile@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
- integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-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"
-
-jsonify@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
- integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-
-jsonpointer@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
- integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk=
-
-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"
-
-junk@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
- integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
-
-just-debounce@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea"
- integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=
-
-keyv@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
- integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
- dependencies:
- json-buffer "3.0.0"
-
-keyv@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
- integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
- dependencies:
- json-buffer "3.0.0"
-
-kind-of@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
- integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=
-
-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, kind-of@^5.0.2:
- 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.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
- integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
-
-known-css-properties@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a"
- integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==
-
-known-css-properties@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4"
- integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==
-
-last-run@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b"
- integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls=
- dependencies:
- default-resolution "^2.0.0"
- es6-weak-map "^2.0.1"
-
-lazystream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
- integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
- dependencies:
- readable-stream "^2.0.5"
-
-lazystream@~0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920"
- integrity sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=
- dependencies:
- readable-stream "~1.0.2"
-
-lcid@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
- integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
- dependencies:
- invert-kv "^1.0.0"
-
-lcid@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
- integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
- dependencies:
- invert-kv "^2.0.0"
-
-lead@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
- integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
- dependencies:
- flush-write-stream "^1.0.2"
-
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
- dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
-
-liftoff@^2.0.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
- integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
- dependencies:
- extend "^3.0.0"
- findup-sync "^2.0.0"
- fined "^1.0.1"
- flagged-respawn "^1.0.0"
- is-plain-object "^2.0.4"
- object.map "^1.0.0"
- rechoir "^0.6.2"
- resolve "^1.1.7"
-
-liftoff@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3"
- integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==
- dependencies:
- extend "^3.0.0"
- findup-sync "^3.0.0"
- fined "^1.0.1"
- flagged-respawn "^1.0.0"
- is-plain-object "^2.0.4"
- object.map "^1.0.0"
- rechoir "^0.6.2"
- resolve "^1.1.7"
-
-limiter@^1.0.5:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1"
- integrity sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==
-
-load-bmfont@^1.3.1, load-bmfont@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
- integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
- dependencies:
- buffer-equal "0.0.1"
- mime "^1.3.4"
- parse-bmfont-ascii "^1.0.3"
- parse-bmfont-binary "^1.0.5"
- parse-bmfont-xml "^1.1.4"
- phin "^2.9.1"
- xhr "^2.0.1"
- xtend "^4.0.0"
-
-load-json-file@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
- integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
- strip-bom "^2.0.0"
-
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
-loader-runner@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
- integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
-
-loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
- integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^2.0.0"
- json5 "^1.0.1"
-
-loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5:
- version "0.2.17"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
- integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
- dependencies:
- big.js "^3.1.3"
- emojis-list "^2.0.0"
- json5 "^0.5.0"
- object-assign "^4.0.1"
-
-loader-utils@^1.0.0, loader-utils@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
- integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^1.0.1"
-
-localtunnel@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.0.tgz#2ea71174fa80e34cce91b2a7ce416e6a57d9ff7c"
- integrity sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==
- dependencies:
- axios "0.19.0"
- debug "4.1.1"
- openurl "1.1.1"
- yargs "13.3.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"
-
-locate-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
- integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
- dependencies:
- p-locate "^3.0.0"
- path-exists "^3.0.0"
-
-locate-path@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
- integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
- dependencies:
- p-locate "^4.1.0"
-
-lodash._basecopy@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
- integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=
-
-lodash._basetostring@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
- integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=
-
-lodash._basevalues@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
- integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=
-
-lodash._escapehtmlchar@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d"
- integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=
- dependencies:
- lodash._htmlescapes "~2.4.1"
-
-lodash._escapestringchar@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72"
- integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=
-
-lodash._getnative@^3.0.0:
- version "3.9.1"
- resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
- integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
-
-lodash._htmlescapes@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb"
- integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs=
-
-lodash._isiterateecall@^3.0.0:
- version "3.0.9"
- resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
- integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=
-
-lodash._isnative@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c"
- integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=
-
-lodash._objecttypes@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11"
- integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=
-
-lodash._reescape@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
- integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=
-
-lodash._reevaluate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
- integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=
-
-lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222"
- integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI=
-
-lodash._reinterpolate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
- integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-
-lodash._reunescapedhtml@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7"
- integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c=
- dependencies:
- lodash._htmlescapes "~2.4.1"
- lodash.keys "~2.4.1"
-
-lodash._root@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
- integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
-
-lodash._shimkeys@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203"
- integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=
- dependencies:
- lodash._objecttypes "~2.4.1"
-
-lodash.capitalize@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
- integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
-
-lodash.clone@^4.3.2:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
- integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
-
-lodash.clonedeep@^4.3.2:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
-lodash.defaults@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
- integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
-
-lodash.defaults@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54"
- integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=
- dependencies:
- lodash._objecttypes "~2.4.1"
- lodash.keys "~2.4.1"
-
-lodash.escape@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
- integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=
- dependencies:
- lodash._root "^3.0.0"
-
-lodash.escape@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4"
- integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q=
- dependencies:
- lodash._escapehtmlchar "~2.4.1"
- lodash._reunescapedhtml "~2.4.1"
- lodash.keys "~2.4.1"
-
-lodash.get@^4.0.0:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
- integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
-
-lodash.isarguments@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
- integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
-
-lodash.isarray@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
- integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
-
-lodash.isfinite@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3"
- integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=
-
-lodash.isobject@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
- integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=
- dependencies:
- lodash._objecttypes "~2.4.1"
-
-lodash.kebabcase@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
- integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
-
-lodash.keys@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
- integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
- dependencies:
- lodash._getnative "^3.0.0"
- lodash.isarguments "^3.0.0"
- lodash.isarray "^3.0.0"
-
-lodash.keys@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727"
- integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc=
- dependencies:
- lodash._isnative "~2.4.1"
- lodash._shimkeys "~2.4.1"
- lodash.isobject "~2.4.1"
-
-lodash.memoize@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
- integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
-
-lodash.restparam@^3.0.0:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
- integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
-
-lodash.some@^4.2.2:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
- integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
-
-lodash.sortby@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
- integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
-
-lodash.template@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d"
- integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0=
- dependencies:
- lodash._escapestringchar "~2.4.1"
- lodash._reinterpolate "~2.4.1"
- lodash.defaults "~2.4.1"
- lodash.escape "~2.4.1"
- lodash.keys "~2.4.1"
- lodash.templatesettings "~2.4.1"
- lodash.values "~2.4.1"
-
-lodash.template@^3.0.0:
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
- integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=
- dependencies:
- lodash._basecopy "^3.0.0"
- lodash._basetostring "^3.0.0"
- lodash._basevalues "^3.0.0"
- lodash._isiterateecall "^3.0.0"
- lodash._reinterpolate "^3.0.0"
- lodash.escape "^3.0.0"
- lodash.keys "^3.0.0"
- lodash.restparam "^3.0.0"
- lodash.templatesettings "^3.0.0"
-
-lodash.template@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
- integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
- dependencies:
- lodash._reinterpolate "^3.0.0"
- lodash.templatesettings "^4.0.0"
-
-lodash.templatesettings@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
- integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=
- dependencies:
- lodash._reinterpolate "^3.0.0"
- lodash.escape "^3.0.0"
-
-lodash.templatesettings@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
- integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
- dependencies:
- lodash._reinterpolate "^3.0.0"
-
-lodash.templatesettings@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699"
- integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=
- dependencies:
- lodash._reinterpolate "~2.4.1"
- lodash.escape "~2.4.1"
-
-lodash.uniq@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
- integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-
-lodash.values@~2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4"
- integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=
- dependencies:
- lodash.keys "~2.4.1"
-
-lodash@^3.0.1:
- version "3.10.1"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
- integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
-
-lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.3.0, lodash@~4.17.10:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
- integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-
-lodash@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
- integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=
-
-lodash@~2.4.1:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
- integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=
-
-logalot@^2.0.0, logalot@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
- integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI=
- dependencies:
- figures "^1.3.5"
- squeak "^1.0.0"
-
-longest@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
- integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
-
-loose-envify@^1.0.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
- integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
- dependencies:
- js-tokens "^3.0.0 || ^4.0.0"
-
-loud-rejection@^1.0.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
- integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
- dependencies:
- currently-unhandled "^0.4.1"
- signal-exit "^3.0.0"
-
-lower-case@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
- integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
-
-lowercase-keys@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
- integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=
-
-lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
- integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-lpad-align@^1.0.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
- integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=
- dependencies:
- get-stdin "^4.0.1"
- indent-string "^2.1.0"
- longest "^1.0.0"
- meow "^3.3.0"
-
-lru-cache@2:
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
- integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
-
-lru-cache@^4.0.1, lru-cache@^4.1.5:
- 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"
-
-lru-cache@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
- integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
- dependencies:
- yallist "^3.0.2"
-
-lz-string@^1.4.4:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
- integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=
-
-make-dir@^1.0.0, make-dir@^1.2.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"
-
-make-dir@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
- integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
- dependencies:
- pify "^4.0.1"
- semver "^5.6.0"
-
-make-dir@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
-make-iterator@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
- integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
- dependencies:
- kind-of "^6.0.2"
-
-map-age-cleaner@^0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
- integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
- dependencies:
- p-defer "^1.0.0"
-
-map-cache@^0.2.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-obj@^1.0.0, map-obj@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
- integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-
-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"
-
-markdown-loader@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-5.1.0.tgz#4efd5006b1514ca966141c661a47e542a9836e6e"
- integrity sha512-xtQNozLEL+55ZSPTNwro8epZqf1h7HjAZd/69zNe8lbckDiGVHeLQm849bXzocln2pwRK2A/GrW/7MAmwjcFog==
- dependencies:
- loader-utils "^1.2.3"
- marked "^0.7.0"
-
-marked@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
- integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
-
-matchdep@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
- integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4=
- dependencies:
- findup-sync "^2.0.0"
- micromatch "^3.0.4"
- resolve "^1.4.0"
- stack-trace "0.0.10"
-
-md5.js@^1.3.4:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
- integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-mdn-data@2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
- integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
-
-mdn-data@~1.1.0:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
- integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==
-
-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=
-
-mem@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
- integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
- dependencies:
- map-age-cleaner "^0.1.1"
- mimic-fn "^2.0.0"
- p-is-promise "^2.0.0"
-
-memory-fs@^0.4.0, memory-fs@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
- integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
- dependencies:
- errno "^0.1.3"
- readable-stream "^2.0.1"
-
-meow@^3.3.0, meow@^3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
- integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
- dependencies:
- camelcase-keys "^2.0.0"
- decamelize "^1.1.2"
- loud-rejection "^1.0.0"
- map-obj "^1.0.1"
- minimist "^1.1.3"
- normalize-package-data "^2.3.4"
- object-assign "^4.0.1"
- read-pkg-up "^1.0.1"
- redent "^1.0.0"
- trim-newlines "^1.0.0"
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-merge2@^1.2.3:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
- integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
-
-merge2@^1.3.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
- integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-
-merge@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
- integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
-
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
- 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"
-
-micromatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
- integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
- dependencies:
- braces "^3.0.1"
- picomatch "^2.0.5"
-
-miller-rabin@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
- integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
- dependencies:
- bn.js "^4.0.0"
- brorand "^1.0.1"
-
-mime-db@1.40.0:
- version "1.40.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
- integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
-
-mime-db@^1.28.0:
- version "1.41.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0"
- integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw==
-
-mime-db@~1.12.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7"
- integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=
-
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.24"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
- integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
- dependencies:
- mime-db "1.40.0"
-
-mime-types@~2.0.9:
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6"
- integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=
- dependencies:
- mime-db "~1.12.0"
-
-mime@1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
- integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
-
-mime@1.6.0, mime@^1.3.4:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mime@^2.4.0:
- version "2.4.4"
- resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
- integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
-
-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==
-
-mimic-fn@^2.0.0, mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-mimic-response@^1.0.0, mimic-response@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-min-document@^2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
- integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
- dependencies:
- dom-walk "^0.1.0"
-
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
- integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-
-minimatch@0.3:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
- integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=
- dependencies:
- lru-cache "2"
- sigmund "~1.0.0"
-
-"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
- 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"
-
-minimatch@^2.0.1:
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
- integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=
- dependencies:
- brace-expansion "^1.0.0"
-
-minimatch@~0.2.11:
- version "0.2.14"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
- integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=
- dependencies:
- lru-cache "2"
- sigmund "~1.0.0"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
- integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
-minimist@1.1.x:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
- integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
-
-minimist@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
- integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4=
-
-minimist@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce"
- integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784=
-
-minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
- integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
-
-minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-minimist@~0.0.1:
- version "0.0.10"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
- integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
-
-minipass@^2.2.1, minipass@^2.6.0, minipass@^2.6.4:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.7.0.tgz#c01093a82287c8331f08f1075499fef124888796"
- integrity sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
-minizlib@^1.2.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.2.tgz#6f0ccc82fa53e1bf2ff145f220d2da9fa6e3a166"
- integrity sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==
- dependencies:
- minipass "^2.2.1"
-
-mississippi@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
- integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
- dependencies:
- concat-stream "^1.5.0"
- duplexify "^3.4.2"
- end-of-stream "^1.1.0"
- flush-write-stream "^1.0.0"
- from2 "^2.1.0"
- parallel-transform "^1.1.0"
- pump "^3.0.0"
- pumpify "^1.3.3"
- stream-each "^1.1.0"
- through2 "^2.0.0"
-
-mitt@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8"
- integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==
-
-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"
-
-mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
- dependencies:
- minimist "0.0.8"
-
-mkdirp@^0.5.3:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
- integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
- dependencies:
- minimist "^1.2.5"
-
-move-concurrently@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
- integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
- dependencies:
- aproba "^1.1.1"
- copy-concurrently "^1.0.0"
- fs-write-stream-atomic "^1.0.8"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.3"
-
-mozjpeg@^6.0.0:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-6.0.1.tgz#56969dddb5741ef2bcb1af066cae21e61a91a27b"
- integrity sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.0"
- logalot "^2.1.0"
-
-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==
-
-ms@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-multipipe@^0.1.0, multipipe@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
- integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=
- dependencies:
- duplexer2 "0.0.2"
-
-mute-stdout@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331"
- integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==
-
-mute-stream@0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
- integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
-
-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==
-
-nan@^2.12.1, nan@^2.13.2:
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
- integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
-
-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"
-
-natives@^1.1.3:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
- integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-
-needle@, needle@^2.2.1:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
- integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
- dependencies:
- debug "^3.2.6"
- iconv-lite "^0.4.4"
- sax "^1.2.4"
-
-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==
-
-neo-async@^2.5.0, neo-async@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
- integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
-
-next-tick@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
- integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-
-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==
-
-no-case@^2.2.0:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
- integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
- dependencies:
- lower-case "^1.1.1"
-
-node-gyp@^3.8.0:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
- integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
- dependencies:
- fstream "^1.0.0"
- glob "^7.0.3"
- graceful-fs "^4.1.2"
- mkdirp "^0.5.0"
- nopt "2 || 3"
- npmlog "0 || 1 || 2 || 3 || 4"
- osenv "0"
- request "^2.87.0"
- rimraf "2"
- semver "~5.3.0"
- tar "^2.0.0"
- which "1"
-
-node-libs-browser@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
- integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
- dependencies:
- assert "^1.1.1"
- browserify-zlib "^0.2.0"
- buffer "^4.3.0"
- console-browserify "^1.1.0"
- constants-browserify "^1.0.0"
- crypto-browserify "^3.11.0"
- domain-browser "^1.1.1"
- events "^3.0.0"
- https-browserify "^1.0.0"
- os-browserify "^0.3.0"
- path-browserify "0.0.1"
- process "^0.11.10"
- punycode "^1.2.4"
- querystring-es3 "^0.2.0"
- readable-stream "^2.3.3"
- stream-browserify "^2.0.1"
- stream-http "^2.7.2"
- string_decoder "^1.0.0"
- timers-browserify "^2.0.4"
- tty-browserify "0.0.0"
- url "^0.11.0"
- util "^0.11.0"
- vm-browserify "^1.0.1"
-
-node-pre-gyp@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
- integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
- dependencies:
- detect-libc "^1.0.2"
- mkdirp "^0.5.1"
- needle "^2.2.1"
- nopt "^4.0.1"
- npm-packlist "^1.1.6"
- npmlog "^4.0.2"
- rc "^1.2.7"
- rimraf "^2.6.1"
- semver "^5.3.0"
- tar "^4"
-
-node-releases@^1.1.29:
- version "1.1.32"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.32.tgz#485b35c1bf9b4d8baa105d782f8ca731e518276e"
- integrity sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==
- dependencies:
- semver "^5.3.0"
-
-node-sass@^4.8.3:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
- integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
- dependencies:
- async-foreach "^0.1.3"
- chalk "^1.1.1"
- cross-spawn "^3.0.0"
- gaze "^1.0.0"
- get-stdin "^4.0.1"
- glob "^7.0.3"
- in-publish "^2.0.0"
- lodash "^4.17.11"
- meow "^3.7.0"
- mkdirp "^0.5.1"
- nan "^2.13.2"
- node-gyp "^3.8.0"
- npmlog "^4.0.0"
- request "^2.88.0"
- sass-graph "^2.2.4"
- stdout-stream "^1.4.0"
- "true-case-path" "^1.0.2"
-
-node-sri@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/node-sri/-/node-sri-1.1.1.tgz#041096d2b11f232b65dedc4c3ae1cb62babb54b0"
- integrity sha1-BBCW0rEfIytl3txMOuHLYrq7VLA=
-
-node.extend@^1.0.10:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0"
- integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==
- dependencies:
- has "^1.0.3"
- is "^3.2.1"
-
-"nopt@2 || 3":
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
- integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
- dependencies:
- abbrev "1"
-
-nopt@^4.0.1, nopt@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
- integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
- 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"
-
-normalize-path@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
- integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
- dependencies:
- remove-trailing-separator "^1.0.1"
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-normalize-range@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
- integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
-
-normalize-url@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
- integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
- dependencies:
- prepend-http "^2.0.0"
- query-string "^5.0.1"
- sort-keys "^2.0.0"
-
-normalize-url@^3.0.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
- integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
-
-normalize-url@^4.1.0:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.4.1.tgz#81e9c153b0ad5743755696f2aa20488d48e962b6"
- integrity sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg==
-
-now-and-later@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
- integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
- dependencies:
- once "^1.3.2"
-
-npm-bundled@^1.0.1:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
- integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
-
-npm-conf@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
- integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
- dependencies:
- config-chain "^1.1.11"
- pify "^3.0.0"
-
-npm-packlist@^1.1.6:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44"
- integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==
- dependencies:
- ignore-walk "^3.0.1"
- npm-bundled "^1.0.1"
-
-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"
-
-npm-run-path@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
- integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
- dependencies:
- are-we-there-yet "~1.1.2"
- console-control-strings "~1.1.0"
- gauge "~2.7.3"
- set-blocking "~2.0.0"
-
-nth-check@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
- integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
- dependencies:
- boolbase "~1.0.0"
-
-num2fraction@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
- integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
-
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
-nwsapi@^2.0.9:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f"
- integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==
-
-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-assign@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
- integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=
-
-object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-assign@~0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-0.3.1.tgz#060e2a2a27d7c0d77ec77b78f11aa47fd88008d2"
- integrity sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=
-
-object-component@0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
- integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
-
-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-inspect@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
- integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
-
-object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
- integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-object-keys@~0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
- integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
-
-object-path@^0.9.0:
- version "0.9.2"
- resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
- integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=
-
-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.assign@^4.0.4, object.assign@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
- integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
- dependencies:
- define-properties "^1.1.2"
- function-bind "^1.1.1"
- has-symbols "^1.0.0"
- object-keys "^1.0.11"
-
-object.defaults@^1.0.0, object.defaults@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
- integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
- dependencies:
- array-each "^1.0.1"
- array-slice "^1.0.0"
- for-own "^1.0.0"
- isobject "^3.0.0"
-
-object.getownpropertydescriptors@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
- integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.5.1"
-
-object.map@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
- integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
- dependencies:
- for-own "^1.0.0"
- make-iterator "^1.0.0"
-
-object.pick@^1.2.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"
-
-object.reduce@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad"
- integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=
- dependencies:
- for-own "^1.0.0"
- make-iterator "^1.0.0"
-
-object.values@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
- integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.12.0"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-omggif@^1.0.9:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19"
- integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
-
-on-finished@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.1.0.tgz#0c539f09291e8ffadde0c8a25850fb2cedc7022d"
- integrity sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0=
- dependencies:
- ee-first "1.0.5"
-
-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"
-
-once@^1.3.0, once@^1.3.1, once@^1.3.2, 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"
-
-once@~1.3.0:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
- integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=
- dependencies:
- wrappy "1"
-
-onetime@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
- integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
-
-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"
-
-onetime@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
- integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
- dependencies:
- mimic-fn "^2.1.0"
-
-open@^0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
- integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=
-
-openurl@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387"
- integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=
-
-opn@5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
- integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==
- dependencies:
- is-wsl "^1.1.0"
-
-optimist@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
- integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
- dependencies:
- minimist "~0.0.1"
- wordwrap "~0.0.2"
-
-optionator@^0.8.1, optionator@^0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
- integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
- dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.4"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- wordwrap "~1.0.0"
-
-optipng-bin@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-6.0.0.tgz#376120fa79d5e71eee2f524176efdd3a5eabd316"
- integrity sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.0"
- logalot "^2.0.0"
-
-orchestrator@^0.3.0:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
- integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=
- dependencies:
- end-of-stream "~0.1.5"
- sequencify "~0.0.7"
- stream-consume "~0.1.0"
-
-ordered-read-streams@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
- integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=
-
-ordered-read-streams@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
- integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
- dependencies:
- readable-stream "^2.0.1"
-
-os-browserify@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
- integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
-
-os-filter-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
- integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==
- dependencies:
- arch "^2.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-locale@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
- integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
- dependencies:
- lcid "^1.0.0"
-
-os-locale@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
- integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
- dependencies:
- execa "^1.0.0"
- lcid "^2.0.0"
- mem "^4.0.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, osenv@^0.1.4:
- 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"
-
-ow@^0.17.0:
- version "0.17.0"
- resolved "https://registry.yarnpkg.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c"
- integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==
- dependencies:
- type-fest "^0.11.0"
-
-p-cancelable@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
- integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
-
-p-cancelable@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
- integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
-
-p-cancelable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
- integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
-
-p-defer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
- integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
-p-event@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085"
- integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=
- dependencies:
- p-timeout "^1.1.1"
-
-p-event@^2.1.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
- integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
- dependencies:
- p-timeout "^2.0.1"
-
-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-is-promise@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
- integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
-
-p-is-promise@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
- integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
-
-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-limit@^2.0.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
- integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
- dependencies:
- p-try "^2.0.0"
-
-p-limit@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.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-locate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
- integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
- dependencies:
- p-limit "^2.0.0"
-
-p-locate@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
- integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
- dependencies:
- p-limit "^2.2.0"
-
-p-map-series@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
- integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=
- dependencies:
- p-reduce "^1.0.0"
-
-p-pipe@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e"
- integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==
-
-p-reduce@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
- integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
-
-p-timeout@^1.1.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
- integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
- dependencies:
- p-finally "^1.0.0"
-
-p-timeout@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
- integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
- dependencies:
- p-finally "^1.0.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.0.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==
-
-pako@^1.0.5, pako@~1.0.5:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
- integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
-
-parallel-transform@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
- integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
- dependencies:
- cyclist "^1.0.1"
- inherits "^2.0.3"
- readable-stream "^2.1.5"
-
-param-case@2.1.x:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
- integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
- dependencies:
- no-case "^2.2.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"
-
-parents@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
- integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=
- dependencies:
- path-platform "~0.11.15"
-
-parse-asn1@^5.0.0:
- version "5.1.5"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
- integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
- dependencies:
- asn1.js "^4.0.0"
- browserify-aes "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
- safe-buffer "^5.1.1"
-
-parse-author@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f"
- integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=
- dependencies:
- author-regex "^1.0.0"
-
-parse-bmfont-ascii@^1.0.3:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
- integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
-
-parse-bmfont-binary@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
- integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
-
-parse-bmfont-xml@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
- integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
- dependencies:
- xml-parse-from-string "^1.0.0"
- xml2js "^0.4.5"
-
-parse-filepath@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
- integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
- dependencies:
- is-absolute "^1.0.0"
- map-cache "^0.2.0"
- path-root "^0.1.1"
-
-parse-headers@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
- integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
- dependencies:
- for-each "^0.3.3"
- string.prototype.trim "^1.1.2"
-
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
- dependencies:
- error-ex "^1.2.0"
-
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
-parse-node-version@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
- integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
-
-parse-passwd@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
- integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
-
-parse5@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
- integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
-
-parseqs@0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
- integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
- dependencies:
- better-assert "~1.0.0"
-
-parseuri@0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
- integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
- dependencies:
- better-assert "~1.0.0"
-
-parseurl@~1.3.0, parseurl@~1.3.2, 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-browserify@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
- integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
-
-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@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
- integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
- dependencies:
- pinkie-promise "^2.0.0"
-
-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-exists@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
- integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
-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-key@^3.0.0, path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-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-platform@~0.11.15:
- version "0.11.15"
- resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
- integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
-
-path-root-regex@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
- integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
-
-path-root@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
- integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
- dependencies:
- path-root-regex "^0.1.0"
-
-path-starts-with@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.0.tgz#ffd6d51926cd497022b44d392196033d5451892f"
- integrity sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==
-
-path-type@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
- integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
- dependencies:
- graceful-fs "^4.1.2"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
-path-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
- integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-
-pbkdf2@^3.0.3:
- version "3.0.17"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
- integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
- dependencies:
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
- ripemd160 "^2.0.1"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-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=
-
-phin@^2.9.1:
- version "2.9.3"
- resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
- integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
-
-phonegap-plugin-mobile-accessibility@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/phonegap-plugin-mobile-accessibility/-/phonegap-plugin-mobile-accessibility-1.0.5.tgz#95a8754d127508bc6e1ae259a53ce765836eac03"
- integrity sha1-lah1TRJ1CLxuGuJZpTznZYNurAM=
-
-picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
- integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
-
-pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
-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==
-
-pinkie-promise@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
- integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
- dependencies:
- pinkie "^2.0.0"
-
-pinkie@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
- integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
-pixelmatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
- integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
- dependencies:
- pngjs "^3.0.0"
-
-pkg-dir@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
- integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
- dependencies:
- find-up "^3.0.0"
-
-pkginfo@0.3.x:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
- integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
-
-plist@^3.0.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"
-
-plugin-error@1.0.1, plugin-error@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
- integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
- dependencies:
- ansi-colors "^1.0.1"
- arr-diff "^4.0.0"
- arr-union "^3.1.0"
- extend-shallow "^3.0.2"
-
-plugin-error@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
- integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=
- dependencies:
- ansi-cyan "^0.1.1"
- ansi-red "^0.1.1"
- arr-diff "^1.0.1"
- arr-union "^2.0.1"
- extend-shallow "^1.1.2"
-
-plur@^3.0.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b"
- integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==
- dependencies:
- irregular-plurals "^2.0.0"
-
-pluralize@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
- integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
-
-pn@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
- integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-
-pngjs@^3.0.0, pngjs@^3.3.3:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
- integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
-
-pngquant-bin@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460"
- integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.1"
- execa "^0.10.0"
- logalot "^2.0.0"
-
-pngquant-bin@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.0.tgz#aff0d7e61095feb96ced379ad8c7294ad3dd1712"
- integrity sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==
- dependencies:
- bin-build "^3.0.0"
- bin-wrapper "^4.0.1"
- execa "^4.0.0"
- logalot "^2.0.0"
-
-portscanner@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96"
- integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=
- dependencies:
- async "1.5.2"
- is-number-like "^1.0.3"
-
-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=
-
-postcss-assets@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-assets/-/postcss-assets-5.0.0.tgz#f721d07d339605fb58414e9f69cf05401c54e709"
- integrity sha1-9yHQfTOWBftYQU6fac8FQBxU5wk=
- dependencies:
- assets "^3.0.0"
- bluebird "^3.5.0"
- postcss "^6.0.10"
- postcss-functions "^3.0.0"
-
-postcss-attribute-case-insensitive@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7"
- integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0"
-
-postcss-calc@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436"
- integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==
- dependencies:
- css-unit-converter "^1.1.1"
- postcss "^7.0.5"
- postcss-selector-parser "^5.0.0-rc.4"
- postcss-value-parser "^3.3.1"
-
-postcss-color-functional-notation@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0"
- integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-color-gray@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
- integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
-
-postcss-color-hex-alpha@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388"
- integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==
- dependencies:
- postcss "^7.0.14"
- postcss-values-parser "^2.0.1"
-
-postcss-color-mod-function@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d"
- integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-color-rebeccapurple@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77"
- integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-colormin@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
- integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
- dependencies:
- browserslist "^4.0.0"
- color "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-convert-values@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
- integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-custom-media@^7.0.8:
- version "7.0.8"
- resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
- integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==
- dependencies:
- postcss "^7.0.14"
-
-postcss-custom-properties@^8.0.11:
- version "8.0.11"
- resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
- integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
- dependencies:
- postcss "^7.0.17"
- postcss-values-parser "^2.0.1"
-
-postcss-custom-selectors@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba"
- integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-dir-pseudo-class@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2"
- integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-discard-comments@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
- integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-duplicates@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
- integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-empty@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
- integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-overridden@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
- integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-unused@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea"
- integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==
- dependencies:
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
- uniqs "^2.0.0"
-
-postcss-double-position-gradients@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
- integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==
- dependencies:
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
-
-postcss-env-function@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7"
- integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-focus-visible@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e"
- integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==
- dependencies:
- postcss "^7.0.2"
-
-postcss-focus-within@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680"
- integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==
- dependencies:
- postcss "^7.0.2"
-
-postcss-font-variant@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc"
- integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-functions@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e"
- integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=
- dependencies:
- glob "^7.1.2"
- object-assign "^4.1.1"
- postcss "^6.0.9"
- postcss-value-parser "^3.3.0"
-
-postcss-gap-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715"
- integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-image-set-function@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288"
- integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-initial@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.1.tgz#99d319669a13d6c06ef8e70d852f68cb1b399b61"
- integrity sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==
- dependencies:
- lodash.template "^4.5.0"
- postcss "^7.0.2"
-
-postcss-lab-function@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
- integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-load-config@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
- integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
- dependencies:
- cosmiconfig "^5.0.0"
- import-cwd "^2.0.0"
-
-postcss-logical@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
- integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
- dependencies:
- postcss "^7.0.2"
-
-postcss-media-minmax@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
- integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-merge-idents@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23"
- integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==
- dependencies:
- cssnano-util-same-parent "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-merge-longhand@^4.0.11:
- version "4.0.11"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
- integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
- dependencies:
- css-color-names "0.0.4"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- stylehacks "^4.0.0"
-
-postcss-merge-rules@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
- integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- cssnano-util-same-parent "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
- vendors "^1.0.0"
-
-postcss-minify-font-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
- integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-gradients@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
- integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- is-color-stop "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-params@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
- integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
- dependencies:
- alphanum-sort "^1.0.0"
- browserslist "^4.0.0"
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- uniqs "^2.0.0"
-
-postcss-minify-selectors@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
- integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
- dependencies:
- alphanum-sort "^1.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
-
-postcss-nesting@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
- integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-normalize-charset@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
- integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
- dependencies:
- postcss "^7.0.0"
-
-postcss-normalize-display-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
- integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-positions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
- integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-repeat-style@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
- integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-string@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
- integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
- dependencies:
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-timing-functions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
- integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-unicode@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
- integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-url@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
- integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
- dependencies:
- is-absolute-url "^2.0.0"
- normalize-url "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-whitespace@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
- integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-ordered-values@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
- integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-overflow-shorthand@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30"
- integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==
- dependencies:
- postcss "^7.0.2"
-
-postcss-page-break@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf"
- integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==
- dependencies:
- postcss "^7.0.2"
-
-postcss-place@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62"
- integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-preset-env@^6.5.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5"
- integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==
- dependencies:
- autoprefixer "^9.6.1"
- browserslist "^4.6.4"
- caniuse-lite "^1.0.30000981"
- css-blank-pseudo "^0.1.4"
- css-has-pseudo "^0.10.0"
- css-prefers-color-scheme "^3.1.1"
- cssdb "^4.4.0"
- postcss "^7.0.17"
- postcss-attribute-case-insensitive "^4.0.1"
- postcss-color-functional-notation "^2.0.1"
- postcss-color-gray "^5.0.0"
- postcss-color-hex-alpha "^5.0.3"
- postcss-color-mod-function "^3.0.3"
- postcss-color-rebeccapurple "^4.0.1"
- postcss-custom-media "^7.0.8"
- postcss-custom-properties "^8.0.11"
- postcss-custom-selectors "^5.1.2"
- postcss-dir-pseudo-class "^5.0.0"
- postcss-double-position-gradients "^1.0.0"
- postcss-env-function "^2.0.2"
- postcss-focus-visible "^4.0.0"
- postcss-focus-within "^3.0.0"
- postcss-font-variant "^4.0.0"
- postcss-gap-properties "^2.0.0"
- postcss-image-set-function "^3.0.1"
- postcss-initial "^3.0.0"
- postcss-lab-function "^2.0.1"
- postcss-logical "^3.0.0"
- postcss-media-minmax "^4.0.0"
- postcss-nesting "^7.0.0"
- postcss-overflow-shorthand "^2.0.0"
- postcss-page-break "^2.0.0"
- postcss-place "^4.0.1"
- postcss-pseudo-class-any-link "^6.0.0"
- postcss-replace-overflow-wrap "^3.0.0"
- postcss-selector-matches "^4.0.0"
- postcss-selector-not "^4.0.0"
-
-postcss-pseudo-class-any-link@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1"
- integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-reduce-idents@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b"
- integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-reduce-initial@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
- integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
-
-postcss-reduce-transforms@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
- integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-replace-overflow-wrap@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
- integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-round-subpixels@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/postcss-round-subpixels/-/postcss-round-subpixels-1.2.0.tgz#e21d6ac5952e185f9bdc008b94f004fe509d0a11"
- integrity sha1-4h1qxZUuGF+b3ACLlPAE/lCdChE=
- dependencies:
- postcss "^5.0.2"
- postcss-value-parser "^3.1.2"
-
-postcss-selector-matches@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff"
- integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-not@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0"
- integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-parser@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
- integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=
- dependencies:
- dot-prop "^4.1.1"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
- integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
- dependencies:
- cssesc "^2.0.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-svgo@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
- integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
- dependencies:
- is-svg "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- svgo "^1.0.0"
-
-postcss-unique-selectors@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
- integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
- dependencies:
- alphanum-sort "^1.0.0"
- postcss "^7.0.0"
- uniqs "^2.0.0"
-
-postcss-unprefix@^2.1.3:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/postcss-unprefix/-/postcss-unprefix-2.1.4.tgz#ab1c038ab77f068799ed36e1cbd997b51e7360a1"
- integrity sha512-s+muBiGIMx3RvgPTtPBnSrfvIBHJ2Zx16QZf/VDB/sAxdYP6FIzci8d1gLh0+9psu5W6zVtCbU5micNt6Zh3cg==
- dependencies:
- autoprefixer "^9.4.3"
- known-css-properties "^0.11.0"
- normalize-range "^0.1.2"
- postcss-selector-parser "^5.0.0"
- postcss-value-parser "^3.3.1"
- pseudo-classes "^1.0.0"
- pseudo-elements "^1.1.0"
-
-postcss-value-parser@^3.0.0, postcss-value-parser@^3.1.2, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
- integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-
-postcss-value-parser@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9"
- integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==
-
-postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
- integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
- dependencies:
- flatten "^1.0.2"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-zindex@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1"
- integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==
- dependencies:
- has "^1.0.0"
- postcss "^7.0.0"
- uniqs "^2.0.0"
-
-postcss@^5.0.2:
- version "5.2.18"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
- integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
- dependencies:
- chalk "^1.1.3"
- js-base64 "^2.1.9"
- source-map "^0.5.6"
- supports-color "^3.2.3"
-
-postcss@^6.0.10, postcss@^6.0.9:
- version "6.0.23"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
- integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
- dependencies:
- chalk "^2.4.1"
- source-map "^0.6.1"
- supports-color "^5.4.0"
-
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6:
- version "7.0.18"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233"
- integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==
- dependencies:
- chalk "^2.4.2"
- source-map "^0.6.1"
- supports-color "^6.1.0"
-
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-
-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=
-
-prepend-http@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
- integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
-pretty-bytes@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
- integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
-
-pretty-hrtime@^0.2.0:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-0.2.2.tgz#d4fd88351e3a4741f8173af7d6a4b846f9895c00"
- integrity sha1-1P2INR46R0H4Fzr31qS4RvmJXAA=
-
-pretty-hrtime@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
- integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
-
-private@^0.1.6, private@~0.1.5:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
- integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
-
-process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-
-process@~0.5.1:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
- integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
-
-progress@^1.1.8:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
- integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
-
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-promise-inflight@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-
-promise-polyfill@^8.1.0:
- version "8.1.3"
- resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116"
- integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==
-
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-
-proxy-middleware@^0.5.0:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.5.1.tgz#da24d5d58c1ddf13dad237c7eca503849eaea903"
- integrity sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM=
-
-prr@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
- integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-
-pseudo-classes@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/pseudo-classes/-/pseudo-classes-1.0.0.tgz#60a69b67395c36ff119c4d1c86e1981785206b96"
- integrity sha1-YKabZzlcNv8RnE0chuGYF4Uga5Y=
-
-pseudo-elements@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pseudo-elements/-/pseudo-elements-1.1.0.tgz#9ba6dd8ac3ce1f3d7d36d4355aa3e28d08391f28"
- integrity sha1-m6bdisPOHz19NtQ1WqPijQg5Hyg=
-
-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.24, psl@^1.1.28:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
- integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
-
-public-encrypt@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
- integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
- dependencies:
- bn.js "^4.1.0"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- parse-asn1 "^5.0.0"
- randombytes "^2.0.1"
- safe-buffer "^5.1.2"
-
-pump@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
- integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-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"
-
-pumpify@^1.3.3, pumpify@^1.3.5:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
- integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
- dependencies:
- duplexify "^3.6.0"
- inherits "^2.0.3"
- pump "^2.0.0"
-
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
-punycode@^1.2.4, punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
-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.1.2:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
- integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
-
-qs@2.2.4:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.4.tgz#2e9fbcd34b540e3421c924ecd01e90aa975319c8"
- integrity sha1-Lp+800tUDjQhySTs0B6QqpdTGcg=
-
-qs@6.2.3:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
- integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=
-
-qs@~2.2.3:
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c"
- integrity sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=
-
-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==
-
-query-string@^5.0.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
- integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
- dependencies:
- decode-uri-component "^0.2.0"
- object-assign "^4.1.0"
- strict-uri-encode "^1.0.0"
-
-query-string@^6.8.1:
- version "6.8.3"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b"
- integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==
- dependencies:
- decode-uri-component "^0.2.0"
- split-on-first "^1.0.0"
- strict-uri-encode "^2.0.0"
-
-querystring-es3@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
- integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
-
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
- integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
- integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
- dependencies:
- randombytes "^2.0.5"
- safe-buffer "^5.1.0"
-
-range-parser@~1.2.0, 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@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.3.0.tgz#978230a156a5548f42eef14de22d0f4f610083d1"
- integrity sha1-l4IwoValVI9C7vFN4i0PT2EAg9E=
- dependencies:
- bytes "1"
- iconv-lite "0.4.4"
-
-raw-body@^2.3.2:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
- integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
- dependencies:
- bytes "3.1.0"
- http-errors "1.7.3"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
-
-rc@^1.2.7:
- 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"
-
-rcedit@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.0.0.tgz#dcc85d93aa91a41c1ebc5c6aa1dfc43ea28b7dad"
- integrity sha512-XcFGyEBjhWSsud+R8elwQtGBbVkCf7tAiad+nXo5jc6l2rMf46NfGNwjnmBNneBIZDfq+Npf8lwP371JTONfrw==
-
-rcfinder@^0.1.6:
- version "0.1.9"
- resolved "https://registry.yarnpkg.com/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115"
- integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU=
- dependencies:
- lodash.clonedeep "^4.3.2"
-
-rcloader@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.1.4.tgz#d0c902f0444983a2ee5a6907937c6a79ca704509"
- integrity sha1-0MkC8ERJg6LuWmkHk3xqecpwRQk=
- dependencies:
- lodash "^3.0.1"
- rcfinder "^0.1.6"
-
-read-pkg-up@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
- integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
- dependencies:
- find-up "^1.0.0"
- read-pkg "^1.0.0"
-
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
-
-read-pkg@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
- integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
- dependencies:
- load-json-file "^1.0.0"
- normalize-package-data "^2.3.2"
- path-type "^1.0.0"
-
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
-read@~1.0.4:
- 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"
-
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
- integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-"readable-stream@2 || 3":
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
- integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26:
- version "1.0.34"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
- integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@^1.0.27-1, readable-stream@~1.1.9:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@^3.0.2, readable-stream@^3.1.1:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readdirp@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
- integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
- dependencies:
- graceful-fs "^4.1.11"
- micromatch "^3.1.10"
- readable-stream "^2.0.2"
-
-readdirp@~3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
- integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
- dependencies:
- picomatch "^2.2.1"
-
-readline2@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
- integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- mute-stream "0.0.5"
-
-recast@~0.11.12:
- version "0.11.23"
- resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
- integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=
- dependencies:
- ast-types "0.9.6"
- esprima "~3.1.0"
- private "~0.1.5"
- source-map "~0.5.0"
-
-rechoir@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
- integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
- dependencies:
- resolve "^1.1.6"
-
-redent@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
- integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
- dependencies:
- indent-string "^2.1.0"
- strip-indent "^1.0.1"
-
-regenerate-unicode-properties@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
- integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==
- dependencies:
- regenerate "^1.4.0"
-
-regenerate@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
- integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
-
-regenerator-runtime@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
- integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
-
-regenerator-runtime@^0.13.3:
- version "0.13.3"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
- integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
-
-regenerator-runtime@^0.13.4:
- version "0.13.5"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
- integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
-
-regenerator-transform@^0.14.0:
- version "0.14.1"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"
- integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==
- dependencies:
- private "^0.1.6"
-
-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"
-
-regexp-tree@^0.1.13:
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
- integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==
-
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
-regexpu-core@^4.5.4:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
- integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==
- dependencies:
- regenerate "^1.4.0"
- regenerate-unicode-properties "^8.1.0"
- regjsgen "^0.5.0"
- regjsparser "^0.6.0"
- unicode-match-property-ecmascript "^1.0.4"
- unicode-match-property-value-ecmascript "^1.1.0"
-
-regjsgen@^0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
- integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
-
-regjsparser@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c"
- integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==
- dependencies:
- jsesc "~0.5.0"
-
-relateurl@0.2.x:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
- integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
-
-remove-bom-buffer@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
- integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
- dependencies:
- is-buffer "^1.1.5"
- is-utf8 "^0.2.1"
-
-remove-bom-stream@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
- integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
- dependencies:
- remove-bom-buffer "^3.0.0"
- safe-buffer "^5.1.0"
- through2 "^2.0.3"
-
-remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
- integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-
-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=
-
-repeating@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
- integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
- dependencies:
- is-finite "^1.0.0"
-
-replace-ext@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
- integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=
-
-replace-ext@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
- integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
-
-replace-homedir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c"
- integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=
- dependencies:
- homedir-polyfill "^1.0.1"
- is-absolute "^1.0.0"
- remove-trailing-separator "^1.1.0"
-
-request-promise-core@1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
- integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
- dependencies:
- lodash "^4.17.11"
-
-request-promise-native@^1.0.5:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
- integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
- dependencies:
- request-promise-core "1.1.2"
- stealthy-require "^1.1.1"
- tough-cookie "^2.3.3"
-
-request@^2.87.0, request@^2.88.0:
- version "2.88.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
- integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
- 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.0"
- 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.4.3"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
-require-main-filename@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
- integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
-require-main-filename@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
- integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-
-require-uncached@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
- integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
- dependencies:
- caller-path "^0.1.0"
- resolve-from "^1.0.0"
-
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
-
-resolve-cwd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
- integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
- dependencies:
- resolve-from "^3.0.0"
-
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
- integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
- dependencies:
- expand-tilde "^2.0.0"
- global-modules "^1.0.0"
-
-resolve-from@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
- integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
-
-resolve-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
- integrity sha1-six699nWiBvItuZTM17rywoYh0g=
-
-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-options@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
- integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
- dependencies:
- value-or-function "^3.0.0"
-
-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.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
- integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@^1.15.1, resolve@^1.4.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
- integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
- dependencies:
- path-parse "^1.0.6"
-
-resp-modifier@6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f"
- integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=
- dependencies:
- debug "^2.2.0"
- minimatch "^3.0.2"
-
-responselike@1.0.2, responselike@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
- integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
- dependencies:
- lowercase-keys "^1.0.0"
-
-restore-cursor@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
- integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
- dependencies:
- exit-hook "^1.0.0"
- onetime "^1.0.0"
-
-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==
-
-reusify@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
- integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-
-rgb-regex@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
- integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
-
-rgba-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
- integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
-
-rimraf@2, rimraf@^2.4.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
- integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
- dependencies:
- glob "^7.1.3"
-
-rimraf@2.6.3, rimraf@~2.6.2:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
-rimraf@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
- integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==
- dependencies:
- glob "^7.1.3"
-
-ripemd160@^2.0.0, ripemd160@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
- integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
-
-run-async@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
- integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
- dependencies:
- once "^1.3.0"
-
-run-async@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
- integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
- dependencies:
- is-promise "^2.1.0"
-
-run-parallel@^1.1.9:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
- integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
-
-run-queue@^1.0.0, run-queue@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
- integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
- dependencies:
- aproba "^1.1.1"
-
-rusha@^0.8.13:
- version "0.8.13"
- resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a"
- integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=
-
-rx-lite@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
- integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
-
-rx@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
- integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=
-
-rxjs@^5.5.6:
- version "5.5.12"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
- integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
- dependencies:
- symbol-observable "1.0.1"
-
-rxjs@^6.4.0:
- version "6.5.3"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a"
- integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==
- dependencies:
- tslib "^1.9.0"
-
-safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- 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.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
- 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==
-
-sanitize-filename@^1.6.0, sanitize-filename@^1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
- integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
- dependencies:
- truncate-utf8-bytes "^1.0.0"
-
-sass-graph@^2.2.4:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
- integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
- dependencies:
- glob "^7.0.0"
- lodash "^4.0.0"
- scss-tokenizer "^0.2.3"
- yargs "^7.0.0"
-
-sass-lint@^1.12.0:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f"
- integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==
- dependencies:
- commander "^2.8.1"
- eslint "^2.7.0"
- front-matter "2.1.2"
- fs-extra "^3.0.1"
- glob "^7.0.0"
- globule "^1.0.0"
- gonzales-pe-sl "^4.2.3"
- js-yaml "^3.5.4"
- known-css-properties "^0.3.0"
- lodash.capitalize "^4.1.0"
- lodash.kebabcase "^4.0.0"
- merge "^1.2.0"
- path-is-absolute "^1.0.0"
- util "^0.10.3"
-
-sass-unused@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/sass-unused/-/sass-unused-0.3.0.tgz#69924e4996d6c96840fb3a99e0a0290516811a9f"
- integrity sha512-fGNcUpDeSFwnN+BTQ251iM77Py8awPXc96vSE3TpvMcgbC90IrohonRb4oxWX/KzHpezkmUddS8/t04R+yIB8w==
- dependencies:
- glob "^7.0.5"
- gonzales-pe "^4.2.3"
-
-sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-saxes@^3.1.3:
- version "3.1.11"
- resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
- integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
- dependencies:
- xmlchars "^2.1.1"
-
-schema-utils@^0.4.0:
- version "0.4.7"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
- integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
- dependencies:
- ajv "^6.1.0"
- ajv-keywords "^3.1.0"
-
-schema-utils@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
- integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
- dependencies:
- ajv "^6.1.0"
- ajv-errors "^1.0.0"
- ajv-keywords "^3.1.0"
-
-schema-utils@^2.6.5:
- version "2.6.5"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a"
- integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==
- dependencies:
- ajv "^6.12.0"
- ajv-keywords "^3.4.1"
-
-scss-tokenizer@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
- integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
- dependencies:
- js-base64 "^2.1.8"
- source-map "^0.4.2"
-
-seek-bzip@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
- integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
- dependencies:
- commander "~2.8.1"
-
-semver-greatest-satisfied-range@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b"
- integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els=
- dependencies:
- sver-compat "^1.5.0"
-
-semver-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
- integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
-
-semver-truncate@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
- integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=
- dependencies:
- semver "^5.3.0"
-
-"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@^4.1.0:
- version "4.3.6"
- resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
- integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
-
-semver@^6.0.0, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@~5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
- integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
-
-send@0.16.2:
- version "0.16.2"
- resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
- integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
- 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.6.2"
- mime "1.4.1"
- ms "2.0.0"
- on-finished "~2.3.0"
- range-parser "~1.2.0"
- statuses "~1.4.0"
-
-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"
-
-sequencify@~0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
- integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=
-
-serialize-error@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf"
- integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A==
-
-serialize-javascript@^1.7.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
- integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
-
-serialize-javascript@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
- integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
- dependencies:
- randombytes "^2.1.0"
-
-serve-index@1.9.1, serve-index@^1.1.4:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
- dependencies:
- accepts "~1.3.4"
- batch "0.6.1"
- debug "2.6.9"
- escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
-
-serve-static@1.13.2:
- version "1.13.2"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
- integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
- dependencies:
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- parseurl "~1.3.2"
- send "0.16.2"
-
-serve-static@^1.3.0:
- 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"
-
-server-destroy@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
- integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=
-
-set-blocking@^2.0.0, set-blocking@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-
-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"
-
-setimmediate@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
- integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
-
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
- integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
-
-setprototypeof@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
- integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
-sha.js@^2.4.0, sha.js@^2.4.8:
- version "2.4.11"
- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
- integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-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-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.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=
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-shelljs@^0.6.0:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8"
- integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=
-
-sigmund@^1.0.1, sigmund@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
- integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
-
-signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
- integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-
-simple-swizzle@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
- integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
- dependencies:
- is-arrayish "^0.3.1"
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-slice-ansi@0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
- integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
-
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
-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"
-
-socket.io-adapter@~1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
- integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=
-
-socket.io-client@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f"
- integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==
- dependencies:
- backo2 "1.0.2"
- base64-arraybuffer "0.1.5"
- component-bind "1.0.0"
- component-emitter "1.2.1"
- debug "~3.1.0"
- engine.io-client "~3.2.0"
- has-binary2 "~1.0.2"
- has-cors "1.1.0"
- indexof "0.0.1"
- object-component "0.0.3"
- parseqs "0.0.5"
- parseuri "0.0.5"
- socket.io-parser "~3.2.0"
- to-array "0.1.4"
-
-socket.io-client@^2.0.4:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4"
- integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==
- dependencies:
- backo2 "1.0.2"
- base64-arraybuffer "0.1.5"
- component-bind "1.0.0"
- component-emitter "1.2.1"
- debug "~4.1.0"
- engine.io-client "~3.4.0"
- has-binary2 "~1.0.2"
- has-cors "1.1.0"
- indexof "0.0.1"
- object-component "0.0.3"
- parseqs "0.0.5"
- parseuri "0.0.5"
- socket.io-parser "~3.3.0"
- to-array "0.1.4"
-
-socket.io-parser@~3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077"
- integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==
- dependencies:
- component-emitter "1.2.1"
- debug "~3.1.0"
- isarray "2.0.1"
-
-socket.io-parser@~3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
- integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
- dependencies:
- component-emitter "1.2.1"
- debug "~3.1.0"
- isarray "2.0.1"
-
-socket.io@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980"
- integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==
- dependencies:
- debug "~3.1.0"
- engine.io "~3.2.0"
- has-binary2 "~1.0.2"
- socket.io-adapter "~1.1.0"
- socket.io-client "2.1.1"
- socket.io-parser "~3.2.0"
-
-sort-keys-length@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
- integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=
- dependencies:
- sort-keys "^1.0.0"
-
-sort-keys@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
- integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
- dependencies:
- is-plain-obj "^1.0.0"
-
-sort-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
- integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
- dependencies:
- is-plain-obj "^1.0.0"
-
-source-list-map@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
-source-map-resolve@^0.5.0:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
- integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
- dependencies:
- atob "^2.1.1"
- decode-uri-component "^0.2.0"
- resolve-url "^0.2.1"
- source-map-url "^0.4.0"
- urix "^0.1.0"
-
-source-map-support@~0.5.12:
- version "0.5.13"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
- integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.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.4.2:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
- integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
- dependencies:
- amdefine ">=0.0.4"
-
-source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-source-map@~0.1.38:
- version "0.1.43"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
- integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
- dependencies:
- amdefine ">=0.0.4"
-
-sparkles@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
- integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
-
-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-on-first@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
- integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
-
-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"
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
-squeak@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
- integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=
- dependencies:
- chalk "^1.0.0"
- console-stream "^0.1.1"
- lpad-align "^1.0.1"
-
-ssh2-streams@~0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.2.1.tgz#9c9c9964be60e9644575af328677f64b1e5cbd79"
- integrity sha512-3zCOsmunh1JWgPshfhKmBCL3lUtHPoh+a/cyQ49Ft0Q0aF7xgN06b76L+oKtFi0fgO57FLjFztb1GlJcEZ4a3Q==
- dependencies:
- asn1 "~0.2.0"
- semver "^5.1.0"
- streamsearch "~0.1.2"
-
-ssh2@~0.6.1:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.6.2.tgz#b065d6e2133a2d4b557447d613b3511cb15e3a2e"
- integrity sha512-DJ+dOhXEEsmNpcQTI0x69FS++JH6qqL/ltEHf01pI1SSLMAcmD+hL4jRwvHjPwynPsmSUbHJ/WIZYzROfqZWjA==
- dependencies:
- ssh2-streams "~0.2.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"
-
-ssri@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
- integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
- dependencies:
- figgy-pudding "^3.5.1"
-
-stable@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
- integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
-
-stack-trace@0.0.10, stack-trace@0.0.x:
- version "0.0.10"
- resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
- integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
-
-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.4.0 < 2", "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=
-
-statuses@~1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
- integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=
-
-statuses@~1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
- integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
-
-stdout-stream@^1.4.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
- integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
- dependencies:
- readable-stream "^2.0.1"
-
-stealthy-require@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
- integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
-
-stream-browserify@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
- integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
- dependencies:
- inherits "~2.0.1"
- readable-stream "^2.0.2"
-
-stream-consume@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
- integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==
-
-stream-each@^1.1.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
- integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
- dependencies:
- end-of-stream "^1.1.0"
- stream-shift "^1.0.0"
-
-stream-exhaust@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d"
- integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==
-
-stream-http@^2.7.2:
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
- integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
- dependencies:
- builtin-status-codes "^3.0.0"
- inherits "^2.0.1"
- readable-stream "^2.3.6"
- to-arraybuffer "^1.0.0"
- xtend "^4.0.0"
-
-stream-shift@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
- integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
-
-stream-throttle@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3"
- integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=
- dependencies:
- commander "^2.2.0"
- limiter "^1.0.5"
-
-streamsearch@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
- integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
-
-strict-uri-encode@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
- integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
-
-strict-uri-encode@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
- integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
-
-strictdom@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460"
- integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA=
-
-string-replace-webpack-plugin@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/string-replace-webpack-plugin/-/string-replace-webpack-plugin-0.1.3.tgz#73c657e759d66cfe80ae1e0cf091aa256d0e715c"
- integrity sha1-c8ZX51nWbP6Arh4M8JGqJW0OcVw=
- dependencies:
- async "~0.2.10"
- loader-utils "~0.2.3"
- optionalDependencies:
- css-loader "^0.9.1"
- file-loader "^0.8.1"
- style-loader "^0.8.3"
-
-string-width@^1.0.1, string-width@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0:
- 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-width@^3.0.0, string-width@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
- integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
- dependencies:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-string-width@^4.1.0, string-width@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
- integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
-
-string.prototype.trim@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d"
- integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.13.0"
- function-bind "^1.1.1"
-
-string.prototype.trimleft@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
- integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
- dependencies:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
-
-string.prototype.trimright@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
- integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
- dependencies:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
-
-string_decoder@^1.0.0, string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-strip-ansi@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220"
- integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=
- dependencies:
- ansi-regex "^0.2.1"
-
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
- dependencies:
- ansi-regex "^2.0.0"
-
-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.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
-strip-bom@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
- integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=
- dependencies:
- first-chunk-stream "^1.0.0"
- is-utf8 "^0.2.0"
-
-strip-bom@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
- integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
- dependencies:
- is-utf8 "^0.2.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-dirs@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
- integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
- dependencies:
- is-natural-number "^4.0.1"
-
-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-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
-strip-indent@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
- integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
- dependencies:
- get-stdin "^4.0.1"
-
-strip-json-comments@^2.0.1, 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=
-
-strip-json-comments@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
-
-strip-json-comments@~1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
- integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
-
-strip-outer@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
- integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
- dependencies:
- escape-string-regexp "^1.0.2"
-
-style-loader@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.8.3.tgz#f4f92eb7db63768748f15065cd6700f5a1c85357"
- integrity sha1-9Pkut9tjdodI8VBlzWcA9aHIU1c=
- dependencies:
- loader-utils "^0.2.5"
-
-stylehacks@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
- integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
-
-sumchecker@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.0.tgz#da5457b4605184575c76540e5e99cc777cb8ce4c"
- integrity sha512-yreseuC/z4iaodVoq07XULEOO9p4jnQazO7mbrnDSvWAU/y2cbyIKs+gWJptfcGu9R+1l27K8Rkj0bfvqnBpgQ==
- dependencies:
- debug "^4.1.0"
-
-supports-color@6.1.0, supports-color@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
- integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a"
- integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=
-
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
- integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-
-supports-color@^3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
- integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
- dependencies:
- has-flag "^1.0.0"
-
-supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.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"
-
-supports-color@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
- integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
- dependencies:
- has-flag "^4.0.0"
-
-sver-compat@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8"
- integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=
- dependencies:
- es6-iterator "^2.0.1"
- es6-symbol "^3.1.1"
-
-svgo@^1.0.0, svgo@^1.0.5:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313"
- integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==
- dependencies:
- chalk "^2.4.1"
- coa "^2.0.2"
- css-select "^2.0.0"
- css-select-base-adapter "^0.1.1"
- css-tree "1.0.0-alpha.33"
- csso "^3.5.1"
- js-yaml "^3.13.1"
- mkdirp "~0.5.1"
- object.values "^1.1.0"
- sax "~1.2.4"
- stable "^0.1.8"
- unquote "~1.1.1"
- util.promisify "~1.0.0"
-
-symbol-observable@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
- integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
-
-symbol-tree@^3.2.2:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
- integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-
-table@^3.7.8:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
- integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
- dependencies:
- ajv "^4.7.0"
- ajv-keywords "^1.0.0"
- chalk "^1.1.1"
- lodash "^4.0.0"
- slice-ansi "0.0.4"
- string-width "^2.0.0"
-
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
-tapable@^1.0.0, tapable@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
- integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
-
-tar-stream@^1.5.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
- integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
- dependencies:
- bl "^1.0.0"
- buffer-alloc "^1.2.0"
- end-of-stream "^1.0.0"
- fs-constants "^1.0.0"
- readable-stream "^2.3.0"
- to-buffer "^1.1.1"
- xtend "^4.0.0"
-
-tar-stream@~0.4.0:
- version "0.4.7"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd"
- integrity sha1-Hx0s6evHtCdlJDyg6PG3v9oKrc0=
- dependencies:
- bl "^0.9.0"
- end-of-stream "^1.0.0"
- readable-stream "^1.0.27-1"
- xtend "^4.0.0"
-
-tar@^2.0.0:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
- integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
- dependencies:
- block-stream "*"
- fstream "^1.0.12"
- inherits "2"
-
-tar@^4:
- version "4.4.11"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.11.tgz#7ac09801445a3cf74445ed27499136b5240ffb73"
- integrity sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.6.4"
- minizlib "^1.2.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.3"
-
-temp-dir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
- integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
-
-tempfile@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
- integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU=
- dependencies:
- temp-dir "^1.0.0"
- uuid "^3.0.1"
-
-ternary-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253"
- integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==
- dependencies:
- duplexify "^4.1.1"
- fork-stream "^0.0.4"
- merge-stream "^2.0.0"
- through2 "^3.0.1"
-
-terser-webpack-plugin@^1.1.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
- integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
- dependencies:
- cacache "^12.0.2"
- find-cache-dir "^2.1.0"
- is-wsl "^1.1.0"
- schema-utils "^1.0.0"
- serialize-javascript "^1.7.0"
- source-map "^0.6.1"
- terser "^4.1.2"
- webpack-sources "^1.4.0"
- worker-farm "^1.7.0"
-
-terser-webpack-plugin@^1.4.3:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
- integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
- dependencies:
- cacache "^12.0.2"
- find-cache-dir "^2.1.0"
- is-wsl "^1.1.0"
- schema-utils "^1.0.0"
- serialize-javascript "^3.1.0"
- source-map "^0.6.1"
- terser "^4.1.2"
- webpack-sources "^1.4.0"
- worker-farm "^1.7.0"
-
-terser@^4.0.0, terser@^4.1.2:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65"
- integrity sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==
- dependencies:
- commander "^2.20.0"
- source-map "~0.6.1"
- source-map-support "~0.5.12"
-
-text-table@^0.2.0, text-table@~0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-
-tfunk@^3.0.1:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b"
- integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s=
- dependencies:
- chalk "^1.1.1"
- object-path "^0.9.0"
-
-through2-concurrent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-2.0.0.tgz#c9dd2c146504ec9962dbc86a5168b63d662669fa"
- integrity sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A==
- dependencies:
- through2 "^2.0.0"
-
-through2-filter@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
- integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
- dependencies:
- through2 "~2.0.0"
- xtend "~4.0.0"
-
-through2@*, through2@3.0.1, through2@^3.0.0, through2@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
- integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
- dependencies:
- readable-stream "2 || 3"
-
-through2@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
- integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=
- dependencies:
- readable-stream "^2.1.5"
- xtend "~4.0.1"
-
-through2@^0.4.1, through2@~0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
- integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=
- dependencies:
- readable-stream "~1.0.17"
- xtend "~2.1.1"
-
-through2@^0.5.0, through2@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
- integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac=
- dependencies:
- readable-stream "~1.0.17"
- xtend "~3.0.0"
-
-through2@^0.6.1, through2@~0.6.1:
- version "0.6.5"
- resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
- integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
- dependencies:
- readable-stream ">=1.0.33-1 <1.1.0-0"
- xtend ">=4.0.0 <4.1.0-0"
-
-through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
- integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
- dependencies:
- readable-stream "~2.3.6"
- xtend "~4.0.1"
-
-through2@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/through2/-/through2-0.3.0.tgz#2d1d28c8d1daf8d9c5cb78f0a69343c6b8642d97"
- integrity sha1-LR0oyNHa+NnFy3jwppNDxrhkLZc=
- dependencies:
- readable-stream "~1.0.17"
- xtend "~2.1.1"
-
-through@^2.3.6, through@^2.3.8, 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=
-
-tildify@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
- integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
- dependencies:
- os-homedir "^1.0.0"
-
-time-stamp@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
- integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
-
-timed-out@^4.0.0, timed-out@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
- integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
-
-timers-browserify@^2.0.4:
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
- integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
- dependencies:
- setimmediate "^1.0.4"
-
-timm@^1.6.1:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd"
- integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==
-
-timsort@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
- integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
-
-tiny-lr@0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.1.4.tgz#6e41d7e67dfd0878e5e0b37e37a06d67e309ff4d"
- integrity sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00=
- dependencies:
- body-parser "~1.8.0"
- debug "~0.8.1"
- faye-websocket "~0.7.2"
- parseurl "~1.3.0"
- qs "~2.2.3"
-
-tinycolor2@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
- integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
-
-tmp-promise@^1.0.5:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.1.0.tgz#bb924d239029157b9bc1d506a6aa341f8b13e64c"
- integrity sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==
- dependencies:
- bluebird "^3.5.0"
- tmp "0.1.0"
-
-tmp@0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
- integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
- dependencies:
- rimraf "^2.6.3"
-
-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-absolute-glob@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
- integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
- dependencies:
- is-absolute "^1.0.0"
- is-negated-glob "^1.0.0"
-
-to-array@0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
- integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
-
-to-arraybuffer@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
- integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
-
-to-buffer@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
- integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
-
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
-
-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-readable-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
- integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
-
-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-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-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"
-
-to-through@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
- integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
- dependencies:
- through2 "^2.0.3"
-
-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@^2.3.3, tough-cookie@^2.4.3:
- 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"
-
-tough-cookie@~2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
- integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
- dependencies:
- psl "^1.1.24"
- punycode "^1.4.1"
-
-tr46@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
- integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
- dependencies:
- punycode "^2.1.0"
-
-trim-newlines@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
- integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
-
-trim-repeated@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
- integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE=
- dependencies:
- escape-string-regexp "^1.0.2"
-
-trim-right@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
- integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
-
-trim@^0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
- integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
-
-"true-case-path@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
- integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
- dependencies:
- glob "^7.1.2"
-
-truncate-utf8-bytes@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
- integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys=
- dependencies:
- utf8-byte-length "^1.0.1"
-
-tslib@^1.9.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
- integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
-
-tty-browserify@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
- integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
-
-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-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
- dependencies:
- prelude-ls "~1.1.2"
-
-type-fest@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
- integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
-
-type-is@~1.5.1:
- version "1.5.7"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90"
- integrity sha1-uTaKWTzG730GReeLL0xky+zQXpA=
- dependencies:
- media-typer "0.3.0"
- mime-types "~2.0.9"
-
-type@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
- integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
-
-typedarray@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-
-ua-parser-js@^0.7.18:
- version "0.7.21"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
- integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
-
-uglify-js@3.4.x:
- version "3.4.10"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
- integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
- dependencies:
- commander "~2.19.0"
- source-map "~0.6.1"
-
-uglify-template-string-loader@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/uglify-template-string-loader/-/uglify-template-string-loader-1.1.1.tgz#d091d15f66b65f1cae2f4222583009302c86339f"
- integrity sha512-EHJx8m0aIHlwX5xlJd2xPYIFvLrPkVK5X8zpVxSNTmu7KoT2eSg1TNlwZS+JS65+dwJXC4rC5mc+F4UVe2rckw==
-
-ultron@~1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
- integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
-
-unbzip2-stream@^1.0.9:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
- integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==
- dependencies:
- buffer "^5.2.1"
- through "^2.3.8"
-
-unc-path-regex@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
- integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
-
-underscore@~1.8.3:
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
- integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
-
-undertaker-registry@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50"
- integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=
-
-undertaker@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b"
- integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==
- dependencies:
- arr-flatten "^1.0.1"
- arr-map "^2.0.0"
- bach "^1.0.0"
- collection-map "^1.0.0"
- es6-weak-map "^2.0.1"
- last-run "^1.1.0"
- object.defaults "^1.0.0"
- object.reduce "^1.0.0"
- undertaker-registry "^1.0.0"
-
-unicode-canonical-property-names-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
- integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
-
-unicode-match-property-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
- integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
- dependencies:
- unicode-canonical-property-names-ecmascript "^1.0.4"
- unicode-property-aliases-ecmascript "^1.0.4"
-
-unicode-match-property-value-ecmascript@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277"
- integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==
-
-unicode-property-aliases-ecmascript@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
- integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==
-
-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"
-
-uniq@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
- integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
-
-uniqs@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
- integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
-
-unique-filename@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
- integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
- dependencies:
- unique-slug "^2.0.0"
-
-unique-slug@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
- integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
- dependencies:
- imurmurhash "^0.1.4"
-
-unique-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
- integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=
-
-unique-stream@^2.0.2:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
- integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
- dependencies:
- json-stable-stringify-without-jsonify "^1.0.1"
- through2-filter "^3.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=
-
-unquote@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
- integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
-
-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"
-
-unused-files-webpack-plugin@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/unused-files-webpack-plugin/-/unused-files-webpack-plugin-3.4.0.tgz#adc67a3b5549d028818d3119cbf2b5c88aea8670"
- integrity sha512-cmukKOBdIqaM1pqThY0+jp+mYgCVyzrD8uRbKEucQwIGZcLIRn+gSRiQ7uLjcDd3Zba9NUxVGyYa7lWM4UCGeg==
- dependencies:
- babel-runtime "^7.0.0-beta.3"
- glob-all "^3.1.0"
- semver "^5.5.0"
- util.promisify "^1.0.0"
- warning "^3.0.0"
-
-upath@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
- integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-
-upper-case@^1.1.1:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
- integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
-
-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"
-
-url-parse-lax@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
- integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
- dependencies:
- prepend-http "^2.0.0"
-
-url-to-options@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
- integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
-
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
- integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
-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==
-
-user-home@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
- integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA=
-
-user-home@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
- integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
- dependencies:
- os-homedir "^1.0.0"
-
-utf8-byte-length@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
- integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
-
-utif@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759"
- integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==
- dependencies:
- pako "^1.0.5"
-
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-util.promisify@^1.0.0, util.promisify@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
- integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
- dependencies:
- define-properties "^1.1.2"
- object.getownpropertydescriptors "^2.0.3"
-
-util@0.10.3:
- version "0.10.3"
- resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
- integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
- dependencies:
- inherits "2.0.1"
-
-util@^0.10.3:
- version "0.10.4"
- resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
- integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
- dependencies:
- inherits "2.0.3"
-
-util@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
- integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
- dependencies:
- inherits "2.0.3"
-
-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.0.1, uuid@^3.3.2:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
- integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
-
-v8-compile-cache@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
- integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
-
-v8flags@^2.0.2:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
- integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=
- dependencies:
- user-home "^1.1.1"
-
-v8flags@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
- integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
- dependencies:
- homedir-polyfill "^1.0.1"
-
-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"
-
-value-or-function@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
- integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
-
-vendors@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0"
- integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==
-
-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"
-
-vinyl-buffer@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-0.0.0.tgz#d197a824badcb11cccf9643ac91be24d43eda8db"
- integrity sha1-0ZeoJLrcsRzM+WQ6yRviTUPtqNs=
- dependencies:
- bl "^0.7.0"
- through2 "^0.4.1"
-
-vinyl-fs@^0.3.0:
- version "0.3.14"
- resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
- integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=
- dependencies:
- defaults "^1.0.0"
- glob-stream "^3.1.5"
- glob-watcher "^0.0.6"
- graceful-fs "^3.0.0"
- mkdirp "^0.5.0"
- strip-bom "^1.0.0"
- through2 "^0.6.1"
- vinyl "^0.4.0"
-
-vinyl-fs@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
- integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
- dependencies:
- fs-mkdirp-stream "^1.0.0"
- glob-stream "^6.1.0"
- graceful-fs "^4.0.0"
- is-valid-glob "^1.0.0"
- lazystream "^1.0.0"
- lead "^1.0.0"
- object.assign "^4.0.4"
- pumpify "^1.3.5"
- readable-stream "^2.3.3"
- remove-bom-buffer "^3.0.0"
- remove-bom-stream "^1.2.0"
- resolve-options "^1.1.0"
- through2 "^2.0.0"
- to-through "^2.0.0"
- value-or-function "^3.0.0"
- vinyl "^2.0.0"
- vinyl-sourcemap "^1.1.0"
-
-vinyl-source-stream@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-0.1.1.tgz#a53a4f21a07a234695e04c2703f9f1b5b9084595"
- integrity sha1-pTpPIaB6I0aV4EwnA/nxtbkIRZU=
- dependencies:
- through2 "~0.3.0"
- vinyl "~0.2.2"
-
-vinyl-sourcemap@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
- integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
- dependencies:
- append-buffer "^1.0.2"
- convert-source-map "^1.5.0"
- graceful-fs "^4.1.6"
- normalize-path "^2.1.1"
- now-and-later "^2.0.0"
- remove-bom-buffer "^3.0.0"
- vinyl "^2.0.0"
-
-vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
- integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=
- dependencies:
- source-map "^0.5.1"
-
-vinyl@*, vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
- integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
- dependencies:
- clone "^2.1.1"
- clone-buffer "^1.0.0"
- clone-stats "^1.0.0"
- cloneable-readable "^1.0.0"
- remove-trailing-separator "^1.0.1"
- replace-ext "^1.0.0"
-
-vinyl@^0.2.1, vinyl@~0.2.2:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252"
- integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=
- dependencies:
- clone-stats "~0.0.1"
-
-vinyl@^0.4.0:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
- integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc=
- dependencies:
- clone "^0.2.0"
- clone-stats "^0.0.1"
-
-vinyl@^0.5.0:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
- integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=
- dependencies:
- clone "^1.0.0"
- clone-stats "^0.0.1"
- replace-ext "0.0.1"
-
-vm-browserify@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
- integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
-
-w3c-hr-time@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
- integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
- dependencies:
- browser-process-hrtime "^0.1.2"
-
-warning@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
- integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=
- dependencies:
- loose-envify "^1.0.0"
-
-watch@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406"
- integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=
-
-watchpack-chokidar2@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
- integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
- dependencies:
- chokidar "^2.1.8"
-
-watchpack@^1.6.1:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
- integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
- dependencies:
- graceful-fs "^4.1.2"
- neo-async "^2.5.0"
- optionalDependencies:
- chokidar "^3.4.0"
- watchpack-chokidar2 "^2.0.0"
-
-webidl-conversions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
- integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
-
-webpack-cli@^3.1.0:
- version "3.3.9"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a"
- integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==
- dependencies:
- chalk "2.4.2"
- cross-spawn "6.0.5"
- enhanced-resolve "4.1.0"
- findup-sync "3.0.0"
- global-modules "2.0.0"
- import-local "2.0.0"
- interpret "1.2.0"
- loader-utils "1.2.3"
- supports-color "6.1.0"
- v8-compile-cache "2.0.3"
- yargs "13.2.4"
-
-webpack-deep-scope-plugin@^1.6.0:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/webpack-deep-scope-plugin/-/webpack-deep-scope-plugin-1.6.2.tgz#131eac79739021e42ebc07066ea8869107f37b85"
- integrity sha512-S5ZM1i7oTIVPIS1z/Fu41tqFzaXpy8vZnwEDC9I7NLj5XD8GGrDZbDXtG5FCGkHPGxtAzF4O21DKZZ76vpBGzw==
- dependencies:
- deep-scope-analyser "^1.7.0"
-
-webpack-plugin-replace@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/webpack-plugin-replace/-/webpack-plugin-replace-1.2.0.tgz#3f20db96237400433231e35ea76d9be3f7128916"
- integrity sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w==
-
-webpack-sources@^1.4.0, webpack-sources@^1.4.1:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
- integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
- dependencies:
- source-list-map "^2.0.0"
- source-map "~0.6.1"
-
-webpack-stream@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39"
- integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A==
- dependencies:
- fancy-log "^1.3.3"
- lodash.clone "^4.3.2"
- lodash.some "^4.2.2"
- memory-fs "^0.4.1"
- plugin-error "^1.0.1"
- supports-color "^5.5.0"
- through "^2.3.8"
- vinyl "^2.1.0"
- webpack "^4.26.1"
-
-webpack-strip-block@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/webpack-strip-block/-/webpack-strip-block-0.2.0.tgz#c60d4a703e0eeee8895e7f1abe9b5fe914681470"
- integrity sha1-xg1KcD4O7uiJXn8avptf6RRoFHA=
- dependencies:
- loader-utils "^1.1.0"
-
-webpack@^4.26.1, webpack@^4.43.0:
- version "4.43.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
- integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
- dependencies:
- "@webassemblyjs/ast" "1.9.0"
- "@webassemblyjs/helper-module-context" "1.9.0"
- "@webassemblyjs/wasm-edit" "1.9.0"
- "@webassemblyjs/wasm-parser" "1.9.0"
- acorn "^6.4.1"
- ajv "^6.10.2"
- ajv-keywords "^3.4.1"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^4.1.0"
- eslint-scope "^4.0.3"
- json-parse-better-errors "^1.0.2"
- loader-runner "^2.4.0"
- loader-utils "^1.2.3"
- memory-fs "^0.4.1"
- micromatch "^3.1.10"
- mkdirp "^0.5.3"
- neo-async "^2.6.1"
- node-libs-browser "^2.2.1"
- schema-utils "^1.0.0"
- tapable "^1.1.3"
- terser-webpack-plugin "^1.4.3"
- watchpack "^1.6.1"
- webpack-sources "^1.4.1"
-
-websocket-driver@>=0.3.6:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"
- integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==
- dependencies:
- http-parser-js ">=0.4.0 <0.4.11"
- safe-buffer ">=5.1.0"
- websocket-extensions ">=0.1.1"
-
-websocket-extensions@>=0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
- integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
-
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
- integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
- dependencies:
- iconv-lite "0.4.24"
-
-whatwg-fetch@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
- integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
-
-whatwg-mimetype@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
- integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
-
-whatwg-url@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
- integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^1.0.1"
- webidl-conversions "^4.0.2"
-
-which-module@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
- integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
-
-which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-
-which@1, which@^1.1.1, which@^1.2.14, which@^1.2.9, 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"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
- integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
- dependencies:
- string-width "^1.0.2 || 2"
-
-winston@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/winston/-/winston-1.0.2.tgz#351c58e2323f8a4ca29a45195aa9aa3b4c35d76f"
- integrity sha1-NRxY4jI/ikyimkUZWqmqO0w1128=
- dependencies:
- async "~1.0.0"
- colors "1.0.x"
- cycle "1.0.x"
- eyes "0.1.x"
- isstream "0.1.x"
- pkginfo "0.3.x"
- stack-trace "0.0.x"
-
-wordwrap@~0.0.2:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
- integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
-
-wordwrap@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
- integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-
-worker-farm@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
- integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
- dependencies:
- errno "~0.1.7"
-
-worker-loader@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
- integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==
- dependencies:
- loader-utils "^1.0.0"
- schema-utils "^0.4.0"
-
-wrap-ansi@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
- integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
-
-wrap-ansi@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
- integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
- dependencies:
- ansi-styles "^3.2.0"
- string-width "^3.0.0"
- strip-ansi "^5.0.0"
-
-wrap-ansi@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
- integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
-write@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
- integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
- dependencies:
- mkdirp "^0.5.1"
-
-ws@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
- integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
- dependencies:
- async-limiter "~1.0.0"
-
-ws@~3.3.1:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
- integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
- dependencies:
- async-limiter "~1.0.0"
- safe-buffer "~5.1.0"
- ultron "~1.1.0"
-
-ws@~6.1.0:
- version "6.1.4"
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
- integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
- dependencies:
- async-limiter "~1.0.0"
-
-xhr@^2.0.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
- integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
- dependencies:
- global "~4.3.0"
- is-function "^1.0.1"
- parse-headers "^2.0.0"
- xtend "^4.0.0"
-
-xml-name-validator@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
- integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
-
-xml-parse-from-string@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
- integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
-
-xml2js@^0.4.5:
- version "0.4.22"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02"
- integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==
- dependencies:
- sax ">=0.6.0"
- util.promisify "~1.0.0"
- xmlbuilder "~11.0.0"
-
-xmlbuilder@^9.0.7:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
-
-xmlbuilder@~11.0.0:
- version "11.0.1"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
- integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
-
-xmlchars@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
- integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-
-xmldom@0.1.x:
- version "0.1.27"
- resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
- integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk=
-
-xmlhttprequest-ssl@~1.5.4:
- version "1.5.5"
- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
- integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
-
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
- integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-
-xtend@~2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
- integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
- dependencies:
- object-keys "~0.4.0"
-
-xtend@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
- integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=
-
-y18n@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
- integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
-
-y18n@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
- integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
-
-yallist@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
- integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
- integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
-
-yaml-loader@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/yaml-loader/-/yaml-loader-0.6.0.tgz#fe1c48b9f4803dace55a59a1474e790ba6ab1b48"
- integrity sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==
- dependencies:
- loader-utils "^1.4.0"
- yaml "^1.8.3"
-
-yaml@^1.8.3:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
- integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
-
-yargs-parser@5.0.0-security.0:
- version "5.0.0-security.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24"
- integrity sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==
- dependencies:
- camelcase "^3.0.0"
- object.assign "^4.1.0"
-
-yargs-parser@^13.0.0, yargs-parser@^13.1.0:
- version "13.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
- integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^13.1.1:
- version "13.1.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
- integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^18.1.2:
- version "18.1.3"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
- integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
- integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
- dependencies:
- camelcase "^3.0.0"
-
-yargs@13.2.4:
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
- integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- os-locale "^3.1.0"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.1.0"
-
-yargs@13.3.0:
- version "13.3.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
- integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.1.1"
-
-yargs@^15.4.1:
- version "15.4.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
- integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
- dependencies:
- cliui "^6.0.0"
- decamelize "^1.2.0"
- find-up "^4.1.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^4.2.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^18.1.2"
-
-yargs@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
- integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
- dependencies:
- camelcase "^3.0.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^1.4.0"
- read-pkg-up "^1.0.1"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^1.0.2"
- which-module "^1.0.0"
- y18n "^3.2.1"
- yargs-parser "^5.0.0"
-
-yargs@^7.1.0:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6"
- integrity sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==
- dependencies:
- camelcase "^3.0.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^1.4.0"
- read-pkg-up "^1.0.1"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^1.0.2"
- which-module "^1.0.0"
- y18n "^3.2.1"
- yargs-parser "5.0.0-security.0"
-
-yargs@~1.2.6:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"
- integrity sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=
- dependencies:
- minimist "^0.1.0"
-
-yauzl@^2.4.2:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
-
-yeast@0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
- integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
-
-zip-stream@~0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3"
- integrity sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M=
- dependencies:
- compress-commons "~0.1.0"
- lodash "~2.4.1"
- readable-stream "~1.0.26"
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d"
+ integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==
+ dependencies:
+ "@babel/highlight" "^7.0.0"
+
+"@babel/code-frame@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+ integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+ dependencies:
+ "@babel/highlight" "^7.8.3"
+
+"@babel/core@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
+ integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/generator" "^7.9.0"
+ "@babel/helper-module-transforms" "^7.9.0"
+ "@babel/helpers" "^7.9.0"
+ "@babel/parser" "^7.9.0"
+ "@babel/template" "^7.8.6"
+ "@babel/traverse" "^7.9.0"
+ "@babel/types" "^7.9.0"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.1"
+ json5 "^2.1.2"
+ lodash "^4.17.13"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56"
+ integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==
+ dependencies:
+ "@babel/types" "^7.6.0"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/generator@^7.9.0", "@babel/generator@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9"
+ integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==
+ dependencies:
+ "@babel/types" "^7.9.5"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
+ integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
+ integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-call-delegate@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43"
+ integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.4.4"
+ "@babel/traverse" "^7.4.4"
+ "@babel/types" "^7.4.4"
+
+"@babel/helper-define-map@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369"
+ integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/types" "^7.5.5"
+ lodash "^4.17.13"
+
+"@babel/helper-explode-assignable-expression@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
+ integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==
+ dependencies:
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-function-name@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
+ integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.0.0"
+ "@babel/template" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-function-name@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
+ integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.8.3"
+ "@babel/template" "^7.8.3"
+ "@babel/types" "^7.9.5"
+
+"@babel/helper-get-function-arity@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
+ integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-get-function-arity@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
+ integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-hoist-variables@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a"
+ integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==
+ dependencies:
+ "@babel/types" "^7.4.4"
+
+"@babel/helper-member-expression-to-functions@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590"
+ integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==
+ dependencies:
+ "@babel/types" "^7.5.5"
+
+"@babel/helper-member-expression-to-functions@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
+ integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-module-imports@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d"
+ integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-module-imports@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
+ integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a"
+ integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-simple-access" "^7.1.0"
+ "@babel/helper-split-export-declaration" "^7.4.4"
+ "@babel/template" "^7.4.4"
+ "@babel/types" "^7.5.5"
+ lodash "^4.17.13"
+
+"@babel/helper-module-transforms@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
+ integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.8.3"
+ "@babel/helper-replace-supers" "^7.8.6"
+ "@babel/helper-simple-access" "^7.8.3"
+ "@babel/helper-split-export-declaration" "^7.8.3"
+ "@babel/template" "^7.8.6"
+ "@babel/types" "^7.9.0"
+ lodash "^4.17.13"
+
+"@babel/helper-optimise-call-expression@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
+ integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-optimise-call-expression@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
+ integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-plugin-utils@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
+ integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
+
+"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351"
+ integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==
+ dependencies:
+ lodash "^4.17.13"
+
+"@babel/helper-remap-async-to-generator@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f"
+ integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-wrap-function" "^7.1.0"
+ "@babel/template" "^7.1.0"
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-replace-supers@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2"
+ integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.5.5"
+ "@babel/helper-optimise-call-expression" "^7.0.0"
+ "@babel/traverse" "^7.5.5"
+ "@babel/types" "^7.5.5"
+
+"@babel/helper-replace-supers@^7.8.6":
+ version "7.8.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8"
+ integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.8.3"
+ "@babel/helper-optimise-call-expression" "^7.8.3"
+ "@babel/traverse" "^7.8.6"
+ "@babel/types" "^7.8.6"
+
+"@babel/helper-simple-access@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
+ integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==
+ dependencies:
+ "@babel/template" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@babel/helper-simple-access@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
+ integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+ dependencies:
+ "@babel/template" "^7.8.3"
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-split-export-declaration@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
+ integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
+ dependencies:
+ "@babel/types" "^7.4.4"
+
+"@babel/helper-split-export-declaration@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
+ integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
+"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
+ integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+
+"@babel/helper-wrap-function@^7.1.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
+ integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/template" "^7.1.0"
+ "@babel/traverse" "^7.1.0"
+ "@babel/types" "^7.2.0"
+
+"@babel/helpers@^7.9.0":
+ version "7.9.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
+ integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
+ dependencies:
+ "@babel/template" "^7.8.3"
+ "@babel/traverse" "^7.9.0"
+ "@babel/types" "^7.9.0"
+
+"@babel/highlight@^7.0.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540"
+ integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^4.0.0"
+
+"@babel/highlight@^7.8.3":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
+ integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.9.0"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b"
+ integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==
+
+"@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
+ version "7.9.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
+ integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
+
+"@babel/plugin-proposal-async-generator-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
+ integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.1.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+
+"@babel/plugin-proposal-dynamic-import@^7.5.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506"
+ integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+
+"@babel/plugin-proposal-json-strings@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
+ integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+
+"@babel/plugin-proposal-object-rest-spread@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58"
+ integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5"
+ integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
+ integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.4.4"
+ regexpu-core "^4.5.4"
+
+"@babel/plugin-syntax-async-generators@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
+ integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-dynamic-import@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
+ integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-json-strings@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
+ integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-object-rest-spread@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
+ integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c"
+ integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-arrow-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
+ integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-async-to-generator@^7.5.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e"
+ integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.1.0"
+
+"@babel/plugin-transform-block-scoped-functions@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
+ integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-block-scoping@^7.4.4", "@babel/plugin-transform-block-scoping@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc"
+ integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ lodash "^4.17.13"
+
+"@babel/plugin-transform-classes@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9"
+ integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-define-map" "^7.5.5"
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-optimise-call-expression" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.5.5"
+ "@babel/helper-split-export-declaration" "^7.4.4"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
+ integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-destructuring@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6"
+ integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3"
+ integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.4.4"
+ regexpu-core "^4.5.4"
+
+"@babel/plugin-transform-duplicate-keys@^7.5.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853"
+ integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-exponentiation-operator@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008"
+ integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-for-of@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556"
+ integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-function-name@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad"
+ integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==
+ dependencies:
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-literals@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
+ integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-member-expression-literals@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d"
+ integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-modules-amd@^7.5.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91"
+ integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
+"@babel/plugin-transform-modules-commonjs@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486"
+ integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.4.4"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-simple-access" "^7.1.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
+"@babel/plugin-transform-modules-systemjs@^7.5.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249"
+ integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.4.4"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
+"@babel/plugin-transform-modules-umd@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
+ integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.1.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1"
+ integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==
+ dependencies:
+ regexp-tree "^0.1.13"
+
+"@babel/plugin-transform-new-target@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
+ integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-object-super@^7.5.5":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9"
+ integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.5.5"
+
+"@babel/plugin-transform-parameters@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16"
+ integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==
+ dependencies:
+ "@babel/helper-call-delegate" "^7.4.4"
+ "@babel/helper-get-function-arity" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-property-literals@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905"
+ integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-regenerator@^7.4.5":
+ version "7.4.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
+ integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
+ dependencies:
+ regenerator-transform "^0.14.0"
+
+"@babel/plugin-transform-reserved-words@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634"
+ integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-shorthand-properties@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
+ integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-spread@^7.2.0":
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406"
+ integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-sticky-regex@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1"
+ integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.0.0"
+
+"@babel/plugin-transform-template-literals@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0"
+ integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-typeof-symbol@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2"
+ integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-unicode-regex@^7.4.4":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f"
+ integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-regex" "^7.4.4"
+ regexpu-core "^4.5.4"
+
+"@babel/preset-env@^7.5.4":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50"
+ integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.5.0"
+ "@babel/plugin-proposal-json-strings" "^7.2.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.5.5"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-transform-arrow-functions" "^7.2.0"
+ "@babel/plugin-transform-async-to-generator" "^7.5.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
+ "@babel/plugin-transform-block-scoping" "^7.6.0"
+ "@babel/plugin-transform-classes" "^7.5.5"
+ "@babel/plugin-transform-computed-properties" "^7.2.0"
+ "@babel/plugin-transform-destructuring" "^7.6.0"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/plugin-transform-duplicate-keys" "^7.5.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
+ "@babel/plugin-transform-for-of" "^7.4.4"
+ "@babel/plugin-transform-function-name" "^7.4.4"
+ "@babel/plugin-transform-literals" "^7.2.0"
+ "@babel/plugin-transform-member-expression-literals" "^7.2.0"
+ "@babel/plugin-transform-modules-amd" "^7.5.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.6.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.5.0"
+ "@babel/plugin-transform-modules-umd" "^7.2.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0"
+ "@babel/plugin-transform-new-target" "^7.4.4"
+ "@babel/plugin-transform-object-super" "^7.5.5"
+ "@babel/plugin-transform-parameters" "^7.4.4"
+ "@babel/plugin-transform-property-literals" "^7.2.0"
+ "@babel/plugin-transform-regenerator" "^7.4.5"
+ "@babel/plugin-transform-reserved-words" "^7.2.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.2.0"
+ "@babel/plugin-transform-spread" "^7.2.0"
+ "@babel/plugin-transform-sticky-regex" "^7.2.0"
+ "@babel/plugin-transform-template-literals" "^7.4.4"
+ "@babel/plugin-transform-typeof-symbol" "^7.2.0"
+ "@babel/plugin-transform-unicode-regex" "^7.4.4"
+ "@babel/types" "^7.6.0"
+ browserslist "^4.6.0"
+ core-js-compat "^3.1.1"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.5.0"
+
+"@babel/runtime@^7.5.5":
+ version "7.9.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
+ integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.1.0", "@babel/template@^7.4.4":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
+ integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.6.0"
+ "@babel/types" "^7.6.0"
+
+"@babel/template@^7.8.3", "@babel/template@^7.8.6":
+ version "7.8.6"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
+ integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/parser" "^7.8.6"
+ "@babel/types" "^7.8.6"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5":
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516"
+ integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ "@babel/generator" "^7.6.0"
+ "@babel/helper-function-name" "^7.1.0"
+ "@babel/helper-split-export-declaration" "^7.4.4"
+ "@babel/parser" "^7.6.0"
+ "@babel/types" "^7.6.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
+"@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2"
+ integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/generator" "^7.9.5"
+ "@babel/helper-function-name" "^7.9.5"
+ "@babel/helper-split-export-declaration" "^7.8.3"
+ "@babel/parser" "^7.9.0"
+ "@babel/types" "^7.9.5"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
+"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0":
+ version "7.6.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648"
+ integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444"
+ integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.9.5"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
+"@csstools/convert-colors@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
+ integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
+
+"@electron/get@^1.3.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.5.0.tgz#6217d9d18fb71fbd8cd2445a31aa0edc723d19dd"
+ integrity sha512-tafxBz6n08G6SX961F/h8XFtpB/DdwRvJJoDeOH9x78jDSCMQ2G/rRWqSwLFp9oeMFBJf0Pf5Kkw6TKt5w9TWg==
+ dependencies:
+ debug "^4.1.1"
+ env-paths "^2.2.0"
+ fs-extra "^8.1.0"
+ got "^9.6.0"
+ sanitize-filename "^1.6.2"
+ sumchecker "^3.0.0"
+
+"@jimp/bmp@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.8.tgz#8abbfd9e26ba17a47fab311059ea9f7dd82005b6"
+ integrity sha512-uxVgSkI62uAzk5ZazYHEHBehow590WAkLKmDXLzkr/XP/Hv2Fx1T4DKwJ/15IY5ktq5VAhAUWGXTyd8KWFsx7w==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ bmp-js "^0.1.0"
+ core-js "^2.5.7"
+
+"@jimp/core@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.8.tgz#6a41089792516f6e64a5302d12eb562aa7847c7b"
+ integrity sha512-JOFqBBcSNiDiMZJFr6OJqC6viXj5NVBQISua0eacoYvo4YJtTajOIxC4MqWyUmGrDpRMZBR8QhSsIOwsFrdROA==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ any-base "^1.1.0"
+ buffer "^5.2.0"
+ core-js "^2.5.7"
+ exif-parser "^0.1.12"
+ file-type "^9.0.0"
+ load-bmfont "^1.3.1"
+ mkdirp "0.5.1"
+ phin "^2.9.1"
+ pixelmatch "^4.0.2"
+ tinycolor2 "^1.4.1"
+
+"@jimp/custom@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.8.tgz#0476d7b3f5da3121d98895a2e14f2899e602f2b6"
+ integrity sha512-FrYlzZRVXP2vuVwd7Nc2dlK+iZk4g6IaT1Ib8Z6vU5Kkwlt83FJIPJ2UUFABf3bF5big0wkk8ZUihWxE4Nzdng==
+ dependencies:
+ "@jimp/core" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/gif@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.8.tgz#848dd4e6e1a56ca2b3ce528969e44dfa99a53b14"
+ integrity sha512-yyOlujjQcgz9zkjM5ihZDEppn9d1brJ7jQHP5rAKmqep0G7FU1D0AKcV+Ql18RhuI/CgWs10wAVcrQpmLnu4Yw==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+ omggif "^1.0.9"
+
+"@jimp/jpeg@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.8.tgz#4cad85a6d1e15759acb56bddef29aa3473859f2c"
+ integrity sha512-rGtXbYpFXAn471qLpTGvhbBMNHJo5KiufN+vC5AWyufntmkt5f0Ox2Cx4ijuBMDtirZchxbMLtrfGjznS4L/ew==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+ jpeg-js "^0.3.4"
+
+"@jimp/plugin-blit@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.8.tgz#646ebb631f35afc28c1e8908524bc43d1e9afa3d"
+ integrity sha512-7Tl6YpKTSpvwQbnGNhsfX2zyl3jRVVopd276Y2hF2zpDz9Bycow7NdfNU/4Nx1jaf96X6uWOtSVINcQ7rGd47w==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-blur@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.8.tgz#7b753ae94f6099103f57c268c3b2679047eefe95"
+ integrity sha512-NpZCMKxXHLDQsX9zPlWtpMA660DQStY6/z8ZetyxCDbqrLe9YCXpeR4MNhdJdABIiwTm1W5FyFF4kp81PHJx3Q==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-color@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.8.tgz#4101cb1208879b331db6e43ea6b96eaf8dbaedbc"
+ integrity sha512-jjFyU0zNmGOH2rjzHuOMU4kaia0oo82s/7UYfn5h7OUkmUZTd6Do3ZSK1PiXA7KR+s4B76/Omm6Doh/0SGb7BQ==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+ tinycolor2 "^1.4.1"
+
+"@jimp/plugin-contain@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.8.tgz#af95d33b63d0478943374ae15dd2607fc69cad14"
+ integrity sha512-p/P2wCXhAzbmEgXvGsvmxLmbz45feF6VpR4m9suPSOr8PC/i/XvTklTqYEUidYYAft4vHgsYJdS74HKSMnH8lw==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-cover@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.8.tgz#490e3186627a34d93cc015c4169bac9070d6ad17"
+ integrity sha512-2PvWgk+PJfRsfWDI1G8Fpjrsu0ZlpNyZxO2+fqWlVo6y/y2gP4v08FqvbkcqSjNlOu2IDWIFXpgyU0sTINWZLg==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-crop@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.8.tgz#ffec8951a2f3eccad1e3cff9afff5326bd980ce7"
+ integrity sha512-CbrcpWE2xxPK1n/JoTXzhRUhP4mO07mTWaSavenCg664oQl/9XCtL+A0FekuNHzIvn4myEqvkiTwN7FsbunS/Q==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-displace@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.8.tgz#89df05ab7daaff6befc190bb8ac54ec8d57e533b"
+ integrity sha512-RmV2bPxoPE6mrPxtYSPtHxm2cGwBQr5a2p+9gH6SPy+eUMrbGjbvjwKNfXWUYD0leML+Pt5XOmAS9pIROmuruQ==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-dither@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.8.tgz#17e5b9f56575a871e329fef8b388e614b92d84f8"
+ integrity sha512-x6V/qjxe+xypjpQm7GbiMNqci1EW5UizrcebOhHr8AHijOEqHd2hjXh5f6QIGfrkTFelc4/jzq1UyCsYntqz9Q==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-flip@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.8.tgz#153df0c677f79d4078bb9e4c1f2ac392b96dc3a1"
+ integrity sha512-4il6Da6G39s9MyWBEee4jztEOUGJ40E6OlPjkMrdpDNvge6hYEAB31BczTYBP/CEY74j4LDSoY5LbcU4kv06yA==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-gaussian@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.8.tgz#100abc7ae1f19fe9c09ed41625b475aae7c6093c"
+ integrity sha512-pVOblmjv7stZjsqloi4YzHVwAPXKGdNaHPhp4KP4vj41qtc6Hxd9z/+VWGYRTunMFac84gUToe0UKIXd6GhoKw==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-invert@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.8.tgz#f40bfaa3b592d21ff14ede0e49aabec88048cad0"
+ integrity sha512-11zuLiXDHr6tFv4U8aieXqNXQEKbDbSBG/h+X62gGTNFpyn8EVPpncHhOqrAFtZUaPibBqMFlNJ15SzwC7ExsQ==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-mask@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.8.tgz#e64405f7dacf0672bff74f3b95b724d9ac517f86"
+ integrity sha512-hZJ0OiKGJyv7hDSATwJDkunB1Ie80xJnONMgpUuUseteK45YeYNBOiZVUe8vum8QI1UwavgBzcvQ9u4fcgXc9g==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-normalize@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.8.tgz#a0180f2b8835e3638cdc5e057b44ac63f60db6ba"
+ integrity sha512-Q4oYhU+sSyTJI7pMZlg9/mYh68ujLfOxXzQGEXuw0sHGoGQs3B0Jw7jmzGa6pIS06Hup5hD2Zuh1ppvMdjJBfQ==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-print@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.8.tgz#66309549e01896473111e3a0ad2cee428638bd6e"
+ integrity sha512-2aokejGn4Drv1FesnZGqh5KEq0FQtR0drlmtyZrBH+r9cx7hh0Qgf4D1BOTDEgXkfSSngjGRjKKRW/fwOrVXYw==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+ load-bmfont "^1.4.0"
+
+"@jimp/plugin-resize@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.8.tgz#c26d9a973f7eec51ad9018fcbbac1146f7a73aa0"
+ integrity sha512-27nPh8L1YWsxtfmV/+Ub5dOTpXyC0HMF2cu52RQSCYxr+Lm1+23dJF70AF1poUbUe+FWXphwuUxQzjBJza9UoA==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-rotate@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.8.tgz#2afda247984eeebed95c1bb1b13ccd3be5973299"
+ integrity sha512-GbjETvL05BDoLdszNUV4Y0yLkHf177MnqGqilA113LIvx9aD0FtUopGXYfRGVvmtTOTouoaGJUc+K6qngvKxww==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugin-scale@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.8.tgz#5de403345859bb0b30bf3e242dedd8ceb6ecb96c"
+ integrity sha512-GzIYWR/oCUK2jAwku23zt19V1ssaEU4pL0x2XsLNKuuJEU6DvEytJyTMXCE7OLG/MpDBQcQclJKHgiyQm5gIOQ==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+
+"@jimp/plugins@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.8.tgz#5618170a986ced1ea795adcd9376122f2543b856"
+ integrity sha512-fMcTI72Vn/Lz6JftezTURmyP5ml/xGMe0Ljx2KRJ85IWyP33vDmGIUuutFiBEbh2+y7lRT+aTSmjs0QGa/xTmQ==
+ dependencies:
+ "@jimp/plugin-blit" "^0.6.8"
+ "@jimp/plugin-blur" "^0.6.8"
+ "@jimp/plugin-color" "^0.6.8"
+ "@jimp/plugin-contain" "^0.6.8"
+ "@jimp/plugin-cover" "^0.6.8"
+ "@jimp/plugin-crop" "^0.6.8"
+ "@jimp/plugin-displace" "^0.6.8"
+ "@jimp/plugin-dither" "^0.6.8"
+ "@jimp/plugin-flip" "^0.6.8"
+ "@jimp/plugin-gaussian" "^0.6.8"
+ "@jimp/plugin-invert" "^0.6.8"
+ "@jimp/plugin-mask" "^0.6.8"
+ "@jimp/plugin-normalize" "^0.6.8"
+ "@jimp/plugin-print" "^0.6.8"
+ "@jimp/plugin-resize" "^0.6.8"
+ "@jimp/plugin-rotate" "^0.6.8"
+ "@jimp/plugin-scale" "^0.6.8"
+ core-js "^2.5.7"
+ timm "^1.6.1"
+
+"@jimp/png@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.8.tgz#ee06cf078b381137ec7206c4bb1b4cfcbe15ca6f"
+ integrity sha512-JHHg/BZ7KDtHQrcG+a7fztw45rdf7okL/YwkN4qU5FH7Fcrp41nX5QnRviDtD9hN+GaNC7kvjvcqRAxW25qjew==
+ dependencies:
+ "@jimp/utils" "^0.6.8"
+ core-js "^2.5.7"
+ pngjs "^3.3.3"
+
+"@jimp/tiff@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.8.tgz#79bd22ed435edbe29d02a2c8c9bf829f988ebacc"
+ integrity sha512-iWHbxd+0IKWdJyJ0HhoJCGYmtjPBOusz1z1HT/DnpePs/Lo3TO4d9ALXqYfUkyG74ZK5jULZ69KLtwuhuJz1bg==
+ dependencies:
+ core-js "^2.5.7"
+ utif "^2.0.1"
+
+"@jimp/types@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.8.tgz#4510eb635cd00b201745d70e38f791748baa7075"
+ integrity sha512-vCZ/Cp2osy69VP21XOBACfHI5HeR60Rfd4Jidj4W73UL+HrFWOtyQiJ7hlToyu1vI5mR/NsUQpzyQvz56ADm5A==
+ dependencies:
+ "@jimp/bmp" "^0.6.8"
+ "@jimp/gif" "^0.6.8"
+ "@jimp/jpeg" "^0.6.8"
+ "@jimp/png" "^0.6.8"
+ "@jimp/tiff" "^0.6.8"
+ core-js "^2.5.7"
+ timm "^1.6.1"
+
+"@jimp/utils@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.8.tgz#09f794945631173567aa50f72ac28170de58a63d"
+ integrity sha512-7RDfxQ2C/rarNG9iso5vmnKQbcvlQjBIlF/p7/uYj72WeZgVCB+5t1fFBKJSU4WhniHX4jUMijK+wYGE3Y3bGw==
+ dependencies:
+ core-js "^2.5.7"
+
+"@nodelib/fs.scandir@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+ integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.3"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+ integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+ integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.3"
+ fastq "^1.6.0"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sindresorhus/is@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/cordova@^0.0.34":
+ version "0.0.34"
+ resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-0.0.34.tgz#ea7addf74ecec3d7629827a0c39e2c9addc73d04"
+ integrity sha1-6nrd907Ow9dimCegw54smt3HPQQ=
+
+"@types/filesystem@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748"
+ integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw==
+ dependencies:
+ "@types/filewriter" "*"
+
+"@types/filewriter@*":
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3"
+ integrity sha1-wFTor02d11205jq8dviFFocU1LM=
+
+"@types/glob@^7.1.1":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987"
+ integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==
+ dependencies:
+ "@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 "14.0.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9"
+ integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==
+
+"@types/node@^12.7.5":
+ version "12.7.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f"
+ integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==
+
+"@types/q@^1.5.1":
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
+ integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
+
+"@webassemblyjs/ast@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+ integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+ integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+ integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+ integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+ integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+ integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+ integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+ integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+ integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+ integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+ integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+ integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+ integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/helper-wasm-section" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-opt" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+ integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+ integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+ integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+ integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-code-frame" "1.9.0"
+ "@webassemblyjs/helper-fsm" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+ integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abab@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.1.tgz#3fa17797032b71410ec372e11668f4b4ffc86a82"
+ integrity sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==
+
+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.4:
+ 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"
+
+acorn-globals@^4.3.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
+ integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
+ dependencies:
+ acorn "^6.0.1"
+ acorn-walk "^6.0.1"
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
+ dependencies:
+ acorn "^3.0.4"
+
+acorn-jsx@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
+ integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
+
+acorn-walk@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+ integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+ integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
+
+acorn@^5.5.0:
+ version "5.7.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+ integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
+
+acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
+ integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
+
+acorn@^6.4.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+ integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+
+after@0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+ integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
+
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^1.0.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+ integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw=
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
+ integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
+
+ajv@^4.7.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+ integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1:
+ version "6.10.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
+ integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^6.12.0:
+ 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"
+
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+
+ansi-colors@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
+ integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
+ dependencies:
+ ansi-wrap "^0.1.0"
+
+ansi-colors@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-cyan@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
+ integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=
+ dependencies:
+ ansi-wrap "0.1.0"
+
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+ integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
+
+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-gray@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+ integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
+ dependencies:
+ ansi-wrap "0.1.0"
+
+ansi-red@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
+ integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=
+ dependencies:
+ ansi-wrap "0.1.0"
+
+ansi-regex@^0.2.0, ansi-regex@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
+ integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+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-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
+ integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, 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-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
+ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+ integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
+
+any-base@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
+ integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+ integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+append-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+ integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
+ dependencies:
+ buffer-equal "^1.0.0"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+arch@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
+ integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
+
+archive-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
+ integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=
+ dependencies:
+ file-type "^4.2.0"
+
+archiver@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690"
+ integrity sha1-mBd9p6bAGSt/J5jzDNbquKvXZpA=
+ dependencies:
+ async "~0.9.0"
+ buffer-crc32 "~0.2.1"
+ glob "~3.2.6"
+ lazystream "~0.1.0"
+ lodash "~2.4.1"
+ readable-stream "~1.0.26"
+ tar-stream "~0.4.0"
+ zip-stream "~0.4.0"
+
+archy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+ integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
+ integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo=
+ dependencies:
+ arr-flatten "^1.0.1"
+ array-slice "^0.2.3"
+
+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-filter@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee"
+ integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=
+ dependencies:
+ make-iterator "^1.0.0"
+
+arr-flatten@^1.0.1, 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-map@^2.0.0, arr-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4"
+ integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ=
+ dependencies:
+ make-iterator "^1.0.0"
+
+arr-union@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
+ integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=
+
+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-differ@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+ integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=
+
+array-each@^1.0.0, array-each@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
+ integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+ integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
+
+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-initial@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795"
+ integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U=
+ dependencies:
+ array-slice "^1.0.0"
+ is-number "^4.0.0"
+
+array-last@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336"
+ integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==
+ dependencies:
+ is-number "^4.0.0"
+
+array-slice@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+ integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU=
+
+array-slice@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
+ integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
+
+array-sort@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
+ integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
+ dependencies:
+ default-compare "^1.0.0"
+ get-value "^2.0.6"
+ kind-of "^5.0.2"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-uniq@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98"
+ integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==
+
+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=
+
+arraybuffer.slice@~0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
+ integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
+
+asar@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/asar/-/asar-2.0.1.tgz#8518a1c62c238109c15a5f742213e83a09b9fd38"
+ integrity sha512-Vo9yTuUtyFahkVMFaI6uMuX6N7k5DWa6a/8+7ov0/f8Lq9TVR0tUjzSzxQSxT1Y+RJIZgnP7BVb6Uhi+9cjxqA==
+ dependencies:
+ chromium-pickle-js "^0.2.0"
+ commander "^2.20.0"
+ cuint "^0.2.2"
+ glob "^7.1.3"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.1"
+ tmp-promise "^1.0.5"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.0, 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=
+
+assert@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+ integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+ dependencies:
+ object-assign "^4.1.1"
+ util "0.10.3"
+
+assets@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/assets/-/assets-3.0.1.tgz#7a69f4bcc3aca9702760e2a73a7e76ca93e9e3e0"
+ integrity sha512-fTyLNf/9V24y5zO83f4DAEuvaKj7MWBixbnqdZneAhsv1r21yQ/6ogZfvXHmphJAHsz4DhuOwHeJKVbGqqvk0Q==
+ dependencies:
+ async "^2.5.0"
+ bluebird "^3.4.6"
+ calipers "^2.0.0"
+ calipers-gif "^2.0.0"
+ calipers-jpeg "^2.0.0"
+ calipers-png "^2.0.0"
+ calipers-svg "^2.0.0"
+ calipers-webp "^2.0.0"
+ glob "^7.0.6"
+ lodash "^4.15.0"
+ mime "^2.4.0"
+
+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=
+
+ast-types@0.9.6:
+ version "0.9.6"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
+ integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+ integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+async-done@^1.2.0, async-done@^1.2.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2"
+ integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.2"
+ process-nextick-args "^2.0.0"
+ stream-exhaust "^1.0.1"
+
+async-each-series@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432"
+ integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-foreach@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+ integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async-settle@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b"
+ integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=
+ dependencies:
+ async-done "^1.2.2"
+
+async@1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@>=0.2.9:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772"
+ integrity sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==
+
+async@^2.5.0:
+ 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"
+
+async@~0.2.10:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+ integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
+
+async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+ integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
+
+async@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+ integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
+
+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.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+audiosprite@*, audiosprite@^0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/audiosprite/-/audiosprite-0.7.2.tgz#ac431a6c30c127bbb6ed743e5d178862ddf9e31e"
+ integrity sha512-9Z6UwUuv4To5nUQNRIw5/Q3qA7HYm0ANzoW5EDGPEsU2oIRVgmIlLlm9YZfpPKoeUxt54vMStl2/762189VmJw==
+ dependencies:
+ async "~0.9.0"
+ glob "^6.0.4"
+ mkdirp "^0.5.0"
+ optimist "~0.6.1"
+ underscore "~1.8.3"
+ winston "~1.0.0"
+
+author-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450"
+ integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=
+
+autoprefixer@^9.4.3, autoprefixer@^9.4.7, autoprefixer@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
+ integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==
+ dependencies:
+ browserslist "^4.6.3"
+ caniuse-lite "^1.0.30000980"
+ chalk "^2.4.2"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^7.0.17"
+ postcss-value-parser "^4.0.0"
+
+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.8.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+ integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
+
+axios@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"
+ integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==
+ dependencies:
+ follow-redirects "1.5.10"
+ is-buffer "^2.0.2"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
+ integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
+ dependencies:
+ find-cache-dir "^2.1.0"
+ loader-utils "^1.4.0"
+ mkdirp "^0.5.3"
+ pify "^4.0.1"
+ schema-utils "^2.6.5"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-closure-elimination@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-closure-elimination/-/babel-plugin-closure-elimination-1.3.0.tgz#3217fbf6d416dfdf14ff41a8a34e4d0a6bfc22b2"
+ integrity sha512-ClKuSxKLLNhe69bvTMuONDI0dQDW49lXB2qtQyyKCzvwegRGel/q4/e+1EoDNDN97Hf1QkxGMbzpAGPmU4Tfjw==
+
+babel-plugin-console-source@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-console-source/-/babel-plugin-console-source-2.0.4.tgz#263985b1d69b68e463358d087fa877dd967c5f41"
+ integrity sha512-OGhrdhuMjiEW0Ma0P9e2B4dFddCpJ/xN/RRaM/4wwDLl+6ZKf+Xd77FtVjpNeDzNRNk8wjRdStA4hpZizXzl1g==
+
+babel-plugin-danger-remove-unused-import@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-danger-remove-unused-import/-/babel-plugin-danger-remove-unused-import-1.1.2.tgz#ac39c30edfe524ef8cfc411fec5edc479d19e132"
+ integrity sha512-3bNmVAaakP3b1aROj7O3bOWj2kBa85sZR5naZ3Rn8L9buiZaAyZLgjfrPDL3zhX4wySOA5jrTm/wSmJPsMm3cg==
+
+babel-plugin-dynamic-import-node@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
+ integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-runtime@^7.0.0-beta.3:
+ version "7.0.0-beta.3"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz#7c750de5514452c27612172506b49085a4a630f2"
+ integrity sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg==
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+bach@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880"
+ integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=
+ dependencies:
+ arr-filter "^1.1.1"
+ arr-flatten "^1.0.1"
+ arr-map "^2.0.0"
+ array-each "^1.0.0"
+ array-initial "^1.0.0"
+ array-last "^1.1.1"
+ async-done "^1.2.2"
+ async-settle "^1.0.0"
+ now-and-later "^2.0.0"
+
+backo2@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+ integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+
+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-arraybuffer@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+ integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
+
+base64-js@^1.0.2, 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==
+
+base64id@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+ integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=
+
+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"
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
+
+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"
+
+beeper@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+ integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
+ dependencies:
+ callsite "1.0.0"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+ integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+bin-build@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861"
+ integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==
+ dependencies:
+ decompress "^4.0.0"
+ download "^6.2.2"
+ execa "^0.7.0"
+ p-map-series "^1.0.0"
+ tempfile "^2.0.0"
+
+bin-check@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49"
+ integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==
+ dependencies:
+ execa "^0.7.0"
+ executable "^4.1.0"
+
+bin-version-check@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71"
+ integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==
+ dependencies:
+ bin-version "^3.0.0"
+ semver "^5.6.0"
+ semver-truncate "^1.1.2"
+
+bin-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839"
+ integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==
+ dependencies:
+ execa "^1.0.0"
+ find-versions "^3.0.0"
+
+bin-wrapper@^4.0.0, bin-wrapper@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605"
+ integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==
+ dependencies:
+ bin-check "^4.1.0"
+ bin-version-check "^4.0.0"
+ download "^7.1.0"
+ import-lazy "^3.1.0"
+ os-filter-obj "^2.0.0"
+ pify "^4.0.1"
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+ integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
+
+bl@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b"
+ integrity sha1-P7BnBgKsKHjrdw3CA58YNr5irls=
+ dependencies:
+ readable-stream "~1.0.2"
+
+bl@^0.9.0:
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
+ integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=
+ dependencies:
+ readable-stream "~1.0.26"
+
+bl@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+ integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
+ dependencies:
+ readable-stream "^2.3.5"
+ safe-buffer "^5.1.1"
+
+blob@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
+ integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird@3.x.x, bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.5:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
+ integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
+
+bmp-js@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
+ integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+body-parser@~1.8.0:
+ version "1.8.4"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.8.4.tgz#d497e04bc13b3f9a8bd8c70bb0cdc16f2e028898"
+ integrity sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg=
+ dependencies:
+ bytes "1.0.0"
+ depd "0.4.5"
+ iconv-lite "0.4.4"
+ media-typer "0.3.0"
+ on-finished "2.1.0"
+ qs "2.2.4"
+ raw-body "1.3.0"
+ type-is "~1.5.1"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+brace-expansion@^1.0.0, 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, braces@^2.3.2:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-process-hrtime@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
+ integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==
+
+browser-sync-client@^2.26.10:
+ version "2.26.10"
+ resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.10.tgz#ca9309ba19f9695e7945b95062da8a7ef3156711"
+ integrity sha512-8pYitKwpVva7hzXJI8lTljNDbA9fjMEobHSxWqegIUon/GjJAG3UgHB/+lBWnOLzTY8rGX66MvGqL1Aknyrj7g==
+ dependencies:
+ etag "1.8.1"
+ fresh "0.5.2"
+ mitt "^1.1.3"
+ rxjs "^5.5.6"
+
+browser-sync-ui@^2.26.10:
+ version "2.26.10"
+ resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.10.tgz#7b4b378de204b3913d4b8a6f93b16b1ba769d4bc"
+ integrity sha512-UfNSBItlXcmEvJ9RE4JooNtIsiIfHowp+7/52Jz4VFfQD4v78QK5/NV9DVrG41oMM3zLyhW4f/RliOb4ysStZg==
+ dependencies:
+ async-each-series "0.1.1"
+ connect-history-api-fallback "^1"
+ immutable "^3"
+ server-destroy "1.0.1"
+ socket.io-client "^2.0.4"
+ stream-throttle "^0.1.3"
+
+browser-sync@^2.26.10:
+ version "2.26.10"
+ resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.10.tgz#f03c043f615cf53c9294ccb2a5a5e25cfe11a230"
+ integrity sha512-JeVQP3CARvNA1DELj+ZGWj+/0pzE8+Omvq1WNgzaTXVdP3lNEbGxZbkjvLK7hHpQywjQ1sDJWlJQZT6V59XDTg==
+ dependencies:
+ browser-sync-client "^2.26.10"
+ browser-sync-ui "^2.26.10"
+ bs-recipes "1.3.4"
+ bs-snippet-injector "^2.0.1"
+ chokidar "^3.4.1"
+ connect "3.6.6"
+ connect-history-api-fallback "^1"
+ dev-ip "^1.0.1"
+ easy-extender "^2.3.4"
+ eazy-logger "^3"
+ etag "^1.8.1"
+ fresh "^0.5.2"
+ fs-extra "3.0.1"
+ http-proxy "^1.18.1"
+ immutable "^3"
+ localtunnel "^2.0.0"
+ micromatch "^4.0.2"
+ opn "5.3.0"
+ portscanner "2.1.1"
+ qs "6.2.3"
+ raw-body "^2.3.2"
+ resp-modifier "6.0.2"
+ rx "4.1.0"
+ send "0.16.2"
+ serve-index "1.9.1"
+ serve-static "1.13.2"
+ server-destroy "1.0.1"
+ socket.io "2.1.1"
+ ua-parser-js "^0.7.18"
+ yargs "^15.4.1"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
+ integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
+ dependencies:
+ caniuse-lite "^1.0.30000989"
+ electron-to-chromium "^1.3.247"
+ node-releases "^1.1.29"
+
+bs-recipes@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585"
+ integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=
+
+bs-snippet-injector@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5"
+ integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.1, buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+
+buffer-equal@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+ integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
+
+buffer-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+ integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.2.0, buffer@^5.2.1:
+ version "5.4.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115"
+ integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+bufferstreams@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-2.0.1.tgz#441b267c2fc3fee02bb1d929289da113903bd5ef"
+ integrity sha512-ZswyIoBfFb3cVDsnZLLj2IDJ/0ppYdil/v2EGlZXvoefO689FokEmFEldhN5dV7R2QBxFneqTJOMIpfqhj+n0g==
+ dependencies:
+ readable-stream "^2.3.6"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+bytes@1, bytes@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
+ integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
+
+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==
+
+cacache@^12.0.2:
+ version "12.0.3"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
+ integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==
+ dependencies:
+ bluebird "^3.5.5"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.4"
+ graceful-fs "^4.1.15"
+ infer-owner "^1.0.3"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.3"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
+
+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"
+
+cache-swap@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/cache-swap/-/cache-swap-0.3.0.tgz#1c541aa108a50106f630bdd98fe1dec8ba133f51"
+ integrity sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E=
+ dependencies:
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.1"
+ object-assign "^4.0.1"
+ rimraf "^2.4.0"
+
+cacheable-request@^2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+ integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=
+ dependencies:
+ clone-response "1.0.2"
+ get-stream "3.0.0"
+ http-cache-semantics "3.8.1"
+ keyv "3.0.0"
+ lowercase-keys "1.0.0"
+ normalize-url "2.0.1"
+ responselike "1.0.2"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+calipers-gif@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/calipers-gif/-/calipers-gif-2.0.0.tgz#b5eefec3064a77c6dcdbd5bdc51735a01bafdc37"
+ integrity sha1-te7+wwZKd8bc29W9xRc1oBuv3Dc=
+ dependencies:
+ bluebird "3.x.x"
+
+calipers-jpeg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/calipers-jpeg/-/calipers-jpeg-2.0.0.tgz#06d56a53f62717dd809cb956cf64423ce693465b"
+ integrity sha1-BtVqU/YnF92AnLlWz2RCPOaTRls=
+ dependencies:
+ bluebird "3.x.x"
+
+calipers-png@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/calipers-png/-/calipers-png-2.0.0.tgz#1d0d20e5c1ae5f79b74d5286a2e97f59bb70b658"
+ integrity sha1-HQ0g5cGuX3m3TVKGoul/Wbtwtlg=
+ dependencies:
+ bluebird "3.x.x"
+
+calipers-svg@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/calipers-svg/-/calipers-svg-2.0.1.tgz#cd9eaa58ef7428c1a14f5da57e56715fb60f6541"
+ integrity sha512-3PROqHARmj8wWudUC7DzXm1+mSocqgY7jNuehFNHgrUVrKf8o7MqDjS92vJz5LvZsAofJsoAFMajkqwbxBROSQ==
+ dependencies:
+ bluebird "3.x.x"
+
+calipers-webp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/calipers-webp/-/calipers-webp-2.0.0.tgz#e126ece2f84cd71779612bfa2b2653cd95cea77a"
+ integrity sha1-4Sbs4vhM1xd5YSv6KyZTzZXOp3o=
+ dependencies:
+ bluebird "3.x.x"
+
+calipers@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/calipers/-/calipers-2.0.1.tgz#0d3f303ce75ec5f1eda7fecfc7dba6736e35c926"
+ integrity sha512-AP4Ui2Z8fZf69d8Dx4cfJgPjQHY3m+QXGFCaAGu8pfNQjyajkosS+Kkf1n6pQDMZcelN5h3MdcjweUqxcsS4pg==
+ dependencies:
+ bluebird "3.x.x"
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
+ dependencies:
+ callsites "^0.2.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsite@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+ integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+ integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+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==
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+ integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989:
+ version "1.0.30000989"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
+ integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+caw@^2.0.0, caw@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95"
+ integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==
+ dependencies:
+ get-proxy "^2.0.0"
+ isurl "^1.0.0-alpha5"
+ tunnel-agent "^0.6.0"
+ url-to-options "^1.0.1"
+
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, 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"
+
+chalk@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174"
+ integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=
+ dependencies:
+ ansi-styles "^1.1.0"
+ escape-string-regexp "^1.0.0"
+ has-ansi "^0.1.0"
+ strip-ansi "^0.3.0"
+ supports-color "^0.2.0"
+
+chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.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==
+
+chokidar@^2.0.0, chokidar@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+chokidar@^3.4.0, chokidar@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
+ integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.4.0"
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+chownr@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
+ integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+ integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
+ dependencies:
+ tslib "^1.9.0"
+
+chromium-pickle-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+ integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circular-dependency-plugin@^5.0.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93"
+ integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==
+
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+ integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
+circular-json@^0.5.9:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d"
+ integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==
+
+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"
+
+clean-css@4.2.x:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
+ integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
+ dependencies:
+ source-map "~0.6.0"
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
+ dependencies:
+ restore-cursor "^1.0.1"
+
+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=
+
+clipboard-copy@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-3.1.0.tgz#4c59030a43d4988990564a664baeafba99f78ca4"
+ integrity sha512-Xsu1NddBXB89IUauda5BIq3Zq73UWkjkaQlPQbLNvNsd5WBMnTWPNKYR6HGaySOxGYZ+BKxP2E9X4ElnI3yiPA==
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
+clone-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+ integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
+
+clone-response@1.0.2, clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone-stats@^0.0.1, clone-stats@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+ integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=
+
+clone-stats@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+ integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
+
+clone@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
+ integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=
+
+clone@^1.0.0, clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+cloneable-readable@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
+ integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
+ dependencies:
+ inherits "^2.0.1"
+ process-nextick-args "^2.0.0"
+ readable-stream "^2.3.5"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-map@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c"
+ integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=
+ dependencies:
+ arr-map "^2.0.2"
+ for-own "^1.0.0"
+ make-iterator "^1.0.0"
+
+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, color-convert@^1.9.1:
+ 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-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+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=
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
+ integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+color@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
+ integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.2"
+
+colorette@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
+ integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
+
+colors@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+ integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
+
+colors@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
+ integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
+
+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"
+
+commander@2.17.x:
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+ integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
+
+commander@^2.19.0, commander@^2.2.0, commander@^2.20.0, commander@^2.8.1:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
+ integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
+
+commander@~2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+ integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+commander@~2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
+ integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+compare-version@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+ integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
+
+component-bind@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+ integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+
+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==
+
+component-inherit@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+ integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
+
+compress-commons@~0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3"
+ integrity sha1-DHQIcP3ljLpRbwrAyCLjOguF36M=
+ dependencies:
+ buffer-crc32 "~0.2.1"
+ crc32-stream "~0.3.1"
+ readable-stream "~1.0.26"
+
+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=
+
+concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1"
+ integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.0.2"
+ typedarray "^0.0.6"
+
+config-chain@^1.1.11, config-chain@^1.1.12:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
+ integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+connect-history-api-fallback@^1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+ integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+connect-livereload@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.4.1.tgz#0f8a1a816bc9baffae4637ccea917462fe35917a"
+ integrity sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo=
+
+connect@3.6.6:
+ version "3.6.6"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
+ integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=
+ dependencies:
+ debug "2.6.9"
+ finalhandler "1.1.0"
+ parseurl "~1.3.2"
+ utils-merge "1.0.1"
+
+connect@^3.0.1:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
+ integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
+ dependencies:
+ debug "2.6.9"
+ finalhandler "1.1.2"
+ parseurl "~1.3.3"
+ utils-merge "1.0.1"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+console-stream@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+ integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+content-disposition@^0.5.2:
+ 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"
+
+convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+ integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+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=
+
+copy-props@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe"
+ integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
+ dependencies:
+ each-props "^1.3.0"
+ is-plain-object "^2.0.1"
+
+core-js-compat@^3.1.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150"
+ integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==
+ dependencies:
+ browserslist "^4.6.6"
+ semver "^6.3.0"
+
+core-js@3:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09"
+ integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==
+
+core-js@^2.4.0, core-js@^2.5.7:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
+ integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
+
+core-js@^2.5.0:
+ version "2.6.11"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
+ integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+crc32-stream@~0.3.1:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552"
+ integrity sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI=
+ dependencies:
+ buffer-crc32 "~0.2.1"
+ readable-stream "~1.0.24"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@6.0.5, 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"
+
+cross-spawn@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+ integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+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@^7.0.0:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cross-zip@^2.1.5:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/cross-zip/-/cross-zip-2.1.6.tgz#344d3ba9488609942987d815bb84860cff3d9491"
+ integrity sha512-xLIETNkzRcU6jGRzenJyRFxahbtP4628xEKMTI/Ql0Vu8m4h8M7uRLVi7E5OYHuJ6VQPsG4icJumKAFUvfm0+A==
+ dependencies:
+ rimraf "^3.0.0"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+crypto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037"
+ integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==
+
+css-blank-pseudo@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
+ integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==
+ dependencies:
+ postcss "^7.0.5"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-has-pseudo@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
+ integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^5.0.0-rc.4"
+
+css-loader@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.9.1.tgz#2e1aa00ce7e30ef2c6a7a4b300a080a7c979e0dc"
+ integrity sha1-LhqgDOfjDvLGp6SzAKCAp8l54Nw=
+ dependencies:
+ csso "1.3.x"
+ loader-utils "~0.2.2"
+ source-map "~0.1.38"
+
+css-mqpacker@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/css-mqpacker/-/css-mqpacker-7.0.0.tgz#48f4a0ff45b81ec661c4a33ed80b9db8a026333b"
+ integrity sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA==
+ dependencies:
+ minimist "^1.2.0"
+ postcss "^7.0.0"
+
+css-prefers-color-scheme@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4"
+ integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==
+ dependencies:
+ postcss "^7.0.5"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede"
+ integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^2.1.2"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-tree@1.0.0-alpha.29:
+ version "1.0.0-alpha.29"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
+ integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==
+ dependencies:
+ mdn-data "~1.1.0"
+ source-map "^0.5.3"
+
+css-tree@1.0.0-alpha.33:
+ version "1.0.0-alpha.33"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e"
+ integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.5.3"
+
+css-unit-converter@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
+ integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
+
+css-what@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
+cssdb@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
+ integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==
+
+cssesc@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
+ integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
+
+cssnano-preset-advanced@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88"
+ integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw==
+ dependencies:
+ autoprefixer "^9.4.7"
+ cssnano-preset-default "^4.0.7"
+ postcss-discard-unused "^4.0.1"
+ postcss-merge-idents "^4.0.1"
+ postcss-reduce-idents "^4.0.2"
+ postcss-zindex "^4.0.1"
+
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@1.3.x:
+ version "1.3.12"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-1.3.12.tgz#fc628694a2d38938aaac4996753218fd311cdb9e"
+ integrity sha1-/GKGlKLTiTiqrEmWdTIY/TEc254=
+
+csso@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
+ integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==
+ dependencies:
+ css-tree "1.0.0-alpha.29"
+
+cssom@0.3.x, cssom@^0.3.4:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^1.1.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
+ integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
+ dependencies:
+ cssom "0.3.x"
+
+cuint@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+ integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=
+
+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"
+
+cycle@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+ integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
+
+cyclist@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+ integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^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"
+
+data-urls@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
+ integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
+ dependencies:
+ abab "^2.0.0"
+ whatwg-mimetype "^2.2.0"
+ whatwg-url "^7.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+ integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
+
+dateformat@^1.0.7-1.2.3:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
+ integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.3.0"
+
+dateformat@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
+ integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=
+
+debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ 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"
+
+debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+debug@=3.1.0, debug@~3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@~0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130"
+ integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=
+
+decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+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=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+ integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+ dependencies:
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+ tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+ integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+ dependencies:
+ decompress-tar "^4.1.0"
+ file-type "^6.1.0"
+ is-stream "^1.1.0"
+ seek-bzip "^1.0.5"
+ unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+ integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+ dependencies:
+ decompress-tar "^4.1.1"
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+ integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
+ dependencies:
+ file-type "^3.8.0"
+ get-stream "^2.2.0"
+ pify "^2.3.0"
+ yauzl "^2.4.2"
+
+decompress@^4.0.0, decompress@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
+ integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
+ dependencies:
+ decompress-tar "^4.0.0"
+ decompress-tarbz2 "^4.0.0"
+ decompress-targz "^4.0.0"
+ decompress-unzip "^4.0.1"
+ graceful-fs "^4.1.10"
+ make-dir "^1.0.0"
+ pify "^2.3.0"
+ strip-dirs "^2.0.0"
+
+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==
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+deep-scope-analyser@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/deep-scope-analyser/-/deep-scope-analyser-1.7.0.tgz#23015b3a1d23181b1d9cebd25b783a7378ead8da"
+ integrity sha512-rl5Dmt2IZkFpZo6XbEY1zG8st2Wpq8Pi/dV2gz8ZF6BDYt3fnor2JNxHwdO1WLo0k6JbmYp0x8MNy8kE4l1NtA==
+ dependencies:
+ esrecurse "^4.2.1"
+ estraverse "^4.2.0"
+
+default-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f"
+ integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
+ dependencies:
+ kind-of "^5.0.2"
+
+default-resolution@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684"
+ integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=
+
+defaults@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+defer-to-connect@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e"
+ integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+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=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+delete-empty@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/delete-empty/-/delete-empty-3.0.0.tgz#f8040f2669f26fa7060bc2304e9859c593b685e8"
+ integrity sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==
+ dependencies:
+ ansi-colors "^4.1.0"
+ minimist "^1.2.0"
+ path-starts-with "^2.0.0"
+ rimraf "^2.6.2"
+
+depd@0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-0.4.5.tgz#1a664b53388b4a6573e8ae67b5f767c693ca97f1"
+ integrity sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+deprecated@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
+ integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+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-file@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+ integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+dev-ip@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0"
+ integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^1.2.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+ integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-serializer@0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb"
+ integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+ integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
+ integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+
+domexception@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+ integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+ dependencies:
+ webidl-conversions "^4.0.2"
+
+domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.1:
+ 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"
+
+download@^6.2.2:
+ version "6.2.5"
+ resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
+ integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==
+ dependencies:
+ caw "^2.0.0"
+ content-disposition "^0.5.2"
+ decompress "^4.0.0"
+ ext-name "^5.0.0"
+ file-type "5.2.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^7.0.0"
+ make-dir "^1.0.0"
+ p-event "^1.0.0"
+ pify "^3.0.0"
+
+download@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233"
+ integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==
+ dependencies:
+ archive-type "^4.0.0"
+ caw "^2.0.1"
+ content-disposition "^0.5.2"
+ decompress "^4.2.0"
+ ext-name "^5.0.0"
+ file-type "^8.1.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^8.3.1"
+ make-dir "^1.2.0"
+ p-event "^2.1.0"
+ pify "^3.0.0"
+
+duplexer2@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
+ dependencies:
+ readable-stream "~1.1.9"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+duplexify@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61"
+ integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==
+ dependencies:
+ end-of-stream "^1.4.1"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+ stream-shift "^1.0.0"
+
+each-props@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333"
+ integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
+ dependencies:
+ is-plain-object "^2.0.1"
+ object.defaults "^1.1.0"
+
+easy-extender@^2.3.4:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f"
+ integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==
+ dependencies:
+ lodash "^4.17.10"
+
+eazy-logger@^3:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc"
+ integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=
+ dependencies:
+ tfunk "^3.0.1"
+
+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"
+
+editorconfig@^0.15.3:
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
+ integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
+ dependencies:
+ commander "^2.19.0"
+ lru-cache "^4.1.5"
+ semver "^5.6.0"
+ sigmund "^1.0.1"
+
+ee-first@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.0.5.tgz#8c9b212898d8cd9f1a9436650ce7be202c9e9ff0"
+ integrity sha1-jJshKJjYzZ8alDZlDOe+ICyen/A=
+
+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=
+
+electron-notarize@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.1.1.tgz#c3563d70c5e7b3315f44e8495b30050a8c408b91"
+ integrity sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^8.0.1"
+
+electron-osx-sign@^0.4.11:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.13.tgz#4f77f0ff2f5cd71b91c1e6ce550c3a2937ebbef2"
+ integrity sha512-+44lasF26lSBLh9HDG6TGpPjuqqtWGD9Pcp+YglE8gyf1OGYdbW8UCIshKPh69O/AcdvDB0ohaTYQz3nbGPbtw==
+ dependencies:
+ bluebird "^3.5.0"
+ compare-version "^0.1.2"
+ debug "^2.6.8"
+ isbinaryfile "^3.0.2"
+ minimist "^1.2.0"
+ plist "^3.0.1"
+
+electron-packager@^14.0.6:
+ version "14.0.6"
+ resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-14.0.6.tgz#e187f2ef83cc29a97a0f940b7c3bb5e4edc8a8e2"
+ integrity sha512-X+ikV+TnnNkIrK93vOjsjPeykCQBFxBS7LXKMTE1s62rXWirGMdjWL+edVkBOMRkH0ROJyFmWM28Dpj6sfEg+A==
+ dependencies:
+ "@electron/get" "^1.3.0"
+ asar "^2.0.1"
+ cross-zip "^2.1.5"
+ debug "^4.0.1"
+ electron-notarize "^0.1.1"
+ electron-osx-sign "^0.4.11"
+ fs-extra "^8.1.0"
+ galactus "^0.2.1"
+ get-package-info "^1.0.0"
+ junk "^3.1.0"
+ parse-author "^2.0.0"
+ plist "^3.0.0"
+ rcedit "^2.0.0"
+ resolve "^1.1.6"
+ sanitize-filename "^1.6.0"
+ semver "^6.0.0"
+ yargs-parser "^13.0.0"
+
+electron-to-chromium@^1.3.247:
+ version "1.3.264"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.264.tgz#ed837f44524d0601a7b2b7b6efd86e35753d0e27"
+ integrity sha512-z8E7WkrrquCuGYv+kKyybuZIbdms+4PeHp7Zm2uIgEhAigP0bOwqXILItwj0YO73o+QyHY/7XtEfP5DsHOWQgQ==
+
+elliptic@^6.0.0:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b"
+ integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+email-validator@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
+ integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+ integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.1, 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.0.0, end-of-stream@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+ integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
+ dependencies:
+ once "^1.4.0"
+
+end-of-stream@^1.4.1:
+ 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"
+
+end-of-stream@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
+ integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8=
+ dependencies:
+ once "~1.3.0"
+
+engine.io-client@~3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
+ integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "~3.1.0"
+ engine.io-parser "~2.1.1"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "~3.3.1"
+ xmlhttprequest-ssl "~1.5.4"
+ yeast "0.1.2"
+
+engine.io-client@~3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700"
+ integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "~4.1.0"
+ engine.io-parser "~2.2.0"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "~6.1.0"
+ xmlhttprequest-ssl "~1.5.4"
+ yeast "0.1.2"
+
+engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6"
+ integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "~0.0.7"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.5"
+ has-binary2 "~1.0.2"
+
+engine.io-parser@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed"
+ integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "~0.0.7"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.5"
+ has-binary2 "~1.0.2"
+
+engine.io@~3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2"
+ integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==
+ dependencies:
+ accepts "~1.3.4"
+ base64id "1.0.0"
+ cookie "0.3.1"
+ debug "~3.1.0"
+ engine.io-parser "~2.1.0"
+ ws "~3.3.1"
+
+enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
+ integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
+
+env-paths@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
+ integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.1:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497"
+ integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==
+ dependencies:
+ es-to-primitive "^1.2.0"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.0"
+ is-callable "^1.1.4"
+ is-regex "^1.0.4"
+ object-inspect "^1.6.0"
+ object-keys "^1.1.1"
+ string.prototype.trimleft "^2.0.0"
+ string.prototype.trimright "^2.0.0"
+
+es-to-primitive@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
+ integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14:
+ version "0.10.51"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f"
+ integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "^1.0.0"
+
+es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1"
+ integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.51"
+
+es6-templates@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4"
+ integrity sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=
+ dependencies:
+ recast "~0.11.12"
+ through "~2.3.6"
+
+es6-weak-map@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+ integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.46"
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.1"
+
+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.0, escape-string-regexp@^1.0.2, 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=
+
+escodegen@^1.11.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541"
+ integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+ integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^1.3.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
+ integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
+ dependencies:
+ eslint-visitor-keys "^1.0.0"
+
+eslint-visitor-keys@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+ integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
+
+eslint@^2.7.0:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11"
+ integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=
+ dependencies:
+ chalk "^1.1.3"
+ concat-stream "^1.4.6"
+ debug "^2.1.1"
+ doctrine "^1.2.2"
+ es6-map "^0.1.3"
+ escope "^3.6.0"
+ espree "^3.1.6"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^1.1.1"
+ glob "^7.0.3"
+ globals "^9.2.0"
+ ignore "^3.1.2"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ is-my-json-valid "^2.10.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.5.1"
+ json-stable-stringify "^1.0.0"
+ levn "^0.3.0"
+ lodash "^4.0.0"
+ mkdirp "^0.5.0"
+ optionator "^0.8.1"
+ path-is-absolute "^1.0.0"
+ path-is-inside "^1.0.1"
+ pluralize "^1.2.1"
+ progress "^1.1.8"
+ require-uncached "^1.0.2"
+ shelljs "^0.6.0"
+ strip-json-comments "~1.0.1"
+ table "^3.7.8"
+ text-table "~0.2.0"
+ user-home "^2.0.0"
+
+eslint@^5.9.0:
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+ integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ ajv "^6.9.1"
+ chalk "^2.1.0"
+ cross-spawn "^6.0.5"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ eslint-scope "^4.0.3"
+ eslint-utils "^1.3.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^5.0.1"
+ esquery "^1.0.1"
+ esutils "^2.0.2"
+ file-entry-cache "^5.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.7.0"
+ ignore "^4.0.6"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ inquirer "^6.2.2"
+ js-yaml "^3.13.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.11"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ progress "^2.0.0"
+ regexpp "^2.0.1"
+ semver "^5.5.1"
+ strip-ansi "^4.0.0"
+ strip-json-comments "^2.0.1"
+ table "^5.2.3"
+ text-table "^0.2.0"
+
+espree@^3.1.6:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+ integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
+espree@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+ integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
+ dependencies:
+ acorn "^6.0.7"
+ acorn-jsx "^5.0.0"
+ eslint-visitor-keys "^1.0.0"
+
+esprima@^3.1.3, esprima@~3.1.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+ integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+ integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0, esrecurse@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@1.8.1, etag@^1.8.1, etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter3@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
+ integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exec-buffer@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+ integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==
+ dependencies:
+ execa "^0.7.0"
+ p-finally "^1.0.0"
+ pify "^3.0.0"
+ rimraf "^2.5.4"
+ tempfile "^2.0.0"
+
+execa@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+ integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
+ dependencies:
+ cross-spawn "^6.0.0"
+ 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@^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"
+
+execa@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240"
+ integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==
+ dependencies:
+ cross-spawn "^7.0.0"
+ get-stream "^5.0.0"
+ human-signals "^1.1.1"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.0"
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+ strip-final-newline "^2.0.0"
+
+executable@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
+ integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
+ dependencies:
+ pify "^2.2.0"
+
+exif-parser@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
+ integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+ integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
+
+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"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
+extend-shallow@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
+ integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=
+ dependencies:
+ kind-of "^1.1.0"
+
+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.0, 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=
+
+eyes@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+ integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
+
+fancy-log@^1.1.0, fancy-log@^1.2.0, fancy-log@^1.3.2, fancy-log@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
+ integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
+ dependencies:
+ ansi-gray "^0.1.1"
+ color-support "^1.1.3"
+ parse-node-version "^1.0.0"
+ time-stamp "^1.0.0"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+ integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
+
+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@^3.0.3:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
+ integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+ integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastdom@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.9.tgz#b395fab11a3701173c02a054fe769d8f596a0a26"
+ integrity sha512-SSp4fbVzu8JkkG01NUX+0iOwe9M5PN3MGIQ84txLf4TkkJG4q30khkzumKgi4hUqO1+jX6wLHfnCPoZ6eSZ6Tg==
+ dependencies:
+ strictdom "^1.0.1"
+
+faster.js@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/faster.js/-/faster.js-1.1.1.tgz#8bbd7eefdb8f03faac26ad5025b059f94c5cfb4d"
+ integrity sha512-vPThNSLL/E1f7cLHd9yuayxZR82o/Iic4S5ZY45iY5AgBLNIlr3b3c+VpDjoYqjY9a9C/FQVUQy9oTILVP7X0g==
+
+fastparse@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+ integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+fastq@^1.6.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+ integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+ dependencies:
+ reusify "^1.0.4"
+
+faye-websocket@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11"
+ integrity sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=
+ dependencies:
+ websocket-driver ">=0.3.6"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+ dependencies:
+ pend "~1.2.0"
+
+figgy-pudding@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
+ integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
+
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+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"
+
+file-entry-cache@^1.1.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8"
+ integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+file-entry-cache@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+ integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+ dependencies:
+ flat-cache "^2.0.1"
+
+file-loader@^0.8.1:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b"
+ integrity sha1-knXQMf54DyfUf19K8CvUNxPMFRs=
+ dependencies:
+ loader-utils "~0.2.5"
+
+file-type@5.2.0, file-type@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+ integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
+
+file-type@^10.4.0:
+ version "10.11.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890"
+ integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==
+
+file-type@^12.0.0:
+ version "12.4.2"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
+ integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
+
+file-type@^3.8.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
+
+file-type@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+ integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU=
+
+file-type@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+ integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
+file-type@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c"
+ integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==
+
+file-type@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
+ integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==
+
+filename-reserved-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
+ integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik=
+
+filenamify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
+ integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==
+ dependencies:
+ filename-reserved-regex "^2.0.0"
+ strip-outer "^1.0.0"
+ trim-repeated "^1.0.0"
+
+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"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+ integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.2"
+ statuses "~1.3.1"
+ unpipe "~1.0.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-cache-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+ integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^2.0.0"
+ pkg-dir "^3.0.0"
+
+find-index@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
+ integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.0.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"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-versions@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d"
+ integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==
+ dependencies:
+ array-uniq "^2.1.0"
+ semver-regex "^2.0.0"
+
+findup-sync@3.0.0, findup-sync@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+ integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^4.0.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
+findup-sync@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
+ integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^3.1.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
+findup-sync@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
+ integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^4.0.0"
+ micromatch "^4.0.2"
+ resolve-dir "^1.0.1"
+
+fined@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
+ integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
+ dependencies:
+ expand-tilde "^2.0.2"
+ is-plain-object "^2.0.3"
+ object.defaults "^1.1.0"
+ object.pick "^1.2.0"
+ parse-filepath "^1.0.1"
+
+first-chunk-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+ integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=
+
+flagged-respawn@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
+ integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
+
+flat-cache@^1.2.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+ integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+ dependencies:
+ circular-json "^0.3.1"
+ graceful-fs "^4.1.2"
+ rimraf "~2.6.2"
+ write "^0.2.1"
+
+flat-cache@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+ integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+ dependencies:
+ flatted "^2.0.0"
+ rimraf "2.6.3"
+ write "1.0.3"
+
+flatted@^2.0.0, flatted@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
+ integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
+
+flatten@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+ integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
+
+flora-colossus@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93"
+ integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+
+fluent-ffmpeg@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74"
+ integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=
+ dependencies:
+ async ">=0.2.9"
+ which "^1.1.1"
+
+flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
+
+follow-redirects@1.5.10:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
+ integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
+ dependencies:
+ debug "=3.1.0"
+
+follow-redirects@^1.0.0:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
+ integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.1, 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=
+
+for-own@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
+ integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
+ dependencies:
+ for-in "^1.0.1"
+
+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=
+
+fork-stream@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
+ integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=
+
+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"
+
+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, fresh@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+from2@^2.1.0, from2@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+front-matter@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb"
+ integrity sha1-91mDufL0E75ljJPf172M5AePXNs=
+ dependencies:
+ js-yaml "^3.4.6"
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@3.0.1, fs-extra@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
+ integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^3.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0:
+ 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.1, fs-extra@^8.1.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-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs-mkdirp-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+ integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
+ dependencies:
+ graceful-fs "^4.1.11"
+ through2 "^2.0.3"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+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=
+
+fsevents@^1.2.7:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f"
+ integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
+ dependencies:
+ nan "^2.12.1"
+ node-pre-gyp "^0.12.0"
+
+fsevents@~2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fstream@^1.0.0, fstream@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
+ integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+galactus@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9"
+ integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=
+ dependencies:
+ debug "^3.1.0"
+ flora-colossus "^1.0.0"
+ fs-extra "^4.0.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
+ integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=
+ dependencies:
+ globule "~0.1.0"
+
+gaze@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
+generate-function@^2.0.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
+ integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
+ dependencies:
+ is-property "^1.0.2"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
+ dependencies:
+ is-property "^1.0.0"
+
+gensync@^1.0.0-beta.1:
+ version "1.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+ integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-package-info@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c"
+ integrity sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=
+ dependencies:
+ bluebird "^3.1.1"
+ debug "^2.2.0"
+ lodash.get "^4.0.0"
+ read-pkg-up "^2.0.0"
+
+get-proxy@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93"
+ integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==
+ dependencies:
+ npm-conf "^1.1.0"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+ integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
+
+get-stream@3.0.0, 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@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^4.0.0, get-stream@^4.1.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-stream@^5.0.0, get-stream@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
+ integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
+ 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"
+
+gifsicle@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.1.0.tgz#08f878e9048c70adf046185115a6350516a1fdc0"
+ integrity sha512-hQsOH7yjC7fMokntysN6f2QuxrnX+zmKKKVy0sC3Vhtnk8WrOxLdfH/Z2PNn7lVVx+1+drzIeAe8ufcmdSC/8g==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ execa "^4.0.0"
+ logalot "^2.0.0"
+
+glob-all@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab"
+ integrity sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=
+ dependencies:
+ glob "^7.0.5"
+ yargs "~1.2.6"
+
+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-parent@^5.1.0, glob-parent@~5.1.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-stream@^3.1.5:
+ version "3.1.18"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
+ integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=
+ dependencies:
+ glob "^4.3.1"
+ glob2base "^0.0.12"
+ minimatch "^2.0.1"
+ ordered-read-streams "^0.1.0"
+ through2 "^0.6.1"
+ unique-stream "^1.0.0"
+
+glob-stream@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+ integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
+ dependencies:
+ extend "^3.0.0"
+ glob "^7.1.1"
+ glob-parent "^3.1.0"
+ is-negated-glob "^1.0.0"
+ ordered-read-streams "^1.0.0"
+ pumpify "^1.3.5"
+ readable-stream "^2.1.5"
+ remove-trailing-separator "^1.0.1"
+ to-absolute-glob "^2.0.0"
+ unique-stream "^2.0.2"
+
+glob-watcher@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
+ integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=
+ dependencies:
+ gaze "^0.5.1"
+
+glob-watcher@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626"
+ integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-done "^1.2.0"
+ chokidar "^2.0.0"
+ is-negated-glob "^1.0.0"
+ just-debounce "^1.0.0"
+ object.defaults "^1.1.0"
+
+glob2base@^0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
+ integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=
+ dependencies:
+ find-index "^0.1.1"
+
+glob@^4.3.1:
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
+ integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^2.0.1"
+ once "^1.3.0"
+
+glob@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+ integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
+ integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
+ 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"
+
+glob@^7.1.1:
+ 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"
+
+glob@~3.1.21:
+ version "3.1.21"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+ integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=
+ dependencies:
+ graceful-fs "~1.2.0"
+ inherits "1"
+ minimatch "~0.2.11"
+
+glob@~3.2.6:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
+ integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=
+ dependencies:
+ inherits "2"
+ minimatch "0.3"
+
+global-modules@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^1.0.0"
+
+global-prefix@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
+ dependencies:
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
+global@~4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+ integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
+ dependencies:
+ min-document "^2.19.0"
+ process "~0.5.1"
+
+globals@^11.1.0, globals@^11.7.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^9.18.0, globals@^9.2.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globby@^10.0.0:
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+ integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.0.3"
+ glob "^7.1.3"
+ ignore "^5.1.1"
+ merge2 "^1.2.3"
+ slash "^3.0.0"
+
+globule@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
+ integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.17.10"
+ minimatch "~3.0.2"
+
+globule@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
+ integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=
+ dependencies:
+ glob "~3.1.21"
+ lodash "~1.0.1"
+ minimatch "~0.2.11"
+
+glogg@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f"
+ integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==
+ dependencies:
+ sparkles "^1.0.0"
+
+gonzales-pe-sl@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6"
+ integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=
+ dependencies:
+ minimist "1.1.x"
+
+gonzales-pe@^4.2.3:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2"
+ integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==
+ dependencies:
+ minimist "1.1.x"
+
+got@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ decompress-response "^3.2.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-plain-obj "^1.1.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ p-cancelable "^0.3.0"
+ p-timeout "^1.1.1"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ url-parse-lax "^1.0.0"
+ url-to-options "^1.0.1"
+
+got@^8.3.1:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+ integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+ dependencies:
+ "@sindresorhus/is" "^0.7.0"
+ cacheable-request "^2.1.1"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ into-stream "^3.1.0"
+ is-retry-allowed "^1.1.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ mimic-response "^1.0.0"
+ p-cancelable "^0.4.0"
+ p-timeout "^2.0.1"
+ pify "^3.0.0"
+ safe-buffer "^5.1.1"
+ timed-out "^4.0.1"
+ url-parse-lax "^3.0.0"
+ url-to-options "^1.0.1"
+
+got@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+graceful-fs@^3.0.0:
+ version "3.0.12"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef"
+ integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==
+ dependencies:
+ natives "^1.1.3"
+
+graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
+ integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
+
+graceful-fs@^4.2.2:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+graceful-fs@~1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+ integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+ integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
+
+gulp-audiosprite@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/gulp-audiosprite/-/gulp-audiosprite-1.1.0.tgz#1762d7fb9a669f372b33c1511e3402d79b624892"
+ integrity sha512-CwSfZjmNPlTyzcAFaE8RiKzh1dQFDLPPZMHshKwvGqNeTB86s30K8hMXGrrjFqHNF9xb0SUnXfbYT32MO4aNog==
+ dependencies:
+ audiosprite "*"
+ through2 "*"
+ vinyl "*"
+
+gulp-cache@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/gulp-cache/-/gulp-cache-1.1.3.tgz#7c427670aad4d25364c3cc9c53e492b348190d27"
+ integrity sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ cache-swap "^0.3.0"
+ core-js "3"
+ object.pick "^1.3.0"
+ plugin-error "^1.0.1"
+ through2 "3.0.1"
+ vinyl "^2.2.0"
+
+gulp-cached@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce"
+ integrity sha1-/nzU+H83YB5gc8/t7lwr2vi2rM4=
+ dependencies:
+ lodash.defaults "^4.2.0"
+ through2 "^2.0.1"
+
+gulp-clean@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950"
+ integrity sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==
+ dependencies:
+ fancy-log "^1.3.2"
+ plugin-error "^0.1.2"
+ rimraf "^2.6.2"
+ through2 "^2.0.3"
+ vinyl "^2.1.0"
+
+gulp-cli@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f"
+ integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==
+ dependencies:
+ ansi-colors "^1.0.1"
+ archy "^1.0.0"
+ array-sort "^1.0.0"
+ color-support "^1.1.3"
+ concat-stream "^1.6.0"
+ copy-props "^2.0.1"
+ fancy-log "^1.3.2"
+ gulplog "^1.0.0"
+ interpret "^1.4.0"
+ isobject "^3.0.1"
+ liftoff "^3.1.0"
+ matchdep "^2.0.0"
+ mute-stdout "^1.0.0"
+ pretty-hrtime "^1.0.0"
+ replace-homedir "^1.0.0"
+ semver-greatest-satisfied-range "^1.1.0"
+ v8flags "^3.2.0"
+ yargs "^7.1.0"
+
+gulp-dom@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-dom/-/gulp-dom-1.0.0.tgz#f834d5299c09b85e11c32505044a2ebe86ae1375"
+ integrity sha512-hD2w2t3fsjPicX2mT6MFFb+eP3FyCVtEHdejGMMH4+w9EBFxA2xIZadqlzYdAEdE+39dP1aGatuhdHJteUvn1A==
+ dependencies:
+ jsdom "12.2.0"
+ plugin-error "1.0.1"
+ through2 "2.0.3"
+
+gulp-flatten@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/gulp-flatten/-/gulp-flatten-0.4.0.tgz#d9ac819416c30fd5dfb3dea9da79c83a1bcd61d1"
+ integrity sha512-eg4spVTAiv1xXmugyaCxWne1oPtNG0UHEtABx5W8ScLiqAYceyYm6GYA36x0Qh8KOIXmAZV97L2aYGnKREG3Sg==
+ dependencies:
+ plugin-error "^0.1.2"
+ through2 "^2.0.0"
+
+gulp-fluent-ffmpeg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-fluent-ffmpeg/-/gulp-fluent-ffmpeg-2.0.0.tgz#5b5ed180d317fd3d800ddbcd6376ffb46294b836"
+ integrity sha512-pwG6N+NKwLzO/0ybzgcwiADKZ4OzpFjNR4drqCvbvluYcSh/yvsAW7wm63jFzpJIjfFnanYGPNWiUn8+TuTR/g==
+ dependencies:
+ concat-stream "^2.0.0"
+ fluent-ffmpeg "^2.1.2"
+ plugin-error "^1.0.1"
+ through2 "^3.0.1"
+
+gulp-html-beautify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gulp-html-beautify/-/gulp-html-beautify-1.0.1.tgz#2834c6f77669605726eee55e3205f63074b7a152"
+ integrity sha1-KDTG93ZpYFcm7uVeMgX2MHS3oVI=
+ dependencies:
+ js-beautify "^1.5.10"
+ rcloader "^0.1.4"
+ through2 "^2.0.0"
+
+gulp-htmlmin@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz#90fc5e8ad0425a9e86d5d521427184e7276365e7"
+ integrity sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==
+ dependencies:
+ html-minifier "^3.5.20"
+ plugin-error "^1.0.1"
+ through2 "^2.0.3"
+
+gulp-if@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-3.0.0.tgz#6c3e7edc8bafadc34f2ebecb314bf43324ba1e40"
+ integrity sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==
+ dependencies:
+ gulp-match "^1.1.0"
+ ternary-stream "^3.0.0"
+ through2 "^3.0.1"
+
+gulp-imagemin@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz#d1810a908fb64b4fbf15a750d303d988443e68cf"
+ integrity sha512-6xBTNybmPY2YrvrhhlS8Mxi0zn0ypusLon63p9XXxDtIf7U7c6KcViz94K7Skosucr3378A6IY2kJSjJyuwylQ==
+ dependencies:
+ chalk "^3.0.0"
+ fancy-log "^1.3.2"
+ imagemin "^7.0.0"
+ plugin-error "^1.0.1"
+ plur "^3.0.1"
+ pretty-bytes "^5.3.0"
+ through2-concurrent "^2.0.0"
+ optionalDependencies:
+ imagemin-gifsicle "^7.0.0"
+ imagemin-mozjpeg "^8.0.0"
+ imagemin-optipng "^7.0.0"
+ imagemin-svgo "^7.0.0"
+
+gulp-load-plugins@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-2.0.3.tgz#5f275c0b7f1925d8a1ce57cbd5c346d6af6b64fb"
+ integrity sha512-U/1Sml7UbyOu2kH6Fbpo+ka2xyp4DRH6+oDtHgC8oKsnlQRuiBQYQ/LS4k6HxBv1HJlucaNV/SdwZXtLBuvSqg==
+ dependencies:
+ array-unique "^0.3.2"
+ fancy-log "^1.2.0"
+ findup-sync "^4.0.0"
+ gulplog "^1.0.0"
+ has-gulplog "^0.1.0"
+ micromatch "^4.0.2"
+ resolve "^1.15.1"
+
+gulp-match@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f"
+ integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==
+ dependencies:
+ minimatch "^3.0.3"
+
+gulp-phonegap-build@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/gulp-phonegap-build/-/gulp-phonegap-build-0.1.5.tgz#36c145e63cd204702be0f3b99be19e096712bcaf"
+ integrity sha1-NsFF5jzSBHAr4PO5m+GeCWcSvK8=
+ dependencies:
+ archiver "~0.11.0"
+ gulp "~3.8.7"
+ gulp-util "~3.0.0"
+ lodash "~2.4.1"
+ needle ""
+ read "~1.0.4"
+ through2 "~0.6.1"
+ vinyl-buffer "0.0.0"
+ vinyl-source-stream "^0.1.1"
+
+gulp-plumber@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.1.tgz#d38700755a300b9d372318e4ffb5ff7ced0b2c84"
+ integrity sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==
+ dependencies:
+ chalk "^1.1.3"
+ fancy-log "^1.3.2"
+ plugin-error "^0.1.2"
+ through2 "^2.0.3"
+
+gulp-pngquant@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/gulp-pngquant/-/gulp-pngquant-1.0.13.tgz#7160b4b51080898c9bed896ae0432546c46a8130"
+ integrity sha512-oSo5Rw2Rb10eyGhc8XKbghq6yteMmxvsSAKGOZU0ssbylMHk3WoTWcEpNg0YWMyRjrY913y+B+PA4wHM1AL2wA==
+ dependencies:
+ chalk "^3.0.0"
+ fancy-log "^1.3.3"
+ plugin-error "^1.0.1"
+ pngquant-bin "^5.0.2"
+ through2 "^3.0.1"
+
+gulp-postcss@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-8.0.0.tgz#8d3772cd4d27bca55ec8cb4c8e576e3bde4dc550"
+ integrity sha512-Wtl6vH7a+8IS/fU5W9IbOpcaLqKxd5L1DUOzaPmlnCbX1CrG0aWdwVnC3Spn8th0m8D59YbysV5zPUe1n/GJYg==
+ dependencies:
+ fancy-log "^1.3.2"
+ plugin-error "^1.0.1"
+ postcss "^7.0.2"
+ postcss-load-config "^2.0.0"
+ vinyl-sourcemaps-apply "^0.2.1"
+
+gulp-rename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c"
+ integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==
+
+gulp-sass-lint@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/gulp-sass-lint/-/gulp-sass-lint-1.4.0.tgz#6f7096c5abcbc0ce99ddf060c9e1a99067a47ebe"
+ integrity sha512-XerYvHx7rznInkedMw5Ayif+p8EhysOVHUBvlgUa0FSl88H2cjNjaRZ3NGn5Efmp+2HxpXp4NHqMIbOSdwef3A==
+ dependencies:
+ plugin-error "^0.1.2"
+ sass-lint "^1.12.0"
+ through2 "^2.0.2"
+
+gulp-sass@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427"
+ integrity sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==
+ dependencies:
+ chalk "^2.3.0"
+ lodash "^4.17.11"
+ node-sass "^4.8.3"
+ plugin-error "^1.0.1"
+ replace-ext "^1.0.0"
+ strip-ansi "^4.0.0"
+ through2 "^2.0.0"
+ vinyl-sourcemaps-apply "^0.2.0"
+
+"gulp-sftp@git+https://git@github.com/webksde/gulp-sftp":
+ version "0.1.6"
+ resolved "git+https://git@github.com/webksde/gulp-sftp#c8dfb20e290477eeed66a867406576d0c3d4fc6b"
+ dependencies:
+ async "~0.9.0"
+ gulp-util "~3.0.0"
+ object-assign "~0.3.1"
+ parents "~1.0.0"
+ ssh2 "~0.6.1"
+ through2 "~0.4.2"
+
+gulp-terser@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b"
+ integrity sha512-lf+jE2DALg2w32p0HRiYMlFYRYelKZPNunHp2pZccCYrrdCLOs0ItbZcN63yr2pbz116IyhUG9mD/QbtRO1FKA==
+ dependencies:
+ plugin-error "^1.0.1"
+ terser "^4.0.0"
+ through2 "^3.0.1"
+ vinyl-sourcemaps-apply "^0.2.1"
+
+gulp-util@^2.2.19:
+ version "2.2.20"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
+ integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=
+ dependencies:
+ chalk "^0.5.0"
+ dateformat "^1.0.7-1.2.3"
+ lodash._reinterpolate "^2.4.1"
+ lodash.template "^2.4.1"
+ minimist "^0.2.0"
+ multipipe "^0.1.0"
+ through2 "^0.5.0"
+ vinyl "^0.2.1"
+
+gulp-util@^3.0.0, gulp-util@~3.0.0:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+ integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08=
+ dependencies:
+ array-differ "^1.0.0"
+ array-uniq "^1.0.2"
+ beeper "^1.0.0"
+ chalk "^1.0.0"
+ dateformat "^2.0.0"
+ fancy-log "^1.1.0"
+ gulplog "^1.0.0"
+ has-gulplog "^0.1.0"
+ lodash._reescape "^3.0.0"
+ lodash._reevaluate "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.template "^3.0.0"
+ minimist "^1.1.0"
+ multipipe "^0.1.2"
+ object-assign "^3.0.0"
+ replace-ext "0.0.1"
+ through2 "^2.0.0"
+ vinyl "^0.5.0"
+
+gulp-webserver@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/gulp-webserver/-/gulp-webserver-0.9.1.tgz#e09992165d97c5865616d642a1601529b0367064"
+ integrity sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ=
+ dependencies:
+ connect "^3.0.1"
+ connect-livereload "^0.4.0"
+ gulp-util "^2.2.19"
+ isarray "0.0.1"
+ node.extend "^1.0.10"
+ open "^0.0.5"
+ proxy-middleware "^0.5.0"
+ serve-index "^1.1.4"
+ serve-static "^1.3.0"
+ through2 "^0.5.1"
+ tiny-lr "0.1.4"
+ watch "^0.11.0"
+
+gulp-yaml@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/gulp-yaml/-/gulp-yaml-2.0.4.tgz#86569e2becc9f5dfc95dc92db5a71a237f4b6ab4"
+ integrity sha512-S/9Ib8PO+jGkCvWDwBUkmFkeW7QM0pp4PO8NNrMEfWo5Sk30P+KqpyXc4055L/vOX326T/b9MhM4nw5EenyX9g==
+ dependencies:
+ bufferstreams "^2.0.1"
+ js-yaml "^3.13.1"
+ object-assign "^4.1.1"
+ plugin-error "^1.0.1"
+ replace-ext "^1.0.0"
+ through2 "^3.0.0"
+
+gulp@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa"
+ integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==
+ dependencies:
+ glob-watcher "^5.0.3"
+ gulp-cli "^2.2.0"
+ undertaker "^1.2.1"
+ vinyl-fs "^3.0.0"
+
+gulp@~3.8.7:
+ version "3.8.11"
+ resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.8.11.tgz#d557e0a7283eb4136491969b0497767972f1d28a"
+ integrity sha1-1Vfgpyg+tBNkkZabBJd2eXLx0oo=
+ dependencies:
+ archy "^1.0.0"
+ chalk "^0.5.0"
+ deprecated "^0.0.1"
+ gulp-util "^3.0.0"
+ interpret "^0.3.2"
+ liftoff "^2.0.1"
+ minimist "^1.1.0"
+ orchestrator "^0.3.0"
+ pretty-hrtime "^0.2.0"
+ semver "^4.1.0"
+ tildify "^1.0.0"
+ v8flags "^2.0.2"
+ vinyl-fs "^0.3.0"
+
+gulplog@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+ integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U=
+ dependencies:
+ glogg "^1.0.0"
+
+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.0:
+ 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-ansi@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e"
+ integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=
+ dependencies:
+ ansi-regex "^0.2.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-binary2@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
+ integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
+ dependencies:
+ isarray "2.0.1"
+
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+ integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
+
+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-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-gulplog@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+ integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=
+ dependencies:
+ sparkles "^1.0.0"
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+ integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+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"
+
+has@^1.0.0, has@^1.0.1, has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+ integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+ version "2.8.4"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
+ integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
+
+howler@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/howler/-/howler-2.1.2.tgz#8433a09d8fe84132a3e726e05cb2bd352ef8bd49"
+ integrity sha512-oKrTFaVXsDRoB/jik7cEpWKTj7VieoiuzMYJ7E/EU5ayvmpRhumCv3YQ3823zi9VTJkSWAhbryHnlZAionGAJg==
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+html-encoding-sniffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+html-loader@^0.5.5:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea"
+ integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==
+ dependencies:
+ es6-templates "^0.2.3"
+ fastparse "^1.1.1"
+ html-minifier "^3.5.8"
+ loader-utils "^1.1.0"
+ object-assign "^4.1.1"
+
+html-minifier@^3.5.20, html-minifier@^3.5.8:
+ version "3.5.21"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
+ integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.2.x"
+ commander "2.17.x"
+ he "1.2.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "3.4.x"
+
+http-cache-semantics@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+ integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
+http-cache-semantics@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5"
+ integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==
+
+http-errors@1.7.3, 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-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+"http-parser-js@>=0.4.0 <0.4.11":
+ version "0.4.10"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
+ integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=
+
+http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^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"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
+ 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"
+
+iconv-lite@0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8"
+ integrity sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=
+
+ieee754@^1.1.4:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+ integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+ignore-loader@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463"
+ integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=
+
+ignore-walk@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b"
+ integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^3.1.2:
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+ integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.1:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+imagemin-gifsicle@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0"
+ integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==
+ dependencies:
+ execa "^1.0.0"
+ gifsicle "^5.0.0"
+ is-gif "^3.0.0"
+
+imagemin-jpegtran@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-jpegtran/-/imagemin-jpegtran-7.0.0.tgz#7728f84876362d489b9a1656e0cc8e2009406e6f"
+ integrity sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ==
+ dependencies:
+ exec-buffer "^3.0.0"
+ is-jpg "^2.0.0"
+ jpegtran-bin "^5.0.0"
+
+imagemin-mozjpeg@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz#d2ca4e8c982c7c6eda55069af89dee4c1cebcdfd"
+ integrity sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==
+ dependencies:
+ execa "^1.0.0"
+ is-jpg "^2.0.0"
+ mozjpeg "^6.0.0"
+
+imagemin-optipng@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz#2225c82c35e5c29b7fa98d4f9ecee1161a68e888"
+ integrity sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==
+ dependencies:
+ exec-buffer "^3.0.0"
+ is-png "^2.0.0"
+ optipng-bin "^6.0.0"
+
+imagemin-pngquant@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-9.0.0.tgz#f22ba4276cde1799fb15dd475e33984f8607e871"
+ integrity sha512-9cqnTEaJwAHWUi+8EMTB3NUouWToCWxtL+QnoYr8bfVwuKilHvRVWKsa9lt+0c3aWaGxCAkHs++j8qINvSqomA==
+ dependencies:
+ execa "^4.0.0"
+ is-png "^2.0.0"
+ is-stream "^2.0.0"
+ ow "^0.17.0"
+ pngquant-bin "^6.0.0"
+
+imagemin-svgo@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-7.0.0.tgz#a22d0a5917a0d0f37e436932c30f5e000fa91b1c"
+ integrity sha512-+iGJFaPIMx8TjFW6zN+EkOhlqcemdL7F3N3Y0wODvV2kCUBuUtZK7DRZc1+Zfu4U2W/lTMUyx2G8YMOrZntIWg==
+ dependencies:
+ is-svg "^3.0.0"
+ svgo "^1.0.5"
+
+imagemin@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf"
+ integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
+ dependencies:
+ file-type "^12.0.0"
+ globby "^10.0.0"
+ graceful-fs "^4.2.2"
+ junk "^3.1.0"
+ make-dir "^3.0.0"
+ p-pipe "^3.0.0"
+ replace-ext "^1.0.0"
+
+immutable@^3:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
+ integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
+
+import-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+ integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+ dependencies:
+ import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
+import-fresh@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
+ integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-from@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+ integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+ dependencies:
+ resolve-from "^3.0.0"
+
+import-lazy@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc"
+ integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==
+
+import-local@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+ integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+ dependencies:
+ pkg-dir "^3.0.0"
+ resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+in-publish@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+ integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
+ dependencies:
+ repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+ integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
+
+infer-owner@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+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@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+ integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, 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.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+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.5, 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==
+
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+ integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+inquirer@^6.2.2:
+ 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"
+
+interpret@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
+ integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
+
+interpret@^0.3.2:
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.3.10.tgz#088c25de731c6c5b112a90f0071cfaf459e5a7bb"
+ integrity sha1-CIwl3nMcbFsRKpDwBxz69Fnlp7s=
+
+interpret@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+into-stream@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+ integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=
+ dependencies:
+ from2 "^2.1.1"
+ p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+invert-kv@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+ integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
+
+irregular-plurals@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872"
+ integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-absolute@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+ integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
+ dependencies:
+ is-relative "^1.0.0"
+ is-windows "^1.0.1"
+
+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-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.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-buffer@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
+ integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
+
+is-callable@^1.1.3, is-callable@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+ integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.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-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+ integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
+
+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-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+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-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+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-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
+ integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
+
+is-gif@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1"
+ integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==
+ dependencies:
+ file-type "^10.4.0"
+
+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, is-glob@^4.0.1, is-glob@~4.0.1:
+ 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-jpg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97"
+ integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=
+
+is-my-ip-valid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+ integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==
+
+is-my-json-valid@^2.10.0:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a"
+ integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ is-my-ip-valid "^1.0.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-natural-number@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+ integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
+
+is-negated-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+ integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
+
+is-number-like@^1.0.3:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3"
+ integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==
+ dependencies:
+ lodash.isfinite "^3.3.2"
+
+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-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+ integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+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-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+ integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-object@^2.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-png@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d"
+ integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==
+
+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-property@^1.0.0, is-property@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+ integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
+ dependencies:
+ has "^1.0.1"
+
+is-relative@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+ integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
+ dependencies:
+ is-unc-path "^1.0.0"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.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-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+ integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
+ integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
+ dependencies:
+ has-symbols "^1.0.0"
+
+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-unc-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+ integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
+ dependencies:
+ unc-path-regex "^0.1.2"
+
+is-utf8@^0.2.0, is-utf8@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-valid-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
+ integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
+
+is-windows@^1.0.1, 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=
+
+is@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79"
+ integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isarray@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
+ integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
+
+isbinaryfile@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
+ integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
+ dependencies:
+ buffer-alloc "^1.2.0"
+
+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.x, 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=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+jimp@^0.6.1:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.6.8.tgz#63074984337cc469cd4030946e503e7c02a18b5c"
+ integrity sha512-F7emeG7Hp61IM8VFbNvWENLTuHe0ghizWPuP4JS9ujx2r5mCVYEd/zdaz6M2M42ZdN41blxPajLWl9FXo7Mr2Q==
+ dependencies:
+ "@jimp/custom" "^0.6.8"
+ "@jimp/plugins" "^0.6.8"
+ "@jimp/types" "^0.6.8"
+ core-js "^2.5.7"
+ regenerator-runtime "^0.13.3"
+
+jpeg-js@^0.3.4:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.6.tgz#c40382aac9506e7d1f2d856eb02f6c7b2a98b37c"
+ integrity sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==
+
+jpegtran-bin@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/jpegtran-bin/-/jpegtran-bin-5.0.1.tgz#3cecaa471726bbcb66adabeeb544c409b17c73e5"
+ integrity sha512-xQoXWkIEt4ckmvcHd9xG3RcCIn00sf2TshDyFMOAE+46EspEqwqoPWotVI3e55FGWafMa9cEqaoIyrCeWDnFPw==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ logalot "^2.0.0"
+
+js-base64@^2.1.8, js-base64@^2.1.9:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
+ integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
+
+js-beautify@^1.5.10:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178"
+ integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==
+ dependencies:
+ config-chain "^1.1.12"
+ editorconfig "^0.15.3"
+ glob "^7.1.3"
+ mkdirp "~0.5.1"
+ nopt "~4.0.1"
+
+js-levenshtein@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
+ integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsdom@12.2.0:
+ version "12.2.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23"
+ integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig==
+ dependencies:
+ abab "^2.0.0"
+ acorn "^6.0.2"
+ acorn-globals "^4.3.0"
+ array-equal "^1.0.0"
+ cssom "^0.3.4"
+ cssstyle "^1.1.1"
+ data-urls "^1.0.1"
+ domexception "^1.0.1"
+ escodegen "^1.11.0"
+ html-encoding-sniffer "^1.0.2"
+ nwsapi "^2.0.9"
+ parse5 "5.1.0"
+ pn "^1.1.0"
+ request "^2.88.0"
+ request-promise-native "^1.0.5"
+ saxes "^3.1.3"
+ symbol-tree "^3.2.2"
+ tough-cookie "^2.4.3"
+ w3c-hr-time "^1.0.1"
+ webidl-conversions "^4.0.2"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.2.0"
+ whatwg-url "^7.0.0"
+ ws "^6.1.0"
+ xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+ 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-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+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=
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
+ integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+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"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+ integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk=
+
+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"
+
+junk@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
+ integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
+
+just-debounce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea"
+ integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=
+
+keyv@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+ integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+ dependencies:
+ json-buffer "3.0.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
+ integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=
+
+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, kind-of@^5.0.2:
+ 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.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+ integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
+
+known-css-properties@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a"
+ integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==
+
+known-css-properties@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4"
+ integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==
+
+last-run@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b"
+ integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls=
+ dependencies:
+ default-resolution "^2.0.0"
+ es6-weak-map "^2.0.1"
+
+lazystream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+ integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
+ dependencies:
+ readable-stream "^2.0.5"
+
+lazystream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920"
+ integrity sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=
+ dependencies:
+ readable-stream "~1.0.2"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+lcid@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+ integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
+ dependencies:
+ invert-kv "^2.0.0"
+
+lead@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
+ integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
+ dependencies:
+ flush-write-stream "^1.0.2"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+liftoff@^2.0.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
+ integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
+ dependencies:
+ extend "^3.0.0"
+ findup-sync "^2.0.0"
+ fined "^1.0.1"
+ flagged-respawn "^1.0.0"
+ is-plain-object "^2.0.4"
+ object.map "^1.0.0"
+ rechoir "^0.6.2"
+ resolve "^1.1.7"
+
+liftoff@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3"
+ integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==
+ dependencies:
+ extend "^3.0.0"
+ findup-sync "^3.0.0"
+ fined "^1.0.1"
+ flagged-respawn "^1.0.0"
+ is-plain-object "^2.0.4"
+ object.map "^1.0.0"
+ rechoir "^0.6.2"
+ resolve "^1.1.7"
+
+limiter@^1.0.5:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1"
+ integrity sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==
+
+line-column@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
+ integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=
+ dependencies:
+ isarray "^1.0.0"
+ isobject "^2.0.0"
+
+load-bmfont@^1.3.1, load-bmfont@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
+ integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
+ dependencies:
+ buffer-equal "0.0.1"
+ mime "^1.3.4"
+ parse-bmfont-ascii "^1.0.3"
+ parse-bmfont-binary "^1.0.5"
+ parse-bmfont-xml "^1.1.4"
+ phin "^2.9.1"
+ xhr "^2.0.1"
+ xtend "^4.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+ integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
+ integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^2.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+ integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.0, loader-utils@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+localtunnel@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.0.tgz#2ea71174fa80e34cce91b2a7ce416e6a57d9ff7c"
+ integrity sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==
+ dependencies:
+ axios "0.19.0"
+ debug "4.1.1"
+ openurl "1.1.1"
+ yargs "13.3.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"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+ integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=
+
+lodash._basetostring@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+ integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=
+
+lodash._basevalues@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+ integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=
+
+lodash._escapehtmlchar@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d"
+ integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=
+ dependencies:
+ lodash._htmlescapes "~2.4.1"
+
+lodash._escapestringchar@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72"
+ integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+ integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
+
+lodash._htmlescapes@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb"
+ integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs=
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+ integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=
+
+lodash._isnative@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c"
+ integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=
+
+lodash._objecttypes@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11"
+ integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=
+
+lodash._reescape@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+ integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=
+
+lodash._reevaluate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+ integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=
+
+lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222"
+ integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI=
+
+lodash._reinterpolate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+ integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
+
+lodash._reunescapedhtml@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7"
+ integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c=
+ dependencies:
+ lodash._htmlescapes "~2.4.1"
+ lodash.keys "~2.4.1"
+
+lodash._root@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+ integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
+
+lodash._shimkeys@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203"
+ integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+
+lodash.capitalize@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
+ integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
+
+lodash.clone@^4.3.2:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+ integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
+
+lodash.clonedeep@^4.3.2:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+ integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
+
+lodash.defaults@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54"
+ integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+ lodash.keys "~2.4.1"
+
+lodash.escape@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+ integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=
+ dependencies:
+ lodash._root "^3.0.0"
+
+lodash.escape@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4"
+ integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q=
+ dependencies:
+ lodash._escapehtmlchar "~2.4.1"
+ lodash._reunescapedhtml "~2.4.1"
+ lodash.keys "~2.4.1"
+
+lodash.get@^4.0.0:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+ integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+ integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
+
+lodash.isfinite@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3"
+ integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=
+
+lodash.isobject@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
+ integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+
+lodash.kebabcase@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.keys@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727"
+ integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc=
+ dependencies:
+ lodash._isnative "~2.4.1"
+ lodash._shimkeys "~2.4.1"
+ lodash.isobject "~2.4.1"
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.restparam@^3.0.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+ integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
+
+lodash.some@^4.2.2:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+ integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+ integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
+lodash.template@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d"
+ integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0=
+ dependencies:
+ lodash._escapestringchar "~2.4.1"
+ lodash._reinterpolate "~2.4.1"
+ lodash.defaults "~2.4.1"
+ lodash.escape "~2.4.1"
+ lodash.keys "~2.4.1"
+ lodash.templatesettings "~2.4.1"
+ lodash.values "~2.4.1"
+
+lodash.template@^3.0.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+ integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash._basetostring "^3.0.0"
+ lodash._basevalues "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+ lodash.keys "^3.0.0"
+ lodash.restparam "^3.0.0"
+ lodash.templatesettings "^3.0.0"
+
+lodash.template@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
+ integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+ integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+
+lodash.templatesettings@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
+ integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+
+lodash.templatesettings@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699"
+ integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=
+ dependencies:
+ lodash._reinterpolate "~2.4.1"
+ lodash.escape "~2.4.1"
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash.values@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4"
+ integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=
+ dependencies:
+ lodash.keys "~2.4.1"
+
+lodash@^3.0.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+ integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
+
+lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.3.0, lodash@~4.17.10:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
+ integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
+
+lodash@^4.17.4:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
+ integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=
+
+lodash@~2.4.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
+ integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=
+
+logalot@^2.0.0, logalot@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+ integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI=
+ dependencies:
+ figures "^1.3.5"
+ squeak "^1.0.0"
+
+longest@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+ integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+ integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+
+lowercase-keys@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+ integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lpad-align@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+ integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=
+ dependencies:
+ get-stdin "^4.0.1"
+ indent-string "^2.1.0"
+ longest "^1.0.0"
+ meow "^3.3.0"
+
+lru-cache@2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+ integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
+
+lru-cache@^4.0.1, lru-cache@^4.1.5:
+ 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"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lz-string@^1.4.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
+ integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=
+
+make-dir@^1.0.0, make-dir@^1.2.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"
+
+make-dir@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-iterator@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
+ integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
+ dependencies:
+ kind-of "^6.0.2"
+
+map-age-cleaner@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+ integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+ dependencies:
+ p-defer "^1.0.0"
+
+map-cache@^0.2.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-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+ integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+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"
+
+markdown-loader@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-5.1.0.tgz#4efd5006b1514ca966141c661a47e542a9836e6e"
+ integrity sha512-xtQNozLEL+55ZSPTNwro8epZqf1h7HjAZd/69zNe8lbckDiGVHeLQm849bXzocln2pwRK2A/GrW/7MAmwjcFog==
+ dependencies:
+ loader-utils "^1.2.3"
+ marked "^0.7.0"
+
+marked@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
+ integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
+
+matchdep@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
+ integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4=
+ dependencies:
+ findup-sync "^2.0.0"
+ micromatch "^3.0.4"
+ resolve "^1.4.0"
+ stack-trace "0.0.10"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+mdn-data@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+ integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+mdn-data@~1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
+ integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==
+
+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=
+
+mem@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
+ integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
+ dependencies:
+ map-age-cleaner "^0.1.1"
+ mimic-fn "^2.0.0"
+ p-is-promise "^2.0.0"
+
+memory-fs@^0.4.0, memory-fs@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+meow@^3.3.0, meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
+ integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+merge@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
+ integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.40.0:
+ version "1.40.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
+ integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
+
+mime-db@^1.28.0:
+ version "1.41.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0"
+ integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw==
+
+mime-db@~1.12.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7"
+ integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=
+
+mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.24"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
+ integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
+ dependencies:
+ mime-db "1.40.0"
+
+mime-types@~2.0.9:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6"
+ integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=
+ dependencies:
+ mime-db "~1.12.0"
+
+mime@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+ integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
+
+mime@1.6.0, mime@^1.3.4:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.4.0:
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
+ integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
+
+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==
+
+mimic-fn@^2.0.0, mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@0.3:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
+ integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+ 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"
+
+minimatch@^2.0.1:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+ integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimatch@~0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+ integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@1.1.x:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
+ integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
+
+minimist@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
+ integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4=
+
+minimist@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce"
+ integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784=
+
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+
+minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+ integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
+
+minipass@^2.2.1, minipass@^2.6.0, minipass@^2.6.4:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.7.0.tgz#c01093a82287c8331f08f1075499fef124888796"
+ integrity sha512-+CbZuJ4uEiuTL9s5Z/ULkuRg1O9AvVqVvceaBrhbYHIy1R3dPO7FMmG0nZLD0//ZzZq0MUOjwdBQvk+w1JHUqQ==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.2.tgz#6f0ccc82fa53e1bf2ff145f220d2da9fa6e3a166"
+ integrity sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==
+ dependencies:
+ minipass "^2.2.1"
+
+mississippi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+ integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^3.0.0"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mitt@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8"
+ integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==
+
+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"
+
+mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@^0.5.3:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+mozjpeg@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-6.0.1.tgz#56969dddb5741ef2bcb1af066cae21e61a91a27b"
+ integrity sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ logalot "^2.1.0"
+
+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==
+
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+multipipe@^0.1.0, multipipe@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+ integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=
+ dependencies:
+ duplexer2 "0.0.2"
+
+mute-stdout@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331"
+ integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==
+
+mute-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+ integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
+
+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==
+
+nan@^2.12.1, nan@^2.13.2:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+
+nanoid@^3.1.12:
+ version "3.1.12"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654"
+ integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==
+
+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"
+
+natives@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
+ integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+needle@, needle@^2.2.1:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
+ integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+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==
+
+neo-async@^2.5.0, neo-async@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
+ integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
+
+next-tick@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+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==
+
+no-case@^2.2.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+ dependencies:
+ lower-case "^1.1.1"
+
+node-gyp@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
+ integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request "^2.87.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
+node-libs-browser@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+ integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.1"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.11.0"
+ vm-browserify "^1.0.1"
+
+node-pre-gyp@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
+ integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+node-releases@^1.1.29:
+ version "1.1.32"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.32.tgz#485b35c1bf9b4d8baa105d782f8ca731e518276e"
+ integrity sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==
+ dependencies:
+ semver "^5.3.0"
+
+node-sass@^4.8.3:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
+ integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
+ dependencies:
+ async-foreach "^0.1.3"
+ chalk "^1.1.1"
+ cross-spawn "^3.0.0"
+ gaze "^1.0.0"
+ get-stdin "^4.0.1"
+ glob "^7.0.3"
+ in-publish "^2.0.0"
+ lodash "^4.17.11"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ nan "^2.13.2"
+ node-gyp "^3.8.0"
+ npmlog "^4.0.0"
+ request "^2.88.0"
+ sass-graph "^2.2.4"
+ stdout-stream "^1.4.0"
+ "true-case-path" "^1.0.2"
+
+node-sri@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/node-sri/-/node-sri-1.1.1.tgz#041096d2b11f232b65dedc4c3ae1cb62babb54b0"
+ integrity sha1-BBCW0rEfIytl3txMOuHLYrq7VLA=
+
+node.extend@^1.0.10:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0"
+ integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==
+ dependencies:
+ has "^1.0.3"
+ is "^3.2.1"
+
+"nopt@2 || 3":
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
+ dependencies:
+ abbrev "1"
+
+nopt@^4.0.1, nopt@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ 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"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-url@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+ integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+ dependencies:
+ prepend-http "^2.0.0"
+ query-string "^5.0.1"
+ sort-keys "^2.0.0"
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+normalize-url@^4.1.0:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.4.1.tgz#81e9c153b0ad5743755696f2aa20488d48e962b6"
+ integrity sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg==
+
+now-and-later@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
+ integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
+ dependencies:
+ once "^1.3.2"
+
+npm-bundled@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
+ integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
+
+npm-conf@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+npm-packlist@^1.1.6:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44"
+ integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+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"
+
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+nwsapi@^2.0.9:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f"
+ integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==
+
+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-assign@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+ integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-assign@~0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-0.3.1.tgz#060e2a2a27d7c0d77ec77b78f11aa47fd88008d2"
+ integrity sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=
+
+object-component@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+ integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
+
+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-inspect@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
+ integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-path@^0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
+ integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=
+
+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.assign@^4.0.4, object.assign@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.defaults@^1.0.0, object.defaults@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
+ integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
+ dependencies:
+ array-each "^1.0.1"
+ array-slice "^1.0.0"
+ for-own "^1.0.0"
+ isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.map@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
+ integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
+ dependencies:
+ for-own "^1.0.0"
+ make-iterator "^1.0.0"
+
+object.pick@^1.2.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"
+
+object.reduce@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad"
+ integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=
+ dependencies:
+ for-own "^1.0.0"
+ make-iterator "^1.0.0"
+
+object.values@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
+ integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.12.0"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+omggif@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19"
+ integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
+
+on-finished@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.1.0.tgz#0c539f09291e8ffadde0c8a25850fb2cedc7022d"
+ integrity sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0=
+ dependencies:
+ ee-first "1.0.5"
+
+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"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.2, 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"
+
+once@~1.3.0:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+ integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+ integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
+
+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"
+
+onetime@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+ integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+open@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
+ integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=
+
+openurl@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387"
+ integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=
+
+opn@5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
+ integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==
+ dependencies:
+ is-wsl "^1.1.0"
+
+optimist@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+optipng-bin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-6.0.0.tgz#376120fa79d5e71eee2f524176efdd3a5eabd316"
+ integrity sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ logalot "^2.0.0"
+
+orchestrator@^0.3.0:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
+ integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=
+ dependencies:
+ end-of-stream "~0.1.5"
+ sequencify "~0.0.7"
+ stream-consume "~0.1.0"
+
+ordered-read-streams@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
+ integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=
+
+ordered-read-streams@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+ integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
+ dependencies:
+ readable-stream "^2.0.1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-filter-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
+ integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==
+ dependencies:
+ arch "^2.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-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-locale@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
+ integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
+ dependencies:
+ execa "^1.0.0"
+ lcid "^2.0.0"
+ mem "^4.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, 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, osenv@^0.1.4:
+ 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"
+
+ow@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c"
+ integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==
+ dependencies:
+ type-fest "^0.11.0"
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+ integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-defer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+ integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
+
+p-event@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085"
+ integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=
+ dependencies:
+ p-timeout "^1.1.1"
+
+p-event@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
+ integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
+ dependencies:
+ p-timeout "^2.0.1"
+
+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-is-promise@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+ integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
+
+p-is-promise@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+ integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
+
+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-limit@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
+ integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.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-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-map-series@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+ integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=
+ dependencies:
+ p-reduce "^1.0.0"
+
+p-pipe@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e"
+ integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==
+
+p-reduce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+ integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+ integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+ dependencies:
+ p-finally "^1.0.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.0.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==
+
+pako@^1.0.5, pako@~1.0.5:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
+ integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
+
+parallel-transform@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+ integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+ dependencies:
+ cyclist "^1.0.1"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+param-case@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
+ dependencies:
+ no-case "^2.2.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"
+
+parents@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+ integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=
+ dependencies:
+ path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
+ integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-author@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f"
+ integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=
+ dependencies:
+ author-regex "^1.0.0"
+
+parse-bmfont-ascii@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
+ integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
+
+parse-bmfont-binary@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
+ integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
+
+parse-bmfont-xml@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
+ integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
+ dependencies:
+ xml-parse-from-string "^1.0.0"
+ xml2js "^0.4.5"
+
+parse-filepath@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
+ integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
+ dependencies:
+ is-absolute "^1.0.0"
+ map-cache "^0.2.0"
+ path-root "^0.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
+ integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
+ dependencies:
+ for-each "^0.3.3"
+ string.prototype.trim "^1.1.2"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-node-version@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
+ integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+ integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+
+parse5@5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
+ integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
+
+parseqs@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+ integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
+ dependencies:
+ better-assert "~1.0.0"
+
+parseuri@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+ integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
+ dependencies:
+ better-assert "~1.0.0"
+
+parseurl@~1.3.0, parseurl@~1.3.2, 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-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+ integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+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@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+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-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ 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-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+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-platform@~0.11.15:
+ version "0.11.15"
+ resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+ integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
+
+path-root-regex@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+ integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
+
+path-root@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+ integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
+ dependencies:
+ path-root-regex "^0.1.0"
+
+path-starts-with@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.0.tgz#ffd6d51926cd497022b44d392196033d5451892f"
+ integrity sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
+ dependencies:
+ pify "^2.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.3:
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+ integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
+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=
+
+phin@^2.9.1:
+ version "2.9.3"
+ resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
+ integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
+
+phonegap-plugin-mobile-accessibility@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/phonegap-plugin-mobile-accessibility/-/phonegap-plugin-mobile-accessibility-1.0.5.tgz#95a8754d127508bc6e1ae259a53ce765836eac03"
+ integrity sha1-lah1TRJ1CLxuGuJZpTznZYNurAM=
+
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+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==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pixelmatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
+ integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
+ dependencies:
+ pngjs "^3.0.0"
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkginfo@0.3.x:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
+ integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
+
+plist@^3.0.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"
+
+plugin-error@1.0.1, plugin-error@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
+ integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
+ dependencies:
+ ansi-colors "^1.0.1"
+ arr-diff "^4.0.0"
+ arr-union "^3.1.0"
+ extend-shallow "^3.0.2"
+
+plugin-error@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace"
+ integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=
+ dependencies:
+ ansi-cyan "^0.1.1"
+ ansi-red "^0.1.1"
+ arr-diff "^1.0.1"
+ arr-union "^2.0.1"
+ extend-shallow "^1.1.2"
+
+plur@^3.0.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b"
+ integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==
+ dependencies:
+ irregular-plurals "^2.0.0"
+
+pluralize@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+ integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
+
+pn@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+ integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
+
+pngjs@^3.0.0, pngjs@^3.3.3:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
+ integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
+
+pngquant-bin@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460"
+ integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+ execa "^0.10.0"
+ logalot "^2.0.0"
+
+pngquant-bin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.0.tgz#aff0d7e61095feb96ced379ad8c7294ad3dd1712"
+ integrity sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+ execa "^4.0.0"
+ logalot "^2.0.0"
+
+portscanner@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96"
+ integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=
+ dependencies:
+ async "1.5.2"
+ is-number-like "^1.0.3"
+
+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=
+
+postcss-assets@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-assets/-/postcss-assets-5.0.0.tgz#f721d07d339605fb58414e9f69cf05401c54e709"
+ integrity sha1-9yHQfTOWBftYQU6fac8FQBxU5wk=
+ dependencies:
+ assets "^3.0.0"
+ bluebird "^3.5.0"
+ postcss "^6.0.10"
+ postcss-functions "^3.0.0"
+
+postcss-attribute-case-insensitive@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7"
+ integrity sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0"
+
+postcss-calc@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436"
+ integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==
+ dependencies:
+ css-unit-converter "^1.1.1"
+ postcss "^7.0.5"
+ postcss-selector-parser "^5.0.0-rc.4"
+ postcss-value-parser "^3.3.1"
+
+postcss-color-functional-notation@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0"
+ integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-gray@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
+ integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.5"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-hex-alpha@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388"
+ integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==
+ dependencies:
+ postcss "^7.0.14"
+ postcss-values-parser "^2.0.1"
+
+postcss-color-mod-function@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d"
+ integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-rebeccapurple@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77"
+ integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-critical-split@^2.5.3:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/postcss-critical-split/-/postcss-critical-split-2.5.3.tgz#9339d3699f6363d0a3ad0952420dc9faa181363b"
+ integrity sha512-FDG+evU4RBGM9/LQ5nCktzFKjYH2O/SLollJwtrdGagXXbMvk620Bc9o8WpqHJnu573uxVkx9lhob1HZvSWhZg==
+ dependencies:
+ merge "^1.2.0"
+ postcss "^6.0.1"
+
+postcss-custom-media@^7.0.8:
+ version "7.0.8"
+ resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
+ integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-custom-properties@^8.0.11:
+ version "8.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
+ integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
+ dependencies:
+ postcss "^7.0.17"
+ postcss-values-parser "^2.0.1"
+
+postcss-custom-selectors@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba"
+ integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-dir-pseudo-class@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2"
+ integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-unused@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea"
+ integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-double-position-gradients@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
+ integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==
+ dependencies:
+ postcss "^7.0.5"
+ postcss-values-parser "^2.0.0"
+
+postcss-env-function@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7"
+ integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-focus-visible@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e"
+ integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-focus-within@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680"
+ integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-font-variant@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc"
+ integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-functions@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e"
+ integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=
+ dependencies:
+ glob "^7.1.2"
+ object-assign "^4.1.1"
+ postcss "^6.0.9"
+ postcss-value-parser "^3.3.0"
+
+postcss-gap-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715"
+ integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-image-set-function@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288"
+ integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-initial@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.1.tgz#99d319669a13d6c06ef8e70d852f68cb1b399b61"
+ integrity sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==
+ dependencies:
+ lodash.template "^4.5.0"
+ postcss "^7.0.2"
+
+postcss-lab-function@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
+ integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-load-config@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
+ integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ import-cwd "^2.0.0"
+
+postcss-logical@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
+ integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-media-minmax@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
+ integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-merge-idents@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23"
+ integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==
+ dependencies:
+ cssnano-util-same-parent "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-nesting@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
+ integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-overflow-shorthand@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30"
+ integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-page-break@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf"
+ integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-place@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62"
+ integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-preset-env@^6.5.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5"
+ integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==
+ dependencies:
+ autoprefixer "^9.6.1"
+ browserslist "^4.6.4"
+ caniuse-lite "^1.0.30000981"
+ css-blank-pseudo "^0.1.4"
+ css-has-pseudo "^0.10.0"
+ css-prefers-color-scheme "^3.1.1"
+ cssdb "^4.4.0"
+ postcss "^7.0.17"
+ postcss-attribute-case-insensitive "^4.0.1"
+ postcss-color-functional-notation "^2.0.1"
+ postcss-color-gray "^5.0.0"
+ postcss-color-hex-alpha "^5.0.3"
+ postcss-color-mod-function "^3.0.3"
+ postcss-color-rebeccapurple "^4.0.1"
+ postcss-custom-media "^7.0.8"
+ postcss-custom-properties "^8.0.11"
+ postcss-custom-selectors "^5.1.2"
+ postcss-dir-pseudo-class "^5.0.0"
+ postcss-double-position-gradients "^1.0.0"
+ postcss-env-function "^2.0.2"
+ postcss-focus-visible "^4.0.0"
+ postcss-focus-within "^3.0.0"
+ postcss-font-variant "^4.0.0"
+ postcss-gap-properties "^2.0.0"
+ postcss-image-set-function "^3.0.1"
+ postcss-initial "^3.0.0"
+ postcss-lab-function "^2.0.1"
+ postcss-logical "^3.0.0"
+ postcss-media-minmax "^4.0.0"
+ postcss-nesting "^7.0.0"
+ postcss-overflow-shorthand "^2.0.0"
+ postcss-page-break "^2.0.0"
+ postcss-place "^4.0.1"
+ postcss-pseudo-class-any-link "^6.0.0"
+ postcss-replace-overflow-wrap "^3.0.0"
+ postcss-selector-matches "^4.0.0"
+ postcss-selector-not "^4.0.0"
+
+postcss-pseudo-class-any-link@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1"
+ integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-reduce-idents@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b"
+ integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-replace-overflow-wrap@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
+ integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-round-subpixels@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-round-subpixels/-/postcss-round-subpixels-1.2.0.tgz#e21d6ac5952e185f9bdc008b94f004fe509d0a11"
+ integrity sha1-4h1qxZUuGF+b3ACLlPAE/lCdChE=
+ dependencies:
+ postcss "^5.0.2"
+ postcss-value-parser "^3.1.2"
+
+postcss-selector-matches@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff"
+ integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==
+ dependencies:
+ balanced-match "^1.0.0"
+ postcss "^7.0.2"
+
+postcss-selector-not@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0"
+ integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==
+ dependencies:
+ balanced-match "^1.0.0"
+ postcss "^7.0.2"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+ integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=
+ dependencies:
+ dot-prop "^4.1.1"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
+ integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
+ dependencies:
+ cssesc "^2.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-unprefix@^2.1.3:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-unprefix/-/postcss-unprefix-2.1.4.tgz#ab1c038ab77f068799ed36e1cbd997b51e7360a1"
+ integrity sha512-s+muBiGIMx3RvgPTtPBnSrfvIBHJ2Zx16QZf/VDB/sAxdYP6FIzci8d1gLh0+9psu5W6zVtCbU5micNt6Zh3cg==
+ dependencies:
+ autoprefixer "^9.4.3"
+ known-css-properties "^0.11.0"
+ normalize-range "^0.1.2"
+ postcss-selector-parser "^5.0.0"
+ postcss-value-parser "^3.3.1"
+ pseudo-classes "^1.0.0"
+ pseudo-elements "^1.1.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.1.2, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9"
+ integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==
+
+postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
+ integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-zindex@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1"
+ integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss@^5.0.2:
+ version "5.2.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+ integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
+ dependencies:
+ chalk "^1.1.3"
+ js-base64 "^2.1.9"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@^6.0.1, postcss@^6.0.10, postcss@^6.0.9:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233"
+ integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.1.tgz#c3a287dd10e4f6c84cb3791052b96a5d859c9389"
+ integrity sha512-9DGLSsjooH3kSNjTZUOt2eIj2ZTW0VI2PZ/3My+8TC7KIbH2OKwUlISfDsf63EP4aiRUt3XkEWMWvyJHvJelEg==
+ dependencies:
+ colorette "^1.2.1"
+ line-column "^1.0.2"
+ nanoid "^3.1.12"
+ source-map "^0.6.1"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+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=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+pretty-bytes@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
+ integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
+
+pretty-hrtime@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-0.2.2.tgz#d4fd88351e3a4741f8173af7d6a4b846f9895c00"
+ integrity sha1-1P2INR46R0H4Fzr31qS4RvmJXAA=
+
+pretty-hrtime@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+ integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+
+private@^0.1.6, private@^0.1.8, private@~0.1.5:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+process@~0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+ integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
+
+progress@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+ integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+promise-polyfill@^8.1.0:
+ version "8.1.3"
+ resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116"
+ integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+
+proxy-middleware@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.5.1.tgz#da24d5d58c1ddf13dad237c7eca503849eaea903"
+ integrity sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM=
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudo-classes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pseudo-classes/-/pseudo-classes-1.0.0.tgz#60a69b67395c36ff119c4d1c86e1981785206b96"
+ integrity sha1-YKabZzlcNv8RnE0chuGYF4Uga5Y=
+
+pseudo-elements@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pseudo-elements/-/pseudo-elements-1.1.0.tgz#9ba6dd8ac3ce1f3d7d36d4355aa3e28d08391f28"
+ integrity sha1-m6bdisPOHz19NtQ1WqPijQg5Hyg=
+
+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.24, psl@^1.1.28:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
+ integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+pump@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+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"
+
+pumpify@^1.3.3, pumpify@^1.3.5:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.2.4, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+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.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.4.tgz#2e9fbcd34b540e3421c924ecd01e90aa975319c8"
+ integrity sha1-Lp+800tUDjQhySTs0B6QqpdTGcg=
+
+qs@6.2.3:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
+ integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=
+
+qs@~2.2.3:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c"
+ integrity sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=
+
+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==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+query-string@^6.8.1:
+ version "6.8.3"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b"
+ integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ split-on-first "^1.0.0"
+ strict-uri-encode "^2.0.0"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.0, 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@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.3.0.tgz#978230a156a5548f42eef14de22d0f4f610083d1"
+ integrity sha1-l4IwoValVI9C7vFN4i0PT2EAg9E=
+ dependencies:
+ bytes "1"
+ iconv-lite "0.4.4"
+
+raw-body@^2.3.2:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc@^1.2.7:
+ 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"
+
+rcedit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.0.0.tgz#dcc85d93aa91a41c1ebc5c6aa1dfc43ea28b7dad"
+ integrity sha512-XcFGyEBjhWSsud+R8elwQtGBbVkCf7tAiad+nXo5jc6l2rMf46NfGNwjnmBNneBIZDfq+Npf8lwP371JTONfrw==
+
+rcfinder@^0.1.6:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115"
+ integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU=
+ dependencies:
+ lodash.clonedeep "^4.3.2"
+
+rcloader@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.1.4.tgz#d0c902f0444983a2ee5a6907937c6a79ca704509"
+ integrity sha1-0MkC8ERJg6LuWmkHk3xqecpwRQk=
+ dependencies:
+ lodash "^3.0.1"
+ rcfinder "^0.1.6"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+read@~1.0.4:
+ 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"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+"readable-stream@2 || 3":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
+ integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^1.0.27-1, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.5.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+readdirp@~3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
+ integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+recast@~0.11.12:
+ version "0.11.23"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
+ integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=
+ dependencies:
+ ast-types "0.9.6"
+ esprima "~3.1.0"
+ private "~0.1.5"
+ source-map "~0.5.0"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+ dependencies:
+ resolve "^1.1.6"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+regenerate-unicode-properties@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
+ integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+ integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
+ integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
+ integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+
+regenerator-transform@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"
+ integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==
+ dependencies:
+ private "^0.1.6"
+
+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"
+
+regexp-tree@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
+ integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==
+
+regexpp@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+ integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
+regexpu-core@^4.5.4:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
+ integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.1.0"
+ regjsgen "^0.5.0"
+ regjsparser "^0.6.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.1.0"
+
+regjsgen@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
+ integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
+
+regjsparser@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c"
+ integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@0.2.x:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remove-bom-buffer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+ integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
+ dependencies:
+ is-buffer "^1.1.5"
+ is-utf8 "^0.2.1"
+
+remove-bom-stream@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+ integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
+ dependencies:
+ remove-bom-buffer "^3.0.0"
+ safe-buffer "^5.1.0"
+ through2 "^2.0.3"
+
+remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+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=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+ integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=
+
+replace-ext@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+ integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
+
+replace-homedir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c"
+ integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=
+ dependencies:
+ homedir-polyfill "^1.0.1"
+ is-absolute "^1.0.0"
+ remove-trailing-separator "^1.1.0"
+
+request-promise-core@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
+ integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
+ dependencies:
+ lodash "^4.17.11"
+
+request-promise-native@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
+ integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
+ dependencies:
+ request-promise-core "1.1.2"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
+request@^2.87.0, request@^2.88.0:
+ version "2.88.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+ integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
+ 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.0"
+ 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.4.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+require-uncached@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+ dependencies:
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+ integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+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-options@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+ integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
+ dependencies:
+ value-or-function "^3.0.0"
+
+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.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
+ integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.15.1, resolve@^1.4.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resp-modifier@6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f"
+ integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=
+ dependencies:
+ debug "^2.2.0"
+ minimatch "^3.0.2"
+
+responselike@1.0.2, responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+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==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@2, rimraf@^2.4.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@2.6.3, rimraf@~2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
+ integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
+ dependencies:
+ once "^1.3.0"
+
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
+ dependencies:
+ is-promise "^2.1.0"
+
+run-parallel@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+ integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+rusha@^0.8.13:
+ version "0.8.13"
+ resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a"
+ integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+ integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
+
+rx@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+ integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=
+
+rxjs@^5.5.6:
+ version "5.5.12"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
+ integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
+ dependencies:
+ symbol-observable "1.0.1"
+
+rxjs@^6.4.0:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a"
+ integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ 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.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+ 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==
+
+sanitize-filename@^1.6.0, sanitize-filename@^1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
+ integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
+sass-graph@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+ integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
+ dependencies:
+ glob "^7.0.0"
+ lodash "^4.0.0"
+ scss-tokenizer "^0.2.3"
+ yargs "^7.0.0"
+
+sass-lint@^1.12.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f"
+ integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==
+ dependencies:
+ commander "^2.8.1"
+ eslint "^2.7.0"
+ front-matter "2.1.2"
+ fs-extra "^3.0.1"
+ glob "^7.0.0"
+ globule "^1.0.0"
+ gonzales-pe-sl "^4.2.3"
+ js-yaml "^3.5.4"
+ known-css-properties "^0.3.0"
+ lodash.capitalize "^4.1.0"
+ lodash.kebabcase "^4.0.0"
+ merge "^1.2.0"
+ path-is-absolute "^1.0.0"
+ util "^0.10.3"
+
+sass-unused@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/sass-unused/-/sass-unused-0.3.0.tgz#69924e4996d6c96840fb3a99e0a0290516811a9f"
+ integrity sha512-fGNcUpDeSFwnN+BTQ251iM77Py8awPXc96vSE3TpvMcgbC90IrohonRb4oxWX/KzHpezkmUddS8/t04R+yIB8w==
+ dependencies:
+ glob "^7.0.5"
+ gonzales-pe "^4.2.3"
+
+sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^3.1.3:
+ version "3.1.11"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
+ integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
+ dependencies:
+ xmlchars "^2.1.1"
+
+schema-utils@^0.4.0:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
+ integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5:
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a"
+ integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==
+ dependencies:
+ ajv "^6.12.0"
+ ajv-keywords "^3.4.1"
+
+scss-tokenizer@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+ integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
+ dependencies:
+ js-base64 "^2.1.8"
+ source-map "^0.4.2"
+
+seek-bzip@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
+ integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
+ dependencies:
+ commander "~2.8.1"
+
+semver-greatest-satisfied-range@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b"
+ integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els=
+ dependencies:
+ sver-compat "^1.5.0"
+
+semver-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
+ integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+
+semver-truncate@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+ integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=
+ dependencies:
+ semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^4.1.0:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+ integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
+
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+ integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
+
+send@0.16.2:
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+ integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
+ 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.6.2"
+ mime "1.4.1"
+ ms "2.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.4.0"
+
+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"
+
+sequencify@~0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
+ integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=
+
+serialize-error@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf"
+ integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A==
+
+serialize-javascript@^1.7.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
+ integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
+
+serialize-javascript@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+ integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-index@1.9.1, serve-index@^1.1.4:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+ integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.13.2:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+ integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.2"
+ send "0.16.2"
+
+serve-static@^1.3.0:
+ 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"
+
+server-destroy@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
+ integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+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"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+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-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.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=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shelljs@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8"
+ integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=
+
+sigmund@^1.0.1, sigmund@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+ integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+ integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
+
+slice-ansi@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+ integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+ dependencies:
+ ansi-styles "^3.2.0"
+ astral-regex "^1.0.0"
+ is-fullwidth-code-point "^2.0.0"
+
+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"
+
+socket.io-adapter@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
+ integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=
+
+socket.io-client@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f"
+ integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==
+ dependencies:
+ backo2 "1.0.2"
+ base64-arraybuffer "0.1.5"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "~3.1.0"
+ engine.io-client "~3.2.0"
+ has-binary2 "~1.0.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ socket.io-parser "~3.2.0"
+ to-array "0.1.4"
+
+socket.io-client@^2.0.4:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4"
+ integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==
+ dependencies:
+ backo2 "1.0.2"
+ base64-arraybuffer "0.1.5"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "~4.1.0"
+ engine.io-client "~3.4.0"
+ has-binary2 "~1.0.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ socket.io-parser "~3.3.0"
+ to-array "0.1.4"
+
+socket.io-parser@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077"
+ integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==
+ dependencies:
+ component-emitter "1.2.1"
+ debug "~3.1.0"
+ isarray "2.0.1"
+
+socket.io-parser@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
+ integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
+ dependencies:
+ component-emitter "1.2.1"
+ debug "~3.1.0"
+ isarray "2.0.1"
+
+socket.io@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980"
+ integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==
+ dependencies:
+ debug "~3.1.0"
+ engine.io "~3.2.0"
+ has-binary2 "~1.0.2"
+ socket.io-adapter "~1.1.0"
+ socket.io-client "2.1.1"
+ socket.io-parser "~3.2.0"
+
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+ integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@~0.5.12:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+ integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.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.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@~0.1.38:
+ version "0.1.43"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+ integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
+ dependencies:
+ amdefine ">=0.0.4"
+
+sparkles@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
+ integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
+
+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-on-first@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
+ integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
+
+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"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+squeak@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+ integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=
+ dependencies:
+ chalk "^1.0.0"
+ console-stream "^0.1.1"
+ lpad-align "^1.0.1"
+
+ssh2-streams@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.2.1.tgz#9c9c9964be60e9644575af328677f64b1e5cbd79"
+ integrity sha512-3zCOsmunh1JWgPshfhKmBCL3lUtHPoh+a/cyQ49Ft0Q0aF7xgN06b76L+oKtFi0fgO57FLjFztb1GlJcEZ4a3Q==
+ dependencies:
+ asn1 "~0.2.0"
+ semver "^5.1.0"
+ streamsearch "~0.1.2"
+
+ssh2@~0.6.1:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.6.2.tgz#b065d6e2133a2d4b557447d613b3511cb15e3a2e"
+ integrity sha512-DJ+dOhXEEsmNpcQTI0x69FS++JH6qqL/ltEHf01pI1SSLMAcmD+hL4jRwvHjPwynPsmSUbHJ/WIZYzROfqZWjA==
+ dependencies:
+ ssh2-streams "~0.2.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"
+
+ssri@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
+ integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
+ dependencies:
+ figgy-pudding "^3.5.1"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+stack-trace@0.0.10, stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
+
+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.4.0 < 2", "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=
+
+statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+ integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=
+
+statuses@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+ integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
+
+stdout-stream@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
+ integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
+ dependencies:
+ readable-stream "^2.0.1"
+
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
+stream-browserify@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-browserify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
+ integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
+ dependencies:
+ inherits "~2.0.4"
+ readable-stream "^3.5.0"
+
+stream-consume@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
+ integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==
+
+stream-each@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+ integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-exhaust@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d"
+ integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+ integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
+
+stream-throttle@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3"
+ integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=
+ dependencies:
+ commander "^2.2.0"
+ limiter "^1.0.5"
+
+streamsearch@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+ integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+strict-uri-encode@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+ integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
+
+strictdom@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460"
+ integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA=
+
+string-replace-webpack-plugin@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/string-replace-webpack-plugin/-/string-replace-webpack-plugin-0.1.3.tgz#73c657e759d66cfe80ae1e0cf091aa256d0e715c"
+ integrity sha1-c8ZX51nWbP6Arh4M8JGqJW0OcVw=
+ dependencies:
+ async "~0.2.10"
+ loader-utils "~0.2.3"
+ optionalDependencies:
+ css-loader "^0.9.1"
+ file-loader "^0.8.1"
+ style-loader "^0.8.3"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0:
+ 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-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trim@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d"
+ integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.13.0"
+ function-bind "^1.1.1"
+
+string.prototype.trimleft@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
+ integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
+ dependencies:
+ define-properties "^1.1.3"
+ function-bind "^1.1.1"
+
+string.prototype.trimright@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
+ integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
+ dependencies:
+ define-properties "^1.1.3"
+ function-bind "^1.1.1"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220"
+ integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=
+ dependencies:
+ ansi-regex "^0.2.1"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+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.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
+ integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=
+ dependencies:
+ first-chunk-stream "^1.0.0"
+ is-utf8 "^0.2.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.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-dirs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+ integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+ dependencies:
+ is-natural-number "^4.0.1"
+
+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-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+strip-json-comments@^2.0.1, 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=
+
+strip-json-comments@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
+ integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
+
+strip-json-comments@~1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
+ integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
+
+strip-outer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+ integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+style-loader@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.8.3.tgz#f4f92eb7db63768748f15065cd6700f5a1c85357"
+ integrity sha1-9Pkut9tjdodI8VBlzWcA9aHIU1c=
+ dependencies:
+ loader-utils "^0.2.5"
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+sumchecker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.0.tgz#da5457b4605184575c76540e5e99cc777cb8ce4c"
+ integrity sha512-yreseuC/z4iaodVoq07XULEOO9p4jnQazO7mbrnDSvWAU/y2cbyIKs+gWJptfcGu9R+1l27K8Rkj0bfvqnBpgQ==
+ dependencies:
+ debug "^4.1.0"
+
+supports-color@6.1.0, supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a"
+ integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.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"
+
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
+sver-compat@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8"
+ integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=
+ dependencies:
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+svgo@^1.0.0, svgo@^1.0.5:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313"
+ integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==
+ dependencies:
+ chalk "^2.4.1"
+ coa "^2.0.2"
+ css-select "^2.0.0"
+ css-select-base-adapter "^0.1.1"
+ css-tree "1.0.0-alpha.33"
+ csso "^3.5.1"
+ js-yaml "^3.13.1"
+ mkdirp "~0.5.1"
+ object.values "^1.1.0"
+ sax "~1.2.4"
+ stable "^0.1.8"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
+symbol-observable@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+ integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
+
+symbol-tree@^3.2.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+table@^3.7.8:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+ integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
+table@^5.2.3:
+ version "5.4.6"
+ resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+ integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+ dependencies:
+ ajv "^6.10.2"
+ lodash "^4.17.14"
+ slice-ansi "^2.1.0"
+ string-width "^3.0.0"
+
+tapable@^1.0.0, tapable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+ integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+ dependencies:
+ bl "^1.0.0"
+ buffer-alloc "^1.2.0"
+ end-of-stream "^1.0.0"
+ fs-constants "^1.0.0"
+ readable-stream "^2.3.0"
+ to-buffer "^1.1.1"
+ xtend "^4.0.0"
+
+tar-stream@~0.4.0:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd"
+ integrity sha1-Hx0s6evHtCdlJDyg6PG3v9oKrc0=
+ dependencies:
+ bl "^0.9.0"
+ end-of-stream "^1.0.0"
+ readable-stream "^1.0.27-1"
+ xtend "^4.0.0"
+
+tar@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
+ integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.12"
+ inherits "2"
+
+tar@^4:
+ version "4.4.11"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.11.tgz#7ac09801445a3cf74445ed27499136b5240ffb73"
+ integrity sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.6.4"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+temp-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+ integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
+
+tempfile@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+ integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU=
+ dependencies:
+ temp-dir "^1.0.0"
+ uuid "^3.0.1"
+
+ternary-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253"
+ integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==
+ dependencies:
+ duplexify "^4.1.1"
+ fork-stream "^0.0.4"
+ merge-stream "^2.0.0"
+ through2 "^3.0.1"
+
+terser-webpack-plugin@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
+ integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
+ dependencies:
+ cacache "^12.0.2"
+ find-cache-dir "^2.1.0"
+ is-wsl "^1.1.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^1.7.0"
+ source-map "^0.6.1"
+ terser "^4.1.2"
+ webpack-sources "^1.4.0"
+ worker-farm "^1.7.0"
+
+terser-webpack-plugin@^1.4.3:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
+ integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
+ dependencies:
+ cacache "^12.0.2"
+ find-cache-dir "^2.1.0"
+ is-wsl "^1.1.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^3.1.0"
+ source-map "^0.6.1"
+ terser "^4.1.2"
+ webpack-sources "^1.4.0"
+ worker-farm "^1.7.0"
+
+terser@^4.0.0, terser@^4.1.2:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65"
+ integrity sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+text-table@^0.2.0, text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+tfunk@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b"
+ integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s=
+ dependencies:
+ chalk "^1.1.1"
+ object-path "^0.9.0"
+
+through2-concurrent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-2.0.0.tgz#c9dd2c146504ec9962dbc86a5168b63d662669fa"
+ integrity sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A==
+ dependencies:
+ through2 "^2.0.0"
+
+through2-filter@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
+ integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
+ dependencies:
+ through2 "~2.0.0"
+ xtend "~4.0.0"
+
+through2@*, through2@3.0.1, through2@^3.0.0, through2@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
+ integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
+ dependencies:
+ readable-stream "2 || 3"
+
+through2@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through2@^0.4.1, through2@~0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
+ integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=
+ dependencies:
+ readable-stream "~1.0.17"
+ xtend "~2.1.1"
+
+through2@^0.5.0, through2@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
+ integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac=
+ dependencies:
+ readable-stream "~1.0.17"
+ xtend "~3.0.0"
+
+through2@^0.6.1, through2@~0.6.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+ integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
+ dependencies:
+ readable-stream ">=1.0.33-1 <1.1.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through2@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.3.0.tgz#2d1d28c8d1daf8d9c5cb78f0a69343c6b8642d97"
+ integrity sha1-LR0oyNHa+NnFy3jwppNDxrhkLZc=
+ dependencies:
+ readable-stream "~1.0.17"
+ xtend "~2.1.1"
+
+through@^2.3.6, through@^2.3.8, 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=
+
+tildify@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
+ integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
+ dependencies:
+ os-homedir "^1.0.0"
+
+time-stamp@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+ integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+timers-browserify@^2.0.4:
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
+ integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
+ dependencies:
+ setimmediate "^1.0.4"
+
+timm@^1.6.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd"
+ integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-lr@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.1.4.tgz#6e41d7e67dfd0878e5e0b37e37a06d67e309ff4d"
+ integrity sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00=
+ dependencies:
+ body-parser "~1.8.0"
+ debug "~0.8.1"
+ faye-websocket "~0.7.2"
+ parseurl "~1.3.0"
+ qs "~2.2.3"
+
+tinycolor2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
+ integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
+
+tmp-promise@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.1.0.tgz#bb924d239029157b9bc1d506a6aa341f8b13e64c"
+ integrity sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==
+ dependencies:
+ bluebird "^3.5.0"
+ tmp "0.1.0"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+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-absolute-glob@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+ integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
+ dependencies:
+ is-absolute "^1.0.0"
+ is-negated-glob "^1.0.0"
+
+to-array@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+ integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-buffer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+ integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+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-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+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-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+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"
+
+to-through@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+ integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
+ dependencies:
+ through2 "^2.0.3"
+
+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@^2.3.3, tough-cookie@^2.4.3:
+ 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"
+
+tough-cookie@~2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+ integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
+ dependencies:
+ psl "^1.1.24"
+ punycode "^1.4.1"
+
+tr46@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+ integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
+ dependencies:
+ punycode "^2.1.0"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+ integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
+
+trim-repeated@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+ integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE=
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+trim@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+ integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+
+"true-case-path@^1.0.2":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
+ integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
+ dependencies:
+ glob "^7.1.2"
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys=
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+tslib@^1.9.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
+ integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+ integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+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-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-fest@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+ integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
+type-is@~1.5.1:
+ version "1.5.7"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90"
+ integrity sha1-uTaKWTzG730GReeLL0xky+zQXpA=
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.0.9"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+ua-parser-js@^0.7.18:
+ version "0.7.21"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
+ integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
+
+uglify-js@3.4.x:
+ version "3.4.10"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
+ integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
+ dependencies:
+ commander "~2.19.0"
+ source-map "~0.6.1"
+
+uglify-template-string-loader@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/uglify-template-string-loader/-/uglify-template-string-loader-1.1.1.tgz#d091d15f66b65f1cae2f4222583009302c86339f"
+ integrity sha512-EHJx8m0aIHlwX5xlJd2xPYIFvLrPkVK5X8zpVxSNTmu7KoT2eSg1TNlwZS+JS65+dwJXC4rC5mc+F4UVe2rckw==
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbzip2-stream@^1.0.9:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
+ integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
+unc-path-regex@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+ integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
+
+underscore@~1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
+ integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
+
+undertaker-registry@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50"
+ integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=
+
+undertaker@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b"
+ integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==
+ dependencies:
+ arr-flatten "^1.0.1"
+ arr-map "^2.0.0"
+ bach "^1.0.0"
+ collection-map "^1.0.0"
+ es6-weak-map "^2.0.1"
+ last-run "^1.1.0"
+ object.defaults "^1.0.0"
+ object.reduce "^1.0.0"
+ undertaker-registry "^1.0.0"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277"
+ integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
+ integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==
+
+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"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unique-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
+ integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=
+
+unique-stream@^2.0.2:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
+ integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
+ dependencies:
+ json-stable-stringify-without-jsonify "^1.0.1"
+ through2-filter "^3.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=
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+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"
+
+unused-files-webpack-plugin@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/unused-files-webpack-plugin/-/unused-files-webpack-plugin-3.4.0.tgz#adc67a3b5549d028818d3119cbf2b5c88aea8670"
+ integrity sha512-cmukKOBdIqaM1pqThY0+jp+mYgCVyzrD8uRbKEucQwIGZcLIRn+gSRiQ7uLjcDd3Zba9NUxVGyYa7lWM4UCGeg==
+ dependencies:
+ babel-runtime "^7.0.0-beta.3"
+ glob-all "^3.1.0"
+ semver "^5.5.0"
+ util.promisify "^1.0.0"
+ warning "^3.0.0"
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+ integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+
+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"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+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==
+
+user-home@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+ integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA=
+
+user-home@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+ integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
+ dependencies:
+ os-homedir "^1.0.0"
+
+utf8-byte-length@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+ integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
+
+utif@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759"
+ integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==
+ dependencies:
+ pako "^1.0.5"
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0, util.promisify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
+ dependencies:
+ inherits "2.0.3"
+
+util@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
+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.0.1, uuid@^3.3.2:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
+ integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
+
+v8-compile-cache@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
+ integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
+
+v8flags@^2.0.2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+ integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=
+ dependencies:
+ user-home "^1.1.1"
+
+v8flags@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
+ integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+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"
+
+value-or-function@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+ integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
+
+vendors@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0"
+ integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==
+
+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"
+
+vinyl-buffer@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-0.0.0.tgz#d197a824badcb11cccf9643ac91be24d43eda8db"
+ integrity sha1-0ZeoJLrcsRzM+WQ6yRviTUPtqNs=
+ dependencies:
+ bl "^0.7.0"
+ through2 "^0.4.1"
+
+vinyl-fs@^0.3.0:
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
+ integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=
+ dependencies:
+ defaults "^1.0.0"
+ glob-stream "^3.1.5"
+ glob-watcher "^0.0.6"
+ graceful-fs "^3.0.0"
+ mkdirp "^0.5.0"
+ strip-bom "^1.0.0"
+ through2 "^0.6.1"
+ vinyl "^0.4.0"
+
+vinyl-fs@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
+ integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
+ dependencies:
+ fs-mkdirp-stream "^1.0.0"
+ glob-stream "^6.1.0"
+ graceful-fs "^4.0.0"
+ is-valid-glob "^1.0.0"
+ lazystream "^1.0.0"
+ lead "^1.0.0"
+ object.assign "^4.0.4"
+ pumpify "^1.3.5"
+ readable-stream "^2.3.3"
+ remove-bom-buffer "^3.0.0"
+ remove-bom-stream "^1.2.0"
+ resolve-options "^1.1.0"
+ through2 "^2.0.0"
+ to-through "^2.0.0"
+ value-or-function "^3.0.0"
+ vinyl "^2.0.0"
+ vinyl-sourcemap "^1.1.0"
+
+vinyl-source-stream@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-0.1.1.tgz#a53a4f21a07a234695e04c2703f9f1b5b9084595"
+ integrity sha1-pTpPIaB6I0aV4EwnA/nxtbkIRZU=
+ dependencies:
+ through2 "~0.3.0"
+ vinyl "~0.2.2"
+
+vinyl-sourcemap@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+ integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
+ dependencies:
+ append-buffer "^1.0.2"
+ convert-source-map "^1.5.0"
+ graceful-fs "^4.1.6"
+ normalize-path "^2.1.1"
+ now-and-later "^2.0.0"
+ remove-bom-buffer "^3.0.0"
+ vinyl "^2.0.0"
+
+vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
+ integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=
+ dependencies:
+ source-map "^0.5.1"
+
+vinyl@*, vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
+ integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
+ dependencies:
+ clone "^2.1.1"
+ clone-buffer "^1.0.0"
+ clone-stats "^1.0.0"
+ cloneable-readable "^1.0.0"
+ remove-trailing-separator "^1.0.1"
+ replace-ext "^1.0.0"
+
+vinyl@^0.2.1, vinyl@~0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252"
+ integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=
+ dependencies:
+ clone-stats "~0.0.1"
+
+vinyl@^0.4.0:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
+ integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc=
+ dependencies:
+ clone "^0.2.0"
+ clone-stats "^0.0.1"
+
+vinyl@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+ integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+vm-browserify@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
+ integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
+
+w3c-hr-time@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+ integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
+ dependencies:
+ browser-process-hrtime "^0.1.2"
+
+warning@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
+ integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=
+ dependencies:
+ loose-envify "^1.0.0"
+
+watch@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406"
+ integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=
+
+watchpack-chokidar2@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
+ integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
+ dependencies:
+ chokidar "^2.1.8"
+
+watchpack@^1.6.1:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
+ integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
+ dependencies:
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+ optionalDependencies:
+ chokidar "^3.4.0"
+ watchpack-chokidar2 "^2.0.0"
+
+webidl-conversions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+ integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+
+webpack-cli@^3.1.0:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a"
+ integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==
+ dependencies:
+ chalk "2.4.2"
+ cross-spawn "6.0.5"
+ enhanced-resolve "4.1.0"
+ findup-sync "3.0.0"
+ global-modules "2.0.0"
+ import-local "2.0.0"
+ interpret "1.2.0"
+ loader-utils "1.2.3"
+ supports-color "6.1.0"
+ v8-compile-cache "2.0.3"
+ yargs "13.2.4"
+
+webpack-deep-scope-plugin@^1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/webpack-deep-scope-plugin/-/webpack-deep-scope-plugin-1.6.2.tgz#131eac79739021e42ebc07066ea8869107f37b85"
+ integrity sha512-S5ZM1i7oTIVPIS1z/Fu41tqFzaXpy8vZnwEDC9I7NLj5XD8GGrDZbDXtG5FCGkHPGxtAzF4O21DKZZ76vpBGzw==
+ dependencies:
+ deep-scope-analyser "^1.7.0"
+
+webpack-plugin-replace@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-plugin-replace/-/webpack-plugin-replace-1.2.0.tgz#3f20db96237400433231e35ea76d9be3f7128916"
+ integrity sha512-1HA3etHpJW55qonJqv84o5w5GY7iqF8fqSHpTWdNwarj1llkkt4jT4QSvYs1hoaU8Lu5akDnq/spHHO5mXwo1w==
+
+webpack-sources@^1.4.0, webpack-sources@^1.4.1:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-stream@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39"
+ integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A==
+ dependencies:
+ fancy-log "^1.3.3"
+ lodash.clone "^4.3.2"
+ lodash.some "^4.2.2"
+ memory-fs "^0.4.1"
+ plugin-error "^1.0.1"
+ supports-color "^5.5.0"
+ through "^2.3.8"
+ vinyl "^2.1.0"
+ webpack "^4.26.1"
+
+webpack-strip-block@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-strip-block/-/webpack-strip-block-0.2.0.tgz#c60d4a703e0eeee8895e7f1abe9b5fe914681470"
+ integrity sha1-xg1KcD4O7uiJXn8avptf6RRoFHA=
+ dependencies:
+ loader-utils "^1.1.0"
+
+webpack@^4.26.1, webpack@^4.43.0:
+ version "4.43.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
+ integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/wasm-edit" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ acorn "^6.4.1"
+ ajv "^6.10.2"
+ ajv-keywords "^3.4.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^4.1.0"
+ eslint-scope "^4.0.3"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.4.0"
+ loader-utils "^1.2.3"
+ memory-fs "^0.4.1"
+ micromatch "^3.1.10"
+ mkdirp "^0.5.3"
+ neo-async "^2.6.1"
+ node-libs-browser "^2.2.1"
+ schema-utils "^1.0.0"
+ tapable "^1.1.3"
+ terser-webpack-plugin "^1.4.3"
+ watchpack "^1.6.1"
+ webpack-sources "^1.4.1"
+
+websocket-driver@>=0.3.6:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"
+ integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==
+ dependencies:
+ http-parser-js ">=0.4.0 <0.4.11"
+ safe-buffer ">=5.1.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
+ integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-fetch@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
+ integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
+
+whatwg-mimetype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
+ integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.1"
+ webidl-conversions "^4.0.2"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1, which@^1.1.1, which@^1.2.14, which@^1.2.9, 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"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+winston@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-1.0.2.tgz#351c58e2323f8a4ca29a45195aa9aa3b4c35d76f"
+ integrity sha1-NRxY4jI/ikyimkUZWqmqO0w1128=
+ dependencies:
+ async "~1.0.0"
+ colors "1.0.x"
+ cycle "1.0.x"
+ eyes "0.1.x"
+ isstream "0.1.x"
+ pkginfo "0.3.x"
+ stack-trace "0.0.x"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+ integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
+worker-farm@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+ integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+ dependencies:
+ errno "~0.1.7"
+
+worker-loader@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
+ integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==
+ dependencies:
+ loader-utils "^1.0.0"
+ schema-utils "^0.4.0"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+ integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+ dependencies:
+ mkdirp "^0.5.1"
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@~3.3.1:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@~6.1.0:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
+ integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xhr@^2.0.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
+ integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
+ dependencies:
+ global "~4.3.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xml-parse-from-string@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
+ integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
+
+xml2js@^0.4.5:
+ version "0.4.22"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02"
+ integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==
+ dependencies:
+ sax ">=0.6.0"
+ util.promisify "~1.0.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@^9.0.7:
+ version "9.0.7"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+ integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xmlchars@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+xmldom@0.1.x:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+ integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk=
+
+xmlhttprequest-ssl@~1.5.4:
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+ integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+xtend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
+ integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+ integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
+
+y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+ integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+ integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
+
+yaml-loader@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/yaml-loader/-/yaml-loader-0.6.0.tgz#fe1c48b9f4803dace55a59a1474e790ba6ab1b48"
+ integrity sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==
+ dependencies:
+ loader-utils "^1.4.0"
+ yaml "^1.8.3"
+
+yaml@^1.8.3:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+
+yargs-parser@5.0.0-security.0:
+ version "5.0.0-security.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24"
+ integrity sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==
+ dependencies:
+ camelcase "^3.0.0"
+ object.assign "^4.1.0"
+
+yargs-parser@^13.0.0, yargs-parser@^13.1.0:
+ version "13.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
+ integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^13.1.1:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+ integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@13.2.4:
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
+ integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ os-locale "^3.1.0"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.0"
+
+yargs@13.3.0:
+ version "13.3.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
+ integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.1"
+
+yargs@^15.4.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yargs@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+ integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^5.0.0"
+
+yargs@^7.1.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6"
+ integrity sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "5.0.0-security.0"
+
+yargs@~1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"
+ integrity sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=
+ dependencies:
+ minimist "^0.1.0"
+
+yauzl@^2.4.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yeast@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
+ integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
+
+zip-stream@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3"
+ integrity sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M=
+ dependencies:
+ compress-commons "~0.1.0"
+ lodash "~2.4.1"
+ readable-stream "~1.0.26"
diff --git a/package.json b/package.json
index bdc0eb53..715bf26d 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
"@types/cordova": "^0.0.34",
"@types/filesystem": "^0.0.29",
"ajv": "^6.10.2",
+ "babel-core": "^6.26.3",
"babel-loader": "^8.0.4",
"circular-dependency-plugin": "^5.0.2",
"circular-json": "^0.5.9",
@@ -49,6 +50,7 @@
"markdown-loader": "^4.0.0",
"match-all": "^1.2.5",
"phonegap-plugin-mobile-accessibility": "^1.0.5",
+ "postcss": ">=5.0.0",
"promise-polyfill": "^8.1.0",
"query-string": "^6.8.1",
"rusha": "^0.8.13",
@@ -71,6 +73,7 @@
"yawn-yaml": "^1.5.0"
},
"devDependencies": {
+ "@octokit/rest": "^18.0.6",
"@typescript-eslint/eslint-plugin": "3.0.1",
"@typescript-eslint/parser": "3.0.1",
"autoprefixer": "^9.4.3",
diff --git a/res/bg_render.webm b/res/bg_render.webm
index bda0db6b..86ed678e 100644
Binary files a/res/bg_render.webm and b/res/bg_render.webm differ
diff --git a/res/ui/building_icons/analyzer.png b/res/ui/building_icons/analyzer.png
new file mode 100644
index 00000000..61f9e1ba
Binary files /dev/null and b/res/ui/building_icons/analyzer.png differ
diff --git a/res/ui/building_icons/balancer.png b/res/ui/building_icons/balancer.png
new file mode 100644
index 00000000..4347d2ba
Binary files /dev/null and b/res/ui/building_icons/balancer.png differ
diff --git a/res/ui/building_icons/belt.png b/res/ui/building_icons/belt.png
index 628480fb..566e971d 100644
Binary files a/res/ui/building_icons/belt.png and b/res/ui/building_icons/belt.png differ
diff --git a/res/ui/building_icons/comparator.png b/res/ui/building_icons/comparator.png
new file mode 100644
index 00000000..25955e22
Binary files /dev/null and b/res/ui/building_icons/comparator.png differ
diff --git a/res/ui/building_icons/constant_signal.png b/res/ui/building_icons/constant_signal.png
index b438fa29..311df8a8 100644
Binary files a/res/ui/building_icons/constant_signal.png and b/res/ui/building_icons/constant_signal.png differ
diff --git a/res/ui/building_icons/cutter.png b/res/ui/building_icons/cutter.png
index 6d0fc4d1..84eafc30 100644
Binary files a/res/ui/building_icons/cutter.png and b/res/ui/building_icons/cutter.png differ
diff --git a/res/ui/building_icons/display.png b/res/ui/building_icons/display.png
index 14c48d7e..56548fde 100644
Binary files a/res/ui/building_icons/display.png and b/res/ui/building_icons/display.png differ
diff --git a/res/ui/building_icons/filter.png b/res/ui/building_icons/filter.png
index 2e87af28..16215918 100644
Binary files a/res/ui/building_icons/filter.png and b/res/ui/building_icons/filter.png differ
diff --git a/res/ui/building_icons/item_producer.png b/res/ui/building_icons/item_producer.png
new file mode 100644
index 00000000..ca267ea6
Binary files /dev/null and b/res/ui/building_icons/item_producer.png differ
diff --git a/res/ui/building_icons/lever.png b/res/ui/building_icons/lever.png
index 77eea9f3..e4514b98 100644
Binary files a/res/ui/building_icons/lever.png and b/res/ui/building_icons/lever.png differ
diff --git a/res/ui/building_icons/logic_gate.png b/res/ui/building_icons/logic_gate.png
index 81a0bdd6..1de56dfa 100644
Binary files a/res/ui/building_icons/logic_gate.png and b/res/ui/building_icons/logic_gate.png differ
diff --git a/res/ui/building_icons/miner.png b/res/ui/building_icons/miner.png
index fc7050ea..9103750b 100644
Binary files a/res/ui/building_icons/miner.png and b/res/ui/building_icons/miner.png differ
diff --git a/res/ui/building_icons/mixer.png b/res/ui/building_icons/mixer.png
index 87409438..6ce15dbb 100644
Binary files a/res/ui/building_icons/mixer.png and b/res/ui/building_icons/mixer.png differ
diff --git a/res/ui/building_icons/painter.png b/res/ui/building_icons/painter.png
index 4aa888b6..e0b63af5 100644
Binary files a/res/ui/building_icons/painter.png and b/res/ui/building_icons/painter.png differ
diff --git a/res/ui/building_icons/reader.png b/res/ui/building_icons/reader.png
index 890a6ad7..8381c9b8 100644
Binary files a/res/ui/building_icons/reader.png and b/res/ui/building_icons/reader.png differ
diff --git a/res/ui/building_icons/rotater.png b/res/ui/building_icons/rotater.png
index 3fb355d6..00a4c75d 100644
Binary files a/res/ui/building_icons/rotater.png and b/res/ui/building_icons/rotater.png differ
diff --git a/res/ui/building_icons/splitter.png b/res/ui/building_icons/splitter.png
deleted file mode 100644
index fb889bab..00000000
Binary files a/res/ui/building_icons/splitter.png and /dev/null differ
diff --git a/res/ui/building_icons/stacker.png b/res/ui/building_icons/stacker.png
index 5a4dda42..ccafd591 100644
Binary files a/res/ui/building_icons/stacker.png and b/res/ui/building_icons/stacker.png differ
diff --git a/res/ui/building_icons/storage.png b/res/ui/building_icons/storage.png
new file mode 100644
index 00000000..5423513d
Binary files /dev/null and b/res/ui/building_icons/storage.png differ
diff --git a/res/ui/building_icons/transistor.png b/res/ui/building_icons/transistor.png
new file mode 100644
index 00000000..5296edbb
Binary files /dev/null and b/res/ui/building_icons/transistor.png differ
diff --git a/res/ui/building_icons/trash.png b/res/ui/building_icons/trash.png
index b6a34ae6..0f4238f4 100644
Binary files a/res/ui/building_icons/trash.png and b/res/ui/building_icons/trash.png differ
diff --git a/res/ui/building_icons/underground_belt.png b/res/ui/building_icons/underground_belt.png
index b52f4d8e..a8f121c1 100644
Binary files a/res/ui/building_icons/underground_belt.png and b/res/ui/building_icons/underground_belt.png differ
diff --git a/res/ui/building_icons/virtual_processor.png b/res/ui/building_icons/virtual_processor.png
index f5471999..f67f4c84 100644
Binary files a/res/ui/building_icons/virtual_processor.png and b/res/ui/building_icons/virtual_processor.png differ
diff --git a/res/ui/building_icons/wire.png b/res/ui/building_icons/wire.png
index 6bae2537..1f07a846 100644
Binary files a/res/ui/building_icons/wire.png and b/res/ui/building_icons/wire.png differ
diff --git a/res/ui/building_icons/wire_tunnel.png b/res/ui/building_icons/wire_tunnel.png
index d0e185f9..97bfc3db 100644
Binary files a/res/ui/building_icons/wire_tunnel.png and b/res/ui/building_icons/wire_tunnel.png differ
diff --git a/res/ui/building_tutorials/analyzer.png b/res/ui/building_tutorials/analyzer.png
new file mode 100644
index 00000000..d0e820c1
Binary files /dev/null and b/res/ui/building_tutorials/analyzer.png differ
diff --git a/res/ui/building_tutorials/splitter-compact.png b/res/ui/building_tutorials/balancer-merger.png
similarity index 100%
rename from res/ui/building_tutorials/splitter-compact.png
rename to res/ui/building_tutorials/balancer-merger.png
diff --git a/res/ui/building_tutorials/balancer-splitter.png b/res/ui/building_tutorials/balancer-splitter.png
new file mode 100644
index 00000000..d03103b2
Binary files /dev/null and b/res/ui/building_tutorials/balancer-splitter.png differ
diff --git a/res/ui/building_tutorials/splitter.png b/res/ui/building_tutorials/balancer.png
similarity index 100%
rename from res/ui/building_tutorials/splitter.png
rename to res/ui/building_tutorials/balancer.png
diff --git a/res/ui/building_tutorials/comparator.png b/res/ui/building_tutorials/comparator.png
new file mode 100644
index 00000000..8dfed981
Binary files /dev/null and b/res/ui/building_tutorials/comparator.png differ
diff --git a/res/ui/building_tutorials/constant_signal.png b/res/ui/building_tutorials/constant_signal.png
new file mode 100644
index 00000000..70de0a21
Binary files /dev/null and b/res/ui/building_tutorials/constant_signal.png differ
diff --git a/res/ui/building_tutorials/cutter-quad.png b/res/ui/building_tutorials/cutter-quad.png
index 22137353..696a05be 100644
Binary files a/res/ui/building_tutorials/cutter-quad.png and b/res/ui/building_tutorials/cutter-quad.png differ
diff --git a/res/ui/building_tutorials/display.png b/res/ui/building_tutorials/display.png
new file mode 100644
index 00000000..de5c7ed7
Binary files /dev/null and b/res/ui/building_tutorials/display.png differ
diff --git a/res/ui/building_tutorials/item_producer.png b/res/ui/building_tutorials/item_producer.png
new file mode 100644
index 00000000..b0d15387
Binary files /dev/null and b/res/ui/building_tutorials/item_producer.png differ
diff --git a/res/ui/building_tutorials/lever.png b/res/ui/building_tutorials/lever.png
new file mode 100644
index 00000000..da7551f2
Binary files /dev/null and b/res/ui/building_tutorials/lever.png differ
diff --git a/res/ui/building_tutorials/logic_gate-and.png b/res/ui/building_tutorials/logic_gate-and.png
new file mode 100644
index 00000000..e8c31683
Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-and.png differ
diff --git a/res/ui/building_tutorials/logic_gate-not.png b/res/ui/building_tutorials/logic_gate-not.png
new file mode 100644
index 00000000..47fbeb1b
Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-not.png differ
diff --git a/res/ui/building_tutorials/logic_gate-or.png b/res/ui/building_tutorials/logic_gate-or.png
new file mode 100644
index 00000000..d1c82770
Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-or.png differ
diff --git a/res/ui/building_tutorials/logic_gate-xor.png b/res/ui/building_tutorials/logic_gate-xor.png
new file mode 100644
index 00000000..d9d282f7
Binary files /dev/null and b/res/ui/building_tutorials/logic_gate-xor.png differ
diff --git a/res/ui/building_tutorials/painter-mirrored.png b/res/ui/building_tutorials/painter-mirrored.png
new file mode 100644
index 00000000..bb1147d5
Binary files /dev/null and b/res/ui/building_tutorials/painter-mirrored.png differ
diff --git a/res/ui/building_tutorials/painter-quad.png b/res/ui/building_tutorials/painter-quad.png
index 57536440..2d52a01b 100644
Binary files a/res/ui/building_tutorials/painter-quad.png and b/res/ui/building_tutorials/painter-quad.png differ
diff --git a/res/ui/building_tutorials/painter.png b/res/ui/building_tutorials/painter.png
index 8791082f..63cc6683 100644
Binary files a/res/ui/building_tutorials/painter.png and b/res/ui/building_tutorials/painter.png differ
diff --git a/res/ui/building_tutorials/reader.png b/res/ui/building_tutorials/reader.png
new file mode 100644
index 00000000..c008e28e
Binary files /dev/null and b/res/ui/building_tutorials/reader.png differ
diff --git a/res/ui/building_tutorials/rotater-ccw.png b/res/ui/building_tutorials/rotater-ccw.png
index a76b7179..cf13f63b 100644
Binary files a/res/ui/building_tutorials/rotater-ccw.png and b/res/ui/building_tutorials/rotater-ccw.png differ
diff --git a/res/ui/building_tutorials/rotater-fl.png b/res/ui/building_tutorials/rotater-fl.png
deleted file mode 100644
index cb6cee0d..00000000
Binary files a/res/ui/building_tutorials/rotater-fl.png and /dev/null differ
diff --git a/res/ui/building_tutorials/rotater-rotate180.png b/res/ui/building_tutorials/rotater-rotate180.png
new file mode 100644
index 00000000..b2681662
Binary files /dev/null and b/res/ui/building_tutorials/rotater-rotate180.png differ
diff --git a/res/ui/building_tutorials/rotater.png b/res/ui/building_tutorials/rotater.png
index c8ecb8b0..0726f2b1 100644
Binary files a/res/ui/building_tutorials/rotater.png and b/res/ui/building_tutorials/rotater.png differ
diff --git a/res/ui/building_tutorials/splitter-compact-inverse.png b/res/ui/building_tutorials/splitter-compact-inverse.png
deleted file mode 100644
index 38965f4d..00000000
Binary files a/res/ui/building_tutorials/splitter-compact-inverse.png and /dev/null differ
diff --git a/res/ui/building_tutorials/stacker.png b/res/ui/building_tutorials/stacker.png
index 55232a2c..ef11af8d 100644
Binary files a/res/ui/building_tutorials/stacker.png and b/res/ui/building_tutorials/stacker.png differ
diff --git a/res/ui/building_tutorials/storage.png b/res/ui/building_tutorials/storage.png
new file mode 100644
index 00000000..b5d21433
Binary files /dev/null and b/res/ui/building_tutorials/storage.png differ
diff --git a/res/ui/building_tutorials/transistor.png b/res/ui/building_tutorials/transistor.png
new file mode 100644
index 00000000..e3ca0ba6
Binary files /dev/null and b/res/ui/building_tutorials/transistor.png differ
diff --git a/res/ui/building_tutorials/trash-storage.png b/res/ui/building_tutorials/trash-storage.png
deleted file mode 100644
index 50c77719..00000000
Binary files a/res/ui/building_tutorials/trash-storage.png and /dev/null differ
diff --git a/res/ui/building_tutorials/virtual_processor-cutter.png b/res/ui/building_tutorials/virtual_processor-cutter.png
new file mode 100644
index 00000000..45ad6d3a
Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-cutter.png differ
diff --git a/res/ui/building_tutorials/virtual_processor-painter.png b/res/ui/building_tutorials/virtual_processor-painter.png
new file mode 100644
index 00000000..2b9387eb
Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-painter.png differ
diff --git a/res/ui/building_tutorials/virtual_processor-rotater.png b/res/ui/building_tutorials/virtual_processor-rotater.png
new file mode 100644
index 00000000..752d21f8
Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-rotater.png differ
diff --git a/res/ui/building_tutorials/virtual_processor-stacker.png b/res/ui/building_tutorials/virtual_processor-stacker.png
new file mode 100644
index 00000000..fdaccb02
Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-stacker.png differ
diff --git a/res/ui/building_tutorials/virtual_processor-unstacker.png b/res/ui/building_tutorials/virtual_processor-unstacker.png
new file mode 100644
index 00000000..697c21cd
Binary files /dev/null and b/res/ui/building_tutorials/virtual_processor-unstacker.png differ
diff --git a/res/ui/building_tutorials/wire-second.png b/res/ui/building_tutorials/wire-second.png
new file mode 100644
index 00000000..9f2b462c
Binary files /dev/null and b/res/ui/building_tutorials/wire-second.png differ
diff --git a/res/ui/building_tutorials/wire.png b/res/ui/building_tutorials/wire.png
new file mode 100644
index 00000000..d5cf0bed
Binary files /dev/null and b/res/ui/building_tutorials/wire.png differ
diff --git a/res/ui/building_tutorials/wire_tunnel.png b/res/ui/building_tutorials/wire_tunnel.png
new file mode 100644
index 00000000..e8b25063
Binary files /dev/null and b/res/ui/building_tutorials/wire_tunnel.png differ
diff --git a/res/ui/get_on_steam_with_price.png b/res/ui/get_on_steam_with_price.png
new file mode 100644
index 00000000..e935acdc
Binary files /dev/null and b/res/ui/get_on_steam_with_price.png differ
diff --git a/res/ui/icons/advantage_buildings.png b/res/ui/icons/advantage_buildings.png
new file mode 100644
index 00000000..91e7a565
Binary files /dev/null and b/res/ui/icons/advantage_buildings.png differ
diff --git a/res/ui/icons/advantage_dark_mode.png b/res/ui/icons/advantage_dark_mode.png
new file mode 100644
index 00000000..c176b8ad
Binary files /dev/null and b/res/ui/icons/advantage_dark_mode.png differ
diff --git a/res/ui/icons/advantage_markers.png b/res/ui/icons/advantage_markers.png
new file mode 100644
index 00000000..af3835c7
Binary files /dev/null and b/res/ui/icons/advantage_markers.png differ
diff --git a/res/ui/icons/advantage_new_levels.png b/res/ui/icons/advantage_new_levels.png
new file mode 100644
index 00000000..730732fe
Binary files /dev/null and b/res/ui/icons/advantage_new_levels.png differ
diff --git a/res/ui/icons/advantage_savegames.png b/res/ui/icons/advantage_savegames.png
new file mode 100644
index 00000000..79e7c327
Binary files /dev/null and b/res/ui/icons/advantage_savegames.png differ
diff --git a/res/ui/icons/advantage_support.png b/res/ui/icons/advantage_support.png
new file mode 100644
index 00000000..b86703a5
Binary files /dev/null and b/res/ui/icons/advantage_support.png differ
diff --git a/res/ui/icons/advantage_upgrades.png b/res/ui/icons/advantage_upgrades.png
new file mode 100644
index 00000000..e06b6d82
Binary files /dev/null and b/res/ui/icons/advantage_upgrades.png differ
diff --git a/res/ui/icons/advantage_wires.png b/res/ui/icons/advantage_wires.png
new file mode 100644
index 00000000..bb26fa87
Binary files /dev/null and b/res/ui/icons/advantage_wires.png differ
diff --git a/res/ui/icons/delete.png b/res/ui/icons/delete.png
index db1c86f1..114693a6 100644
Binary files a/res/ui/icons/delete.png and b/res/ui/icons/delete.png differ
diff --git a/res/ui/icons/demo_steam_link_indicator.png b/res/ui/icons/demo_steam_link_indicator.png
new file mode 100644
index 00000000..98add9df
Binary files /dev/null and b/res/ui/icons/demo_steam_link_indicator.png differ
diff --git a/res/ui/icons/download.png b/res/ui/icons/download.png
index 68ed3fb4..9bea1b85 100644
Binary files a/res/ui/icons/download.png and b/res/ui/icons/download.png differ
diff --git a/res/ui/icons/enum_selector_white.png b/res/ui/icons/enum_selector_white.png
new file mode 100644
index 00000000..c95a44cc
Binary files /dev/null and b/res/ui/icons/enum_selector_white.png differ
diff --git a/res/ui/icons/main_menu_exit.png b/res/ui/icons/main_menu_exit.png
index 07a54c6c..b1918778 100644
Binary files a/res/ui/icons/main_menu_exit.png and b/res/ui/icons/main_menu_exit.png differ
diff --git a/res/ui/icons/main_menu_settings.png b/res/ui/icons/main_menu_settings.png
index eb99a2ef..88bd4987 100644
Binary files a/res/ui/icons/main_menu_settings.png and b/res/ui/icons/main_menu_settings.png differ
diff --git a/res/ui/icons/save.png b/res/ui/icons/save.png
index d48274bc..e75c08f4 100644
Binary files a/res/ui/icons/save.png and b/res/ui/icons/save.png differ
diff --git a/res/ui/icons/settings_menu_exit.png b/res/ui/icons/settings_menu_exit.png
new file mode 100644
index 00000000..3fa17330
Binary files /dev/null and b/res/ui/icons/settings_menu_exit.png differ
diff --git a/res/ui/icons/settings_menu_play.png b/res/ui/icons/settings_menu_play.png
new file mode 100644
index 00000000..358b5362
Binary files /dev/null and b/res/ui/icons/settings_menu_play.png differ
diff --git a/res/ui/icons/settings_menu_settings.png b/res/ui/icons/settings_menu_settings.png
new file mode 100644
index 00000000..8eb6efee
Binary files /dev/null and b/res/ui/icons/settings_menu_settings.png differ
diff --git a/res/ui/icons/shop.png b/res/ui/icons/shop.png
index 29519103..94dbc6de 100644
Binary files a/res/ui/icons/shop.png and b/res/ui/icons/shop.png differ
diff --git a/res/ui/icons/shop_active.png b/res/ui/icons/shop_active.png
new file mode 100644
index 00000000..773d4c88
Binary files /dev/null and b/res/ui/icons/shop_active.png differ
diff --git a/res/ui/icons/statistics.png b/res/ui/icons/statistics.png
index c6b8e68a..e6349d88 100644
Binary files a/res/ui/icons/statistics.png and b/res/ui/icons/statistics.png differ
diff --git a/res/ui/icons/toggle_unit.png b/res/ui/icons/toggle_unit.png
new file mode 100644
index 00000000..e2126a97
Binary files /dev/null and b/res/ui/icons/toggle_unit.png differ
diff --git a/res/ui/interactive_tutorial.noinline/21_1_place_quad_painter.gif b/res/ui/interactive_tutorial.noinline/21_1_place_quad_painter.gif
new file mode 100644
index 00000000..ea854cf2
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/21_1_place_quad_painter.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/21_2_switch_to_wires.gif b/res/ui/interactive_tutorial.noinline/21_2_switch_to_wires.gif
new file mode 100644
index 00000000..78ab6fd2
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/21_2_switch_to_wires.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/21_3_place_button.gif b/res/ui/interactive_tutorial.noinline/21_3_place_button.gif
new file mode 100644
index 00000000..52ffb076
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/21_3_place_button.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/21_4_press_button.gif b/res/ui/interactive_tutorial.noinline/21_4_press_button.gif
new file mode 100644
index 00000000..5d79f1e3
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/21_4_press_button.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/2_1_place_cutter.gif b/res/ui/interactive_tutorial.noinline/2_1_place_cutter.gif
new file mode 100644
index 00000000..1678c0b2
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/2_1_place_cutter.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/2_2_place_trash.gif b/res/ui/interactive_tutorial.noinline/2_2_place_trash.gif
new file mode 100644
index 00000000..0d60fa9f
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/2_2_place_trash.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/2_3_more_cutters.gif b/res/ui/interactive_tutorial.noinline/2_3_more_cutters.gif
new file mode 100644
index 00000000..50ce88f9
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/2_3_more_cutters.gif differ
diff --git a/res/ui/interactive_tutorial.noinline/3_1_rectangles.gif b/res/ui/interactive_tutorial.noinline/3_1_rectangles.gif
new file mode 100644
index 00000000..418d3123
Binary files /dev/null and b/res/ui/interactive_tutorial.noinline/3_1_rectangles.gif differ
diff --git a/res/ui/languages/da.svg b/res/ui/languages/da.svg
index ea9d950a..b6ace9ab 100644
--- a/res/ui/languages/da.svg
+++ b/res/ui/languages/da.svg
@@ -1,36 +1,38 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/ui/memes/cat1.png b/res/ui/memes/cat1.png
new file mode 100644
index 00000000..114c3fa0
Binary files /dev/null and b/res/ui/memes/cat1.png differ
diff --git a/res_built/.gitignore b/res_built/.gitignore
deleted file mode 100644
index 060e04d9..00000000
--- a/res_built/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Ignore built sounds
-sounds
diff --git a/res_built/atlas/atlas0_hq.json b/res_built/atlas/atlas0_hq.json
deleted file mode 100644
index 9edcc70f..00000000
--- a/res_built/atlas/atlas0_hq.json
+++ /dev/null
@@ -1,1476 +0,0 @@
-{"frames": {
-
-"sprites/belt/built/forward_0.png":
-{
- "frame": {"x":440,"y":742,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_1.png":
-{
- "frame": {"x":1815,"y":1070,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_2.png":
-{
- "frame": {"x":1804,"y":1366,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_3.png":
-{
- "frame": {"x":1924,"y":1405,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_4.png":
-{
- "frame": {"x":439,"y":1038,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_5.png":
-{
- "frame": {"x":1801,"y":1514,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_6.png":
-{
- "frame": {"x":1921,"y":1553,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_7.png":
-{
- "frame": {"x":1801,"y":1662,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_8.png":
-{
- "frame": {"x":1921,"y":1701,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_9.png":
-{
- "frame": {"x":137,"y":1849,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_10.png":
-{
- "frame": {"x":1539,"y":1139,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_11.png":
-{
- "frame": {"x":1538,"y":1287,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_12.png":
-{
- "frame": {"x":1806,"y":1218,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/forward_13.png":
-{
- "frame": {"x":1926,"y":1257,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_0.png":
-{
- "frame": {"x":3,"y":1182,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_1.png":
-{
- "frame": {"x":137,"y":1182,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_2.png":
-{
- "frame": {"x":283,"y":1703,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_3.png":
-{
- "frame": {"x":389,"y":1849,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_4.png":
-{
- "frame": {"x":417,"y":1703,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_5.png":
-{
- "frame": {"x":523,"y":1849,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_6.png":
-{
- "frame": {"x":551,"y":1703,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_7.png":
-{
- "frame": {"x":657,"y":1849,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_8.png":
-{
- "frame": {"x":791,"y":1408,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_9.png":
-{
- "frame": {"x":685,"y":1703,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_10.png":
-{
- "frame": {"x":425,"y":1186,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_11.png":
-{
- "frame": {"x":425,"y":1320,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_12.png":
-{
- "frame": {"x":424,"y":1454,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/left_13.png":
-{
- "frame": {"x":144,"y":1465,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_0.png":
-{
- "frame": {"x":925,"y":1476,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_1.png":
-{
- "frame": {"x":565,"y":1542,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_2.png":
-{
- "frame": {"x":1461,"y":1703,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_3.png":
-{
- "frame": {"x":791,"y":1849,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_4.png":
-{
- "frame": {"x":925,"y":1610,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_5.png":
-{
- "frame": {"x":1059,"y":1740,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_6.png":
-{
- "frame": {"x":1193,"y":1805,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_7.png":
-{
- "frame": {"x":1327,"y":1827,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_8.png":
-{
- "frame": {"x":925,"y":1744,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_9.png":
-{
- "frame": {"x":1059,"y":1874,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_10.png":
-{
- "frame": {"x":699,"y":1542,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_11.png":
-{
- "frame": {"x":1059,"y":1606,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_12.png":
-{
- "frame": {"x":1193,"y":1671,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/belt/built/right_13.png":
-{
- "frame": {"x":1327,"y":1693,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/belt_left.png":
-{
- "frame": {"x":925,"y":1878,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/belt_right.png":
-{
- "frame": {"x":1461,"y":1849,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/belt_top.png":
-{
- "frame": {"x":3,"y":1318,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/constant_signal.png":
-{
- "frame": {"x":1938,"y":847,"w":105,"h":127},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":105,"h":127},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/cutter-quad.png":
-{
- "frame": {"x":3,"y":151,"w":548,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":548,"h":144},
- "sourceSize": {"w":576,"h":144}
-},
-"sprites/blueprints/cutter.png":
-{
- "frame": {"x":847,"y":298,"w":256,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":256,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/display.png":
-{
- "frame": {"x":257,"y":1849,"w":128,"h":136},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":8,"y":8,"w":128,"h":136},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/filter.png":
-{
- "frame": {"x":1107,"y":556,"w":268,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":16,"y":0,"w":268,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/lever.png":
-{
- "frame": {"x":1823,"y":732,"w":111,"h":129},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":4,"w":111,"h":129},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/logic_gate-not.png":
-{
- "frame": {"x":1545,"y":843,"w":123,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":123,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/logic_gate-or.png":
-{
- "frame": {"x":1249,"y":996,"w":144,"h":123},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":123},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/logic_gate-transistor.png":
-{
- "frame": {"x":708,"y":888,"w":101,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":101,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/logic_gate-xor.png":
-{
- "frame": {"x":291,"y":890,"w":144,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/logic_gate.png":
-{
- "frame": {"x":1397,"y":852,"w":144,"h":133},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/miner-chainable.png":
-{
- "frame": {"x":151,"y":1035,"w":136,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/miner.png":
-{
- "frame": {"x":123,"y":1318,"w":136,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":136,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/mixer.png":
-{
- "frame": {"x":1676,"y":584,"w":261,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/painter-double.png":
-{
- "frame": {"x":1683,"y":3,"w":288,"h":287},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":287},
- "sourceSize": {"w":288,"h":288}
-},
-"sprites/blueprints/painter-mirrored.png":
-{
- "frame": {"x":555,"y":298,"w":288,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/painter-quad.png":
-{
- "frame": {"x":3,"y":3,"w":560,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":560,"h":144},
- "sourceSize": {"w":576,"h":144}
-},
-"sprites/blueprints/painter.png":
-{
- "frame": {"x":3,"y":299,"w":288,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/reader.png":
-{
- "frame": {"x":938,"y":1181,"w":141,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/rotater-ccw.png":
-{
- "frame": {"x":1245,"y":1123,"w":143,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/rotater-fl.png":
-{
- "frame": {"x":1658,"y":1325,"w":142,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":142,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/rotater.png":
-{
- "frame": {"x":1097,"y":1171,"w":143,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/splitter-compact-inverse.png":
-{
- "frame": {"x":560,"y":1036,"w":142,"h":138},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":792,"y":1118,"w":142,"h":138},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":142,"h":138},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/splitter-compact-merge.png":
-{
- "frame": {"x":1373,"y":1409,"w":139,"h":138},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/splitter-compact.png":
-{
- "frame": {"x":1373,"y":1551,"w":139,"h":138},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":2,"w":139,"h":138},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/splitter.png":
-{
- "frame": {"x":295,"y":299,"w":256,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":256,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/stacker.png":
-{
- "frame": {"x":295,"y":594,"w":261,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":0,"w":261,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/blueprints/trash-storage.png":
-{
- "frame": {"x":847,"y":593,"w":250,"h":288},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":21,"y":0,"w":250,"h":288},
- "sourceSize": {"w":288,"h":288}
-},
-"sprites/blueprints/trash.png":
-{
- "frame": {"x":292,"y":742,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/underground_belt_entry-tier2.png":
-{
- "frame": {"x":1516,"y":1574,"w":138,"h":125},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":19,"w":138,"h":125},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/underground_belt_entry.png":
-{
- "frame": {"x":283,"y":1182,"w":138,"h":112},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":32,"w":138,"h":112},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/underground_belt_exit-tier2.png":
-{
- "frame": {"x":1225,"y":1555,"w":139,"h":112},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":139,"h":112},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/underground_belt_exit.png":
-{
- "frame": {"x":283,"y":1298,"w":138,"h":112},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":138,"h":112},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor-analyzer.png":
-{
- "frame": {"x":3,"y":887,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor-rotater.png":
-{
- "frame": {"x":1545,"y":991,"w":118,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":118,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor-shapecompare.png":
-{
- "frame": {"x":1397,"y":989,"w":144,"h":133},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":133},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor-stacker.png":
-{
- "frame": {"x":961,"y":1033,"w":132,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":132,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor-unstacker.png":
-{
- "frame": {"x":1101,"y":704,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/virtual_processor.png":
-{
- "frame": {"x":291,"y":1037,"w":144,"h":141},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":3,"w":144,"h":141},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire-cross.png":
-{
- "frame": {"x":1249,"y":704,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire-split.png":
-{
- "frame": {"x":1098,"y":1000,"w":144,"h":82},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":62,"w":144,"h":82},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire-turn.png":
-{
- "frame": {"x":706,"y":1036,"w":82,"h":82},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":62,"y":62,"w":82,"h":82},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire.png":
-{
- "frame": {"x":1107,"y":151,"w":20,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":62,"y":0,"w":20,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire_tunnel-coating.png":
-{
- "frame": {"x":255,"y":677,"w":33,"h":134},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":56,"y":5,"w":33,"h":134},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/blueprints/wire_tunnel.png":
-{
- "frame": {"x":1516,"y":1435,"w":138,"h":135},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":138,"h":135},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/belt_left.png":
-{
- "frame": {"x":3,"y":1182,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/belt_right.png":
-{
- "frame": {"x":925,"y":1476,"w":130,"h":130},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":14,"w":130,"h":130},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/belt_top.png":
-{
- "frame": {"x":440,"y":742,"w":116,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":116,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/constant_signal.png":
-{
- "frame": {"x":1941,"y":716,"w":104,"h":127},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":104,"h":127},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/cutter-quad.png":
-{
- "frame": {"x":555,"y":151,"w":548,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":548,"h":143},
- "sourceSize": {"w":576,"h":144}
-},
-"sprites/buildings/cutter.png":
-{
- "frame": {"x":847,"y":446,"w":256,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":256,"h":143},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/display.png":
-{
- "frame": {"x":1545,"y":704,"w":126,"h":135},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":126,"h":135},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/filter.png":
-{
- "frame": {"x":1379,"y":556,"w":267,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":267,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/hub.png":
-{
- "frame": {"x":1131,"y":3,"w":548,"h":549},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":16,"w":548,"h":549},
- "sourceSize": {"w":576,"h":576}
-},
-"sprites/buildings/lever.png":
-{
- "frame": {"x":1823,"y":865,"w":109,"h":127},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":18,"y":5,"w":109,"h":127},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/logic_gate-not.png":
-{
- "frame": {"x":972,"y":885,"w":122,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":12,"y":0,"w":122,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/logic_gate-or.png":
-{
- "frame": {"x":1659,"y":1198,"w":143,"h":123},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":123},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/logic_gate-transistor.png":
-{
- "frame": {"x":151,"y":887,"w":100,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":100,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/logic_gate-xor.png":
-{
- "frame": {"x":1392,"y":1126,"w":143,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/logic_gate.png":
-{
- "frame": {"x":1391,"y":1273,"w":143,"h":132},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":132},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/miner-chainable.png":
-{
- "frame": {"x":3,"y":1703,"w":136,"h":142},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/miner.png":
-{
- "frame": {"x":143,"y":1703,"w":136,"h":142},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":136,"h":142},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/mixer.png":
-{
- "frame": {"x":560,"y":594,"w":260,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/painter-double.png":
-{
- "frame": {"x":1683,"y":294,"w":288,"h":286},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":286},
- "sourceSize": {"w":288,"h":288}
-},
-"sprites/buildings/painter-mirrored.png":
-{
- "frame": {"x":555,"y":446,"w":288,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/painter-quad.png":
-{
- "frame": {"x":567,"y":3,"w":560,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":560,"h":144},
- "sourceSize": {"w":576,"h":144}
-},
-"sprites/buildings/painter.png":
-{
- "frame": {"x":3,"y":447,"w":288,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":288,"h":144},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/reader.png":
-{
- "frame": {"x":790,"y":1260,"w":141,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":141,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/rotater-ccw.png":
-{
- "frame": {"x":1083,"y":1319,"w":141,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/rotater-fl.png":
-{
- "frame": {"x":935,"y":1329,"w":141,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":141,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/rotater.png":
-{
- "frame": {"x":1228,"y":1408,"w":141,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":141,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/splitter-compact-inverse.png":
-{
- "frame": {"x":1080,"y":1466,"w":141,"h":136},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":3,"w":141,"h":136},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":559,"y":1178,"w":142,"h":136},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":3,"w":142,"h":136},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/splitter-compact-merge.png":
-{
- "frame": {"x":1658,"y":1473,"w":139,"h":136},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/splitter-compact.png":
-{
- "frame": {"x":1658,"y":1613,"w":139,"h":136},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":3,"w":139,"h":136},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/splitter.png":
-{
- "frame": {"x":295,"y":447,"w":256,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":0,"w":256,"h":143},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/stacker.png":
-{
- "frame": {"x":560,"y":741,"w":260,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":260,"h":143},
- "sourceSize": {"w":288,"h":144}
-},
-"sprites/buildings/trash-storage.png":
-{
- "frame": {"x":3,"y":595,"w":248,"h":288},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":22,"y":0,"w":248,"h":288},
- "sourceSize": {"w":288,"h":288}
-},
-"sprites/buildings/trash.png":
-{
- "frame": {"x":1397,"y":704,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/underground_belt_entry-tier2.png":
-{
- "frame": {"x":3,"y":1476,"w":137,"h":124},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":20,"w":137,"h":124},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/underground_belt_entry.png":
-{
- "frame": {"x":283,"y":1414,"w":137,"h":111},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":33,"w":137,"h":111},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/underground_belt_exit-tier2.png":
-{
- "frame": {"x":283,"y":1529,"w":137,"h":111},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/underground_belt_exit.png":
-{
- "frame": {"x":424,"y":1588,"w":137,"h":111},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":137,"h":111},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor-analyzer.png":
-{
- "frame": {"x":1675,"y":732,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor-rotater.png":
-{
- "frame": {"x":439,"y":890,"w":117,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":117,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor-shapecompare.png":
-{
- "frame": {"x":1244,"y":1271,"w":143,"h":133},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":143,"h":133},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor-stacker.png":
-{
- "frame": {"x":3,"y":1849,"w":130,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":130,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor-unstacker.png":
-{
- "frame": {"x":3,"y":1035,"w":144,"h":143},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":1,"w":144,"h":143},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/virtual_processor.png":
-{
- "frame": {"x":1249,"y":852,"w":144,"h":140},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":144,"h":140},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire-cross.png":
-{
- "frame": {"x":1672,"y":880,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire-split.png":
-{
- "frame": {"x":1667,"y":1028,"w":144,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire-turn.png":
-{
- "frame": {"x":1941,"y":631,"w":81,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire.png":
-{
- "frame": {"x":2027,"y":272,"w":18,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire_tunnel-coating.png":
-{
- "frame": {"x":255,"y":815,"w":32,"h":134},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":56,"y":5,"w":32,"h":134},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/buildings/wire_tunnel.png":
-{
- "frame": {"x":559,"y":1318,"w":137,"h":134},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":5,"w":137,"h":134},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/debug/acceptor_slot.png":
-{
- "frame": {"x":1107,"y":447,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-"sprites/debug/ejector_slot.png":
-{
- "frame": {"x":1107,"y":463,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-"sprites/misc/hub_direction_indicator.png":
-{
- "frame": {"x":1975,"y":272,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/misc/processor_disabled.png":
-{
- "frame": {"x":3,"y":1606,"w":78,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":10,"y":10,"w":78,"h":81},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/misc/processor_disconnected.png":
-{
- "frame": {"x":1975,"y":3,"w":65,"h":84},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":17,"y":8,"w":65,"h":84},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/misc/reader_overlay.png":
-{
- "frame": {"x":1820,"y":996,"w":104,"h":70},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":38,"w":104,"h":70},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/misc/slot_bad_arrow.png":
-{
- "frame": {"x":255,"y":638,"w":35,"h":35},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":2,"w":35,"h":35},
- "sourceSize": {"w":39,"h":39}
-},
-"sprites/misc/slot_good_arrow.png":
-{
- "frame": {"x":255,"y":595,"w":35,"h":39},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":35,"h":39},
- "sourceSize": {"w":39,"h":39}
-},
-"sprites/misc/storage_overlay.png":
-{
- "frame": {"x":1935,"y":1209,"w":89,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":89,"h":44},
- "sourceSize": {"w":90,"h":45}
-},
-"sprites/misc/waypoint.png":
-{
- "frame": {"x":48,"y":1997,"w":38,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":38,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/boolean_false.png":
-{
- "frame": {"x":255,"y":953,"w":31,"h":41},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":5,"w":31,"h":41},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/boolean_true.png":
-{
- "frame": {"x":1650,"y":556,"w":22,"h":41},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":5,"w":22,"h":41},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/display/blue.png":
-{
- "frame": {"x":1975,"y":376,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/cyan.png":
-{
- "frame": {"x":1975,"y":427,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/green.png":
-{
- "frame": {"x":1975,"y":478,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/purple.png":
-{
- "frame": {"x":1975,"y":529,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/red.png":
-{
- "frame": {"x":1975,"y":580,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/white.png":
-{
- "frame": {"x":90,"y":1997,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/display/yellow.png":
-{
- "frame": {"x":141,"y":1997,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":47},
- "sourceSize": {"w":49,"h":49}
-},
-"sprites/wires/lever_on.png":
-{
- "frame": {"x":1936,"y":978,"w":109,"h":127},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":18,"y":5,"w":109,"h":127},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/logical_acceptor.png":
-{
- "frame": {"x":1975,"y":91,"w":62,"h":106},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":43,"y":0,"w":62,"h":106},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/logical_ejector.png":
-{
- "frame": {"x":1975,"y":201,"w":60,"h":67},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":44,"y":0,"w":60,"h":67},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/network_conflict.png":
-{
- "frame": {"x":192,"y":1997,"w":47,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":2,"w":47,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/network_empty.png":
-{
- "frame": {"x":3,"y":1997,"w":41,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":41,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/overlay_tile.png":
-{
- "frame": {"x":1935,"y":1109,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/color_cross.png":
-{
- "frame": {"x":1101,"y":852,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/color_forward.png":
-{
- "frame": {"x":2026,"y":420,"w":18,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/color_split.png":
-{
- "frame": {"x":1667,"y":1113,"w":144,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/color_turn.png":
-{
- "frame": {"x":706,"y":1122,"w":81,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/conflict_cross.png":
-{
- "frame": {"x":824,"y":885,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/conflict_forward.png":
-{
- "frame": {"x":2026,"y":568,"w":18,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/conflict_split.png":
-{
- "frame": {"x":813,"y":1033,"w":144,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/conflict_turn.png":
-{
- "frame": {"x":705,"y":1207,"w":81,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/regular_cross.png":
-{
- "frame": {"x":1672,"y":880,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/regular_forward.png":
-{
- "frame": {"x":2027,"y":272,"w":18,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/regular_split.png":
-{
- "frame": {"x":1667,"y":1028,"w":144,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/regular_turn.png":
-{
- "frame": {"x":1941,"y":631,"w":81,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/shape_cross.png":
-{
- "frame": {"x":560,"y":888,"w":144,"h":144},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/shape_forward.png":
-{
- "frame": {"x":1107,"y":299,"w":18,"h":144},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":0,"w":18,"h":144},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/shape_split.png":
-{
- "frame": {"x":1097,"y":1086,"w":144,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":63,"w":144,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/sets/shape_turn.png":
-{
- "frame": {"x":705,"y":1292,"w":81,"h":81},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":63,"y":63,"w":81,"h":81},
- "sourceSize": {"w":144,"h":144}
-},
-"sprites/wires/wires_preview.png":
-{
- "frame": {"x":1975,"y":324,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-}},
-"meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "1.0",
- "image": "atlas0_hq.png",
- "format": "RGBA8888",
- "size": {"w":2048,"h":2048},
- "scale": "0.75",
- "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
-}
-}
diff --git a/res_built/atlas/atlas0_hq.png b/res_built/atlas/atlas0_hq.png
deleted file mode 100644
index f56d35d0..00000000
Binary files a/res_built/atlas/atlas0_hq.png and /dev/null differ
diff --git a/res_built/atlas/atlas0_lq.json b/res_built/atlas/atlas0_lq.json
deleted file mode 100644
index c5cdf2ad..00000000
--- a/res_built/atlas/atlas0_lq.json
+++ /dev/null
@@ -1,1476 +0,0 @@
-{"frames": {
-
-"sprites/belt/built/forward_0.png":
-{
- "frame": {"x":466,"y":519,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_1.png":
-{
- "frame": {"x":51,"y":961,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_2.png":
-{
- "frame": {"x":352,"y":869,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_3.png":
-{
- "frame": {"x":300,"y":891,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_4.png":
-{
- "frame": {"x":249,"y":893,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_5.png":
-{
- "frame": {"x":455,"y":864,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_6.png":
-{
- "frame": {"x":396,"y":912,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_7.png":
-{
- "frame": {"x":344,"y":921,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_8.png":
-{
- "frame": {"x":227,"y":973,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_9.png":
-{
- "frame": {"x":271,"y":973,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_10.png":
-{
- "frame": {"x":95,"y":961,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_11.png":
-{
- "frame": {"x":139,"y":941,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_12.png":
-{
- "frame": {"x":183,"y":917,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/forward_13.png":
-{
- "frame": {"x":183,"y":969,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_0.png":
-{
- "frame": {"x":326,"y":499,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_1.png":
-{
- "frame": {"x":465,"y":571,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_2.png":
-{
- "frame": {"x":323,"y":699,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_3.png":
-{
- "frame": {"x":275,"y":707,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_4.png":
-{
- "frame": {"x":323,"y":747,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_5.png":
-{
- "frame": {"x":208,"y":759,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_6.png":
-{
- "frame": {"x":156,"y":773,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_7.png":
-{
- "frame": {"x":105,"y":797,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_8.png":
-{
- "frame": {"x":54,"y":817,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_9.png":
-{
- "frame": {"x":3,"y":843,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_10.png":
-{
- "frame": {"x":465,"y":619,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_11.png":
-{
- "frame": {"x":324,"y":651,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_12.png":
-{
- "frame": {"x":223,"y":611,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/left_13.png":
-{
- "frame": {"x":275,"y":659,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_0.png":
-{
- "frame": {"x":311,"y":795,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_1.png":
-{
- "frame": {"x":256,"y":797,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_2.png":
-{
- "frame": {"x":3,"y":891,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_3.png":
-{
- "frame": {"x":359,"y":821,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_4.png":
-{
- "frame": {"x":304,"y":843,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_5.png":
-{
- "frame": {"x":252,"y":845,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_6.png":
-{
- "frame": {"x":201,"y":855,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_7.png":
-{
- "frame": {"x":150,"y":869,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_8.png":
-{
- "frame": {"x":99,"y":893,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_9.png":
-{
- "frame": {"x":51,"y":913,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_10.png":
-{
- "frame": {"x":204,"y":807,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_11.png":
-{
- "frame": {"x":153,"y":821,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_12.png":
-{
- "frame": {"x":102,"y":845,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/belt/built/right_13.png":
-{
- "frame": {"x":51,"y":865,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/belt_left.png":
-{
- "frame": {"x":3,"y":939,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/belt_right.png":
-{
- "frame": {"x":407,"y":864,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/belt_top.png":
-{
- "frame": {"x":315,"y":973,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/constant_signal.png":
-{
- "frame": {"x":426,"y":411,"w":36,"h":43},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/cutter-quad.png":
-{
- "frame": {"x":191,"y":55,"w":184,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
- "sourceSize": {"w":192,"h":48}
-},
-"sprites/blueprints/cutter.png":
-{
- "frame": {"x":95,"y":296,"w":87,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/display.png":
-{
- "frame": {"x":326,"y":399,"w":44,"h":46},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/filter.png":
-{
- "frame": {"x":3,"y":244,"w":91,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":91,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/lever.png":
-{
- "frame": {"x":231,"y":467,"w":38,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":1,"w":38,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/logic_gate-not.png":
-{
- "frame": {"x":467,"y":311,"w":42,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":42,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/logic_gate-or.png":
-{
- "frame": {"x":423,"y":818,"w":48,"h":42},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/logic_gate-transistor.png":
-{
- "frame": {"x":426,"y":534,"w":35,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/logic_gate-xor.png":
-{
- "frame": {"x":291,"y":159,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/logic_gate.png":
-{
- "frame": {"x":171,"y":622,"w":48,"h":45},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/miner-chainable.png":
-{
- "frame": {"x":107,"y":648,"w":47,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/miner.png":
-{
- "frame": {"x":55,"y":672,"w":47,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/mixer.png":
-{
- "frame": {"x":98,"y":244,"w":89,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/painter-double.png":
-{
- "frame": {"x":387,"y":3,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/painter-mirrored.png":
-{
- "frame": {"x":191,"y":159,"w":96,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/painter-quad.png":
-{
- "frame": {"x":3,"y":3,"w":188,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
- "sourceSize": {"w":192,"h":48}
-},
-"sprites/blueprints/painter.png":
-{
- "frame": {"x":375,"y":203,"w":96,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/reader.png":
-{
- "frame": {"x":291,"y":211,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/rotater-ccw.png":
-{
- "frame": {"x":274,"y":399,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/rotater-fl.png":
-{
- "frame": {"x":374,"y":411,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/rotater.png":
-{
- "frame": {"x":274,"y":451,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/splitter-compact-inverse.png":
-{
- "frame": {"x":374,"y":463,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":374,"y":515,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/splitter-compact-merge.png":
-{
- "frame": {"x":106,"y":700,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/splitter-compact.png":
-{
- "frame": {"x":54,"y":724,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/splitter.png":
-{
- "frame": {"x":186,"y":315,"w":87,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/stacker.png":
-{
- "frame": {"x":374,"y":307,"w":89,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/blueprints/trash-storage.png":
-{
- "frame": {"x":285,"y":299,"w":85,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/trash.png":
-{
- "frame": {"x":3,"y":400,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/underground_belt_entry-tier2.png":
-{
- "frame": {"x":447,"y":771,"w":48,"h":43},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/underground_belt_entry.png":
-{
- "frame": {"x":55,"y":556,"w":48,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/underground_belt_exit-tier2.png":
-{
- "frame": {"x":55,"y":598,"w":48,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/underground_belt_exit.png":
-{
- "frame": {"x":107,"y":606,"w":48,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor-analyzer.png":
-{
- "frame": {"x":55,"y":400,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor-rotater.png":
-{
- "frame": {"x":466,"y":415,"w":41,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":41,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor-shapecompare.png":
-{
- "frame": {"x":223,"y":659,"w":48,"h":45},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor-stacker.png":
-{
- "frame": {"x":325,"y":547,"w":45,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":45,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor-unstacker.png":
-{
- "frame": {"x":107,"y":400,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/virtual_processor.png":
-{
- "frame": {"x":3,"y":452,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire-cross.png":
-{
- "frame": {"x":55,"y":452,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire-split.png":
-{
- "frame": {"x":285,"y":263,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire-turn.png":
-{
- "frame": {"x":479,"y":162,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire.png":
-{
- "frame": {"x":159,"y":520,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire_tunnel-coating.png":
-{
- "frame": {"x":426,"y":655,"w":12,"h":46},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/blueprints/wire_tunnel.png":
-{
- "frame": {"x":107,"y":504,"w":48,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/belt_left.png":
-{
- "frame": {"x":326,"y":499,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/belt_right.png":
-{
- "frame": {"x":311,"y":795,"w":44,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":44,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/belt_top.png":
-{
- "frame": {"x":466,"y":519,"w":40,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":40,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/constant_signal.png":
-{
- "frame": {"x":426,"y":458,"w":36,"h":43},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":0,"w":36,"h":43},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/cutter-quad.png":
-{
- "frame": {"x":191,"y":107,"w":184,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
- "sourceSize": {"w":192,"h":48}
-},
-"sprites/buildings/cutter.png":
-{
- "frame": {"x":3,"y":348,"w":87,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/display.png":
-{
- "frame": {"x":326,"y":449,"w":44,"h":46},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":2,"w":44,"h":46},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/filter.png":
-{
- "frame": {"x":191,"y":263,"w":90,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":90,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/hub.png":
-{
- "frame": {"x":3,"y":55,"w":184,"h":185},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":4,"w":184,"h":185},
- "sourceSize": {"w":192,"h":192}
-},
-"sprites/buildings/lever.png":
-{
- "frame": {"x":231,"y":515,"w":38,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":1,"w":38,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/logic_gate-not.png":
-{
- "frame": {"x":466,"y":363,"w":43,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":43,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/logic_gate-or.png":
-{
- "frame": {"x":3,"y":556,"w":48,"h":42},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":42},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/logic_gate-transistor.png":
-{
- "frame": {"x":426,"y":586,"w":35,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":35,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/logic_gate-xor.png":
-{
- "frame": {"x":107,"y":452,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/logic_gate.png":
-{
- "frame": {"x":371,"y":723,"w":48,"h":45},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/miner-chainable.png":
-{
- "frame": {"x":3,"y":698,"w":47,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/miner.png":
-{
- "frame": {"x":158,"y":671,"w":47,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/mixer.png":
-{
- "frame": {"x":374,"y":359,"w":88,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/painter-double.png":
-{
- "frame": {"x":379,"y":103,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/painter-mirrored.png":
-{
- "frame": {"x":191,"y":211,"w":96,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/painter-quad.png":
-{
- "frame": {"x":195,"y":3,"w":188,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
- "sourceSize": {"w":192,"h":48}
-},
-"sprites/buildings/painter.png":
-{
- "frame": {"x":375,"y":255,"w":96,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/reader.png":
-{
- "frame": {"x":179,"y":467,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/rotater-ccw.png":
-{
- "frame": {"x":273,"y":503,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/rotater-fl.png":
-{
- "frame": {"x":374,"y":567,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/rotater.png":
-{
- "frame": {"x":273,"y":555,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/splitter-compact-inverse.png":
-{
- "frame": {"x":107,"y":555,"w":48,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":171,"y":571,"w":48,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/splitter-compact-merge.png":
-{
- "frame": {"x":3,"y":750,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/splitter-compact.png":
-{
- "frame": {"x":209,"y":708,"w":47,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/splitter.png":
-{
- "frame": {"x":94,"y":348,"w":87,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/stacker.png":
-{
- "frame": {"x":3,"y":296,"w":88,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
- "sourceSize": {"w":96,"h":48}
-},
-"sprites/buildings/trash-storage.png":
-{
- "frame": {"x":185,"y":367,"w":85,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/trash.png":
-{
- "frame": {"x":374,"y":619,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/underground_belt_entry-tier2.png":
-{
- "frame": {"x":105,"y":751,"w":47,"h":42},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/underground_belt_entry.png":
-{
- "frame": {"x":54,"y":775,"w":47,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/underground_belt_exit-tier2.png":
-{
- "frame": {"x":3,"y":801,"w":47,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/underground_belt_exit.png":
-{
- "frame": {"x":260,"y":755,"w":47,"h":38},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor-analyzer.png":
-{
- "frame": {"x":178,"y":519,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor-rotater.png":
-{
- "frame": {"x":466,"y":467,"w":41,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":4,"y":0,"w":41,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor-shapecompare.png":
-{
- "frame": {"x":371,"y":772,"w":48,"h":45},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":45},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor-stacker.png":
-{
- "frame": {"x":325,"y":599,"w":45,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":45,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor-unstacker.png":
-{
- "frame": {"x":272,"y":607,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/virtual_processor.png":
-{
- "frame": {"x":372,"y":671,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire-cross.png":
-{
- "frame": {"x":458,"y":667,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire-split.png":
-{
- "frame": {"x":3,"y":602,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire-turn.png":
-{
- "frame": {"x":479,"y":194,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire.png":
-{
- "frame": {"x":159,"y":572,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire_tunnel-coating.png":
-{
- "frame": {"x":442,"y":655,"w":12,"h":46},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":18,"y":1,"w":12,"h":46},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/buildings/wire_tunnel.png":
-{
- "frame": {"x":157,"y":723,"w":47,"h":46},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":47,"h":46},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/debug/acceptor_slot.png":
-{
- "frame": {"x":379,"y":55,"w":4,"h":4},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4},
- "sourceSize": {"w":4,"h":4}
-},
-"sprites/debug/ejector_slot.png":
-{
- "frame": {"x":379,"y":63,"w":4,"h":4},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":4,"h":4},
- "sourceSize": {"w":4,"h":4}
-},
-"sprites/misc/hub_direction_indicator.png":
-{
- "frame": {"x":487,"y":30,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/misc/processor_disabled.png":
-{
- "frame": {"x":479,"y":129,"w":28,"h":29},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":2,"w":28,"h":29},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/misc/processor_disconnected.png":
-{
- "frame": {"x":475,"y":258,"w":23,"h":29},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":2,"w":23,"h":29},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/misc/reader_overlay.png":
-{
- "frame": {"x":426,"y":505,"w":36,"h":25},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":12,"w":36,"h":25},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/misc/slot_bad_arrow.png":
-{
- "frame": {"x":426,"y":638,"w":13,"h":13},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
- "sourceSize": {"w":13,"h":13}
-},
-"sprites/misc/slot_good_arrow.png":
-{
- "frame": {"x":443,"y":638,"w":13,"h":13},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
- "sourceSize": {"w":13,"h":13}
-},
-"sprites/misc/storage_overlay.png":
-{
- "frame": {"x":479,"y":110,"w":30,"h":15},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":30,"h":15},
- "sourceSize": {"w":30,"h":15}
-},
-"sprites/misc/waypoint.png":
-{
- "frame": {"x":495,"y":291,"w":14,"h":16},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/boolean_false.png":
-{
- "frame": {"x":424,"y":705,"w":12,"h":15},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":1,"w":12,"h":15},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/boolean_true.png":
-{
- "frame": {"x":440,"y":705,"w":9,"h":15},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":1,"w":9,"h":15},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/blue.png":
-{
- "frame": {"x":487,"y":50,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/cyan.png":
-{
- "frame": {"x":487,"y":70,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/green.png":
-{
- "frame": {"x":487,"y":90,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/purple.png":
-{
- "frame": {"x":475,"y":291,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/red.png":
-{
- "frame": {"x":159,"y":400,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/white.png":
-{
- "frame": {"x":159,"y":420,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/display/yellow.png":
-{
- "frame": {"x":159,"y":440,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/lever_on.png":
-{
- "frame": {"x":230,"y":563,"w":38,"h":44},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":1,"w":38,"h":44},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/logical_acceptor.png":
-{
- "frame": {"x":343,"y":259,"w":23,"h":36},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":0,"w":23,"h":36},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/logical_ejector.png":
-{
- "frame": {"x":487,"y":3,"w":22,"h":23},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":22,"h":23},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/network_conflict.png":
-{
- "frame": {"x":159,"y":460,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/network_empty.png":
-{
- "frame": {"x":159,"y":500,"w":15,"h":16},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":15,"h":16},
- "sourceSize": {"w":16,"h":16}
-},
-"sprites/wires/overlay_tile.png":
-{
- "frame": {"x":343,"y":159,"w":32,"h":32},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/sets/color_cross.png":
-{
- "frame": {"x":453,"y":719,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/color_forward.png":
-{
- "frame": {"x":423,"y":724,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/color_split.png":
-{
- "frame": {"x":3,"y":634,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/color_turn.png":
-{
- "frame": {"x":343,"y":195,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/conflict_cross.png":
-{
- "frame": {"x":3,"y":504,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/conflict_forward.png":
-{
- "frame": {"x":435,"y":724,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/conflict_split.png":
-{
- "frame": {"x":55,"y":640,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/conflict_turn.png":
-{
- "frame": {"x":475,"y":226,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/regular_cross.png":
-{
- "frame": {"x":458,"y":667,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/regular_forward.png":
-{
- "frame": {"x":159,"y":572,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/regular_split.png":
-{
- "frame": {"x":3,"y":602,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/regular_turn.png":
-{
- "frame": {"x":479,"y":194,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/shape_cross.png":
-{
- "frame": {"x":55,"y":504,"w":48,"h":48},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/shape_forward.png":
-{
- "frame": {"x":499,"y":771,"w":8,"h":48},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":0,"w":8,"h":48},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/shape_split.png":
-{
- "frame": {"x":3,"y":666,"w":48,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":20,"w":48,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/sets/shape_turn.png":
-{
- "frame": {"x":343,"y":227,"w":28,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":20,"y":20,"w":28,"h":28},
- "sourceSize": {"w":48,"h":48}
-},
-"sprites/wires/wires_preview.png":
-{
- "frame": {"x":159,"y":480,"w":16,"h":16},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":16},
- "sourceSize": {"w":16,"h":16}
-}},
-"meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "1.0",
- "image": "atlas0_lq.png",
- "format": "RGBA8888",
- "size": {"w":512,"h":1024},
- "scale": "0.25",
- "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
-}
-}
diff --git a/res_built/atlas/atlas0_lq.png b/res_built/atlas/atlas0_lq.png
deleted file mode 100644
index 1c60156c..00000000
Binary files a/res_built/atlas/atlas0_lq.png and /dev/null differ
diff --git a/res_built/atlas/atlas0_mq.json b/res_built/atlas/atlas0_mq.json
deleted file mode 100644
index c5d7d311..00000000
--- a/res_built/atlas/atlas0_mq.json
+++ /dev/null
@@ -1,1476 +0,0 @@
-{"frames": {
-
-"sprites/belt/built/forward_0.png":
-{
- "frame": {"x":943,"y":803,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_1.png":
-{
- "frame": {"x":94,"y":1746,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_2.png":
-{
- "frame": {"x":754,"y":1555,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_3.png":
-{
- "frame": {"x":653,"y":1564,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_4.png":
-{
- "frame": {"x":556,"y":1601,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_5.png":
-{
- "frame": {"x":458,"y":1663,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_6.png":
-{
- "frame": {"x":359,"y":1711,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_7.png":
-{
- "frame": {"x":268,"y":1771,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_8.png":
-{
- "frame": {"x":176,"y":1835,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_9.png":
-{
- "frame": {"x":85,"y":1846,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_10.png":
-{
- "frame": {"x":3,"y":1789,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_11.png":
-{
- "frame": {"x":3,"y":1889,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_12.png":
-{
- "frame": {"x":856,"y":1469,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/forward_13.png":
-{
- "frame": {"x":938,"y":1469,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_0.png":
-{
- "frame": {"x":403,"y":911,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_1.png":
-{
- "frame": {"x":403,"y":1002,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_2.png":
-{
- "frame": {"x":3,"y":1516,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_3.png":
-{
- "frame": {"x":785,"y":1191,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_4.png":
-{
- "frame": {"x":876,"y":1196,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_5.png":
-{
- "frame": {"x":785,"y":1282,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_6.png":
-{
- "frame": {"x":685,"y":1287,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_7.png":
-{
- "frame": {"x":583,"y":1325,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_8.png":
-{
- "frame": {"x":482,"y":1381,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_9.png":
-{
- "frame": {"x":383,"y":1429,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_10.png":
-{
- "frame": {"x":391,"y":1338,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_11.png":
-{
- "frame": {"x":292,"y":1398,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_12.png":
-{
- "frame": {"x":196,"y":1462,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/left_13.png":
-{
- "frame": {"x":99,"y":1473,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_0.png":
-{
- "frame": {"x":287,"y":1489,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_1.png":
-{
- "frame": {"x":190,"y":1553,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_2.png":
-{
- "frame": {"x":674,"y":1378,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_3.png":
-{
- "frame": {"x":573,"y":1416,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_4.png":
-{
- "frame": {"x":474,"y":1472,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_5.png":
-{
- "frame": {"x":378,"y":1520,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_6.png":
-{
- "frame": {"x":281,"y":1580,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_7.png":
-{
- "frame": {"x":185,"y":1644,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_8.png":
-{
- "frame": {"x":94,"y":1655,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_9.png":
-{
- "frame": {"x":3,"y":1698,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_10.png":
-{
- "frame": {"x":94,"y":1564,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_11.png":
-{
- "frame": {"x":3,"y":1607,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_12.png":
-{
- "frame": {"x":876,"y":1287,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/belt/built/right_13.png":
-{
- "frame": {"x":776,"y":1373,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/belt_left.png":
-{
- "frame": {"x":867,"y":1378,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/belt_right.png":
-{
- "frame": {"x":765,"y":1464,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/belt_top.png":
-{
- "frame": {"x":85,"y":1946,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/constant_signal.png":
-{
- "frame": {"x":949,"y":396,"w":71,"h":85},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":0,"w":71,"h":85},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/cutter-quad.png":
-{
- "frame": {"x":373,"y":103,"w":366,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
- "sourceSize": {"w":384,"h":96}
-},
-"sprites/blueprints/cutter.png":
-{
- "frame": {"x":745,"y":594,"w":172,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":172,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/display.png":
-{
- "frame": {"x":664,"y":1469,"w":86,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":5,"y":5,"w":86,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/filter.png":
-{
- "frame": {"x":569,"y":303,"w":180,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":10,"y":0,"w":180,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/lever.png":
-{
- "frame": {"x":167,"y":1935,"w":75,"h":86},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":3,"w":75,"h":86},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/logic_gate-not.png":
-{
- "frame": {"x":469,"y":1563,"w":83,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":7,"y":0,"w":83,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/logic_gate-or.png":
-{
- "frame": {"x":303,"y":903,"w":96,"h":82},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":82},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/logic_gate-transistor.png":
-{
- "frame": {"x":451,"y":703,"w":68,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/logic_gate-xor.png":
-{
- "frame": {"x":3,"y":674,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/logic_gate.png":
-{
- "frame": {"x":910,"y":1103,"w":96,"h":89},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/miner-chainable.png":
-{
- "frame": {"x":100,"y":1373,"w":92,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/miner.png":
-{
- "frame": {"x":3,"y":1416,"w":92,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/mixer.png":
-{
- "frame": {"x":3,"y":474,"w":175,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/painter-double.png":
-{
- "frame": {"x":759,"y":3,"w":192,"h":192},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":192},
- "sourceSize": {"w":192,"h":192}
-},
-"sprites/blueprints/painter-mirrored.png":
-{
- "frame": {"x":373,"y":303,"w":192,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/painter-quad.png":
-{
- "frame": {"x":3,"y":3,"w":374,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
- "sourceSize": {"w":384,"h":96}
-},
-"sprites/blueprints/painter.png":
-{
- "frame": {"x":753,"y":394,"w":192,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/reader.png":
-{
- "frame": {"x":3,"y":926,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/rotater-ccw.png":
-{
- "frame": {"x":103,"y":674,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/rotater-fl.png":
-{
- "frame": {"x":102,"y":983,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/rotater.png":
-{
- "frame": {"x":203,"y":674,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/splitter-compact-inverse.png":
-{
- "frame": {"x":300,"y":1047,"w":95,"h":93},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":201,"y":1111,"w":95,"h":93},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/splitter-compact-merge.png":
-{
- "frame": {"x":300,"y":1144,"w":93,"h":93},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/splitter-compact.png":
-{
- "frame": {"x":201,"y":1208,"w":93,"h":93},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/splitter.png":
-{
- "frame": {"x":3,"y":574,"w":171,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/stacker.png":
-{
- "frame": {"x":182,"y":474,"w":175,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/blueprints/trash-storage.png":
-{
- "frame": {"x":528,"y":603,"w":167,"h":192},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":167,"h":192},
- "sourceSize": {"w":192,"h":192}
-},
-"sprites/blueprints/trash.png":
-{
- "frame": {"x":351,"y":703,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/underground_belt_entry-tier2.png":
-{
- "frame": {"x":397,"y":1172,"w":93,"h":84},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":12,"w":93,"h":84},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/underground_belt_entry.png":
-{
- "frame": {"x":298,"y":1241,"w":93,"h":75},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":21,"w":93,"h":75},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/underground_belt_exit-tier2.png":
-{
- "frame": {"x":399,"y":1093,"w":94,"h":75},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":94,"h":75},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/underground_belt_exit.png":
-{
- "frame": {"x":198,"y":1305,"w":93,"h":75},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":0,"w":93,"h":75},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor-analyzer.png":
-{
- "frame": {"x":523,"y":799,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor-rotater.png":
-{
- "frame": {"x":276,"y":1671,"w":79,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor-shapecompare.png":
-{
- "frame": {"x":3,"y":774,"w":96,"h":89},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor-stacker.png":
-{
- "frame": {"x":931,"y":903,"w":88,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":88,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor-unstacker.png":
-{
- "frame": {"x":349,"y":803,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/virtual_processor.png":
-{
- "frame": {"x":710,"y":1090,"w":96,"h":94},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":96,"h":94},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire-cross.png":
-{
- "frame": {"x":522,"y":899,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire-split.png":
-{
- "frame": {"x":3,"y":867,"w":96,"h":55},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":41,"w":96,"h":55},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire-turn.png":
-{
- "frame": {"x":955,"y":105,"w":55,"h":55},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":41,"y":41,"w":55,"h":55},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire.png":
-{
- "frame": {"x":699,"y":603,"w":14,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":41,"y":0,"w":14,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire_tunnel-coating.png":
-{
- "frame": {"x":921,"y":594,"w":23,"h":90},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":37,"y":3,"w":23,"h":90},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/blueprints/wire_tunnel.png":
-{
- "frame": {"x":101,"y":1278,"w":93,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":2,"y":2,"w":93,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/belt_left.png":
-{
- "frame": {"x":403,"y":911,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/belt_right.png":
-{
- "frame": {"x":287,"y":1489,"w":87,"h":87},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":9,"w":87,"h":87},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/belt_top.png":
-{
- "frame": {"x":943,"y":803,"w":78,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":78,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/constant_signal.png":
-{
- "frame": {"x":949,"y":485,"w":70,"h":85},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":0,"w":70,"h":85},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/cutter-quad.png":
-{
- "frame": {"x":373,"y":203,"w":366,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
- "sourceSize": {"w":384,"h":96}
-},
-"sprites/buildings/cutter.png":
-{
- "frame": {"x":178,"y":574,"w":171,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/display.png":
-{
- "frame": {"x":565,"y":1507,"w":84,"h":90},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":6,"w":84,"h":90},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/filter.png":
-{
- "frame": {"x":569,"y":403,"w":179,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":179,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/hub.png":
-{
- "frame": {"x":3,"y":103,"w":366,"h":367},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":10,"w":366,"h":367},
- "sourceSize": {"w":384,"h":384}
-},
-"sprites/buildings/lever.png":
-{
- "frame": {"x":948,"y":574,"w":73,"h":85},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":12,"y":3,"w":73,"h":85},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/logic_gate-not.png":
-{
- "frame": {"x":372,"y":1611,"w":82,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":8,"y":0,"w":82,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/logic_gate-or.png":
-{
- "frame": {"x":203,"y":866,"w":96,"h":83},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":83},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/logic_gate-transistor.png":
-{
- "frame": {"x":623,"y":799,"w":68,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":68,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/logic_gate-xor.png":
-{
- "frame": {"x":610,"y":1033,"w":96,"h":95},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":95},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/logic_gate.png":
-{
- "frame": {"x":203,"y":774,"w":96,"h":88},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":88},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/miner-chainable.png":
-{
- "frame": {"x":690,"y":1188,"w":91,"h":95},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/miner.png":
-{
- "frame": {"x":590,"y":1226,"w":91,"h":95},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/mixer.png":
-{
- "frame": {"x":361,"y":503,"w":174,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/painter-double.png":
-{
- "frame": {"x":759,"y":199,"w":192,"h":191},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":191},
- "sourceSize": {"w":192,"h":192}
-},
-"sprites/buildings/painter-mirrored.png":
-{
- "frame": {"x":373,"y":403,"w":192,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/painter-quad.png":
-{
- "frame": {"x":381,"y":3,"w":374,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
- "sourceSize": {"w":384,"h":96}
-},
-"sprites/buildings/painter.png":
-{
- "frame": {"x":752,"y":494,"w":192,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/reader.png":
-{
- "frame": {"x":3,"y":1026,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/rotater-ccw.png":
-{
- "frame": {"x":201,"y":1011,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/rotater-fl.png":
-{
- "frame": {"x":102,"y":1083,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/rotater.png":
-{
- "frame": {"x":3,"y":1126,"w":95,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/splitter-compact-inverse.png":
-{
- "frame": {"x":3,"y":1226,"w":94,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":94,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/splitter-compact-merge-inverse.png":
-{
- "frame": {"x":102,"y":1183,"w":95,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":95,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/splitter-compact-merge.png":
-{
- "frame": {"x":3,"y":1321,"w":93,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/splitter-compact.png":
-{
- "frame": {"x":497,"y":1099,"w":93,"h":91},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/splitter.png":
-{
- "frame": {"x":353,"y":603,"w":171,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/stacker.png":
-{
- "frame": {"x":539,"y":503,"w":174,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
- "sourceSize": {"w":192,"h":96}
-},
-"sprites/buildings/trash-storage.png":
-{
- "frame": {"x":736,"y":694,"w":166,"h":192},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":14,"y":0,"w":166,"h":192},
- "sourceSize": {"w":192,"h":192}
-},
-"sprites/buildings/trash.png":
-{
- "frame": {"x":731,"y":890,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/underground_belt_entry-tier2.png":
-{
- "frame": {"x":494,"y":1194,"w":92,"h":83},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":13,"w":92,"h":83},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/underground_belt_entry.png":
-{
- "frame": {"x":395,"y":1260,"w":92,"h":74},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":22,"w":92,"h":74},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/underground_belt_exit-tier2.png":
-{
- "frame": {"x":295,"y":1320,"w":92,"h":74},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/underground_belt_exit.png":
-{
- "frame": {"x":196,"y":1384,"w":92,"h":74},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor-analyzer.png":
-{
- "frame": {"x":622,"y":933,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor-rotater.png":
-{
- "frame": {"x":185,"y":1735,"w":79,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":9,"y":0,"w":79,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor-shapecompare.png":
-{
- "frame": {"x":103,"y":774,"w":96,"h":89},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":89},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor-stacker.png":
-{
- "frame": {"x":491,"y":1281,"w":88,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":0,"w":88,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor-unstacker.png":
-{
- "frame": {"x":510,"y":999,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/virtual_processor.png":
-{
- "frame": {"x":810,"y":1093,"w":96,"h":94},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":2,"w":96,"h":94},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire-cross.png":
-{
- "frame": {"x":831,"y":893,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire-split.png":
-{
- "frame": {"x":103,"y":867,"w":96,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire-turn.png":
-{
- "frame": {"x":955,"y":164,"w":54,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire.png":
-{
- "frame": {"x":743,"y":103,"w":12,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire_tunnel-coating.png":
-{
- "frame": {"x":921,"y":688,"w":22,"h":90},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":37,"y":3,"w":22,"h":90},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/buildings/wire_tunnel.png":
-{
- "frame": {"x":594,"y":1132,"w":92,"h":90},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":3,"w":92,"h":90},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/debug/acceptor_slot.png":
-{
- "frame": {"x":1013,"y":164,"w":8,"h":8},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
- "sourceSize": {"w":8,"h":8}
-},
-"sprites/debug/ejector_slot.png":
-{
- "frame": {"x":1013,"y":176,"w":8,"h":8},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
- "sourceSize": {"w":8,"h":8}
-},
-"sprites/misc/hub_direction_indicator.png":
-{
- "frame": {"x":695,"y":851,"w":32,"h":32},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/misc/processor_disabled.png":
-{
- "frame": {"x":449,"y":803,"w":53,"h":55},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":6,"w":53,"h":55},
- "sourceSize": {"w":64,"h":64}
-},
-"sprites/misc/processor_disconnected.png":
-{
- "frame": {"x":303,"y":674,"w":44,"h":57},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":11,"y":5,"w":44,"h":57},
- "sourceSize": {"w":64,"h":64}
-},
-"sprites/misc/reader_overlay.png":
-{
- "frame": {"x":947,"y":752,"w":70,"h":47},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":13,"y":25,"w":70,"h":47},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/misc/slot_bad_arrow.png":
-{
- "frame": {"x":717,"y":605,"w":24,"h":24},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":1,"w":24,"h":24},
- "sourceSize": {"w":26,"h":26}
-},
-"sprites/misc/slot_good_arrow.png":
-{
- "frame": {"x":717,"y":575,"w":24,"h":26},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":1,"y":0,"w":24,"h":26},
- "sourceSize": {"w":26,"h":26}
-},
-"sprites/misc/storage_overlay.png":
-{
- "frame": {"x":955,"y":71,"w":60,"h":30},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":60,"h":30},
- "sourceSize": {"w":60,"h":30}
-},
-"sprites/misc/waypoint.png":
-{
- "frame": {"x":717,"y":539,"w":26,"h":32},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/boolean_false.png":
-{
- "frame": {"x":717,"y":633,"w":21,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":6,"y":3,"w":21,"h":28},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/boolean_true.png":
-{
- "frame": {"x":717,"y":665,"w":15,"h":28},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":7,"y":3,"w":15,"h":28},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/display/blue.png":
-{
- "frame": {"x":699,"y":703,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/cyan.png":
-{
- "frame": {"x":699,"y":740,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/green.png":
-{
- "frame": {"x":699,"y":777,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/purple.png":
-{
- "frame": {"x":906,"y":782,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/red.png":
-{
- "frame": {"x":906,"y":819,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/white.png":
-{
- "frame": {"x":906,"y":856,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/display/yellow.png":
-{
- "frame": {"x":695,"y":814,"w":33,"h":33},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33},
- "sourceSize": {"w":33,"h":33}
-},
-"sprites/wires/lever_on.png":
-{
- "frame": {"x":948,"y":663,"w":73,"h":85},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":12,"y":3,"w":73,"h":85},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/logical_acceptor.png":
-{
- "frame": {"x":303,"y":735,"w":42,"h":71},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":28,"y":0,"w":42,"h":71},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/logical_ejector.png":
-{
- "frame": {"x":449,"y":862,"w":41,"h":45},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":29,"y":0,"w":41,"h":45},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/network_conflict.png":
-{
- "frame": {"x":622,"y":899,"w":32,"h":30},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":1,"w":32,"h":30},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/network_empty.png":
-{
- "frame": {"x":717,"y":503,"w":28,"h":32},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":3,"y":0,"w":28,"h":32},
- "sourceSize": {"w":32,"h":32}
-},
-"sprites/wires/overlay_tile.png":
-{
- "frame": {"x":955,"y":3,"w":64,"h":64},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
- "sourceSize": {"w":64,"h":64}
-},
-"sprites/wires/sets/color_cross.png":
-{
- "frame": {"x":722,"y":990,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/color_forward.png":
-{
- "frame": {"x":743,"y":203,"w":12,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/color_split.png":
-{
- "frame": {"x":103,"y":925,"w":96,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/color_turn.png":
-{
- "frame": {"x":955,"y":222,"w":54,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/conflict_cross.png":
-{
- "frame": {"x":822,"y":993,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/conflict_forward.png":
-{
- "frame": {"x":506,"y":803,"w":12,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/conflict_split.png":
-{
- "frame": {"x":203,"y":953,"w":96,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/conflict_turn.png":
-{
- "frame": {"x":955,"y":280,"w":54,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/regular_cross.png":
-{
- "frame": {"x":831,"y":893,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/regular_forward.png":
-{
- "frame": {"x":743,"y":103,"w":12,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/regular_split.png":
-{
- "frame": {"x":103,"y":867,"w":96,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/regular_turn.png":
-{
- "frame": {"x":955,"y":164,"w":54,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/shape_cross.png":
-{
- "frame": {"x":922,"y":1003,"w":96,"h":96},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/shape_forward.png":
-{
- "frame": {"x":494,"y":903,"w":12,"h":96},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":0,"w":12,"h":96},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/shape_split.png":
-{
- "frame": {"x":303,"y":989,"w":96,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":0,"y":42,"w":96,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/sets/shape_turn.png":
-{
- "frame": {"x":955,"y":338,"w":54,"h":54},
- "rotated": false,
- "trimmed": true,
- "spriteSourceSize": {"x":42,"y":42,"w":54,"h":54},
- "sourceSize": {"w":96,"h":96}
-},
-"sprites/wires/wires_preview.png":
-{
- "frame": {"x":695,"y":887,"w":32,"h":32},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":32,"h":32},
- "sourceSize": {"w":32,"h":32}
-}},
-"meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "1.0",
- "image": "atlas0_mq.png",
- "format": "RGBA8888",
- "size": {"w":1024,"h":2048},
- "scale": "0.5",
- "smartupdate": "$TexturePacker:SmartUpdate:d21082eda6f288e04b0739186004794d:0912211652d1c400e2846013f9de057b:908b89f5ca8ff73e331a35a3b14d0604$"
-}
-}
diff --git a/res_built/atlas/atlas0_mq.png b/res_built/atlas/atlas0_mq.png
deleted file mode 100644
index 9e9b97c6..00000000
Binary files a/res_built/atlas/atlas0_mq.png and /dev/null differ
diff --git a/res_raw/atlas.json b/res_raw/atlas.json
new file mode 100644
index 00000000..9e548568
--- /dev/null
+++ b/res_raw/atlas.json
@@ -0,0 +1,22 @@
+{
+ "pot": true,
+ "paddingX": 2,
+ "paddingY": 2,
+ "edgePadding": true,
+ "rotation": false,
+ "maxWidth": 2048,
+ "useIndexes": false,
+ "alphaThreshold": 1,
+ "maxHeight": 2048,
+ "stripWhitespaceX": true,
+ "stripWhitespaceY": true,
+ "duplicatePadding": true,
+ "alias": true,
+ "fast": false,
+ "limitMemory": false,
+ "combineSubdirectories": true,
+ "flattenPaths": false,
+ "bleedIterations": 4,
+ "scale": [0.25, 0.5, 0.75],
+ "scaleSuffix": ["_lq", "_mq", "_hq"]
+}
diff --git a/res_raw/atlas.tps b/res_raw/atlas.tps
deleted file mode 100644
index 947bdb04..00000000
--- a/res_raw/atlas.tps
+++ /dev/null
@@ -1,623 +0,0 @@
-
-
-
- fileFormatVersion
- 4
- texturePackerVersion
- 5.4.0
- autoSDSettings
-
-
- scale
- 0.75
- extension
- _hq
- spriteFilter
-
- acceptFractionalValues
-
- maxTextureSize
-
- width
- 2048
- height
- 2048
-
-
-
- scale
- 0.5
- extension
- _mq
- spriteFilter
-
- acceptFractionalValues
-
- maxTextureSize
-
- width
- 2048
- height
- 2048
-
-
-
- scale
- 0.25
- extension
- _lq
- spriteFilter
-
- acceptFractionalValues
-
- maxTextureSize
-
- width
- 2048
- height
- 2048
-
-
-
- allowRotation
-
- shapeDebug
-
- dpi
- 72
- dataFormat
- json
- textureFileName
-
- flipPVR
-
- pvrCompressionQuality
- PVR_QUALITY_NORMAL
- atfCompressData
-
- mipMapMinSize
- 32768
- etc1CompressionQuality
- ETC1_QUALITY_LOW_PERCEPTUAL
- etc2CompressionQuality
- ETC2_QUALITY_LOW_PERCEPTUAL
- dxtCompressionMode
- DXT_PERCEPTUAL
- jxrColorFormat
- JXR_YUV444
- jxrTrimFlexBits
- 0
- jxrCompressionLevel
- 0
- ditherType
- NearestNeighbour
- backgroundColor
- 0
- libGdx
-
- filtering
-
- x
- Linear
- y
- Linear
-
-
- shapePadding
- 0
- jpgQuality
- 80
- pngOptimizationLevel
- 0
- webpQualityLevel
- 101
- textureSubPath
-
- atfFormats
-
- textureFormat
- png
- borderPadding
- 1
- maxTextureSize
-
- width
- 2048
- height
- 2048
-
- fixedTextureSize
-
- width
- -1
- height
- -1
-
- algorithmSettings
-
- algorithm
- MaxRects
- freeSizeMode
- Best
- sizeConstraints
- POT
- forceSquared
-
- maxRects
-
- heuristic
- Best
-
- basic
-
- sortBy
- Best
- order
- Ascending
-
- polygon
-
- alignToGrid
- 1
-
-
- dataFileNames
-
- data
-
- name
- ../res_built/atlas/atlas{n}{v}.json
-
-
- multiPack
-
- forceIdenticalLayout
-
- outputFormat
- RGBA8888
- alphaHandling
- ClearTransparentPixels
- contentProtection
-
- key
-
-
- autoAliasEnabled
-
- trimSpriteNames
-
- prependSmartFolderName
-
- autodetectAnimations
-
- globalSpriteSettings
-
- scale
- 1
- scaleMode
- Smooth
- extrude
- 2
- trimThreshold
- 2
- trimMargin
- 1
- trimMode
- Trim
- tracerTolerance
- 200
- heuristicMask
-
- defaultPivotPoint
- 0.5,0.5
- writePivotPoints
-
-
- individualSpriteSettings
-
- sprites/belt/built/forward_0.png
- sprites/belt/built/forward_1.png
- sprites/belt/built/forward_10.png
- sprites/belt/built/forward_11.png
- sprites/belt/built/forward_12.png
- sprites/belt/built/forward_13.png
- sprites/belt/built/forward_2.png
- sprites/belt/built/forward_3.png
- sprites/belt/built/forward_4.png
- sprites/belt/built/forward_5.png
- sprites/belt/built/forward_6.png
- sprites/belt/built/forward_7.png
- sprites/belt/built/forward_8.png
- sprites/belt/built/forward_9.png
- sprites/belt/built/left_0.png
- sprites/belt/built/left_1.png
- sprites/belt/built/left_10.png
- sprites/belt/built/left_11.png
- sprites/belt/built/left_12.png
- sprites/belt/built/left_13.png
- sprites/belt/built/left_2.png
- sprites/belt/built/left_3.png
- sprites/belt/built/left_4.png
- sprites/belt/built/left_5.png
- sprites/belt/built/left_6.png
- sprites/belt/built/left_7.png
- sprites/belt/built/left_8.png
- sprites/belt/built/left_9.png
- sprites/belt/built/right_0.png
- sprites/belt/built/right_1.png
- sprites/belt/built/right_10.png
- sprites/belt/built/right_11.png
- sprites/belt/built/right_12.png
- sprites/belt/built/right_13.png
- sprites/belt/built/right_2.png
- sprites/belt/built/right_3.png
- sprites/belt/built/right_4.png
- sprites/belt/built/right_5.png
- sprites/belt/built/right_6.png
- sprites/belt/built/right_7.png
- sprites/belt/built/right_8.png
- sprites/belt/built/right_9.png
- sprites/blueprints/constant_signal.png
- sprites/blueprints/display.png
- sprites/blueprints/lever.png
- sprites/blueprints/logic_gate-not.png
- sprites/blueprints/logic_gate-or.png
- sprites/blueprints/logic_gate-transistor.png
- sprites/blueprints/logic_gate-xor.png
- sprites/blueprints/logic_gate.png
- sprites/blueprints/miner-chainable.png
- sprites/blueprints/miner.png
- sprites/blueprints/reader.png
- sprites/blueprints/rotater-ccw.png
- sprites/blueprints/rotater-fl.png
- sprites/blueprints/rotater.png
- sprites/blueprints/splitter-compact-inverse.png
- sprites/blueprints/splitter-compact-merge-inverse.png
- sprites/blueprints/splitter-compact-merge.png
- sprites/blueprints/splitter-compact.png
- sprites/blueprints/trash.png
- sprites/blueprints/underground_belt_entry-tier2.png
- sprites/blueprints/underground_belt_entry.png
- sprites/blueprints/underground_belt_exit-tier2.png
- sprites/blueprints/underground_belt_exit.png
- sprites/blueprints/virtual_processor-analyzer.png
- sprites/blueprints/virtual_processor-rotater.png
- sprites/blueprints/virtual_processor-shapecompare.png
- sprites/blueprints/virtual_processor-unstacker.png
- sprites/blueprints/virtual_processor.png
- sprites/blueprints/wire_tunnel-coating.png
- sprites/blueprints/wire_tunnel.png
- sprites/buildings/constant_signal.png
- sprites/buildings/display.png
- sprites/buildings/lever.png
- sprites/buildings/logic_gate-not.png
- sprites/buildings/logic_gate-or.png
- sprites/buildings/logic_gate-transistor.png
- sprites/buildings/logic_gate-xor.png
- sprites/buildings/logic_gate.png
- sprites/buildings/miner-chainable.png
- sprites/buildings/reader.png
- sprites/buildings/rotater-ccw.png
- sprites/buildings/rotater-fl.png
- sprites/buildings/splitter-compact-inverse.png
- sprites/buildings/splitter-compact-merge-inverse.png
- sprites/buildings/splitter-compact-merge.png
- sprites/buildings/splitter-compact.png
- sprites/buildings/underground_belt_entry-tier2.png
- sprites/buildings/underground_belt_entry.png
- sprites/buildings/underground_belt_exit-tier2.png
- sprites/buildings/underground_belt_exit.png
- sprites/buildings/virtual_processor-analyzer.png
- sprites/buildings/virtual_processor-rotater.png
- sprites/buildings/virtual_processor-shapecompare.png
- sprites/buildings/virtual_processor-unstacker.png
- sprites/buildings/virtual_processor.png
- sprites/buildings/wire_tunnel-coating.png
- sprites/buildings/wire_tunnel.png
- sprites/misc/reader_overlay.png
- sprites/wires/lever_on.png
- sprites/wires/sets/color_cross.png
- sprites/wires/sets/color_forward.png
- sprites/wires/sets/color_split.png
- sprites/wires/sets/color_turn.png
- sprites/wires/sets/conflict_cross.png
- sprites/wires/sets/conflict_forward.png
- sprites/wires/sets/conflict_split.png
- sprites/wires/sets/conflict_turn.png
- sprites/wires/sets/regular_cross.png
- sprites/wires/sets/regular_forward.png
- sprites/wires/sets/regular_split.png
- sprites/wires/sets/regular_turn.png
- sprites/wires/sets/shape_cross.png
- sprites/wires/sets/shape_forward.png
- sprites/wires/sets/shape_split.png
- sprites/wires/sets/shape_turn.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 48,48,96,96
- scale9Paddings
- 48,48,96,96
- scale9FromFile
-
-
- sprites/blueprints/belt_left.png
- sprites/blueprints/belt_right.png
- sprites/blueprints/belt_top.png
- sprites/blueprints/wire-cross.png
- sprites/blueprints/wire-split.png
- sprites/blueprints/wire-turn.png
- sprites/blueprints/wire.png
- sprites/buildings/belt_left.png
- sprites/buildings/belt_right.png
- sprites/buildings/belt_top.png
- sprites/buildings/wire-cross.png
- sprites/buildings/wire-split.png
- sprites/buildings/wire-turn.png
- sprites/buildings/wire.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 32,32,63,63
- scale9Paddings
- 32,32,63,63
- scale9FromFile
-
-
- sprites/blueprints/cutter-quad.png
- sprites/blueprints/painter-quad.png
- sprites/buildings/cutter-quad.png
- sprites/buildings/painter-quad.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 192,48,384,96
- scale9Paddings
- 192,48,384,96
- scale9FromFile
-
-
- sprites/blueprints/cutter.png
- sprites/blueprints/filter.png
- sprites/blueprints/mixer.png
- sprites/blueprints/painter-mirrored.png
- sprites/blueprints/painter.png
- sprites/blueprints/splitter.png
- sprites/blueprints/stacker.png
- sprites/buildings/filter.png
- sprites/buildings/painter-mirrored.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 96,48,192,96
- scale9Paddings
- 96,48,192,96
- scale9FromFile
-
-
- sprites/blueprints/painter-double.png
- sprites/blueprints/trash-storage.png
- sprites/buildings/painter-double.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 96,96,192,192
- scale9Paddings
- 96,96,192,192
- scale9FromFile
-
-
- sprites/buildings/cutter.png
- sprites/buildings/mixer.png
- sprites/buildings/painter.png
- sprites/buildings/splitter.png
- sprites/buildings/stacker.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 64,32,128,64
- scale9Paddings
- 64,32,128,64
- scale9FromFile
-
-
- sprites/buildings/hub.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 192,192,384,384
- scale9Paddings
- 192,192,384,384
- scale9FromFile
-
-
- sprites/buildings/miner.png
- sprites/buildings/rotater.png
- sprites/buildings/trash.png
- sprites/misc/processor_disabled.png
- sprites/misc/processor_disconnected.png
- sprites/wires/logical_acceptor.png
- sprites/wires/logical_ejector.png
- sprites/wires/overlay_tile.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 32,32,64,64
- scale9Paddings
- 32,32,64,64
- scale9FromFile
-
-
- sprites/buildings/trash-storage.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 144,144,288,288
- scale9Paddings
- 144,144,288,288
- scale9FromFile
-
-
- sprites/debug/acceptor_slot.png
- sprites/debug/ejector_slot.png
- sprites/misc/hub_direction_indicator.png
- sprites/misc/waypoint.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 8,8,16,16
- scale9Paddings
- 8,8,16,16
- scale9FromFile
-
-
- sprites/misc/slot_bad_arrow.png
- sprites/misc/slot_good_arrow.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 24,24,48,48
- scale9Paddings
- 24,24,48,48
- scale9FromFile
-
-
- sprites/misc/storage_overlay.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 44,22,89,43
- scale9Paddings
- 44,22,89,43
- scale9FromFile
-
-
- sprites/wires/boolean_false.png
- sprites/wires/boolean_true.png
- sprites/wires/network_conflict.png
- sprites/wires/network_empty.png
- sprites/wires/wires_preview.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 16,16,32,32
- scale9Paddings
- 16,16,32,32
- scale9FromFile
-
-
- sprites/wires/display/blue.png
- sprites/wires/display/cyan.png
- sprites/wires/display/green.png
- sprites/wires/display/purple.png
- sprites/wires/display/red.png
- sprites/wires/display/white.png
- sprites/wires/display/yellow.png
-
- pivotPoint
- 0.5,0.5
- spriteScale
- 1
- scale9Enabled
-
- scale9Borders
- 11,11,22,22
- scale9Paddings
- 11,11,22,22
- scale9FromFile
-
-
-
- fileList
-
- sprites
-
- ignoreFileList
-
- replaceList
-
- ignoredWarnings
-
- commonDivisorX
- 1
- commonDivisorY
- 1
- packNormalMaps
-
- autodetectNormalMaps
-
- normalMapFilter
-
- normalMapSuffix
-
- normalMapSheetFileName
-
- exporterProperties
-
-
-
diff --git a/res_raw/sounds/music/menu.wav b/res_raw/sounds/music/menu.wav
index 4024b94a..54a5d9d3 100644
Binary files a/res_raw/sounds/music/menu.wav and b/res_raw/sounds/music/menu.wav differ
diff --git a/res_raw/sounds/music/theme-full.mp3 b/res_raw/sounds/music/theme-full.mp3
index be4f3a7b..db26aeb8 100644
Binary files a/res_raw/sounds/music/theme-full.mp3 and b/res_raw/sounds/music/theme-full.mp3 differ
diff --git a/res_raw/sounds/music/theme-short.mp3 b/res_raw/sounds/music/theme-short.mp3
new file mode 100644
index 00000000..1cc3b7da
Binary files /dev/null and b/res_raw/sounds/music/theme-short.mp3 differ
diff --git a/res_raw/sounds/music/theme-short.wav b/res_raw/sounds/music/theme-short.wav
deleted file mode 100644
index 555caaee..00000000
--- a/res_raw/sounds/music/theme-short.wav
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:df7487fb5e8cb34cecee2519b9c3162a5107d2d7b1301c4a550904cfb108a015
-size 223361394
diff --git a/res_raw/sounds/sfx/badge_notification.wav b/res_raw/sounds/sfx/badge_notification.wav
index 0af30494..4a1a4f3f 100644
Binary files a/res_raw/sounds/sfx/badge_notification.wav and b/res_raw/sounds/sfx/badge_notification.wav differ
diff --git a/res_raw/sounds/sfx/copy.wav b/res_raw/sounds/sfx/copy.wav
new file mode 100644
index 00000000..c595b90a
Binary files /dev/null and b/res_raw/sounds/sfx/copy.wav differ
diff --git a/res_raw/sounds/sfx/destroy_building.wav b/res_raw/sounds/sfx/destroy_building.wav
index ffb38158..111469f3 100644
Binary files a/res_raw/sounds/sfx/destroy_building.wav and b/res_raw/sounds/sfx/destroy_building.wav differ
diff --git a/res_raw/sounds/sfx/dialog_error.wav b/res_raw/sounds/sfx/dialog_error.wav
index ef7eddfd..66a7a653 100644
Binary files a/res_raw/sounds/sfx/dialog_error.wav and b/res_raw/sounds/sfx/dialog_error.wav differ
diff --git a/res_raw/sounds/sfx/dialog_ok.wav b/res_raw/sounds/sfx/dialog_ok.wav
index 889d3426..20181cc9 100644
Binary files a/res_raw/sounds/sfx/dialog_ok.wav and b/res_raw/sounds/sfx/dialog_ok.wav differ
diff --git a/res_raw/sounds/sfx/level_complete.wav b/res_raw/sounds/sfx/level_complete.wav
index 2977de84..96c6f9fb 100644
Binary files a/res_raw/sounds/sfx/level_complete.wav and b/res_raw/sounds/sfx/level_complete.wav differ
diff --git a/res_raw/sounds/sfx/place_belt.wav b/res_raw/sounds/sfx/place_belt.wav
index 087104bc..f2ac6c21 100644
Binary files a/res_raw/sounds/sfx/place_belt.wav and b/res_raw/sounds/sfx/place_belt.wav differ
diff --git a/res_raw/sounds/sfx/place_building.wav b/res_raw/sounds/sfx/place_building.wav
index 3bb89df5..329d1d65 100644
Binary files a/res_raw/sounds/sfx/place_building.wav and b/res_raw/sounds/sfx/place_building.wav differ
diff --git a/res_raw/sounds/sfx/ui_click.wav b/res_raw/sounds/sfx/ui_click.wav
index 673b8904..3535f23e 100644
Binary files a/res_raw/sounds/sfx/ui_click.wav and b/res_raw/sounds/sfx/ui_click.wav differ
diff --git a/res_raw/sounds/sfx/ui_error.wav b/res_raw/sounds/sfx/ui_error.wav
index 283ea26c..07a988d2 100644
Binary files a/res_raw/sounds/sfx/ui_error.wav and b/res_raw/sounds/sfx/ui_error.wav differ
diff --git a/res_raw/sounds/sfx/ui_swish_hide.wav b/res_raw/sounds/sfx/ui_swish_hide.wav
index ad7bed1d..e24b0939 100644
Binary files a/res_raw/sounds/sfx/ui_swish_hide.wav and b/res_raw/sounds/sfx/ui_swish_hide.wav differ
diff --git a/res_raw/sounds/sfx/ui_swish_show.wav b/res_raw/sounds/sfx/ui_swish_show.wav
index 63436899..e46cf9eb 100644
Binary files a/res_raw/sounds/sfx/ui_swish_show.wav and b/res_raw/sounds/sfx/ui_swish_show.wav differ
diff --git a/res_raw/sprites/belt/generate_wire_sprites.js b/res_raw/sprites/belt/generate_wire_sprites.js
index 24ac319b..7db9782c 100644
--- a/res_raw/sprites/belt/generate_wire_sprites.js
+++ b/res_raw/sprites/belt/generate_wire_sprites.js
@@ -1,226 +1,212 @@
-/**
- *
- * Run `yarn global add canvas` first
- */
-
-const { createCanvas } = require("canvas");
-const fs = require("fs");
-const path = require("path");
-
-const outputFolder = path.join(__dirname, "..", "wires", "sets");
-
-const dimensions = 192;
-const lineSize = 12;
-const lowerLineSize = 20;
-
-function hexToRGB(h) {
- let r = 0,
- g = 0,
- b = 0;
-
- // 3 digits
- if (h.length == 4) {
- r = "0x" + h[1] + h[1];
- g = "0x" + h[2] + h[2];
- b = "0x" + h[3] + h[3];
-
- // 6 digits
- } else if (h.length == 7) {
- r = "0x" + h[1] + h[2];
- g = "0x" + h[3] + h[4];
- b = "0x" + h[5] + h[6];
- }
-
- return [+r, +g, +b];
-}
-
-function RGBToHSL(r, g, b) {
- // Make r, g, and b fractions of 1
- r /= 255;
- g /= 255;
- b /= 255;
-
- // Find greatest and smallest channel values
- let cmin = Math.min(r, g, b),
- cmax = Math.max(r, g, b),
- delta = cmax - cmin,
- h = 0,
- s = 0,
- l = 0;
- // Calculate hue
- // No difference
- if (delta == 0) h = 0;
- // Red is max
- else if (cmax == r) h = ((g - b) / delta) % 6;
- // Green is max
- else if (cmax == g) h = (b - r) / delta + 2;
- // Blue is max
- else h = (r - g) / delta + 4;
-
- h = Math.round(h * 60);
-
- // Make negative hues positive behind 360°
- if (h < 0) h += 360;
-
- // Calculate lightness
- l = (cmax + cmin) / 2;
-
- // Calculate saturation
- s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
-
- // Multiply l and s by 100
- s = +(s * 100).toFixed(1);
- l = +(l * 100).toFixed(1);
-
- return [h, s, l];
-}
-
-function HSLToRGB(h, s, l) {
- // Must be fractions of 1
- s /= 100;
- l /= 100;
-
- let c = (1 - Math.abs(2 * l - 1)) * s,
- x = c * (1 - Math.abs(((h / 60) % 2) - 1)),
- m = l - c / 2,
- r = 0,
- g = 0,
- b = 0;
-
- if (0 <= h && h < 60) {
- r = c;
- g = x;
- b = 0;
- } else if (60 <= h && h < 120) {
- r = x;
- g = c;
- b = 0;
- } else if (120 <= h && h < 180) {
- r = 0;
- g = c;
- b = x;
- } else if (180 <= h && h < 240) {
- r = 0;
- g = x;
- b = c;
- } else if (240 <= h && h < 300) {
- r = x;
- g = 0;
- b = c;
- } else if (300 <= h && h < 360) {
- r = c;
- g = 0;
- b = x;
- }
- r = Math.round((r + m) * 255);
- g = Math.round((g + m) * 255);
- b = Math.round((b + m) * 255);
-
- return [r, g, b];
-}
-
-async function run() {
- console.log("Running");
-
- const variants = {
- regular: "#25fff2",
- color: "#eba458",
- shape: "#8858eb",
- conflict: "#ff3e3e",
- };
-
- const promises = [];
-
- for (const variantId in variants) {
- const variantColor = variants[variantId];
- const variantHSL = RGBToHSL(...hexToRGB(variantColor));
- const darkenedColor = HSLToRGB(variantHSL[0], variantHSL[1] - 15, variantHSL[2] - 20);
- const hexDarkenedColor = "rgb(" + darkenedColor.join(",") + ")";
-
- console.log(variantColor, "->", hexToRGB(variantColor), variantHSL, "->", darkenedColor);
-
- const parts = {
- forward: [[0.5, 0, 0.5, 1]],
- turn: [
- [0.5, 0.5, 0.5, 1],
- [0.5, 0.5, 1, 0.5],
- ],
- split: [
- [0.5, 0.5, 0.5, 1],
- [0, 0.5, 1, 0.5],
- ],
- cross: [
- [0, 0.5, 1, 0.5],
- [0.5, 0, 0.5, 1],
- ],
- };
-
- for (const partId in parts) {
- const partLines = parts[partId];
-
- const canvas = createCanvas(dimensions, dimensions);
- const context = canvas.getContext("2d");
- context.quality = "best";
- context.clearRect(0, 0, dimensions, dimensions);
-
- context.strokeStyle = hexDarkenedColor;
- context.lineWidth = lowerLineSize;
- context.lineCap = "square";
- context.imageSmoothingEnabled = false;
-
- // Draw lower lines
- partLines.forEach(([x1, y1, x2, y2]) => {
- context.beginPath();
- context.moveTo(x1 * dimensions, y1 * dimensions);
- context.lineTo(x2 * dimensions, y2 * dimensions);
- context.stroke();
- });
-
- context.strokeStyle = variantColor;
- context.lineWidth = lineSize;
-
- // Draw upper lines
- partLines.forEach(([x1, y1, x2, y2]) => {
- context.beginPath();
- context.moveTo(x1 * dimensions, y1 * dimensions);
- context.lineTo(x2 * dimensions, y2 * dimensions);
- context.stroke();
- });
-
- const out = fs.createWriteStream(path.join(outputFolder, variantId + "_" + partId + ".png"));
- const stream = canvas.createPNGStream();
- stream.pipe(out);
- promises.push(new Promise(resolve => stream.on("end", resolve)));
- }
- }
-
- console.log("Waiting for completion");
- await Promise.all(promises);
-
- // Also wait a bit more
- await new Promise(resolve => setTimeout(resolve, 1000));
-
- console.log("Copying files to all locations");
-
- // // Copy other files
- fs.copyFileSync(
- path.join(outputFolder, "regular_forward.png"),
- path.join(__dirname, "..", "buildings", "wire.png")
- );
- fs.copyFileSync(
- path.join(outputFolder, "regular_turn.png"),
- path.join(__dirname, "..", "buildings", "wire-turn.png")
- );
- fs.copyFileSync(
- path.join(outputFolder, "regular_split.png"),
- path.join(__dirname, "..", "buildings", "wire-split.png")
- );
- fs.copyFileSync(
- path.join(outputFolder, "regular_cross.png"),
- path.join(__dirname, "..", "buildings", "wire-cross.png")
- );
-
- console.log("Done!");
-}
-
-run();
+/**
+ *
+ * Run `yarn global add canvas` first
+ */
+
+const { createCanvas } = require("canvas");
+const fs = require("fs");
+const path = require("path");
+
+const outputFolder = path.join(__dirname, "..", "wires", "sets");
+
+const dimensions = 192;
+const lineSize = 14;
+const lowerLineSize = 32;
+
+const variants = {
+ first: "#61ef6f",
+ second: "#5fb2f1",
+ conflict: "#f74c4c",
+};
+
+function hexToRGB(h) {
+ let r = 0,
+ g = 0,
+ b = 0;
+
+ // 3 digits
+ if (h.length == 4) {
+ r = "0x" + h[1] + h[1];
+ g = "0x" + h[2] + h[2];
+ b = "0x" + h[3] + h[3];
+
+ // 6 digits
+ } else if (h.length == 7) {
+ r = "0x" + h[1] + h[2];
+ g = "0x" + h[3] + h[4];
+ b = "0x" + h[5] + h[6];
+ }
+
+ return [+r, +g, +b];
+}
+
+function RGBToHSL(r, g, b) {
+ // Make r, g, and b fractions of 1
+ r /= 255;
+ g /= 255;
+ b /= 255;
+
+ // Find greatest and smallest channel values
+ let cmin = Math.min(r, g, b),
+ cmax = Math.max(r, g, b),
+ delta = cmax - cmin,
+ h = 0,
+ s = 0,
+ l = 0;
+ // Calculate hue
+ // No difference
+ if (delta == 0) h = 0;
+ // Red is max
+ else if (cmax == r) h = ((g - b) / delta) % 6;
+ // Green is max
+ else if (cmax == g) h = (b - r) / delta + 2;
+ // Blue is max
+ else h = (r - g) / delta + 4;
+
+ h = Math.round(h * 60);
+
+ // Make negative hues positive behind 360°
+ if (h < 0) h += 360;
+
+ // Calculate lightness
+ l = (cmax + cmin) / 2;
+
+ // Calculate saturation
+ s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
+
+ // Multiply l and s by 100
+ s = +(s * 100).toFixed(1);
+ l = +(l * 100).toFixed(1);
+
+ return [h, s, l];
+}
+
+function HSLToRGB(h, s, l) {
+ // Must be fractions of 1
+ s /= 100;
+ l /= 100;
+
+ let c = (1 - Math.abs(2 * l - 1)) * s,
+ x = c * (1 - Math.abs(((h / 60) % 2) - 1)),
+ m = l - c / 2,
+ r = 0,
+ g = 0,
+ b = 0;
+
+ if (0 <= h && h < 60) {
+ r = c;
+ g = x;
+ b = 0;
+ } else if (60 <= h && h < 120) {
+ r = x;
+ g = c;
+ b = 0;
+ } else if (120 <= h && h < 180) {
+ r = 0;
+ g = c;
+ b = x;
+ } else if (180 <= h && h < 240) {
+ r = 0;
+ g = x;
+ b = c;
+ } else if (240 <= h && h < 300) {
+ r = x;
+ g = 0;
+ b = c;
+ } else if (300 <= h && h < 360) {
+ r = c;
+ g = 0;
+ b = x;
+ }
+ r = Math.round((r + m) * 255);
+ g = Math.round((g + m) * 255);
+ b = Math.round((b + m) * 255);
+
+ return [r, g, b];
+}
+
+async function run() {
+ console.log("Running");
+
+ const promises = [];
+
+ for (const variantId in variants) {
+ const variantColor = variants[variantId];
+ const variantHSL = RGBToHSL(...hexToRGB(variantColor));
+ const darkenedColor = HSLToRGB(variantHSL[0], variantHSL[1] - 15, variantHSL[2] - 20);
+ const hexDarkenedColor = "rgb(" + darkenedColor.join(",") + ")";
+
+ console.log(variantColor, "->", hexToRGB(variantColor), variantHSL, "->", darkenedColor);
+
+ const parts = {
+ forward: [[0.5, 0, 0.5, 1]],
+ turn: [
+ [0.5, 0.5, 0.5, 1],
+ [0.5, 0.5, 1, 0.5],
+ ],
+ split: [
+ [0.5, 0.5, 0.5, 1],
+ [0, 0.5, 1, 0.5],
+ ],
+ cross: [
+ [0, 0.5, 1, 0.5],
+ [0.5, 0, 0.5, 1],
+ ],
+ };
+
+ for (const partId in parts) {
+ const partLines = parts[partId];
+
+ const canvas = createCanvas(dimensions, dimensions);
+ const context = canvas.getContext("2d");
+ context.quality = "best";
+ context.clearRect(0, 0, dimensions, dimensions);
+
+ const lineCanvas = createCanvas(dimensions, dimensions);
+ const lineContext = lineCanvas.getContext("2d");
+ lineContext.quality = "best";
+ lineContext.clearRect(0, 0, dimensions, dimensions);
+ lineContext.strokeStyle = hexDarkenedColor;
+ lineContext.lineWidth = lowerLineSize;
+ lineContext.lineCap = "square";
+ lineContext.imageSmoothingEnabled = false;
+
+ // Draw lower lines
+ partLines.forEach(([x1, y1, x2, y2]) => {
+ lineContext.beginPath();
+ lineContext.moveTo(x1 * dimensions, y1 * dimensions);
+ lineContext.lineTo(x2 * dimensions, y2 * dimensions);
+ lineContext.stroke();
+ });
+
+ context.globalAlpha = 0.4;
+ context.drawImage(lineCanvas, 0, 0, dimensions, dimensions);
+
+ context.globalAlpha = 1;
+ context.imageSmoothingEnabled = false;
+ context.lineCap = "square";
+ context.strokeStyle = variantColor;
+ context.lineWidth = lineSize;
+
+ // Draw upper lines
+ partLines.forEach(([x1, y1, x2, y2]) => {
+ context.beginPath();
+ context.moveTo(x1 * dimensions, y1 * dimensions);
+ context.lineTo(x2 * dimensions, y2 * dimensions);
+ context.stroke();
+ });
+
+ const out = fs.createWriteStream(path.join(outputFolder, variantId + "_" + partId + ".png"));
+ const stream = canvas.createPNGStream();
+ stream.pipe(out);
+ promises.push(new Promise(resolve => stream.on("end", resolve)));
+ }
+ }
+
+ console.log("Waiting for completion");
+ await Promise.all(promises);
+
+ console.log("Done!");
+}
+
+run();
diff --git a/res_raw/sprites/blueprints/virtual_processor-analyzer.png b/res_raw/sprites/blueprints/analyzer.png
similarity index 100%
rename from res_raw/sprites/blueprints/virtual_processor-analyzer.png
rename to res_raw/sprites/blueprints/analyzer.png
diff --git a/res_raw/sprites/blueprints/balancer-merger-inverse.png b/res_raw/sprites/blueprints/balancer-merger-inverse.png
new file mode 100644
index 00000000..3940e0a6
Binary files /dev/null and b/res_raw/sprites/blueprints/balancer-merger-inverse.png differ
diff --git a/res_raw/sprites/blueprints/balancer-merger.png b/res_raw/sprites/blueprints/balancer-merger.png
new file mode 100644
index 00000000..a9554f33
Binary files /dev/null and b/res_raw/sprites/blueprints/balancer-merger.png differ
diff --git a/res_raw/sprites/blueprints/balancer-splitter-inverse.png b/res_raw/sprites/blueprints/balancer-splitter-inverse.png
new file mode 100644
index 00000000..c9c4c4c9
Binary files /dev/null and b/res_raw/sprites/blueprints/balancer-splitter-inverse.png differ
diff --git a/res_raw/sprites/blueprints/balancer-splitter.png b/res_raw/sprites/blueprints/balancer-splitter.png
new file mode 100644
index 00000000..3d59d05f
Binary files /dev/null and b/res_raw/sprites/blueprints/balancer-splitter.png differ
diff --git a/res_raw/sprites/blueprints/balancer.png b/res_raw/sprites/blueprints/balancer.png
new file mode 100644
index 00000000..52473772
Binary files /dev/null and b/res_raw/sprites/blueprints/balancer.png differ
diff --git a/res_raw/sprites/blueprints/virtual_processor-shapecompare.png b/res_raw/sprites/blueprints/comparator.png
similarity index 100%
rename from res_raw/sprites/blueprints/virtual_processor-shapecompare.png
rename to res_raw/sprites/blueprints/comparator.png
diff --git a/res_raw/sprites/blueprints/constant_signal.png b/res_raw/sprites/blueprints/constant_signal.png
index 9acb86d2..34adf95b 100644
Binary files a/res_raw/sprites/blueprints/constant_signal.png and b/res_raw/sprites/blueprints/constant_signal.png differ
diff --git a/res_raw/sprites/blueprints/cutter-quad.png b/res_raw/sprites/blueprints/cutter-quad.png
index 5ae8989e..bf47b09b 100644
Binary files a/res_raw/sprites/blueprints/cutter-quad.png and b/res_raw/sprites/blueprints/cutter-quad.png differ
diff --git a/res_raw/sprites/blueprints/item_producer.png b/res_raw/sprites/blueprints/item_producer.png
new file mode 100644
index 00000000..2288c07d
Binary files /dev/null and b/res_raw/sprites/blueprints/item_producer.png differ
diff --git a/res_raw/sprites/blueprints/lever.png b/res_raw/sprites/blueprints/lever.png
index 84ef5f03..cca2ccea 100644
Binary files a/res_raw/sprites/blueprints/lever.png and b/res_raw/sprites/blueprints/lever.png differ
diff --git a/res_raw/sprites/blueprints/logic_gate-or.png b/res_raw/sprites/blueprints/logic_gate-or.png
index f58c3656..e8b4573a 100644
Binary files a/res_raw/sprites/blueprints/logic_gate-or.png and b/res_raw/sprites/blueprints/logic_gate-or.png differ
diff --git a/res_raw/sprites/blueprints/logic_gate-transistor.png b/res_raw/sprites/blueprints/logic_gate-transistor.png
deleted file mode 100644
index c3d3682d..00000000
Binary files a/res_raw/sprites/blueprints/logic_gate-transistor.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/logic_gate-xor.png b/res_raw/sprites/blueprints/logic_gate-xor.png
index 97823a7a..9a711fe4 100644
Binary files a/res_raw/sprites/blueprints/logic_gate-xor.png and b/res_raw/sprites/blueprints/logic_gate-xor.png differ
diff --git a/res_raw/sprites/blueprints/logic_gate.png b/res_raw/sprites/blueprints/logic_gate.png
index de59fa57..5b492203 100644
Binary files a/res_raw/sprites/blueprints/logic_gate.png and b/res_raw/sprites/blueprints/logic_gate.png differ
diff --git a/res_raw/sprites/blueprints/painter-double.png b/res_raw/sprites/blueprints/painter-double.png
index 0fe1d913..f0bf0160 100644
Binary files a/res_raw/sprites/blueprints/painter-double.png and b/res_raw/sprites/blueprints/painter-double.png differ
diff --git a/res_raw/sprites/blueprints/painter-mirrored.png b/res_raw/sprites/blueprints/painter-mirrored.png
index f72f80e2..7641a7cd 100644
Binary files a/res_raw/sprites/blueprints/painter-mirrored.png and b/res_raw/sprites/blueprints/painter-mirrored.png differ
diff --git a/res_raw/sprites/blueprints/painter-quad.png b/res_raw/sprites/blueprints/painter-quad.png
index 6f8ce2a0..75d5100a 100644
Binary files a/res_raw/sprites/blueprints/painter-quad.png and b/res_raw/sprites/blueprints/painter-quad.png differ
diff --git a/res_raw/sprites/blueprints/painter.png b/res_raw/sprites/blueprints/painter.png
index c2326268..0fe02224 100644
Binary files a/res_raw/sprites/blueprints/painter.png and b/res_raw/sprites/blueprints/painter.png differ
diff --git a/res_raw/sprites/blueprints/rotater-fl.png b/res_raw/sprites/blueprints/rotater-fl.png
deleted file mode 100644
index 25a66453..00000000
Binary files a/res_raw/sprites/blueprints/rotater-fl.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/rotater-rotate180.png b/res_raw/sprites/blueprints/rotater-rotate180.png
new file mode 100644
index 00000000..e27c78e5
Binary files /dev/null and b/res_raw/sprites/blueprints/rotater-rotate180.png differ
diff --git a/res_raw/sprites/blueprints/splitter-compact-inverse.png b/res_raw/sprites/blueprints/splitter-compact-inverse.png
deleted file mode 100644
index db528f32..00000000
Binary files a/res_raw/sprites/blueprints/splitter-compact-inverse.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/splitter-compact-merge-inverse.png b/res_raw/sprites/blueprints/splitter-compact-merge-inverse.png
deleted file mode 100644
index 90a429c0..00000000
Binary files a/res_raw/sprites/blueprints/splitter-compact-merge-inverse.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/splitter-compact-merge.png b/res_raw/sprites/blueprints/splitter-compact-merge.png
deleted file mode 100644
index 93488fd9..00000000
Binary files a/res_raw/sprites/blueprints/splitter-compact-merge.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/splitter-compact.png b/res_raw/sprites/blueprints/splitter-compact.png
deleted file mode 100644
index 3e3c81f7..00000000
Binary files a/res_raw/sprites/blueprints/splitter-compact.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/splitter.png b/res_raw/sprites/blueprints/splitter.png
deleted file mode 100644
index 984a99a8..00000000
Binary files a/res_raw/sprites/blueprints/splitter.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/storage.png b/res_raw/sprites/blueprints/storage.png
new file mode 100644
index 00000000..0d9f62db
Binary files /dev/null and b/res_raw/sprites/blueprints/storage.png differ
diff --git a/res_raw/sprites/blueprints/transistor-mirrored.png b/res_raw/sprites/blueprints/transistor-mirrored.png
new file mode 100644
index 00000000..88eaad0d
Binary files /dev/null and b/res_raw/sprites/blueprints/transistor-mirrored.png differ
diff --git a/res_raw/sprites/blueprints/transistor.png b/res_raw/sprites/blueprints/transistor.png
new file mode 100644
index 00000000..b13aedea
Binary files /dev/null and b/res_raw/sprites/blueprints/transistor.png differ
diff --git a/res_raw/sprites/blueprints/trash-storage.png b/res_raw/sprites/blueprints/trash-storage.png
deleted file mode 100644
index cc719a5a..00000000
Binary files a/res_raw/sprites/blueprints/trash-storage.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/underground_belt_entry-tier2.png b/res_raw/sprites/blueprints/underground_belt_entry-tier2.png
index 9a4beb66..796dff59 100644
Binary files a/res_raw/sprites/blueprints/underground_belt_entry-tier2.png and b/res_raw/sprites/blueprints/underground_belt_entry-tier2.png differ
diff --git a/res_raw/sprites/blueprints/underground_belt_entry.png b/res_raw/sprites/blueprints/underground_belt_entry.png
index aa237b6d..f9ad0ba5 100644
Binary files a/res_raw/sprites/blueprints/underground_belt_entry.png and b/res_raw/sprites/blueprints/underground_belt_entry.png differ
diff --git a/res_raw/sprites/blueprints/underground_belt_exit-tier2.png b/res_raw/sprites/blueprints/underground_belt_exit-tier2.png
index b9c97b75..be78107b 100644
Binary files a/res_raw/sprites/blueprints/underground_belt_exit-tier2.png and b/res_raw/sprites/blueprints/underground_belt_exit-tier2.png differ
diff --git a/res_raw/sprites/blueprints/underground_belt_exit.png b/res_raw/sprites/blueprints/underground_belt_exit.png
index 760f63a9..9f02504d 100644
Binary files a/res_raw/sprites/blueprints/underground_belt_exit.png and b/res_raw/sprites/blueprints/underground_belt_exit.png differ
diff --git a/res_raw/sprites/blueprints/virtual_processor-painter.png b/res_raw/sprites/blueprints/virtual_processor-painter.png
new file mode 100644
index 00000000..243517db
Binary files /dev/null and b/res_raw/sprites/blueprints/virtual_processor-painter.png differ
diff --git a/res_raw/sprites/blueprints/virtual_processor-rotater.png b/res_raw/sprites/blueprints/virtual_processor-rotater.png
index d50da022..1cf0e901 100644
Binary files a/res_raw/sprites/blueprints/virtual_processor-rotater.png and b/res_raw/sprites/blueprints/virtual_processor-rotater.png differ
diff --git a/res_raw/sprites/blueprints/virtual_processor-stacker.png b/res_raw/sprites/blueprints/virtual_processor-stacker.png
index 1d691491..09363c3e 100644
Binary files a/res_raw/sprites/blueprints/virtual_processor-stacker.png and b/res_raw/sprites/blueprints/virtual_processor-stacker.png differ
diff --git a/res_raw/sprites/blueprints/wire-cross.png b/res_raw/sprites/blueprints/wire-cross.png
deleted file mode 100644
index c9aeb1c5..00000000
Binary files a/res_raw/sprites/blueprints/wire-cross.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/wire-split.png b/res_raw/sprites/blueprints/wire-split.png
deleted file mode 100644
index f0cdfb11..00000000
Binary files a/res_raw/sprites/blueprints/wire-split.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/wire-turn.png b/res_raw/sprites/blueprints/wire-turn.png
deleted file mode 100644
index becf6411..00000000
Binary files a/res_raw/sprites/blueprints/wire-turn.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/wire.png b/res_raw/sprites/blueprints/wire.png
deleted file mode 100644
index 15bfde22..00000000
Binary files a/res_raw/sprites/blueprints/wire.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/wire_tunnel-coating.png b/res_raw/sprites/blueprints/wire_tunnel-coating.png
deleted file mode 100644
index af93022a..00000000
Binary files a/res_raw/sprites/blueprints/wire_tunnel-coating.png and /dev/null differ
diff --git a/res_raw/sprites/blueprints/wire_tunnel.png b/res_raw/sprites/blueprints/wire_tunnel.png
index 9a7cdd2a..5a2f9c69 100644
Binary files a/res_raw/sprites/blueprints/wire_tunnel.png and b/res_raw/sprites/blueprints/wire_tunnel.png differ
diff --git a/res_raw/sprites/buildings/virtual_processor-analyzer.png b/res_raw/sprites/buildings/analyzer.png
similarity index 100%
rename from res_raw/sprites/buildings/virtual_processor-analyzer.png
rename to res_raw/sprites/buildings/analyzer.png
diff --git a/res_raw/sprites/buildings/balancer-merger-inverse.png b/res_raw/sprites/buildings/balancer-merger-inverse.png
new file mode 100644
index 00000000..ff9c3833
Binary files /dev/null and b/res_raw/sprites/buildings/balancer-merger-inverse.png differ
diff --git a/res_raw/sprites/buildings/balancer-merger.png b/res_raw/sprites/buildings/balancer-merger.png
new file mode 100644
index 00000000..7101c824
Binary files /dev/null and b/res_raw/sprites/buildings/balancer-merger.png differ
diff --git a/res_raw/sprites/buildings/balancer-splitter-inverse.png b/res_raw/sprites/buildings/balancer-splitter-inverse.png
new file mode 100644
index 00000000..4a765fa4
Binary files /dev/null and b/res_raw/sprites/buildings/balancer-splitter-inverse.png differ
diff --git a/res_raw/sprites/buildings/balancer-splitter.png b/res_raw/sprites/buildings/balancer-splitter.png
new file mode 100644
index 00000000..e8fb62be
Binary files /dev/null and b/res_raw/sprites/buildings/balancer-splitter.png differ
diff --git a/res_raw/sprites/buildings/balancer.png b/res_raw/sprites/buildings/balancer.png
new file mode 100644
index 00000000..d1d12ad9
Binary files /dev/null and b/res_raw/sprites/buildings/balancer.png differ
diff --git a/res_raw/sprites/buildings/virtual_processor-shapecompare.png b/res_raw/sprites/buildings/comparator.png
similarity index 100%
rename from res_raw/sprites/buildings/virtual_processor-shapecompare.png
rename to res_raw/sprites/buildings/comparator.png
diff --git a/res_raw/sprites/buildings/constant_signal.png b/res_raw/sprites/buildings/constant_signal.png
index ae9329e0..cba902bf 100644
Binary files a/res_raw/sprites/buildings/constant_signal.png and b/res_raw/sprites/buildings/constant_signal.png differ
diff --git a/res_raw/sprites/buildings/cutter-quad.png b/res_raw/sprites/buildings/cutter-quad.png
index e67628f2..00d70cdc 100644
Binary files a/res_raw/sprites/buildings/cutter-quad.png and b/res_raw/sprites/buildings/cutter-quad.png differ
diff --git a/res_raw/sprites/buildings/item_producer.png b/res_raw/sprites/buildings/item_producer.png
new file mode 100644
index 00000000..573ef372
Binary files /dev/null and b/res_raw/sprites/buildings/item_producer.png differ
diff --git a/res_raw/sprites/buildings/lever.png b/res_raw/sprites/buildings/lever.png
index bdb6c8c8..fea5a18a 100644
Binary files a/res_raw/sprites/buildings/lever.png and b/res_raw/sprites/buildings/lever.png differ
diff --git a/res_raw/sprites/buildings/logic_gate-or.png b/res_raw/sprites/buildings/logic_gate-or.png
index 1b9c9e34..f2995a86 100644
Binary files a/res_raw/sprites/buildings/logic_gate-or.png and b/res_raw/sprites/buildings/logic_gate-or.png differ
diff --git a/res_raw/sprites/buildings/logic_gate-transistor.png b/res_raw/sprites/buildings/logic_gate-transistor.png
deleted file mode 100644
index 35952db4..00000000
Binary files a/res_raw/sprites/buildings/logic_gate-transistor.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/logic_gate-xor.png b/res_raw/sprites/buildings/logic_gate-xor.png
index c7d43a58..3828e4a0 100644
Binary files a/res_raw/sprites/buildings/logic_gate-xor.png and b/res_raw/sprites/buildings/logic_gate-xor.png differ
diff --git a/res_raw/sprites/buildings/logic_gate.png b/res_raw/sprites/buildings/logic_gate.png
index 2d206aa3..aa0ad6fd 100644
Binary files a/res_raw/sprites/buildings/logic_gate.png and b/res_raw/sprites/buildings/logic_gate.png differ
diff --git a/res_raw/sprites/buildings/painter-double.png b/res_raw/sprites/buildings/painter-double.png
index 0d909786..9d2c472e 100644
Binary files a/res_raw/sprites/buildings/painter-double.png and b/res_raw/sprites/buildings/painter-double.png differ
diff --git a/res_raw/sprites/buildings/painter-mirrored.png b/res_raw/sprites/buildings/painter-mirrored.png
index da0e199d..2a3310d7 100644
Binary files a/res_raw/sprites/buildings/painter-mirrored.png and b/res_raw/sprites/buildings/painter-mirrored.png differ
diff --git a/res_raw/sprites/buildings/painter-quad.png b/res_raw/sprites/buildings/painter-quad.png
index d14bd382..698b753a 100644
Binary files a/res_raw/sprites/buildings/painter-quad.png and b/res_raw/sprites/buildings/painter-quad.png differ
diff --git a/res_raw/sprites/buildings/painter.png b/res_raw/sprites/buildings/painter.png
index 1ebca21f..3382d420 100644
Binary files a/res_raw/sprites/buildings/painter.png and b/res_raw/sprites/buildings/painter.png differ
diff --git a/res_raw/sprites/buildings/rotater-fl.png b/res_raw/sprites/buildings/rotater-fl.png
deleted file mode 100644
index 7c2fbc16..00000000
Binary files a/res_raw/sprites/buildings/rotater-fl.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/rotater-rotate180.png b/res_raw/sprites/buildings/rotater-rotate180.png
new file mode 100644
index 00000000..c5969351
Binary files /dev/null and b/res_raw/sprites/buildings/rotater-rotate180.png differ
diff --git a/res_raw/sprites/buildings/splitter-compact-inverse.png b/res_raw/sprites/buildings/splitter-compact-inverse.png
deleted file mode 100644
index 1d9bd4c9..00000000
Binary files a/res_raw/sprites/buildings/splitter-compact-inverse.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/splitter-compact-merge-inverse.png b/res_raw/sprites/buildings/splitter-compact-merge-inverse.png
deleted file mode 100644
index 704663c0..00000000
Binary files a/res_raw/sprites/buildings/splitter-compact-merge-inverse.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/splitter-compact-merge.png b/res_raw/sprites/buildings/splitter-compact-merge.png
deleted file mode 100644
index d5a72dd4..00000000
Binary files a/res_raw/sprites/buildings/splitter-compact-merge.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/splitter-compact.png b/res_raw/sprites/buildings/splitter-compact.png
deleted file mode 100644
index f0f80a0b..00000000
Binary files a/res_raw/sprites/buildings/splitter-compact.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/splitter.png b/res_raw/sprites/buildings/splitter.png
deleted file mode 100644
index 7cd9a2ef..00000000
Binary files a/res_raw/sprites/buildings/splitter.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/storage.png b/res_raw/sprites/buildings/storage.png
new file mode 100644
index 00000000..1e30b766
Binary files /dev/null and b/res_raw/sprites/buildings/storage.png differ
diff --git a/res_raw/sprites/buildings/transistor-mirrored.png b/res_raw/sprites/buildings/transistor-mirrored.png
new file mode 100644
index 00000000..606bfce3
Binary files /dev/null and b/res_raw/sprites/buildings/transistor-mirrored.png differ
diff --git a/res_raw/sprites/buildings/transistor.png b/res_raw/sprites/buildings/transistor.png
new file mode 100644
index 00000000..e543d985
Binary files /dev/null and b/res_raw/sprites/buildings/transistor.png differ
diff --git a/res_raw/sprites/buildings/trash-storage.png b/res_raw/sprites/buildings/trash-storage.png
deleted file mode 100644
index 39a4df1f..00000000
Binary files a/res_raw/sprites/buildings/trash-storage.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/underground_belt_entry-tier2.png b/res_raw/sprites/buildings/underground_belt_entry-tier2.png
index 3a30f4b5..96dd4f66 100644
Binary files a/res_raw/sprites/buildings/underground_belt_entry-tier2.png and b/res_raw/sprites/buildings/underground_belt_entry-tier2.png differ
diff --git a/res_raw/sprites/buildings/underground_belt_entry.png b/res_raw/sprites/buildings/underground_belt_entry.png
index 3b771f60..c1e4c4e8 100644
Binary files a/res_raw/sprites/buildings/underground_belt_entry.png and b/res_raw/sprites/buildings/underground_belt_entry.png differ
diff --git a/res_raw/sprites/buildings/underground_belt_exit-tier2.png b/res_raw/sprites/buildings/underground_belt_exit-tier2.png
index 87c59bf3..2ee15c61 100644
Binary files a/res_raw/sprites/buildings/underground_belt_exit-tier2.png and b/res_raw/sprites/buildings/underground_belt_exit-tier2.png differ
diff --git a/res_raw/sprites/buildings/underground_belt_exit.png b/res_raw/sprites/buildings/underground_belt_exit.png
index c281ed0e..9614ae11 100644
Binary files a/res_raw/sprites/buildings/underground_belt_exit.png and b/res_raw/sprites/buildings/underground_belt_exit.png differ
diff --git a/res_raw/sprites/buildings/virtual_processor-painter.png b/res_raw/sprites/buildings/virtual_processor-painter.png
new file mode 100644
index 00000000..b952e9d7
Binary files /dev/null and b/res_raw/sprites/buildings/virtual_processor-painter.png differ
diff --git a/res_raw/sprites/buildings/virtual_processor-rotater.png b/res_raw/sprites/buildings/virtual_processor-rotater.png
index 8c9dcbdc..6cad3244 100644
Binary files a/res_raw/sprites/buildings/virtual_processor-rotater.png and b/res_raw/sprites/buildings/virtual_processor-rotater.png differ
diff --git a/res_raw/sprites/buildings/virtual_processor-stacker.png b/res_raw/sprites/buildings/virtual_processor-stacker.png
index 15882e63..59c5bada 100644
Binary files a/res_raw/sprites/buildings/virtual_processor-stacker.png and b/res_raw/sprites/buildings/virtual_processor-stacker.png differ
diff --git a/res_raw/sprites/buildings/wire-cross.png b/res_raw/sprites/buildings/wire-cross.png
deleted file mode 100644
index e9c71dac..00000000
Binary files a/res_raw/sprites/buildings/wire-cross.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/wire-split.png b/res_raw/sprites/buildings/wire-split.png
deleted file mode 100644
index e26b552c..00000000
Binary files a/res_raw/sprites/buildings/wire-split.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/wire-turn.png b/res_raw/sprites/buildings/wire-turn.png
deleted file mode 100644
index 5b50bb09..00000000
Binary files a/res_raw/sprites/buildings/wire-turn.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/wire.png b/res_raw/sprites/buildings/wire.png
deleted file mode 100644
index 8310be84..00000000
Binary files a/res_raw/sprites/buildings/wire.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/wire_tunnel-coating.png b/res_raw/sprites/buildings/wire_tunnel-coating.png
deleted file mode 100644
index f5dd3ffe..00000000
Binary files a/res_raw/sprites/buildings/wire_tunnel-coating.png and /dev/null differ
diff --git a/res_raw/sprites/buildings/wire_tunnel.png b/res_raw/sprites/buildings/wire_tunnel.png
index 8349e981..a798036e 100644
Binary files a/res_raw/sprites/buildings/wire_tunnel.png and b/res_raw/sprites/buildings/wire_tunnel.png differ
diff --git a/res_raw/sprites/colors/blue.png b/res_raw/sprites/colors/blue.png
new file mode 100644
index 00000000..5dceb132
Binary files /dev/null and b/res_raw/sprites/colors/blue.png differ
diff --git a/res_raw/sprites/colors/cyan.png b/res_raw/sprites/colors/cyan.png
new file mode 100644
index 00000000..efd0ff1a
Binary files /dev/null and b/res_raw/sprites/colors/cyan.png differ
diff --git a/res_raw/sprites/colors/green.png b/res_raw/sprites/colors/green.png
new file mode 100644
index 00000000..f719e0ce
Binary files /dev/null and b/res_raw/sprites/colors/green.png differ
diff --git a/res_raw/sprites/colors/purple.png b/res_raw/sprites/colors/purple.png
new file mode 100644
index 00000000..ee3ebaf1
Binary files /dev/null and b/res_raw/sprites/colors/purple.png differ
diff --git a/res_raw/sprites/colors/red.png b/res_raw/sprites/colors/red.png
new file mode 100644
index 00000000..8e918371
Binary files /dev/null and b/res_raw/sprites/colors/red.png differ
diff --git a/res_raw/sprites/colors/uncolored.png b/res_raw/sprites/colors/uncolored.png
new file mode 100644
index 00000000..9ca5159e
Binary files /dev/null and b/res_raw/sprites/colors/uncolored.png differ
diff --git a/res_raw/sprites/colors/white.png b/res_raw/sprites/colors/white.png
new file mode 100644
index 00000000..3f1c29f4
Binary files /dev/null and b/res_raw/sprites/colors/white.png differ
diff --git a/res_raw/sprites/colors/yellow.png b/res_raw/sprites/colors/yellow.png
new file mode 100644
index 00000000..6dc9c0ea
Binary files /dev/null and b/res_raw/sprites/colors/yellow.png differ
diff --git a/res_raw/sprites/create_blueprint_previews.py b/res_raw/sprites/create_blueprint_previews.py
index cceefae0..96688fe4 100644
--- a/res_raw/sprites/create_blueprint_previews.py
+++ b/res_raw/sprites/create_blueprint_previews.py
@@ -1,110 +1,92 @@
-# Requirements: numpy, scipy, Pillow,
-from __future__ import print_function
-import sys
-import numpy as np
-from scipy import ndimage
-from PIL import Image, ImageFilter, ImageChops
-import math
-from os import listdir
-from os.path import isdir, isfile
-
-roberts_cross_v = np.array([[0, 0, 0],
- [0, 1, 0],
- [0, 0, -1]])
-
-roberts_cross_h = np.array([[0, 0, 0],
- [0, 0, 1],
- [0, -1, 0]])
-
-
-def rgb2gray(rgb):
- return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
-
-
-
-
-def save_image(data, outfilename, src_image):
- img = Image.fromarray(np.asarray(
- np.clip(data, 0, 255), dtype="uint8"), "L")
- dest = Image.new("RGBA", (img.width, img.height))
- src = img.load()
- dst = dest.load()
-
- realSrc = src_image.load()
- mask = src_image.filter(ImageFilter.GaussianBlur(10)).load()
- orig = src_image.load()
-
-
- isWire = "wire" in outfilename
-
- targetR = 104
- targetG = 200
- targetB = 255
-
- if isWire:
- targetR = 255
- targetG = 104
- targetB = 232
-
- for x in range(img.width):
- for y in range(img.height):
- realpixl = realSrc[x, y]
- greyval = float(src[x, y])
- greyval = min(255.0, greyval)
- greyval = math.pow(
- min(1, float(greyval / 255.0 * 1)), 1.5) * 255.0 * 1
- greyval = max(0, greyval)
- alpha = mask[x, y][3] / 255.0 * 1
-
- edgeFactor = src[x, y] / 255.0
- noEdge = 1 - edgeFactor
-
- shadow = min(1, 1 - realpixl[3] / 255.0 - edgeFactor)
- noShadow = 1 - shadow
-
- dst[x, y] = (
- min(255, int((realpixl[0] / 255.0 * 0.4 + 0.6) * targetR * 1.1)),
- min(255, int((realpixl[1] / 255.0 * 0.4 + 0.6) * targetG * 1.1)),
- min(255, int((realpixl[2] / 255.0 * 0.4 + 0.6) * targetB * 1.1)),
- min(255, int(float(realpixl[3]) * (0.6 + 5 * edgeFactor))))
-
-
- dest.save(outfilename)
-
-
-def roberts_cross(infilename, outfilename):
- print("Processing", infilename)
- img = Image.open(infilename)
- img.load()
- img = img.filter(ImageFilter.GaussianBlur(0.5))
-
- image = rgb2gray(np.asarray(img, dtype="int32"))
- vertical = ndimage.convolve(image, roberts_cross_v)
- horizontal = ndimage.convolve(image, roberts_cross_h)
- output_image = np.sqrt(np.square(horizontal) + np.square(vertical))
- save_image(output_image, outfilename, img)
-
-
-def generateUiPreview(srcPath, buildingId):
- print(srcPath, buildingId)
- img = Image.open(srcPath)
- img.load()
- img.thumbnail((110, 110), Image.ANTIALIAS)
- img.save("../res/ui/hud/building_previews/" + buildingId + ".png")
-
- img = img.convert("LA")
-
- data = img.load()
- for x in range(img.width):
- for y in range(img.height):
- data[x, y] = (data[x, y][0], int(data[x, y][1] * 0.5))
-
- img.save("../res/ui/hud/building_previews/" + buildingId + "_disabled.png")
-
-
-buildings = listdir("buildings")
-
-for buildingId in buildings:
- if "hub" in buildingId:
- continue
- roberts_cross("buildings/" + buildingId + "", "blueprints/" + buildingId + "")
+# Requirements: numpy, scipy, Pillow,
+from __future__ import print_function
+import sys
+import numpy as np
+from scipy import ndimage
+from PIL import Image, ImageFilter, ImageChops
+import math
+from os import listdir
+from os.path import isdir, isfile
+
+generate_blueprint_sprite_v = np.array([[0, 0, 0],
+ [0, 1, 0],
+ [0, 0, -1]])
+
+generate_blueprint_sprite_h = np.array([[0, 0, 0],
+ [0, 0, 1],
+ [0, -1, 0]])
+
+
+def rgb2gray(rgb):
+ return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
+
+def process_image(data, outfilename, src_image):
+ img = Image.fromarray(np.asarray(
+ np.clip(data, 0, 255), dtype="uint8"), "L")
+ dest = Image.new("RGBA", (img.width, img.height))
+ src = img.load()
+ dst = dest.load()
+
+ realSrc = src_image.load()
+ mask = src_image.filter(ImageFilter.GaussianBlur(10)).load()
+ orig = src_image.load()
+
+ # isWire = "wire" in outfilename
+ isWire = False
+
+ targetR = 104
+ targetG = 200
+ targetB = 255
+
+ if isWire:
+ targetR = 255
+ targetG = 104
+ targetB = 232
+
+ for x in range(img.width):
+ for y in range(img.height):
+ realpixl = realSrc[x, y]
+ greyval = float(src[x, y])
+ greyval = min(255.0, greyval)
+ greyval = math.pow(
+ min(1, float(greyval / 255.0 * 1)), 1.5) * 255.0 * 1
+ greyval = max(0, greyval)
+ alpha = mask[x, y][3] / 255.0 * 1
+
+ edgeFactor = src[x, y] / 255.0
+ noEdge = 1 - edgeFactor
+
+ shadow = min(1, 1 - realpixl[3] / 255.0 - edgeFactor)
+ noShadow = 1 - shadow
+
+ dst[x, y] = (
+ min(255, int((realpixl[0] / 255.0 * 0.4 + 0.6) * targetR * 1.1)),
+ min(255, int((realpixl[1] / 255.0 * 0.4 + 0.6) * targetG * 1.1)),
+ min(255, int((realpixl[2] / 255.0 * 0.4 + 0.6) * targetB * 1.1)),
+ min(255, int(float(realpixl[3]) * (0.6 + 5 * edgeFactor))))
+
+
+ dest.save(outfilename)
+
+
+def generate_blueprint_sprite(infilename, outfilename):
+ print("Processing", infilename)
+ img = Image.open(infilename)
+ img.load()
+ img = img.filter(ImageFilter.GaussianBlur(0.5))
+
+ image = rgb2gray(np.asarray(img, dtype="int32"))
+ vertical = ndimage.convolve(image, generate_blueprint_sprite_v)
+ horizontal = ndimage.convolve(image, generate_blueprint_sprite_h)
+ output_image = np.sqrt(np.square(horizontal) + np.square(vertical))
+ process_image(output_image, outfilename, img)
+
+
+buildings = listdir("buildings")
+
+for buildingId in buildings:
+ if "hub" in buildingId:
+ continue
+ if "wire-" in buildingId:
+ continue
+ generate_blueprint_sprite("buildings/" + buildingId + "", "blueprints/" + buildingId + "")
diff --git a/res_raw/sprites/wires/lever_on.png b/res_raw/sprites/wires/lever_on.png
index f6a04e16..55aad16c 100644
Binary files a/res_raw/sprites/wires/lever_on.png and b/res_raw/sprites/wires/lever_on.png differ
diff --git a/res_raw/sprites/wires/sets/color_cross.png b/res_raw/sprites/wires/sets/color_cross.png
deleted file mode 100644
index c3b2a3c2..00000000
Binary files a/res_raw/sprites/wires/sets/color_cross.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/color_forward.png b/res_raw/sprites/wires/sets/color_forward.png
deleted file mode 100644
index f6584aaa..00000000
Binary files a/res_raw/sprites/wires/sets/color_forward.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/color_split.png b/res_raw/sprites/wires/sets/color_split.png
deleted file mode 100644
index af9ddfb6..00000000
Binary files a/res_raw/sprites/wires/sets/color_split.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/color_turn.png b/res_raw/sprites/wires/sets/color_turn.png
deleted file mode 100644
index 1cf4dcb0..00000000
Binary files a/res_raw/sprites/wires/sets/color_turn.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/conflict_cross.png b/res_raw/sprites/wires/sets/conflict_cross.png
index fee403a6..3be1e9b9 100644
Binary files a/res_raw/sprites/wires/sets/conflict_cross.png and b/res_raw/sprites/wires/sets/conflict_cross.png differ
diff --git a/res_raw/sprites/wires/sets/conflict_forward.png b/res_raw/sprites/wires/sets/conflict_forward.png
index 8b9ab43a..abb02d18 100644
Binary files a/res_raw/sprites/wires/sets/conflict_forward.png and b/res_raw/sprites/wires/sets/conflict_forward.png differ
diff --git a/res_raw/sprites/wires/sets/conflict_split.png b/res_raw/sprites/wires/sets/conflict_split.png
index 6e22aaf0..c74a0e41 100644
Binary files a/res_raw/sprites/wires/sets/conflict_split.png and b/res_raw/sprites/wires/sets/conflict_split.png differ
diff --git a/res_raw/sprites/wires/sets/conflict_turn.png b/res_raw/sprites/wires/sets/conflict_turn.png
index 93bd3250..d359969b 100644
Binary files a/res_raw/sprites/wires/sets/conflict_turn.png and b/res_raw/sprites/wires/sets/conflict_turn.png differ
diff --git a/res_raw/sprites/wires/sets/first_cross.png b/res_raw/sprites/wires/sets/first_cross.png
new file mode 100644
index 00000000..5ec6e11b
Binary files /dev/null and b/res_raw/sprites/wires/sets/first_cross.png differ
diff --git a/res_raw/sprites/wires/sets/first_forward.png b/res_raw/sprites/wires/sets/first_forward.png
new file mode 100644
index 00000000..a6e0df71
Binary files /dev/null and b/res_raw/sprites/wires/sets/first_forward.png differ
diff --git a/res_raw/sprites/wires/sets/first_split.png b/res_raw/sprites/wires/sets/first_split.png
new file mode 100644
index 00000000..f77ff0b8
Binary files /dev/null and b/res_raw/sprites/wires/sets/first_split.png differ
diff --git a/res_raw/sprites/wires/sets/first_turn.png b/res_raw/sprites/wires/sets/first_turn.png
new file mode 100644
index 00000000..6d005aae
Binary files /dev/null and b/res_raw/sprites/wires/sets/first_turn.png differ
diff --git a/res_raw/sprites/wires/sets/regular_cross.png b/res_raw/sprites/wires/sets/regular_cross.png
deleted file mode 100644
index e9c71dac..00000000
Binary files a/res_raw/sprites/wires/sets/regular_cross.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/regular_forward.png b/res_raw/sprites/wires/sets/regular_forward.png
deleted file mode 100644
index 8310be84..00000000
Binary files a/res_raw/sprites/wires/sets/regular_forward.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/regular_split.png b/res_raw/sprites/wires/sets/regular_split.png
deleted file mode 100644
index e26b552c..00000000
Binary files a/res_raw/sprites/wires/sets/regular_split.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/regular_turn.png b/res_raw/sprites/wires/sets/regular_turn.png
deleted file mode 100644
index 5b50bb09..00000000
Binary files a/res_raw/sprites/wires/sets/regular_turn.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/second_cross.png b/res_raw/sprites/wires/sets/second_cross.png
new file mode 100644
index 00000000..7c5008b6
Binary files /dev/null and b/res_raw/sprites/wires/sets/second_cross.png differ
diff --git a/res_raw/sprites/wires/sets/second_forward.png b/res_raw/sprites/wires/sets/second_forward.png
new file mode 100644
index 00000000..3656acd7
Binary files /dev/null and b/res_raw/sprites/wires/sets/second_forward.png differ
diff --git a/res_raw/sprites/wires/sets/second_split.png b/res_raw/sprites/wires/sets/second_split.png
new file mode 100644
index 00000000..dd1a51a8
Binary files /dev/null and b/res_raw/sprites/wires/sets/second_split.png differ
diff --git a/res_raw/sprites/wires/sets/second_turn.png b/res_raw/sprites/wires/sets/second_turn.png
new file mode 100644
index 00000000..b2be4bb6
Binary files /dev/null and b/res_raw/sprites/wires/sets/second_turn.png differ
diff --git a/res_raw/sprites/wires/sets/shape_cross.png b/res_raw/sprites/wires/sets/shape_cross.png
deleted file mode 100644
index d04812aa..00000000
Binary files a/res_raw/sprites/wires/sets/shape_cross.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/shape_forward.png b/res_raw/sprites/wires/sets/shape_forward.png
deleted file mode 100644
index 15ec3b9c..00000000
Binary files a/res_raw/sprites/wires/sets/shape_forward.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/shape_split.png b/res_raw/sprites/wires/sets/shape_split.png
deleted file mode 100644
index d19c9b71..00000000
Binary files a/res_raw/sprites/wires/sets/shape_split.png and /dev/null differ
diff --git a/res_raw/sprites/wires/sets/shape_turn.png b/res_raw/sprites/wires/sets/shape_turn.png
deleted file mode 100644
index 4f40caa7..00000000
Binary files a/res_raw/sprites/wires/sets/shape_turn.png and /dev/null differ
diff --git a/shapez.code-workspace b/shapez.code-workspace
index 29dae2a2..e8e7e5b3 100644
--- a/shapez.code-workspace
+++ b/shapez.code-workspace
@@ -14,6 +14,7 @@
"vetur.format.defaultFormatter.js": "vscode-typescript",
"vetur.format.defaultFormatter.ts": "vscode-typescript",
"editor.defaultFormatter": "esbenp.prettier-vscode",
- "editor.formatOnSave": true
+ "editor.formatOnSave": true,
+ "files.trimTrailingWhitespace": true
}
}
\ No newline at end of file
diff --git a/src/css/adinplay.scss b/src/css/adinplay.scss
index c0deca58..79b7542e 100644
--- a/src/css/adinplay.scss
+++ b/src/css/adinplay.scss
@@ -50,7 +50,6 @@
left: 0;
right: 0;
bottom: 0;
- background: rgba($mainBgColor, 0.9) uiResource("loading.svg") center center / #{D(60px)} no-repeat;
@include InlineAnimation(0.2s ease-in-out) {
0% {
opacity: 0;
@@ -59,6 +58,11 @@
opacity: 1;
}
}
+
+ & {
+ /* @load-async */
+ background: rgba($mainBgColor, 0.9) uiResource("loading.svg") center center / #{D(60px)} no-repeat;
+ }
}
}
}
diff --git a/src/css/common.scss b/src/css/common.scss
index 5ae13dda..5b28cd03 100644
--- a/src/css/common.scss
+++ b/src/css/common.scss
@@ -391,14 +391,23 @@ canvas {
color: #393747;
&::after {
content: " ";
- background: uiResource("loading.svg") center center / contain no-repeat;
- @include S(width, 15px);
- @include S(height, 15px);
- @include S(margin-top, 1px);
- @include S(margin-left, 5px);
+ @include S(width, 35px);
+ @include S(height, 35px);
display: inline-block;
vertical-align: middle;
+
+ & {
+ /* @load-async */
+ background: uiResource("loading.svg") center center / contain no-repeat;
+ }
}
+
+ @include InlineAnimation(1.5s ease-in-out infinite) {
+ 50% {
+ transform: scale(1.2) rotate(160deg);
+ }
+ }
+
@include DarkThemeOverride {
color: #fff;
}
@@ -446,7 +455,6 @@ canvas {
.prefab_InfoIcon {
@include S(width, 25px);
@include S(height, 25px);
- // background: uiResource("icons_small/info.png") center center / contain no-repeat;
z-index: 100;
opacity: 0.8;
cursor: pointer;
@@ -463,18 +471,48 @@ canvas {
justify-content: center;
flex-direction: column;
.loadingImage {
- background: uiResource("loading.svg") center center / #{D(60px)} no-repeat;
width: 100%;
display: flex;
flex-grow: 1;
+
+ @include InlineAnimation(1.5s ease-in-out infinite) {
+ 50% {
+ transform: scale(1.2) rotate(160deg);
+ }
+ }
+
+ & {
+ /* @load-async */
+ background: uiResource("loading.svg") center center / #{D(40px)} no-repeat;
+ }
}
+
+ .prefab_GameHint {
+ position: absolute;
+ @include S(left, 20px);
+ @include S(right, 20px);
+ @include S(bottom, 60px);
+ @include Text;
+ color: #666;
+
+ @include DarkThemeOverride() {
+ color: lighten($darkModeGameBackground, 50);
+ }
+ }
+
.loadingStatus {
position: absolute;
@include S(left, 20px);
@include S(right, 20px);
@include S(bottom, 30px);
@include Text;
- @include TextShadow3D(#aaa);
+ @include PlainText;
+ color: #aaa;
+
+ @include DarkThemeOverride {
+ color: lighten($darkModeGameBackground, 20);
+ }
+
display: flex;
flex-direction: column;
justify-content: center;
@@ -568,6 +606,13 @@ canvas {
background-color: lighten($themeColor, 15);
}
}
+
+ @include DarkThemeOverride {
+ background-color: $darkModeGameBackground !important;
+ &.checked {
+ background-color: $colorBlueBright !important;
+ }
+ }
}
.rangeInputContainer {
@@ -597,6 +642,16 @@ input.rangeInput {
@include S(border-radius, 8px);
}
+ @include DarkThemeOverride {
+ &::-webkit-slider-runnable-track {
+ background-color: $darkModeControlsBackground;
+ }
+
+ &::-webkit-slider-thumb {
+ box-shadow: inset 0 0 0 D(10px) #eee;
+ }
+ }
+
&::-webkit-slider-thumb {
appearance: none;
-webkit-appearance: none;
diff --git a/src/css/icons.scss b/src/css/icons.scss
deleted file mode 100644
index 841fccd9..00000000
--- a/src/css/icons.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-$buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, trash, underground_belt, wire,
- constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader;
-
-@each $building in $buildings {
- [data-icon="building_icons/#{$building}.png"] {
- background-image: uiResource("res/ui/building_icons/#{$building}.png") !important;
- }
-}
-
-$buildingsAndVariants: belt, splitter, splitter-compact, splitter-compact-inverse, underground_belt,
- underground_belt-tier2, miner, miner-chainable, cutter, cutter-quad, rotater, rotater-ccw, rotater-fl,
- stacker, mixer, painter, painter-double, painter-quad, trash, trash-storage;
-@each $building in $buildingsAndVariants {
- [data-icon="building_tutorials/#{$building}.png"] {
- background-image: uiResource("res/ui/building_tutorials/#{$building}.png") !important;
- }
-}
-
-// Special case
-[data-icon="building_tutorials/painter-mirrored.png"] {
- background-image: uiResource("res/ui/building_tutorials/painter.png") !important;
-}
-
-$icons: notification_saved, notification_success, notification_upgrade;
-@each $icon in $icons {
- [data-icon="icons/#{$icon}.png"] {
- background-image: uiResource("res/ui/icons/#{$icon}.png") !important;
- }
-}
-
-$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi,
- th, hu, pl, ja, kor, no, pt-PT;
-
-@each $language in $languages {
- [data-languageicon="#{$language}"] {
- background-image: uiResource("languages/#{$language}.svg") !important;
- }
-}
diff --git a/src/css/ingame_hud/beta_overlay.scss b/src/css/ingame_hud/beta_overlay.scss
index 816cddb2..caadd127 100644
--- a/src/css/ingame_hud/beta_overlay.scss
+++ b/src/css/ingame_hud/beta_overlay.scss
@@ -1,8 +1,24 @@
#ingame_HUD_BetaOverlay {
position: fixed;
@include S(top, 10px);
- @include S(right, 15px);
+ left: 50%;
+ transform: translateX(-50%);
color: $colorRedBright;
@include Heading;
text-transform: uppercase;
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+
+ h2 {
+ @include PlainText;
+ }
+
+ span {
+ color: #555;
+ @include SuperSmallText;
+ }
}
diff --git a/src/css/ingame_hud/blueprint_placer.scss b/src/css/ingame_hud/blueprint_placer.scss
index e1cf06ef..36d1cdad 100644
--- a/src/css/ingame_hud/blueprint_placer.scss
+++ b/src/css/ingame_hud/blueprint_placer.scss
@@ -1,39 +1,40 @@
-#ingame_HUD_BlueprintPlacer {
- position: absolute;
- @include S(top, 50px);
- left: 50%;
- transform: translateX(-50%);
- color: #333;
- z-index: 9999;
- background: $ingameHudBg;
- @include S(padding, 5px);
- display: flex;
- flex-direction: column;
- color: #fff;
- @include S(width, 120px);
- align-items: center;
- justify-content: center;
-
- .label {
- @include PlainText;
- text-transform: uppercase;
- }
- .costContainer {
- display: flex;
- align-items: center;
- @include Heading;
-
- > canvas {
- @include S(margin-left, 5px);
- @include S(width, 30px);
- @include S(height, 30px);
- }
- }
-
- &:not(.canAfford) {
- background: rgba(98, 27, 41, 0.8);
- // .costContainer {
- color: rgb(255, 97, 128);
- // }
- }
-}
+#ingame_HUD_BlueprintPlacer {
+ position: absolute;
+ @include S(top, 70px);
+ left: 50%;
+ transform: translateX(-50%);
+ color: #333;
+ z-index: 9999;
+ background: $ingameHudBg;
+ @include S(padding, 5px);
+ display: flex;
+ flex-direction: column;
+ color: #fff;
+ @include S(width, 120px);
+ align-items: center;
+ justify-content: center;
+ @include S(border-radius, $globalBorderRadius);
+
+ .label {
+ @include PlainText;
+ text-transform: uppercase;
+ }
+ .costContainer {
+ display: flex;
+ align-items: center;
+ @include Heading;
+
+ > canvas {
+ @include S(margin-left, 5px);
+ @include S(width, 30px);
+ @include S(height, 30px);
+ }
+ }
+
+ &:not(.canAfford) {
+ background: rgba(98, 27, 41, 0.8);
+ // .costContainer {
+ color: rgb(255, 97, 128);
+ // }
+ }
+}
diff --git a/src/css/ingame_hud/buildings_toolbar.scss b/src/css/ingame_hud/buildings_toolbar.scss
index d394106d..54205d64 100644
--- a/src/css/ingame_hud/buildings_toolbar.scss
+++ b/src/css/ingame_hud/buildings_toolbar.scss
@@ -1,107 +1,114 @@
-.ingame_buildingsToolbar {
- position: fixed;
- @include S(bottom, 0px);
- left: 50%;
- transform: translateX(-50%);
-
- // NOTE: This flex rule may not be necessary. Need to find out intent.
- display: flex;
- flex-direction: column;
- background: transparent;
- border-bottom-width: 0;
- transition: transform 120ms ease-in-out;
- will-change: transform;
-
- background-color: rgba(mix(#ddd, $colorBlueBright, 90%), 0.5);
- backdrop-filter: blur(D(3px));
-
- @include DarkThemeOverride {
- background-color: #222428;
- }
-
- &:not(.visible) {
- transform: translateX(-50%) translateY(#{D(100px)});
- }
-
- @include S(border-top-left-radius, $globalBorderRadius);
- @include S(border-top-right-radius, $globalBorderRadius);
-
- .buildings {
- display: grid;
- grid-auto-flow: column;
-
- .building {
- color: $accentColorDark;
- display: flex;
- flex-direction: column;
- position: relative;
- align-items: center;
- justify-content: center;
- @include S(padding, 5px);
- @include S(padding-bottom, 1px);
- @include S(width, 35px);
- @include S(height, 40px);
-
- background: center center / 65% no-repeat;
-
- &:not(.unlocked) {
- @include S(width, 20px);
- opacity: 0.15;
- background-image: none !important;
-
- &::before {
- content: " ";
- background: uiResource("locked_building.png") center center / #{D(20px)} #{D(20px)}
- no-repeat;
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 4;
- }
- }
-
- @include S(border-radius, $globalBorderRadius);
-
- &.unlocked {
- pointer-events: all;
- transition: all 50ms ease-in-out;
- transition-property: background-color, transform;
- cursor: pointer;
- will-change: transform;
-
- &::before {
- content: "";
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: $accentColorDark;
- opacity: 0;
- will-change: opacity;
- }
-
- &:hover {
- &::before {
- opacity: 0.1;
- }
- }
-
- &.selected {
- transform: scale(1.05);
-
- &::before {
- background-color: $colorBlueBright;
- opacity: 0.6;
- }
-
- .keybinding {
- color: #111;
- }
- }
- }
- }
- }
-}
+.ingame_buildingsToolbar {
+ position: absolute;
+ @include S(bottom, 5px);
+ left: 50%;
+ transform: translateX(-50%);
+
+ display: grid;
+ grid-template-rows: auto auto;
+ justify-items: center;
+
+ background: transparent;
+ transition: transform 120ms ease-in-out;
+ will-change: transform;
+
+ &:not(.visible) {
+ transform: translateX(-50%) translateY(#{D(100px)});
+ }
+
+ .buildings {
+ display: grid;
+ grid-auto-flow: column;
+ justify-items: center;
+ align-self: center;
+ grid-row: 2 / 3;
+
+ background-color: rgba(240, 241, 243, 0.5);
+ @include S(border-radius, $globalBorderRadius);
+
+ @include DarkThemeOverride {
+ background-color: rgba(darken($darkModeGameBackground, 15), 0.95);
+ }
+
+ &.secondary {
+ grid-row: 1 / 2;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+
+ .building {
+ @include S(width, 30px);
+ @include S(height, 22px);
+ background-size: 45%;
+
+ &:not(.unlocked) {
+ &::before {
+ background-size: #{D(13px)};
+ }
+ }
+ }
+ }
+
+ .building {
+ color: $accentColorDark;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ align-items: center;
+ justify-content: center;
+ @include S(padding, 5px);
+ @include S(padding-bottom, 1px);
+ @include S(width, 35px);
+ @include S(height, 40px);
+
+ background: center center / 70% no-repeat;
+
+ &:not(.unlocked) {
+ @include S(width, 20px);
+ opacity: 0.15;
+ background-image: none !important;
+
+ &::before {
+ content: " ";
+
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 4;
+ & {
+ /* @load-async */
+ background: uiResource("locked_building.png") center center / #{D(20px)} #{D(20px)}
+ no-repeat;
+ }
+ }
+ }
+
+ @include S(border-radius, $globalBorderRadius);
+
+ &.unlocked {
+ pointer-events: all;
+ transition: all 50ms ease-in-out;
+ transition-property: background-color, transform;
+
+ cursor: pointer;
+ &:hover {
+ background-color: rgba(30, 40, 90, 0.1);
+ }
+
+ &.pressed {
+ transform: scale(0.9) !important;
+ }
+
+ &.selected {
+ // transform: scale(1.05);
+ background-color: rgba(lighten($colorBlueBright, 9), 0.4);
+
+ .keybinding {
+ color: #111;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/cat_memes.scss b/src/css/ingame_hud/cat_memes.scss
new file mode 100644
index 00000000..ddb0ae3f
--- /dev/null
+++ b/src/css/ingame_hud/cat_memes.scss
@@ -0,0 +1,23 @@
+#ingame_HUD_CatMemes {
+ position: absolute;
+ @include S(width, 150px);
+ @include S(height, 150px);
+ background: transparent center center / contain no-repeat;
+
+ right: 0;
+ @include S(bottom, 150px);
+
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/memes/cat1.png") !important;
+ }
+
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ transform: translateX(100%);
+ }
+ 100% {
+ transform: none;
+ }
+ }
+}
diff --git a/src/css/ingame_hud/dialogs.scss b/src/css/ingame_hud/dialogs.scss
index 9c9ce7a4..ad3f76d0 100644
--- a/src/css/ingame_hud/dialogs.scss
+++ b/src/css/ingame_hud/dialogs.scss
@@ -1,231 +1,259 @@
-.ingameDialog {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- pointer-events: all;
- background: $modalDialogBg;
-
- display: flex;
- align-items: center;
- justify-content: center;
-
- @include InlineAnimation(0.12s ease-in-out) {
- 0% {
- background-color: transparent;
- opacity: 0.5;
- }
- 100% {
- background-color: $modalDialogBg;
- }
- }
-
- $darkModeDialogBg: darken($darkModeGameBackground, 10);
-
- @include DarkThemeOverride {
- background: rgba($darkModeDialogBg, 0.9);
- @include InlineAnimation(0.12s ease-in-out) {
- 0% {
- background-color: transparent;
- opacity: 0.5;
- }
- 100% {
- background-color: rgba($darkModeDialogBg, 0.9);
- }
- }
-
- > .dialogInner.optionChooserDialog .optionParent {
- .option {
- background: #3d3f42;
-
- &:hover {
- background-color: #424348;
- }
-
- &.active {
- background: $colorBlueBright;
- color: #fff;
- }
- }
- }
- }
-
- &.visible {
- .dialogInner {
- opacity: 1;
- }
- backdrop-filter: blur(D(3px));
- }
-
- .dialogInner {
- transition: opacity 0.2s ease-in-out;
- opacity: 0;
- }
-
- &.loadingDialog {
- * {
- color: #fff;
- }
- }
-
- > .dialogInner {
- background: #fff;
- max-height: calc(100vh - #{D(40px)});
- @include S(border-radius, $globalBorderRadius);
- display: flex;
- flex-direction: column;
- @include S(padding, 12px);
- pointer-events: all;
-
- @include DarkThemeOverride {
- background: #333438;
- }
-
- &.optionChooserDialog {
- .optionParent {
- display: grid;
- @include S(grid-gap, 5px);
- grid-template-columns: 1fr 1fr;
- .option {
- pointer-events: all;
- cursor: pointer;
- @include S(padding, 10px);
- background: #eee;
- transition: background-color 0.12s ease-in-out;
-
- &:hover {
- background-color: #e7e7e7;
- }
-
- &.active {
- background-color: $colorBlueBright;
- color: #fff;
- }
- }
- }
- }
-
- > .title {
- @include Heading;
- margin: 0;
- text-transform: uppercase;
- display: grid;
- align-items: center;
- grid-template-columns: 1fr auto;
- @include S(margin-bottom, 10px);
-
- @include DarkThemeInvert();
- > .closeButton {
- opacity: 0.7;
- @include S(width, 20px);
- @include S(height, 20px);
- background: uiResource("icons/close.png") center center / 80% no-repeat;
- cursor: pointer;
- pointer-events: all;
- transition: opacity 0.2s ease-in-out;
- &:hover {
- opacity: 0.4;
- }
- }
- }
-
- > .content {
- @include PlainText;
- overflow-y: auto;
- pointer-events: all;
- @include S(width, 350px);
-
- @include DarkThemeOverride {
- color: #aaa;
- }
-
- a {
- color: $colorBlueBright;
- }
-
- strong {
- font-weight: bold;
- }
-
- .keybinding {
- position: relative;
- background: #eee;
- @include PlainText;
- height: unset;
- margin: 1px 0;
- }
-
- input {
- background: #eee;
- color: #333438;
- width: 100%;
-
- &.errored {
- background-color: rgb(250, 206, 206);
- }
- }
-
- ul.bucketList {
- padding-left: 30px;
-
- li {
- display: list-item;
- }
- }
- }
-
- > .buttons {
- @include S(margin-top, 15px);
- display: flex;
- justify-content: flex-end;
- > button {
- @include S(margin-left, 8px);
- @include Text;
- @include S(min-width, 60px);
- @include S(padding, 5px, 15px);
-
- transition: opacity 0.12s ease-in-out;
- &:hover {
- opacity: 0.9;
- }
-
- &.good {
- background-color: $colorGreenBright;
- color: #fff;
- }
-
- &.bad {
- background-color: $colorRedBright;
- color: #fff;
- }
-
- &.timedButton {
- pointer-events: none;
- cursor: default;
- position: relative;
- overflow: hidden;
- &::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: unset;
- z-index: 5;
- content: " ";
- display: inline-block;
- background: rgba(#fff, 0.6);
- @include InlineAnimation(5s linear) {
- 0% {
- width: 100%;
- }
- 100% {
- width: 0%;
- }
- }
- }
- }
- }
- }
- }
-}
+.ingameDialog {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ pointer-events: all;
+ background: $modalDialogBg;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ @include InlineAnimation(0.12s ease-in-out) {
+ 0% {
+ background-color: transparent;
+ opacity: 0.5;
+ }
+ 100% {
+ background-color: $modalDialogBg;
+ }
+ }
+
+ $darkModeDialogBg: darken($darkModeGameBackground, 5);
+
+ @include DarkThemeOverride {
+ background: rgba($darkModeDialogBg, 0.9);
+ @include InlineAnimation(0.12s ease-in-out) {
+ 0% {
+ background-color: transparent;
+ opacity: 0.5;
+ }
+ 100% {
+ background-color: rgba($darkModeDialogBg, 0.9);
+ }
+ }
+
+ > .dialogInner.optionChooserDialog .optionParent {
+ .option {
+ background: $darkModeControlsBackground;
+
+ &:hover {
+ background-color: lighten($darkModeControlsBackground, 5);
+ }
+
+ &.active {
+ background: $colorBlueBright;
+ color: #fff;
+ }
+ }
+ }
+ }
+
+ &.visible {
+ .dialogInner {
+ opacity: 1;
+ }
+ backdrop-filter: blur(D(3px));
+ }
+
+ .dialogInner {
+ transition: opacity 0.2s ease-in-out;
+ opacity: 0;
+ }
+
+ &.loadingDialog {
+ * {
+ color: #fff;
+ }
+ }
+
+ > .dialogInner {
+ background: #fff;
+ max-height: calc(100vh - #{D(40px)});
+ @include S(border-radius, $globalBorderRadius);
+ display: flex;
+ flex-direction: column;
+ @include S(padding, 12px);
+ pointer-events: all;
+
+ @include DarkThemeOverride {
+ background: darken($darkModeControlsBackground, 5);
+ }
+
+ &.optionChooserDialog {
+ .optionParent {
+ display: grid;
+ @include S(grid-gap, 5px);
+ grid-template-columns: 1fr 1fr;
+ .option {
+ pointer-events: all;
+ cursor: pointer;
+ @include S(padding, 10px);
+
+ background: #eee;
+
+ transition: background-color 0.12s ease-in-out;
+
+ &:hover {
+ background-color: #e7e7e7;
+ }
+
+ &.active {
+ background-color: $colorBlueBright;
+ color: #fff;
+ }
+ }
+ }
+ }
+
+ > .title {
+ @include Heading;
+ margin: 0;
+ text-transform: uppercase;
+ display: grid;
+ align-items: center;
+ grid-template-columns: 1fr auto;
+ @include S(margin-bottom, 10px);
+
+ @include DarkThemeInvert();
+ > .closeButton {
+ opacity: 0.7;
+ @include S(width, 20px);
+ @include S(height, 20px);
+ cursor: pointer;
+ pointer-events: all;
+ transition: opacity 0.2s ease-in-out;
+ &:hover {
+ opacity: 0.4;
+ }
+ & {
+ /* @load-async */
+ background: uiResource("icons/close.png") center center / 80% no-repeat;
+ }
+ }
+ }
+
+ > .content {
+ @include PlainText;
+ overflow-y: auto;
+ pointer-events: all;
+ @include S(width, 350px);
+
+ @include DarkThemeOverride {
+ color: #aaa;
+ }
+
+ a {
+ color: $colorBlueBright;
+ }
+
+ strong {
+ font-weight: bold;
+ }
+
+ .keybinding {
+ position: relative;
+ background: #eee;
+ @include PlainText;
+ height: unset;
+ margin: 1px 0;
+ }
+
+ input {
+ background: #eee;
+ color: #333438;
+ width: 100%;
+
+ &.errored {
+ background-color: rgb(250, 206, 206);
+ }
+ }
+
+ ul.bucketList {
+ padding-left: 30px;
+
+ li {
+ display: list-item;
+ }
+ }
+
+ .ingameItemChooser {
+ @include S(margin, 10px, 0);
+ display: grid;
+ @include S(grid-column-gap, 3px);
+ @include S(grid-row-gap, 5px);
+ grid-template-columns: repeat(10, 1fr);
+ align-items: center;
+ justify-items: center;
+
+ canvas {
+ pointer-events: all;
+ @include S(width, 25px);
+ @include S(height, 25px);
+ position: relative;
+ cursor: pointer;
+ @include IncreasedClickArea(3px);
+
+ &:hover {
+ opacity: 0.9;
+ }
+ }
+ }
+ }
+
+ > .buttons {
+ @include S(margin-top, 15px);
+ display: flex;
+ justify-content: flex-end;
+ > button {
+ @include S(margin-left, 8px);
+ @include Text;
+ @include S(min-width, 60px);
+ @include S(padding, 5px, 15px);
+
+ transition: opacity 0.12s ease-in-out;
+ &:hover {
+ opacity: 0.9;
+ }
+
+ &.good {
+ background-color: $colorGreenBright;
+ color: #fff;
+ }
+
+ &.bad {
+ background-color: $colorRedBright;
+ color: #fff;
+ }
+
+ &.timedButton {
+ pointer-events: none;
+ cursor: default;
+ position: relative;
+ overflow: hidden;
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: unset;
+ z-index: 5;
+ content: " ";
+ display: inline-block;
+ background: rgba(#fff, 0.6);
+ @include InlineAnimation(3s linear) {
+ 0% {
+ width: 100%;
+ }
+ 100% {
+ width: 0%;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/entity_debugger.scss b/src/css/ingame_hud/entity_debugger.scss
index 15f03848..4cf7e5e9 100644
--- a/src/css/ingame_hud/entity_debugger.scss
+++ b/src/css/ingame_hud/entity_debugger.scss
@@ -1,43 +1,79 @@
#ingame_HUD_EntityDebugger {
position: absolute;
+ background: $ingameHudBg;
+ @include S(padding, 5px);
@include S(right, 30px);
- @include S(top, 200px);
- font-size: 14px;
- line-height: 16px;
- color: #fff;
- background: rgba(0, 10, 20, 0.7);
- padding: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+
+ @include SuperSmallText;
+ color: #eee;
+ display: flex;
+ flex-direction: column;
+
+ > label {
+ text-transform: uppercase;
+ }
+
+ .hint {
+ color: #aaa;
+ }
+
&,
* {
pointer-events: all;
}
- .flag {
- display: inline-block;
- background: #333438;
- @include S(padding, 2px);
- @include S(margin-right, 2px);
-
- u {
- opacity: 0.5;
- }
+ .propertyTable {
+ @include S(margin-top, 8px);
}
- .components {
- @include S(margin-top, 4px);
+ .propertyTable,
+ .entityComponents,
+ .entityComponents .object > div {
display: grid;
- grid-template-columns: 1fr 1fr;
- @include S(grid-gap, 3px);
- .component {
- @include S(padding, 2px);
- background: #333;
- display: flex;
- flex-direction: column;
+ grid-template-columns: 1fr auto;
+ @include S(column-gap, 10px);
+ }
- .data {
- @include S(width, 150px);
- @include S(height, 130px);
+ .entityComponents {
+ grid-column: 1 / 3;
+ @include S(margin-top, 5px);
+
+ font-family: "Roboto Mono", "Fira Code", monospace;
+ font-size: 90%;
+ @include S(letter-spacing, -0.5px);
+
+ label,
+ span {
+ line-height: 1.5em;
+
+ &:not(span) {
+ opacity: 0.5;
+ }
+ }
+ &,
+ * {
+ @include SuperSmallText;
+ @include S(font-size, 7px, $important: true);
+ @include S(line-height, 12px, $important: true);
+ }
+
+ .object {
+ grid-column: 1 / 3;
+ line-height: 1.5em;
+
+ > summary {
+ transition: opacity 0.1s ease-in-out;
+ cursor: pointer;
+ &:hover {
+ opacity: 0.8;
+ }
+ }
+ > div {
+ @include S(margin-left, 4px);
+ cursor: pointer;
}
}
}
diff --git a/src/css/ingame_hud/game_menu.scss b/src/css/ingame_hud/game_menu.scss
index f893904c..c95626f1 100644
--- a/src/css/ingame_hud/game_menu.scss
+++ b/src/css/ingame_hud/game_menu.scss
@@ -1,111 +1,107 @@
#ingame_HUD_GameMenu {
position: absolute;
- top: 0;
- right: 0;
- display: flex;
- grid-auto-flow: column;
+ @include S(top, 10px);
+ @include S(right, 10px);
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr;
+ @include S(grid-gap, 6px);
- > .menuButtons {
+ backdrop-filter: blur(D(1px));
+
+ > button,
+ > .button {
+ @include PlainText;
+ @include IncreasedClickArea(0px);
+ background: green;
+ @include S(width, 30px);
+ @include S(height, 30px);
+
+ pointer-events: all;
+ cursor: pointer;
position: relative;
- display: flex;
- flex-grow: 1;
- @include S(padding, 5px, 4px);
- justify-content: flex-end;
- @include S(margin-left, 20px);
+ transition: all 0.12s ease-in-out;
+ transition-property: opacity, transform;
- > .button {
- @include S(width, 30px);
- @include S(height, 30px);
- display: inline-block;
- background: center center / 60% no-repeat;
- pointer-events: all;
- cursor: pointer;
- transition: all 0.12s ease-in-out;
- transition-property: opacity, transform;
- will-change: opacity;
- opacity: 0.9;
- @include S(margin-left, 5px);
- position: relative;
+ display: inline-flex;
+ background: center center / 70% no-repeat;
+ grid-row: 1;
- @include IncreasedClickArea(0px);
+ &.pressed {
+ transform: scale(0.9) !important;
+ }
- @include DarkThemeInvert;
+ opacity: 0.7;
+ &:hover {
+ opacity: 0.9 !important;
+ }
- &:hover {
- opacity: 0.8;
+ @include DarkThemeInvert;
+
+ &.shop {
+ grid-column: 1;
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/shop.png");
}
+ }
- &.save {
+ &.stats {
+ grid-column: 2;
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/statistics.png");
+ }
+ }
+
+ &.save {
+ & {
+ /* @load-async */
background-image: uiResource("icons/save.png");
- @include MakeAnimationWrappedEvenOdd(0.5s ease-in-out) {
- 0% {
- transform: scale(1, 1);
- }
+ }
+ grid-column: 3;
+ @include MakeAnimationWrappedEvenOdd(0.5s ease-in-out) {
+ 0% {
+ transform: scale(1, 1);
+ }
- 70% {
- transform: scale(1.5, 1.5) rotate(20deg);
- opacity: 0.2;
- }
+ 70% {
+ transform: scale(1.5, 1.5) rotate(20deg);
+ opacity: 0.2;
+ }
- 85% {
- transform: scale(0.9, 0.9);
- opacity: 1;
- }
+ 85% {
+ transform: scale(0.9, 0.9);
+ opacity: 1;
+ }
- 90% {
- transform: scale(1.1, 1.1);
- }
+ 90% {
+ transform: scale(1.1, 1.1);
}
}
- &.settings {
- background-image: uiResource("icons/settings.png");
+ &.saving {
+ @include InlineAnimation(0.4s ease-in-out infinite) {
+ 50% {
+ opacity: 0.5;
+ transform: scale(0.8);
+ }
+ }
+ pointer-events: none;
+ cursor: default;
}
}
- }
- .buttonContainer button {
- @include PlainText;
- color: #fff;
- border-color: rgba(0, 0, 0, 0.1);
- @include S(padding, 5px, 5px, 5px);
-
- @include S(padding-left, 30px);
- @include S(margin-right, 3px);
- @include IncreasedClickArea(0px);
- @include ButtonText;
- @include S(min-height, 40px);
- transition: all 0.12s ease-in-out;
- transition-property: opacity, transform;
- display: inline-flex;
- background: center #{D(13px)} / #{D(20px)} no-repeat;
- background-color: $colorGreenBright;
-
- &[data-button-id="shop"] {
- background-color: rgb(93, 103, 250);
- background-image: uiResource("icons/shop.png");
- background-size: #{D(18px)};
- }
- &[data-button-id="stats"] {
- background-color: rgb(85, 199, 138);
- background-image: uiResource("icons/statistics.png");
+ &.settings {
+ grid-column: 4;
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/settings_menu_settings.png");
+ }
}
&:hover {
opacity: 0.9;
- }
-
- .keybinding {
- border: 0;
- color: #fff;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
- bottom: unset;
- background: transparent;
- @include S(top, 0px);
- right: unset;
- left: 50%;
- transform: translateX(-50%);
+ transform: translateY(0);
}
&:not(.hasBadge) .badge {
@@ -113,34 +109,32 @@
}
&.hasBadge {
- transform-origin: 50% 0%;
- @include InlineAnimation(1s ease-in-out infinite) {
+ &.shop {
+ filter: none;
+ opacity: 0.9;
+
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/shop_active.png");
+ }
+ }
+
+ transform-origin: 50% 50%;
+ @include InlineAnimation(0.8s ease-in-out infinite) {
50% {
- transform: scale(1.02);
+ transform: scale(1.3) rotate(6deg);
}
}
.badge {
position: absolute;
- @include S(bottom, -8px);
+ top: 50%;
left: 50%;
- transform: translateX(-50%);
-
- background: #333;
+ transform: translate(-50%, -50%);
@include PlainText;
display: flex;
justify-content: center;
align-items: center;
- @include S(min-width, 5px);
- @include S(height, 10px);
- @include S(padding, 1px, 3px, 2px);
- @include S(border-radius, $globalBorderRadius);
- border: #{D(1px)} solid #fff;
- @include InlineAnimation(1s ease-in-out infinite) {
- 50% {
- transform: translateX(-50%) scale(1.05);
- }
- }
}
}
}
diff --git a/src/css/ingame_hud/interactive_tutorial.scss b/src/css/ingame_hud/interactive_tutorial.scss
index 9d4aeffc..45750b04 100644
--- a/src/css/ingame_hud/interactive_tutorial.scss
+++ b/src/css/ingame_hud/interactive_tutorial.scss
@@ -56,8 +56,9 @@
.helperGif {
@include S(margin-top, 5px);
+ @include S(width, 150px);
@include S(height, 150px);
- background: center center / contain no-repeat;
+ background: center center / cover no-repeat;
transition: opacity 0.1s ease-out;
}
}
diff --git a/src/css/ingame_hud/keybindings_overlay.scss b/src/css/ingame_hud/keybindings_overlay.scss
index 21d07b4b..b44dde4b 100644
--- a/src/css/ingame_hud/keybindings_overlay.scss
+++ b/src/css/ingame_hud/keybindings_overlay.scss
@@ -7,7 +7,7 @@
flex-direction: column;
align-items: flex-start;
color: #333438;
- backdrop-filter: blur(D(2px));
+ backdrop-filter: blur(D(1px));
padding: D(3px);
@include DarkThemeOverride {
@@ -47,10 +47,12 @@
left: unset;
margin: 0;
&.rightMouse {
+ /* @load-async */
background: #fff uiResource("icons/mouse_right.png") center center / 85% no-repeat;
}
&.leftMouse {
+ /* @load-async */
background: #fff uiResource("icons/mouse_left.png") center center / 85% no-repeat;
}
}
diff --git a/src/css/ingame_hud/pinned_shapes.scss b/src/css/ingame_hud/pinned_shapes.scss
index 48e5b70e..671f5aa5 100644
--- a/src/css/ingame_hud/pinned_shapes.scss
+++ b/src/css/ingame_hud/pinned_shapes.scss
@@ -1,138 +1,135 @@
-#ingame_HUD_PinnedShapes {
- position: absolute;
- @include S(left, 9px);
- @include S(top, 150px);
- @include PlainText;
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- justify-content: flex-start;
-
- > .shape {
- position: relative;
- display: grid;
- align-items: center;
- justify-content: center;
- grid-template-columns: auto 1fr;
- grid-template-rows: 1fr 1fr;
- @include S(margin-bottom, 4px);
- color: #333438;
- // text-shadow: #{D(1px)} #{D(1px)} 0 rgba(0, 10, 20, 0.2);
- filter: drop-shadow(#{D(1px)} #{D(1px)} 0 rgba(0, 10, 20, 0.2));
-
- &.unpinable {
- > canvas {
- cursor: pointer;
- pointer-events: all;
- }
- }
-
- > canvas {
- @include S(width, 25px);
- @include S(height, 25px);
- grid-column: 1 / 2;
- grid-row: 1 / 3;
- pointer-events: all;
- transition: transform 0.1s ease-in-out;
- transform-origin: D(2px) center;
- will-change: transform;
- position: relative;
- z-index: 20;
- &:hover {
- transform: scale(2);
- z-index: 21;
- }
- }
-
- > .amountLabel,
- > .goalLabel {
- @include S(margin-left, 5px);
- @include SuperSmallText;
- font-weight: bold;
- display: inline-flex;
- align-items: center;
- flex-direction: row;
- grid-column: 2 / 3;
- @include S(height, 9px);
-
- @include DarkThemeOverride {
- color: #eee;
- }
- }
-
- > .goalLabel {
- @include S(font-size, 7px);
- opacity: 0.9;
- align-self: start;
- justify-self: start;
- font-weight: normal;
- grid-row: 2 / 3;
- }
-
- > .amountLabel {
- align-self: end;
- justify-self: start;
- grid-row: 1 / 2;
- }
-
- > .infoButton {
- @include S(width, 8px);
- @include S(height, 8px);
- background: uiResource("icons/info_button.png") center center / 95% no-repeat;
- position: absolute;
- opacity: 0.7;
- @include S(top, 13px);
- @include S(left, -7px);
- @include DarkThemeInvert;
- @include IncreasedClickArea(2px);
- transition: opacity 0.12s ease-in-out;
- z-index: 100;
-
- &:hover {
- opacity: 0.8;
- }
- }
-
- &.goal,
- &.blueprint {
- .amountLabel::after {
- content: " ";
- position: absolute;
- display: inline-block;
- @include S(width, 8px);
- @include S(height, 8px);
- @include S(top, 4px);
- @include S(left, -7px);
- background: center center / contain no-repeat;
- }
-
- &.goal .amountLabel {
- &::after {
- background-image: uiResource("icons/current_goal_marker.png");
- background-size: 90%;
- }
- @include DarkThemeOverride {
- &::after {
- background-image: uiResource("icons/current_goal_marker_inverted.png") !important;
- }
- }
- }
-
- &.blueprint .amountLabel {
- &::after {
- background-image: uiResource("icons/blueprint_marker.png");
- background-size: 90%;
- }
- @include DarkThemeOverride {
- &::after {
- background-image: uiResource("icons/blueprint_marker_inverted.png") !important;
- }
- }
- }
- }
-
- &.completed {
- opacity: 0.5;
- }
- }
-}
+#ingame_HUD_PinnedShapes {
+ position: absolute;
+ @include S(left, 9px);
+ @include S(top, 150px);
+ @include PlainText;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+
+ > .shape {
+ position: relative;
+ display: grid;
+ align-items: center;
+ justify-content: center;
+ grid-template-columns: auto 1fr;
+ grid-template-rows: 1fr 1fr;
+ @include S(margin-bottom, 4px);
+ color: #333438;
+
+ &.removable {
+ cursor: pointer;
+ pointer-events: all;
+ }
+
+ > canvas {
+ @include S(width, 25px);
+ @include S(height, 25px);
+ grid-column: 1 / 2;
+ grid-row: 1 / 3;
+ pointer-events: none;
+ z-index: 20;
+ position: relative;
+ }
+
+ > .amountLabel,
+ > .goalLabel {
+ @include S(margin-left, 5px);
+ @include SuperSmallText;
+ font-weight: bold;
+ display: inline-flex;
+ align-items: center;
+ flex-direction: row;
+ grid-column: 2 / 3;
+ @include S(height, 9px);
+
+ @include DarkThemeOverride {
+ color: #eee;
+ }
+ }
+
+ > .goalLabel {
+ @include S(font-size, 7px);
+ opacity: 0.9;
+ align-self: start;
+ justify-self: start;
+ font-weight: normal;
+ grid-row: 2 / 3;
+ }
+
+ > .amountLabel {
+ align-self: end;
+ justify-self: start;
+ grid-row: 1 / 2;
+ }
+
+ > .infoButton {
+ @include S(width, 8px);
+ @include S(height, 8px);
+ position: absolute;
+ opacity: 0.7;
+ @include S(top, 13px);
+ @include S(left, -7px);
+ @include DarkThemeInvert;
+ @include IncreasedClickArea(2px);
+ transition: opacity 0.12s ease-in-out;
+ z-index: 100;
+
+ &:hover {
+ opacity: 0.8;
+ }
+
+ & {
+ /* @load-async */
+ background: uiResource("icons/info_button.png") center center / 95% no-repeat;
+ }
+ }
+
+ &.goal,
+ &.blueprint {
+ .amountLabel::after {
+ content: " ";
+ position: absolute;
+ display: inline-block;
+ @include S(width, 8px);
+ @include S(height, 8px);
+ @include S(top, 4px);
+ @include S(left, -7px);
+ background: center center / contain no-repeat;
+ }
+
+ &.goal .amountLabel {
+ &::after {
+ /* @load-async */
+ background-image: uiResource("icons/current_goal_marker.png");
+ background-size: 90%;
+ }
+ @include DarkThemeOverride {
+ &::after {
+ /* @load-async */
+ background-image: uiResource("icons/current_goal_marker_inverted.png") !important;
+ }
+ }
+ }
+
+ &.blueprint .amountLabel {
+ &::after {
+ /* @load-async */
+ background-image: uiResource("icons/blueprint_marker.png");
+ background-size: 90%;
+ }
+ @include DarkThemeOverride {
+ &::after {
+ /* @load-async */
+ background-image: uiResource("icons/blueprint_marker_inverted.png") !important;
+ }
+ }
+ }
+ }
+
+ &.completed {
+ opacity: 0.5;
+ }
+ }
+}
diff --git a/src/css/ingame_hud/sandbox_controller.scss b/src/css/ingame_hud/sandbox_controller.scss
index 0202f5ef..e4680fe4 100644
--- a/src/css/ingame_hud/sandbox_controller.scss
+++ b/src/css/ingame_hud/sandbox_controller.scss
@@ -1,50 +1,50 @@
-#ingame_HUD_SandboxController {
- position: absolute;
- background: $ingameHudBg;
- @include S(padding, 5px);
- @include S(bottom, 10px);
- @include S(left, 10px);
-
- @include SuperSmallText;
- color: #eee;
- display: flex;
- flex-direction: column;
-
- > label {
- text-transform: uppercase;
- }
-
- .hint {
- color: #aaa;
- }
-
- .plusMinus {
- @include S(margin-top, 4px);
- display: grid;
- grid-template-columns: 1fr auto auto;
- align-items: center;
- @include S(grid-gap, 4px);
-
- button {
- @include PlainText;
- @include S(padding, 0);
- display: flex;
- align-items: center;
- justify-content: center;
- @include S(width, 15px);
- @include S(height, 15px);
- @include IncreasedClickArea(0px);
- }
- }
-
- .additionalOptions {
- display: flex;
- flex-direction: column;
- @include S(margin-top, 10px);
- button {
- @include S(margin-bottom, 2px);
- @include IncreasedClickArea(0px);
- @include SuperSmallText;
- }
- }
-}
+#ingame_HUD_SandboxController {
+ position: absolute;
+ background: $ingameHudBg;
+ @include S(padding, 5px);
+ @include S(bottom, 10px);
+ @include S(left, 10px);
+
+ @include SuperSmallText;
+ color: #eee;
+ display: flex;
+ flex-direction: column;
+
+ > label {
+ text-transform: uppercase;
+ }
+
+ .sandboxHint {
+ color: #aaa;
+ }
+
+ .plusMinus {
+ @include S(margin-top, 4px);
+ display: grid;
+ grid-template-columns: 1fr auto auto;
+ align-items: center;
+ @include S(grid-gap, 4px);
+
+ button {
+ @include PlainText;
+ @include S(padding, 0);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ @include S(width, 15px);
+ @include S(height, 15px);
+ @include IncreasedClickArea(0px);
+ }
+ }
+
+ .additionalOptions {
+ display: flex;
+ flex-direction: column;
+ @include S(margin-top, 10px);
+ button {
+ @include S(margin-bottom, 2px);
+ @include IncreasedClickArea(0px);
+ @include SuperSmallText;
+ }
+ }
+}
diff --git a/src/css/ingame_hud/settings_menu.scss b/src/css/ingame_hud/settings_menu.scss
index e0cec1f6..55d5a9e4 100644
--- a/src/css/ingame_hud/settings_menu.scss
+++ b/src/css/ingame_hud/settings_menu.scss
@@ -1,41 +1,67 @@
-#ingame_HUD_SettingsMenu {
- .statsElement {
- position: absolute;
- @include S(left, 30px);
- @include S(top, 30px);
- color: #fff;
- display: flex;
- grid-template-rows: 1fr auto;
- flex-direction: column;
-
- strong {
- text-transform: uppercase;
- @include PlainText;
- opacity: 0.5;
- }
-
- span {
- @include S(margin-bottom, 25px);
- @include Heading;
- }
- }
-
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
-
- .buttons {
- display: grid;
- grid-auto-flow: row;
- @include S(grid-gap, 10px);
- background: rgba(0, 10, 20, 0.1);
- @include S(padding, 10px);
- @include S(border-radius, $globalBorderRadius);
-
- button {
- background-color: #eee;
- color: #55585a;
- }
- }
-}
+#ingame_HUD_SettingsMenu {
+ .statsElement {
+ position: absolute;
+ @include S(left, 30px);
+ @include S(right, 30px);
+ @include S(bottom, 30px);
+ color: #fff;
+ display: grid;
+ grid-template-rows: auto auto;
+ grid-auto-columns: 1fr;
+ align-items: center;
+ justify-items: center;
+
+ strong {
+ text-transform: uppercase;
+ @include PlainText;
+ opacity: 0.5;
+ grid-row: 1;
+ }
+
+ span {
+ @include Heading;
+ grid-row: 2;
+ }
+ }
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ .buttons {
+ display: grid;
+ grid-auto-flow: column;
+ @include S(grid-gap, 50px);
+ @include S(margin-top, -10px);
+
+ button {
+ background: transparent;
+ filter: invert(1);
+
+ content: "";
+ opacity: 0.8;
+ @include S(width, 35px);
+ @include S(height, 35px);
+
+ &.settings {
+ /* @load-async */
+ background-image: uiResource("icons/settings_menu_settings.png");
+ }
+
+ &.menu {
+ /* @load-async */
+ background-image: uiResource("icons/settings_menu_exit.png");
+ }
+
+ &:hover {
+ opacity: 0.6;
+ }
+
+ & {
+ /* @load-async */
+ background: uiResource("icons/settings_menu_play.png") center top / contain no-repeat;
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/shape_viewer.scss b/src/css/ingame_hud/shape_viewer.scss
index 65491a5a..9ece9f35 100644
--- a/src/css/ingame_hud/shape_viewer.scss
+++ b/src/css/ingame_hud/shape_viewer.scss
@@ -1,161 +1,154 @@
-#ingame_HUD_ShapeViewer {
- $dims: 170px;
-
- .content {
- display: flex;
- @include S(width, $dims);
- width: 100%;
- flex-direction: column;
- overflow-x: hidden;
-
- &[data-layers="3"],
- &[data-layers="4"] {
- @include S(width, 2 * $dims);
- .renderArea {
- display: grid;
- grid-template-columns: 1fr 1fr;
- @include S(grid-row-gap, 15px);
- }
- }
-
- .renderArea {
- display: grid;
- width: 100%;
- @include S(grid-row-gap, 10px);
- align-items: center;
- justify-items: center;
- }
-
- .infoArea {
- align-self: flex-end;
- @include S(margin-top, 10px);
- display: flex;
- flex-direction: column;
- overflow: hidden;
-
- button {
- @include S(margin, 0);
- @include PlainText;
- }
- }
-
- .seperator {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- }
-
- .layer {
- position: relative;
- background: #eee;
-
- @include DarkThemeOverride {
- background: rgba(0, 10, 20, 0.2);
- }
- @include S(width, 150px);
- @include S(height, 100px);
- display: flex;
- align-items: center;
- justify-content: center;
-
- > canvas {
- @include S(width, 50px);
- @include S(height, 50px);
- }
-
- .quad {
- position: absolute;
- width: 50%;
- height: 50%;
- display: flex;
- justify-content: center;
- align-items: center;
- box-sizing: border-box;
-
- $arrowDims: 23px;
- $spacing: 9px;
- @include S(padding, 6px);
-
- .colorLabel {
- text-transform: uppercase;
- @include SuperSmallText;
- @include S(font-size, 9px);
- }
-
- .emptyLabel {
- text-transform: uppercase;
- @include SuperSmallText;
- @include S(font-size, 9px);
- }
-
- &::after {
- content: " ";
- background: rgba(0, 10, 20, 0.5);
- @include S(width, $arrowDims);
- @include S(height, 1px);
- position: absolute;
- transform: rotate(45deg);
- transform-origin: 50% 50%;
- }
- @include DarkThemeOverride {
- &::after {
- background: rgba(255, 255, 255, 0.5);
- }
- }
-
- &.quad-0 {
- right: 0;
- top: 0;
- align-items: flex-start;
- justify-content: flex-end;
-
- &::after {
- @include S(left, $spacing);
- @include S(bottom, $arrowDims / 2 + $spacing);
- transform: rotate(-45deg);
- }
- }
- &.quad-1 {
- bottom: 0;
- right: 0;
-
- align-items: flex-end;
- justify-content: flex-end;
-
- &::after {
- @include S(left, $spacing);
- @include S(top, $arrowDims / 2 + $spacing);
- transform: rotate(45deg);
- }
- }
- &.quad-2 {
- bottom: 0;
- left: 0;
-
- align-items: flex-end;
- justify-content: flex-start;
-
- &::after {
- @include S(right, $spacing);
- @include S(top, $arrowDims / 2 + $spacing);
- transform: rotate(135deg);
- }
- }
- &.quad-3 {
- top: 0;
- left: 0;
-
- align-items: flex-start;
- justify-content: flex-start;
-
- &::after {
- @include S(right, $spacing);
- @include S(bottom, $arrowDims / 2 + $spacing);
- transform: rotate(225deg);
- }
- }
- }
- }
- }
-}
+#ingame_HUD_ShapeViewer {
+ $dims: 170px;
+
+ .content {
+ display: flex;
+ @include S(width, $dims);
+ width: 100%;
+ flex-direction: column;
+ overflow-x: hidden;
+
+ &[data-layers="3"],
+ &[data-layers="4"] {
+ @include S(width, 2 * $dims);
+ .renderArea {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ @include S(grid-row-gap, 15px);
+ }
+ }
+
+ .renderArea {
+ display: grid;
+ width: 100%;
+ @include S(grid-row-gap, 10px);
+ align-items: center;
+ justify-items: center;
+ }
+
+ .infoArea {
+ align-self: flex-end;
+ @include S(margin-top, 10px);
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ button {
+ @include S(margin, 0);
+ @include PlainText;
+ }
+ }
+
+ .layer {
+ position: relative;
+ background: #eee;
+
+ @include DarkThemeOverride {
+ background: rgba(0, 10, 20, 0.2);
+ }
+ @include S(width, 150px);
+ @include S(height, 100px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ > canvas {
+ @include S(width, 50px);
+ @include S(height, 50px);
+ }
+
+ .quad {
+ position: absolute;
+ width: 50%;
+ height: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ box-sizing: border-box;
+
+ $arrowDims: 23px;
+ $spacing: 9px;
+ @include S(padding, 6px);
+
+ .colorLabel {
+ text-transform: uppercase;
+ @include SuperSmallText;
+ @include S(font-size, 9px);
+ }
+
+ .emptyLabel {
+ text-transform: uppercase;
+ @include SuperSmallText;
+ @include S(font-size, 9px);
+ }
+
+ &::after {
+ content: " ";
+ background: rgba(0, 10, 20, 0.5);
+ @include S(width, $arrowDims);
+ @include S(height, 1px);
+ position: absolute;
+ transform: rotate(45deg);
+ transform-origin: 50% 50%;
+ }
+ @include DarkThemeOverride {
+ &::after {
+ background: rgba(255, 255, 255, 0.5);
+ }
+ }
+
+ &.quad-0 {
+ right: 0;
+ top: 0;
+ align-items: flex-start;
+ justify-content: flex-end;
+
+ &::after {
+ @include S(left, $spacing);
+ @include S(bottom, $arrowDims / 2 + $spacing);
+ transform: rotate(-45deg);
+ }
+ }
+ &.quad-1 {
+ bottom: 0;
+ right: 0;
+
+ align-items: flex-end;
+ justify-content: flex-end;
+
+ &::after {
+ @include S(left, $spacing);
+ @include S(top, $arrowDims / 2 + $spacing);
+ transform: rotate(45deg);
+ }
+ }
+ &.quad-2 {
+ bottom: 0;
+ left: 0;
+
+ align-items: flex-end;
+ justify-content: flex-start;
+
+ &::after {
+ @include S(right, $spacing);
+ @include S(top, $arrowDims / 2 + $spacing);
+ transform: rotate(135deg);
+ }
+ }
+ &.quad-3 {
+ top: 0;
+ left: 0;
+
+ align-items: flex-start;
+ justify-content: flex-start;
+
+ &::after {
+ @include S(right, $spacing);
+ @include S(bottom, $arrowDims / 2 + $spacing);
+ transform: rotate(225deg);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/shop.scss b/src/css/ingame_hud/shop.scss
index d8cc8a86..301021e7 100644
--- a/src/css/ingame_hud/shop.scss
+++ b/src/css/ingame_hud/shop.scss
@@ -1,320 +1,328 @@
-#ingame_HUD_Shop {
- .content {
- @include S(padding-right, 10px);
- display: flex;
- flex-direction: column;
- @include S(width, 500px);
-
- .upgrade {
- display: grid;
- grid-template-columns: auto 1fr auto;
- background: #eee;
- @include S(border-radius, $globalBorderRadius);
- @include S(margin-bottom, 4px);
- @include S(padding, 5px, 10px);
- @include S(grid-row-gap, 1px);
- @include S(height, 85px);
- grid-template-rows: #{D(20px)} auto;
-
- &:last-child {
- margin-bottom: 0;
- }
-
- @include DarkThemeOverride {
- background: #55585a;
- }
-
- .title {
- grid-column: 1 / 3;
- grid-row: 1 / 2;
- @include PlainText;
- display: flex;
- align-items: center;
- flex-direction: row-reverse;
- justify-content: flex-end;
-
- @include DarkThemeOverride {
- color: #fff;
- }
-
- .tier {
- @include S(margin-right, 9px);
- background: $colorGreenBright;
- @include S(border-radius, $globalBorderRadius);
- text-transform: uppercase;
- @include PlainText;
- color: #fff;
- text-align: center;
- font-weight: bold;
- @include S(min-width, 50px);
- @include S(padding, 0px, 5px);
-
- &[data-tier="0"] {
- background-color: rgb(73, 186, 190);
- }
- &[data-tier="1"] {
- background-color: rgb(88, 110, 207);
- }
- &[data-tier="2"] {
- background-color: rgb(189, 100, 192);
- }
- &[data-tier="3"] {
- background-color: rgb(117, 192, 98);
- }
- &[data-tier="4"] {
- background-color: rgb(243, 77, 48);
- }
- &[data-tier="5"] {
- background-color: rgb(255, 209, 6);
- }
- &[data-tier="6"] {
- background-color: rgb(44, 41, 46);
- }
- }
- }
-
- .icon {
- @include S(width, 40px);
- @include S(height, 40px);
- background: center center / 80% no-repeat;
- align-self: center;
- justify-self: center;
- grid-column: 1 / 2;
- grid-row: 2 / 4;
- @include S(margin-right, 30px);
- @include S(margin-left, 10px);
- opacity: 0.32;
- display: none;
- }
-
- .description {
- grid-column: 2 / 4;
- grid-row: 1 / 2;
- @include PlainText;
- color: #aaa;
- align-self: start;
- justify-self: end;
- }
-
- .requirements {
- grid-column: 2 / 3;
- grid-row: 3 / 4;
- display: grid;
- grid-auto-flow: column;
- @include S(grid-gap, 9px);
- justify-content: start;
-
- .requirement {
- position: relative;
- display: flex;
- flex-direction: column;
- align-items: center;
- @include S(width, 70px);
- overflow: hidden;
-
- button.pin {
- @include S(width, 12px);
- @include S(height, 12px);
- background: uiResource("icons/pin.png") center center / 95% no-repeat;
- position: absolute;
- @include S(top, 2px);
- @include S(right, 2px);
- opacity: 0.6;
- cursor: pointer;
- pointer-events: all;
- @include IncreasedClickArea(5px);
- transition: opacity 0.12s ease-in-out;
-
- @include DarkThemeInvert;
-
- $disabledOpacity: 0.2;
- $enabledOpacity: 0.6;
-
- &:hover {
- opacity: $enabledOpacity + 0.1;
- }
-
- &.alreadyPinned {
- opacity: $disabledOpacity !important;
-
- &:hover {
- opacity: $disabledOpacity + 0.1 !important;
- }
- }
-
- &.isGoal {
- background: uiResource("icons/current_goal_marker.png") center center / 95%
- no-repeat;
- opacity: $disabledOpacity !important;
- cursor: default;
- pointer-events: none;
- }
-
- &.pinned {
- opacity: $disabledOpacity;
- @include InlineAnimation(0.3s ease-in-out) {
- 0% {
- opacity: 1;
- transform: scale(0.8);
- }
-
- 30% {
- opacity: 1;
- transform: scale(1.2);
- }
-
- 100% {
- transform: scale(1);
- }
- }
- &:hover {
- opacity: $disabledOpacity + 0.1;
- }
- }
-
- &.unpinned {
- opacity: $enabledOpacity;
- @include InlineAnimation(0.3s ease-in-out) {
- 0% {
- opacity: 1;
- transform: scale(0.8);
- }
-
- 30% {
- opacity: 1;
- transform: scale(1.2);
- }
-
- 100% {
- transform: scale(1);
- }
- }
- &:hover {
- opacity: $enabledOpacity + 0.1;
- }
- }
- }
-
- button.showInfo {
- @include S(width, 11px);
- @include S(height, 11px);
- background: uiResource("icons/info_button.png") center center / 95% no-repeat;
- position: absolute;
- @include S(top, 17px);
- @include S(right, 2.5px);
- opacity: 0.5;
- cursor: pointer;
- pointer-events: all;
- @include IncreasedClickArea(5px);
- transition: opacity 0.12s ease-in-out;
- @include DarkThemeInvert;
-
- &:hover {
- opacity: 0.6;
- }
- }
-
- canvas {
- @include S(width, 40px);
- @include S(height, 40px);
- }
-
- .amount {
- @include S(margin-top, 4px);
- z-index: 10;
- @include SuperSmallText;
- letter-spacing: 0;
- background: #e2e4e6;
-
- @include S(line-height, 13px);
- @include S(border-radius, $globalBorderRadius);
- @include S(padding, 1px, 0px, 2px);
- position: relative;
- text-align: center;
- @include S(min-width, 50px);
- // @include S(max-width, 100px);
- overflow: hidden;
- width: 100%;
-
- @include DarkThemeOverride {
- background: #333438;
- color: #fff;
- }
-
- .progressBar {
- bottom: 0;
- left: 0;
- right: 0;
- top: 0;
- @include S(border-radius, $globalBorderRadius);
- position: absolute;
- display: inline-block;
- z-index: -1;
- transition: all 0.2s ease-in-out;
- transition-property: width, background-color;
- background: #bdbfca;
-
- @include DarkThemeOverride {
- background: #8c8d96;
- }
-
- &.complete {
- background-color: $colorGreenBright;
-
- @include DarkThemeOverride {
- background-color: $colorGreenBright;
- }
- }
- }
- }
- }
- }
-
- button.buy {
- grid-column: 3 / 4;
- grid-row: 3 / 4;
- align-self: center;
- justify-self: end;
- // @include S(padding, 4px, 5px);
- // @include PlainText;
- background-color: $colorGreenBright;
- color: #fff;
-
- transition: all 0.2s ease-in-out;
- transition-property: background-color, opacity;
-
- &:not(.buyable) {
- background-color: #aaa;
- cursor: default;
- pointer-events: none;
- opacity: 0.3;
- }
-
- &.buyable {
- @include InlineAnimation(1s ease-in-out infinite) {
- 0% {
- }
-
- 50% {
- background-color: lighten($colorGreenBright, 10);
- }
- 100% {
- }
- }
- }
- }
-
- &.maxLevel {
- button.buy {
- opacity: 0 !important;
- }
- .requirements {
- display: none;
- }
- .description {
- color: $colorGreenBright;
- }
- }
- }
- }
-}
+#ingame_HUD_Shop {
+ .content {
+ @include S(padding-right, 10px);
+ display: flex;
+ flex-direction: column;
+ @include S(width, 500px);
+
+ .upgrade {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ background: #eee;
+ @include S(border-radius, $globalBorderRadius);
+ @include S(margin-bottom, 4px);
+ @include S(padding, 5px, 10px);
+ @include S(grid-row-gap, 1px);
+ @include S(height, 85px);
+ grid-template-rows: #{D(20px)} auto;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ @include DarkThemeOverride {
+ background: $darkModeControlsBackground;
+ }
+
+ .title {
+ grid-column: 1 / 3;
+ grid-row: 1 / 2;
+ @include PlainText;
+ display: flex;
+ align-items: center;
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+
+ @include DarkThemeOverride {
+ color: #fff;
+ }
+
+ .tier {
+ @include S(margin-right, 9px);
+ background: $colorGreenBright;
+ @include S(border-radius, $globalBorderRadius);
+ text-transform: uppercase;
+ @include PlainText;
+ color: #fff;
+ text-align: center;
+ font-weight: bold;
+ @include S(min-width, 50px);
+ @include S(padding, 0px, 5px);
+
+ &[data-tier="0"] {
+ background-color: rgb(73, 186, 190);
+ }
+ &[data-tier="1"] {
+ background-color: rgb(88, 110, 207);
+ }
+ &[data-tier="2"] {
+ background-color: rgb(189, 100, 192);
+ }
+ &[data-tier="3"] {
+ background-color: rgb(117, 192, 98);
+ }
+ &[data-tier="4"] {
+ background-color: rgb(243, 77, 48);
+ }
+ &[data-tier="5"] {
+ background-color: rgb(255, 209, 6);
+ }
+ &[data-tier="6"] {
+ background-color: rgb(44, 41, 46);
+ }
+ }
+ }
+
+ .icon {
+ @include S(width, 40px);
+ @include S(height, 40px);
+ background: center center / 80% no-repeat;
+ align-self: center;
+ justify-self: center;
+ grid-column: 1 / 2;
+ grid-row: 2 / 4;
+ @include S(margin-right, 30px);
+ @include S(margin-left, 10px);
+ opacity: 0.32;
+ display: none;
+ }
+
+ .description {
+ grid-column: 2 / 4;
+ grid-row: 1 / 2;
+ @include PlainText;
+ color: #aaa;
+ align-self: start;
+ justify-self: end;
+ }
+
+ .requirements {
+ grid-column: 2 / 3;
+ grid-row: 3 / 4;
+ display: grid;
+ grid-auto-flow: column;
+ @include S(grid-gap, 9px);
+ justify-content: start;
+
+ .requirement {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ @include S(width, 70px);
+ overflow: hidden;
+
+ button.pin {
+ & {
+ /* @load-async */
+ background: uiResource("icons/pin.png") center center / 95% no-repeat;
+ }
+
+ @include S(width, 12px);
+ @include S(height, 12px);
+ position: absolute;
+ @include S(top, 2px);
+ @include S(right, 2px);
+ opacity: 0.6;
+ cursor: pointer;
+ pointer-events: all;
+ @include IncreasedClickArea(5px);
+ transition: opacity 0.12s ease-in-out;
+
+ @include DarkThemeInvert;
+
+ $disabledOpacity: 0.2;
+ $enabledOpacity: 0.6;
+
+ &:hover {
+ opacity: $enabledOpacity + 0.1;
+ }
+
+ &.alreadyPinned {
+ opacity: $disabledOpacity !important;
+
+ &:hover {
+ opacity: $disabledOpacity + 0.1 !important;
+ }
+ }
+
+ &.isGoal {
+ /* @load-async */
+ background: uiResource("icons/current_goal_marker.png") center center / 95%
+ no-repeat;
+ opacity: $disabledOpacity !important;
+ cursor: default;
+ pointer-events: none;
+ }
+
+ &.pinned {
+ opacity: $disabledOpacity;
+ @include InlineAnimation(0.3s ease-in-out) {
+ 0% {
+ opacity: 1;
+ transform: scale(0.8);
+ }
+
+ 30% {
+ opacity: 1;
+ transform: scale(1.2);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+ }
+ &:hover {
+ opacity: $disabledOpacity + 0.1;
+ }
+ }
+
+ &.unpinned {
+ opacity: $enabledOpacity;
+ @include InlineAnimation(0.3s ease-in-out) {
+ 0% {
+ opacity: 1;
+ transform: scale(0.8);
+ }
+
+ 30% {
+ opacity: 1;
+ transform: scale(1.2);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+ }
+ &:hover {
+ opacity: $enabledOpacity + 0.1;
+ }
+ }
+ }
+
+ button.showInfo {
+ @include S(width, 11px);
+ @include S(height, 11px);
+ position: absolute;
+ @include S(top, 17px);
+ @include S(right, 2.5px);
+ opacity: 0.5;
+ cursor: pointer;
+ pointer-events: all;
+ @include IncreasedClickArea(5px);
+ transition: opacity 0.12s ease-in-out;
+ @include DarkThemeInvert;
+
+ &:hover {
+ opacity: 0.6;
+ }
+ }
+ button.showInfo {
+ /* @load-async */
+ background: uiResource("icons/info_button.png") center center / 95% no-repeat;
+ }
+
+ canvas {
+ @include S(width, 40px);
+ @include S(height, 40px);
+ }
+
+ .amount {
+ @include S(margin-top, 4px);
+ z-index: 10;
+ @include SuperSmallText;
+ letter-spacing: 0;
+ background: #e2e4e6;
+
+ @include S(line-height, 13px);
+ @include S(border-radius, $globalBorderRadius);
+ @include S(padding, 1px, 0px, 2px);
+ position: relative;
+ text-align: center;
+ @include S(min-width, 50px);
+ // @include S(max-width, 100px);
+ overflow: hidden;
+ width: 100%;
+
+ @include DarkThemeOverride {
+ background: #333438;
+ color: #fff;
+ }
+
+ .progressBar {
+ bottom: 0;
+ left: 0;
+ right: 0;
+ top: 0;
+ @include S(border-radius, $globalBorderRadius);
+ position: absolute;
+ display: inline-block;
+ z-index: -1;
+ transition: all 0.2s ease-in-out;
+ transition-property: width, background-color;
+ background: #bdbfca;
+
+ @include DarkThemeOverride {
+ background: #8c8d96;
+ }
+
+ &.complete {
+ background-color: $colorGreenBright;
+
+ @include DarkThemeOverride {
+ background-color: $colorGreenBright;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ button.buy {
+ grid-column: 3 / 4;
+ grid-row: 3 / 4;
+ align-self: center;
+ justify-self: end;
+ // @include S(padding, 4px, 5px);
+ // @include PlainText;
+ background-color: $colorGreenBright;
+ color: #fff;
+
+ transition: all 0.2s ease-in-out;
+ transition-property: background-color, opacity;
+
+ &:not(.buyable) {
+ background-color: #aaa;
+ cursor: default;
+ pointer-events: none;
+ opacity: 0.3;
+ }
+
+ &.buyable {
+ @include InlineAnimation(1s ease-in-out infinite) {
+ 0% {
+ }
+
+ 50% {
+ background-color: lighten($colorGreenBright, 10);
+ }
+ 100% {
+ }
+ }
+ }
+ }
+
+ &.maxLevel {
+ button.buy {
+ opacity: 0 !important;
+ }
+ .requirements {
+ display: none;
+ }
+ .description {
+ color: $colorGreenBright;
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/standalone_advantages.scss b/src/css/ingame_hud/standalone_advantages.scss
new file mode 100644
index 00000000..065ad6ac
--- /dev/null
+++ b/src/css/ingame_hud/standalone_advantages.scss
@@ -0,0 +1,169 @@
+#ingame_HUD_StandaloneAdvantages {
+ .content {
+ @include S(width, 440px);
+ @include S(min-height, 300px);
+ }
+ p {
+ @include PlainText;
+ }
+
+ .points {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ @include S(grid-column-gap, 10px);
+ @include S(grid-row-gap, 20px);
+ @include S(margin, 10px, 0, 20px);
+ grid-template-rows: #{D(40px)};
+ align-items: center;
+ }
+
+ .lowerBar {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+
+ > button {
+ transition: opacity 0.12s ease-in-out;
+ &:hover {
+ opacity: 0.85;
+ }
+ }
+
+ .otherCloseButton {
+ @include SuperSmallText;
+ @include S(margin-right, 30px);
+ color: #aaa;
+ @include S(margin, 0);
+ @include IncreasedClickArea(0px);
+ @include S(margin-top, 15px);
+
+ @include InlineAnimation(5s ease-in-out) {
+ 0% {
+ opacity: 0.05;
+ }
+ 50% {
+ opacity: 0.05;
+ }
+ 100% {
+ opacity: 1;
+ }
+ }
+ }
+
+ .steamLinkButton {
+ @include IncreasedClickArea(5px);
+ @include S(margin, 0);
+ @include S(width, 180px);
+ @include S(height, 40px);
+ background: #171a23 center center / contain no-repeat;
+
+ @include S(border-radius, $globalBorderRadius);
+ }
+ }
+
+ .point {
+ display: grid;
+ grid-template-columns: #{D(55px)} auto;
+ grid-template-rows: 1fr 1fr;
+
+ > strong {
+ grid-column: 2 / 3;
+ grid-row: 1 / 2;
+ @include PlainText;
+ text-transform: uppercase;
+ font-weight: bold;
+ }
+
+ > p {
+ grid-column: 2 / 3;
+ grid-row: 2 / 3;
+ @include SuperSmallText;
+ opacity: 0.8;
+ }
+
+ background: transparent #{D(10px)} center / #{D(30px)} no-repeat;
+
+ &.levels {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_new_levels.png");
+ }
+ > strong {
+ color: #f13555;
+ }
+ }
+
+ &.upgrades {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_upgrades.png");
+ }
+ > strong {
+ color: #8a00ff;
+ }
+ }
+
+ &.buildings {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_buildings.png");
+ }
+ > strong {
+ color: #3fce8b;
+ }
+ }
+
+ &.wires {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_wires.png");
+ }
+ > strong {
+ color: #ef2fdb;
+ }
+ }
+
+ &.markers {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_markers.png");
+ }
+ > strong {
+ color: #4294ff;
+ }
+ }
+
+ &.savegames {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_savegames.png");
+ }
+ > strong {
+ color: #ff9500;
+ }
+ }
+
+ &.darkmode {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_dark_mode.png");
+ }
+ > strong {
+ color: #292c32;
+ }
+ }
+
+ &.support {
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/advantage_support.png");
+ }
+ > strong {
+ color: #e72d2d;
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/statistics.scss b/src/css/ingame_hud/statistics.scss
index 12b8c1aa..cdc428c1 100644
--- a/src/css/ingame_hud/statistics.scss
+++ b/src/css/ingame_hud/statistics.scss
@@ -33,22 +33,55 @@
&.displayIcons,
&.displayDetailed,
+ &.displaySorted,
+ &.displayIterateUnit {
+ background: transparent center center / #{D(15px)} no-repeat;
+ }
+
+ &.displayDetailed {
+ /* @load-async */
+ background-image: uiResource("icons/display_list.png");
+ }
+
+ &.displayIcons {
+ /* @load-async */
+ background-image: uiResource("icons/display_icons.png");
+ background-size: #{D(11.5px)};
+ }
+
+ &.displayDetailed {
+ @include S(border-top-left-radius, $globalBorderRadius);
+ @include S(border-bottom-left-radius, $globalBorderRadius);
+ }
+
&.displaySorted {
- background: uiResource("icons/display_list.png") center center / #{D(15px)} no-repeat;
- &.displayIcons {
- background-image: uiResource("icons/display_icons.png");
- background-size: #{D(11.5px)};
- }
- &.displaySorted {
+ & {
+ /* @load-async */
background-image: uiResource("icons/display_sorted.png");
- background-size: #{D(11.5px)};
- margin-right: 4px;
- @include S(padding, 1px, 0);
}
+ background-size: #{D(11.5px)};
+ margin-right: 5px;
+ @include S(border-top-right-radius, $globalBorderRadius);
+ @include S(border-bottom-right-radius, $globalBorderRadius);
+
+ @include S(padding, 1px, 0);
+ }
+
+ &.displayIterateUnit {
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/toggle_unit.png");
+ }
+ opacity: 0.8;
+ @include S(padding, 1px, 0);
}
background-color: #44484a !important;
transition: opacity 0.2s ease-in-out;
+
+ @include DarkThemeOverride {
+ background-color: lighten($darkModeControlsBackground, 10) !important;
+ }
}
.filtersDataSource,
@@ -110,10 +143,10 @@
}
@include DarkThemeOverride {
- background: #222428;
+ background: $darkModeControlsBackground;
&.pinned {
- background: darken(#222428, 10);
+ background: mix($darkModeControlsBackground, $colorBlueBright, 90%);
}
}
@@ -159,6 +192,11 @@
grid-column: 1 / 2;
grid-row: 2 / 3;
justify-self: end;
+ color: #55595a;
+
+ @include DarkThemeOverride {
+ color: #aaa;
+ }
}
}
}
@@ -176,6 +214,10 @@
align-self: center;
text-align: right;
color: #55595a;
+
+ @include DarkThemeOverride {
+ color: #aaa;
+ }
}
canvas.graph {
diff --git a/src/css/ingame_hud/tutorial_hints.scss b/src/css/ingame_hud/tutorial_hints.scss
index ad1096af..27d85fe1 100644
--- a/src/css/ingame_hud/tutorial_hints.scss
+++ b/src/css/ingame_hud/tutorial_hints.scss
@@ -1,117 +1,120 @@
-#ingame_HUD_TutorialHints {
- position: absolute;
- @include S(left, 10px);
- @include S(bottom, 10px);
-
- @include StyleBelowWidth(1430px) {
- @include S(bottom, 50px);
- }
-
- display: flex;
- flex-direction: column;
- background: rgba(50, 60, 70, 0);
-
- transition: all 0.2s ease-in-out;
- pointer-events: all;
-
- transition-property: background-color, transform, bottom, left;
-
- @include S(padding, 5px);
- video {
- transition: all 0.2s ease-in-out;
- transition-property: opacity, width;
- @include S(width, 0px);
- opacity: 0;
- z-index: 10;
- position: relative;
- }
-
- .header {
- color: #333438;
- display: grid;
- align-items: center;
- @include S(grid-gap, 2px);
- grid-template-columns: 1fr;
- @include S(margin-bottom, 3px);
- z-index: 11;
- position: relative;
-
- > span {
- @include DarkThemeInvert;
-
- display: flex;
- @include SuperSmallText;
- justify-content: flex-start;
- align-items: center;
- &::before {
- @include S(margin-right, 4px);
- content: " ";
- @include S(width, 12px);
- @include S(height, 12px);
- display: inline-block;
- background: uiResource("icons/help.png") center center / 95% no-repeat;
- }
- }
-
- button.toggleHint {
- @include PlainText;
- @include IncreasedClickArea(0px);
- }
- }
-
- button.toggleHint {
- .hide {
- display: none;
- }
- }
-
- &.enlarged {
- background: $ingameHudBg;
- left: 50%;
- bottom: 50%;
- transform: translate(-50%, 50%);
-
- &::before {
- pointer-events: all;
- content: " ";
- position: fixed;
- top: -1000px;
- left: -1000px;
- right: -1000px;
- bottom: -1000px;
- z-index: 0;
-
- background: rgba($ingameHudBg, 0.3);
- }
-
- .header {
- grid-template-columns: 1fr auto;
- > span {
- display: none;
- }
- button.toggleHint {
- grid-column: 2 / 3;
- }
- }
-
- video {
- @include InlineAnimation(0.2s ease-in-out) {
- 0% {
- opacity: 0;
- @include S(width, 0px);
- }
- }
-
- opacity: 1;
- @include S(width, 500px);
- }
- button.toggleHint {
- .hide {
- display: block;
- }
- .show {
- display: none;
- }
- }
- }
-}
+#ingame_HUD_TutorialHints {
+ position: absolute;
+ @include S(left, 10px);
+ @include S(bottom, 10px);
+
+ @include StyleBelowWidth(1430px) {
+ @include S(bottom, 50px);
+ }
+
+ display: flex;
+ flex-direction: column;
+ background: rgba(50, 60, 70, 0);
+
+ transition: all 0.2s ease-in-out;
+ pointer-events: all;
+
+ transition-property: background-color, transform, bottom, left;
+
+ @include S(padding, 5px);
+ video {
+ transition: all 0.2s ease-in-out;
+ transition-property: opacity, width;
+ @include S(width, 0px);
+ opacity: 0;
+ z-index: 10;
+ position: relative;
+ }
+
+ .header {
+ color: #333438;
+ display: grid;
+ align-items: center;
+ @include S(grid-gap, 2px);
+ grid-template-columns: 1fr;
+ @include S(margin-bottom, 3px);
+ z-index: 11;
+ position: relative;
+
+ > span {
+ @include DarkThemeInvert;
+
+ display: flex;
+ @include SuperSmallText;
+ justify-content: flex-start;
+ align-items: center;
+ &::before {
+ @include S(margin-right, 4px);
+ content: " ";
+ @include S(width, 12px);
+ @include S(height, 12px);
+ display: inline-block;
+ & {
+ /* @load-async */
+ background: uiResource("icons/help.png") center center / 95% no-repeat;
+ }
+ }
+ }
+
+ button.toggleHint {
+ @include PlainText;
+ @include IncreasedClickArea(0px);
+ }
+ }
+
+ button.toggleHint {
+ .hide {
+ display: none;
+ }
+ }
+
+ &.enlarged {
+ background: $ingameHudBg;
+ left: 50%;
+ bottom: 50%;
+ transform: translate(-50%, 50%);
+
+ &::before {
+ pointer-events: all;
+ content: " ";
+ position: fixed;
+ top: -1000px;
+ left: -1000px;
+ right: -1000px;
+ bottom: -1000px;
+ z-index: 0;
+
+ background: rgba($ingameHudBg, 0.3);
+ }
+
+ .header {
+ grid-template-columns: 1fr auto;
+ > span {
+ display: none;
+ }
+ button.toggleHint {
+ grid-column: 2 / 3;
+ }
+ }
+
+ video {
+ @include InlineAnimation(0.2s ease-in-out) {
+ 0% {
+ opacity: 0;
+ @include S(width, 0px);
+ }
+ }
+
+ opacity: 1;
+ @include S(width, 500px);
+ }
+ button.toggleHint {
+ .hide {
+ display: block;
+ }
+ .show {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/unlock_notification.scss b/src/css/ingame_hud/unlock_notification.scss
index 56720d7a..828c55a9 100644
--- a/src/css/ingame_hud/unlock_notification.scss
+++ b/src/css/ingame_hud/unlock_notification.scss
@@ -1,177 +1,178 @@
-#ingame_HUD_UnlockNotification {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(#333538, 0.98) uiResource("dialog_bg_pattern.png") top left / #{D(10px)} repeat;
- display: flex;
- justify-content: center;
- align-items: center;
- pointer-events: all;
-
- @include InlineAnimation(0.1s ease-in-out) {
- 0% {
- opacity: 0;
- }
- }
-
- .dialog {
- // background: rgba(#222428, 0.5);
- @include S(border-radius, $globalBorderRadius);
- @include S(padding, 30px);
-
- @include InlineAnimation(0.5s ease-in-out) {
- 0% {
- opacity: 0;
- }
- }
- display: flex;
- align-items: center;
- flex-direction: column;
- max-height: 100vh;
-
- color: #fff;
- text-align: center;
- .title,
- .subTitle {
- @include SuperHeading;
- text-transform: uppercase;
- @include S(font-size, 40px);
-
- @include InlineAnimation(0.5s ease-in-out) {
- 0% {
- transform: translateY(-50vh);
- }
- 50% {
- transform: translateY(5vh);
- }
- 75% {
- transform: translateY(-2vh);
- }
- }
- }
-
- .subTitle {
- @include PlainText;
- display: inline-block;
- @include S(margin, 5px, 0, 20px);
- color: $colorGreenBright;
-
- @include S(border-radius, $globalBorderRadius);
- @include InlineAnimation(0.5s ease-in-out) {
- 0% {
- transform: translateY(-60vh);
- }
- 50% {
- transform: translateY(6vh);
- }
- 75% {
- transform: translateY(-3vh);
- }
- }
- }
-
- .contents {
- @include S(width, 400px);
- @include InlineAnimation(0.5s ease-in-out) {
- 0% {
- transform: translateX(-100vw);
- }
- 50% {
- transform: translateX(5vw);
- }
-
- 75% {
- transform: translateX(-2vw);
- }
- }
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- @include S(grid-gap, 10px);
-
- .rewardName {
- grid-column: 1 / 3;
- display: none;
- @include InlineAnimation(0.5s ease-in-out) {
- 0% {
- transform: translateX(200vw);
- }
- 50% {
- transform: translateX(-10vw);
- }
-
- 75% {
- transform: translateX(4vw);
- }
- }
- }
-
- .rewardDesc {
- grid-column: 1 / 3;
- @include PlainText;
- @include S(margin-bottom, 15px);
- color: #aaacaf;
- @include S(width, 400px);
- text-align: left;
- strong {
- color: #fff;
- }
- }
-
- .images {
- display: flex;
- .buildingExplanation {
- @include S(width, 200px);
- @include S(height, 200px);
- display: inline-block;
- background-position: center center;
- background-size: cover;
- background-repeat: no-repeat;
- @include S(border-radius, $globalBorderRadius);
- box-shadow: #{D(2px)} #{D(3px)} 0 0 rgba(0, 0, 0, 0.15);
- }
- }
- }
-
- button.close {
- border: 0;
- position: relative;
- @include S(margin-top, 30px);
-
- &:not(.unlocked) {
- pointer-events: none;
- opacity: 0.8;
- cursor: default;
- }
-
- &.unlocked {
- &::after {
- animation: none !important;
- }
- }
-
- &::after {
- content: " ";
- display: inline-block;
- position: absolute;
- top: 0;
- left: 100%;
- right: 0;
- bottom: 0;
- background: rgba(0, 10, 20, 0.8);
-
- @include InlineAnimation(5s linear) {
- 0% {
- left: 0;
- }
- 100% {
- left: 100%;
- }
- }
- }
- }
- }
-}
+#ingame_HUD_UnlockNotification {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ overflow: auto;
+ pointer-events: all;
+
+ & {
+ /* @load-async */
+ background: rgba(#333538, 0.98) uiResource("dialog_bg_pattern.png") top left / #{D(10px)} repeat;
+ }
+
+ @include InlineAnimation(0.1s ease-in-out) {
+ 0% {
+ opacity: 0;
+ }
+ }
+
+ .dialog {
+ // background: rgba(#222428, 0.5);
+ @include S(border-radius, $globalBorderRadius);
+ @include S(padding, 30px);
+
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ opacity: 0;
+ }
+ }
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+
+ color: #fff;
+ text-align: center;
+ .title,
+ .subTitle {
+ @include SuperHeading;
+ text-transform: uppercase;
+ @include S(font-size, 40px);
+
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ transform: translateY(-50vh);
+ }
+ 50% {
+ transform: translateY(5vh);
+ }
+ 75% {
+ transform: translateY(-2vh);
+ }
+ }
+ }
+
+ .subTitle {
+ @include PlainText;
+ display: inline-block;
+ @include S(margin, 5px, 0, 20px);
+ color: $colorGreenBright;
+
+ @include S(border-radius, $globalBorderRadius);
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ transform: translateY(-60vh);
+ }
+ 50% {
+ transform: translateY(6vh);
+ }
+ 75% {
+ transform: translateY(-3vh);
+ }
+ }
+ }
+
+ .contents {
+ @include S(width, 400px);
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ transform: translateX(-100vw);
+ }
+ 50% {
+ transform: translateX(5vw);
+ }
+
+ 75% {
+ transform: translateX(-2vw);
+ }
+ }
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ @include S(grid-gap, 10px);
+
+ .rewardName {
+ grid-column: 1 / 3;
+ display: none;
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ transform: translateX(200vw);
+ }
+ 50% {
+ transform: translateX(-10vw);
+ }
+
+ 75% {
+ transform: translateX(4vw);
+ }
+ }
+ }
+
+ .rewardDesc {
+ grid-column: 1 / 3;
+ @include PlainText;
+ @include S(margin-bottom, 15px);
+ color: #aaacaf;
+ @include S(width, 400px);
+ text-align: left;
+ strong {
+ color: #fff;
+ }
+ }
+
+ .images {
+ display: flex;
+ .buildingExplanation {
+ @include S(width, 200px);
+ @include S(height, 200px);
+ display: inline-block;
+ background-position: center center;
+ background-size: cover;
+ background-repeat: no-repeat;
+ @include S(border-radius, $globalBorderRadius);
+ box-shadow: #{D(2px)} #{D(3px)} 0 0 rgba(0, 0, 0, 0.15);
+ }
+ }
+ }
+
+ button.close {
+ border: 0;
+ position: relative;
+ @include S(margin-top, 30px);
+
+ &:not(.unlocked) {
+ pointer-events: none;
+ opacity: 0.8;
+ cursor: default;
+ }
+
+ &.unlocked {
+ &::after {
+ animation: none !important;
+ }
+ }
+
+ &::after {
+ content: " ";
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ left: 100%;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 10, 20, 0.8);
+
+ @include InlineAnimation(5s linear) {
+ 0% {
+ left: 0;
+ }
+ 100% {
+ left: 100%;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/ingame_hud/vignette_overlay.scss b/src/css/ingame_hud/vignette_overlay.scss
index ce569fd4..6efe109f 100644
--- a/src/css/ingame_hud/vignette_overlay.scss
+++ b/src/css/ingame_hud/vignette_overlay.scss
@@ -4,7 +4,10 @@
left: 0;
right: 0;
bottom: 0;
- background: uiResource("vignette.lossless.png") center center / cover no-repeat;
+ & {
+ /* @load-async */
+ background: uiResource("vignette.lossless.png") center center / cover no-repeat;
+ }
pointer-events: none;
@include DarkThemeOverride {
diff --git a/src/css/ingame_hud/watermark.scss b/src/css/ingame_hud/watermark.scss
index d14a7fc8..76ec224c 100644
--- a/src/css/ingame_hud/watermark.scss
+++ b/src/css/ingame_hud/watermark.scss
@@ -1,18 +1,85 @@
-#ingame_HUD_Watermark {
- position: absolute;
- background: uiResource("get_on_steam.png") center center / contain no-repeat;
- @include S(width, 110px);
- @include S(height, 40px);
- @include S(top, 10px);
- pointer-events: all;
- cursor: pointer;
- @include S(left, 160px);
-
- transition: all 0.12s ease-in;
- transition-property: opacity, transform;
- transform: skewX(-0.5deg);
- &:hover {
- transform: skewX(-1deg) scale(1.02);
- opacity: 0.9;
- }
-}
+#ingame_HUD_Watermark {
+ position: absolute;
+
+ @include S(border-radius, $globalBorderRadius);
+ @include S(top, 70px);
+ pointer-events: all;
+ cursor: pointer;
+ left: 50%;
+ text-align: center;
+
+ background: rgba(207, 65, 65, 0.8);
+ color: #fff;
+ transform: translateX(-50%);
+ @include PlainText;
+ @include S(padding, 10px);
+
+ &:hover {
+ transform: translateX(-50%) scale(1.02) !important;
+ }
+
+ > strong {
+ @include PlainText;
+ text-transform: uppercase;
+ }
+ > p {
+ @include SuperSmallText;
+ opacity: 0.7;
+ }
+
+ opacity: 0;
+
+ &.visible {
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+ }
+ opacity: 1;
+ }
+
+ &:not(.visible) {
+ @include InlineAnimation(0.5s ease-in-out) {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+ }
+ }
+}
+
+#ingame_HUD_WatermarkClicker {
+ @include S(top, 55px);
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%) !important;
+ @include SuperSmallText;
+ color: $colorBlueBright;
+ text-transform: uppercase;
+ pointer-events: all;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+
+ &:hover {
+ opacity: 0.9;
+ }
+
+ &::after {
+ @include S(margin-left, 4px);
+ content: "";
+ @include S(width, 10px);
+ @include S(height, 10px);
+ display: inline-flex;
+ background: center center / contain no-repeat;
+ & {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/demo_steam_link_indicator.png");
+ }
+ }
+}
diff --git a/src/css/ingame_hud/waypoints.scss b/src/css/ingame_hud/waypoints.scss
index 07a8f7e7..d30c5120 100644
--- a/src/css/ingame_hud/waypoints.scss
+++ b/src/css/ingame_hud/waypoints.scss
@@ -39,6 +39,8 @@
overflow-y: auto;
pointer-events: all;
@include S(padding-right, 5px);
+ @include S(padding-bottom, 5px);
+ @include S(padding-top, 5px);
// Scrollbar
&::-webkit-scrollbar {
@@ -55,7 +57,10 @@
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
- background: uiResource("icons/waypoint.png") left 50% / #{D(8px)} no-repeat;
+ & {
+ /* @load-async */
+ background: uiResource("icons/waypoint.png") left 50% / #{D(8px)} no-repeat;
+ }
opacity: 0.7;
@include S(margin-bottom, 1px);
font-weight: bold;
@@ -68,7 +73,10 @@
@include S(width, 10px);
@include S(height, 10px);
@include S(margin-left, 4px);
- background: uiResource("icons/edit_key.png") center center / 70% no-repeat;
+ & {
+ /* @load-async */
+ background: uiResource("icons/edit_key.png") center center / 70% no-repeat;
+ }
pointer-events: all;
cursor: pointer;
position: relative;
diff --git a/src/css/main.scss b/src/css/main.scss
index 5835a84d..4f6a771e 100644
--- a/src/css/main.scss
+++ b/src/css/main.scss
@@ -6,7 +6,7 @@
@return inline($pth);
}
-@import "icons";
+@import "resources";
@import "trigonometry";
@import "material_colors";
@import "dynamic_ui";
@@ -52,6 +52,8 @@
@import "ingame_hud/color_blind_helper";
@import "ingame_hud/shape_viewer";
@import "ingame_hud/sandbox_controller";
+@import "ingame_hud/standalone_advantages";
+@import "ingame_hud/cat_memes";
// prettier-ignore
$elements:
@@ -71,12 +73,13 @@ ingame_HUD_KeybindingOverlay,
ingame_HUD_Notifications,
ingame_HUD_DebugInfo,
ingame_HUD_EntityDebugger,
-ingame_HUD_InteractiveTutorial,
ingame_HUD_TutorialHints,
-ingame_HUD_buildings_toolbar,
+ingame_HUD_InteractiveTutorial,
+ingame_HUD_BuildingsToolbar,
ingame_HUD_wires_toolbar,
ingame_HUD_BlueprintPlacer,
ingame_HUD_Waypoints_Hint,
+ingame_HUD_WatermarkClicker,
ingame_HUD_Watermark,
ingame_HUD_ColorBlindBelowTileHelper,
ingame_HUD_SandboxController,
@@ -88,9 +91,11 @@ ingame_HUD_BetaOverlay,
ingame_HUD_Shop,
ingame_HUD_Statistics,
ingame_HUD_ShapeViewer,
+ingame_HUD_StandaloneAdvantages,
ingame_HUD_UnlockNotification,
ingame_HUD_SettingsMenu,
-ingame_HUD_ModalDialogs;
+ingame_HUD_ModalDialogs,
+ingame_HUD_CatMemes;
$zindex: 100;
diff --git a/src/css/mixins.scss b/src/css/mixins.scss
index b40afe3e..43f7a259 100644
--- a/src/css/mixins.scss
+++ b/src/css/mixins.scss
@@ -1,363 +1,316 @@
-// ----------------------------------------
-/* Forces an element to get rendered on its own layer, increasing
-the performance when animated. Use only transform and opacity in animations! */
-@mixin FastAnimation {
- will-change: transform, opacity, filter;
- // transform: translateZ(0);
- backface-visibility: hidden;
- -webkit-backface-visibility: hidden;
-}
-
-// Helper which includes the translateZ webkit fix, use together with Fast animation
-// $hardwareAcc: translateZ(0);
-$hardwareAcc: null;
-
-// ----------------------------------------
-/** Increased click area for this element, helpful on mobile */
-@mixin IncreasedClickArea($size) {
- &::after {
- content: "";
- position: absolute;
- top: #{D(-$size)};
- bottom: #{D(-$size)};
- left: #{D(-$size)};
- right: #{D(-$size)};
- // background: rgba(255, 0, 0, 0.3);
- }
-}
-button,
-.increasedClickArea {
- position: relative;
- @include IncreasedClickArea(15px);
-}
-
-// ----------------------------------------
-/* Duplicates an animation and adds two classes .Even and .Odd which uses the
- animation. This can be used to replay the animation by toggling between the classes, because
- it is not possible to restart a css animation */
-@mixin MakeAnimationWrappedEvenOdd($duration, $classPrefix: "anim", $childSelector: "") {
- $animName: autogen_anim_#{unique-id()};
-
- @at-root {
- @keyframes #{$animName}_even {
- @content;
- }
-
- @keyframes #{$animName}_odd {
- @content;
- }
- }
-
- &.#{$classPrefix}Even #{$childSelector} {
- animation: #{$animName}_even $duration;
- }
-
- &.#{$classPrefix}Odd #{$childSelector} {
- animation: #{$animName}_odd $duration;
- }
-}
-
-// ----------------------------------------
-/* Allows to use and define an animation without specifying its name */
-@mixin InlineAnimation($duration) {
- $animName: autogen_anim_#{unique-id()};
-
- @at-root {
- @keyframes #{$animName} {
- @content;
- }
- }
-
- animation: $animName $duration !important;
-}
-
-// ----------------------------------------
-/* Animation prefab for a double bounce pop-in animation, useful for dialogs */
-@mixin DoubleBounceAnim($duration: 0.5s ease-in-out, $amount: 0.2, $initialOpacity: 0) {
- @include InlineAnimation($duration) {
- 0% {
- opacity: $initialOpacity;
- transform: scale(0) $hardwareAcc;
- }
-
- 25% {
- opacity: 0.5;
- transform: scale(1 + $amount) $hardwareAcc;
- }
-
- 50% {
- opacity: 1;
- transform: scale(1 - $amount * 0.5) $hardwareAcc;
- }
-
- 75% {
- transform: scale(1 + $amount * 0.25) $hardwareAcc;
- }
-
- 100% {
- transform: scale(1) $hardwareAcc;
- }
- }
-
- opacity: 1;
-}
-
-// ----------------------------------------
-/* Define a style which is only applied in horizontal mode */
-@mixin HorizontalStyle {
- @include AppendGlobal(".h") {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied in vertical mode */
-@mixin VerticalStyle {
- @include AppendGlobal(".v") {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only while the hardware keyboard is open */
-@mixin AndroidHwKeyboardOpen {
- @include AppendGlobal(".kb") {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Automatically transforms the game state if a hardware keyboard is open */
-@mixin TransformToMatchKeyboard {
- transition: transform 0.2s ease-in-out;
- @include AndroidHwKeyboardOpen {
- @include VerticalStyle {
- transform: translateY(#{D(-125px)}) $hardwareAcc;
- }
- @include HorizontalStyle {
- transform: translateY(#{D(-100px)}) $hardwareAcc;
- }
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied when the viewport is at least X pixels wide */
-@mixin StyleAtWidth($minW) {
- @media (min-width: #{$minW}) {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied when the viewport is at least X pixels height */
-@mixin StyleAtHeight($minH) {
- @media (min-height: #{$minH}) {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied when the viewport has at least the given dimensions */
-@mixin StyleAtDims($minW, $minH) {
- @media (min-height: #{$minH}) and (min-width: #{$minW}) {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied when the viewport has at maximum the given dimensions */
-@mixin StyleBelowDims($maxW, $maxH) {
- @media (max-height: #{$maxH}) and (max-width: #{$maxW}) {
- @content;
- }
-}
-
-// ----------------------------------------
-/* Define a style which is only applied when the viewport has at maximum the given height */
-@mixin StyleBelowHeight($maxH) {
- @media (max-height: #{$maxH}) {
- @content;
- }
-}
-// ----------------------------------------
-/* Define a style which is only applied when the viewport has at maximum the given width */
-@mixin StyleBelowWidth($maxW) {
- @media (max-width: #{$maxW}) {
- @content;
- }
-}
-
-// ----------------------------------------
-// Dynamic graphics quality styles
-
-@mixin BoxShadow3D($bgColor, $size: 3px, $pressEffect: true) {
- background-color: $bgColor;
-
- $borderSize: 1.5px;
- $borderColor: rgb(18, 20, 24);
-
- // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
- // 0 D($size) 0 D($borderSize) $borderColor;
-
- // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 D($borderSize) $borderColor,
- // D(-$size * 1.5) D($size * 2) 0 D($borderSize) rgba(0, 0, 0, 0.1);
-
- // transition: box-shadow 0.1s ease-in-out;
-
- // @if $pressEffect {
- // &.pressed {
- // transform: none !important;
- // $pSize: max(0, $size - 1.5px);
- // transition: none !important;
- // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($pSize) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
- // 0 D($pSize) 0 D($borderSize) $borderColor;
- // top: D($size - $pSize);
- // }
- // }
-}
-
-@mixin BorderRadius($v1: 2px, $v2: "", $v3: "", $v4: "") {
- @include S(border-radius, $v1, $v2, $v3, $v4);
-}
-
-@mixin BoxShadow($x, $y, $blur, $offset, $color) {
- box-shadow: D($x) D($y) D($blur) D($offset) $color;
-}
-
-@mixin DropShadow($yOffset: 2px, $blur: 2px, $amount: 0.2) {
- @include BoxShadow(0, $yOffset, $blur, 0, rgba(#000, $amount));
-}
-
-@mixin TextShadow($yOffset: 2px, $blur: 1px, $amount: 0.6) {
- text-shadow: 0 D($yOffset) D($blur) rgba(#000, $amount);
-}
-
-@mixin Button3D($bgColor, $pressEffect: true) {
- @include BoxShadow3D($bgColor, 2px, $pressEffect);
-}
-
-@mixin ButtonDisabled3D($bgColor) {
- @include BoxShadow3D($bgColor, 0.5px, false);
-}
-
-@mixin BoxShadowInset($bgColor, $size: 3px) {
- background-color: $bgColor;
-
- $borderSize: 1px;
- $borderColor: rgb(15, 19, 24);
- box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 rgba(#fff, 0.07);
- border-top: D($size) solid rgba(#000, 0.1);
-
- //, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
- // 0 D($size + $borderSize) 0 0 $borderColor;
-}
-
-@mixin TextShadow3D($color: rgb(222, 234, 238), $borderColor: #000) {
- color: $color;
-}
-
-// ----------------------------------------
-/* Shine animation prefab, useful for buttons etc. Adds a bright shine which moves over
- the button like a reflection. Performance heavy. */
-@mixin ShineAnimation($duration, $bgColor, $w: 200px, $shineAlpha: 0.25, $lightenAmount: 7, $bgAnim: true) {
- $bgBase: darken($bgColor, 5);
- background-color: $bgBase;
-
- @include HighQualityOrMore {
- position: relative;
- // overflow: hidden;
- // overflow: visible;
-
- &:before {
- content: " ";
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: uiResource("misc/shine_bg.png") 0px center / 100% 100% no-repeat;
-
- @include InlineAnimation($duration ease-in-out infinite) {
- 0% {
- background-position-x: #{D(-$w)};
- }
- 100% {
- background-position-x: #{D($w)};
- }
- }
- }
-
- @if ($bgAnim) {
- @include InlineAnimation($duration ease-in-out infinite) {
- 0% {
- background-color: $bgBase;
- }
- 50% {
- background-color: lighten($bgBase, $lightenAmount);
- }
- 100% {
- background-color: $bgBase;
- }
- }
- }
- }
-}
-
-// ----------------------------------------
-/* String replacement */
-@function str-replace($string, $search, $replace: "") {
- $index: str-index($string, $search);
-
- @if $index {
- @return str-slice($string, 1, $index - 1) + $replace +
- str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
- }
-
- @return $string;
-}
-
-@mixin BounceInFromSide($mul, $duration: 0.18s ease-in-out) {
- @include InlineAnimation($duration) {
- 0% {
- transform: translateY(#{D(-100px * $mul)}) scale(0.9);
- opacity: 0;
- }
-
- 100% {
- opacity: 1;
- transform: none;
- }
- }
- opacity: 1;
- transform: none;
-}
-
-@mixin BreakText {
- word-wrap: break-word;
- word-break: break-all;
- overflow-wrap: break-all;
-}
-
-@mixin SupportsAndroidNotchQuery {
- @supports (color: constant(--notch-inset-left)) {
- @content;
- }
-}
-@mixin SupportsiOsNotchQuery {
- @supports (color: env(safe-area-inset-left, 0px)) {
- @content;
- }
-}
-
-@mixin DarkThemeOverride {
- @at-root html[data-theme="dark"] &,
- &[data-theme="dark"] {
- @content;
- }
-}
-
-@mixin DarkThemeInvert {
- @include DarkThemeOverride {
- filter: invert(1);
- }
-}
+// ----------------------------------------
+/* Forces an element to get rendered on its own layer, increasing
+the performance when animated. Use only transform and opacity in animations! */
+@mixin FastAnimation {
+ will-change: transform, opacity, filter;
+ // transform: translateZ(0);
+ backface-visibility: hidden;
+ -webkit-backface-visibility: hidden;
+}
+
+// Helper which includes the translateZ webkit fix, use together with Fast animation
+// $hardwareAcc: translateZ(0);
+$hardwareAcc: null;
+
+// ----------------------------------------
+/** Increased click area for this element, helpful on mobile */
+@mixin IncreasedClickArea($size) {
+ &::after {
+ content: "";
+ position: absolute;
+ top: #{D(-$size)};
+ bottom: #{D(-$size)};
+ left: #{D(-$size)};
+ right: #{D(-$size)};
+ // background: rgba(255, 0, 0, 0.3);
+ }
+}
+button,
+.increasedClickArea {
+ position: relative;
+ @include IncreasedClickArea(15px);
+}
+
+// ----------------------------------------
+/* Duplicates an animation and adds two classes .Even and .Odd which uses the
+ animation. This can be used to replay the animation by toggling between the classes, because
+ it is not possible to restart a css animation */
+@mixin MakeAnimationWrappedEvenOdd($duration, $classPrefix: "anim", $childSelector: "") {
+ $animName: autogen_anim_#{unique-id()};
+
+ @at-root {
+ @keyframes #{$animName}_even {
+ @content;
+ }
+
+ @keyframes #{$animName}_odd {
+ @content;
+ }
+ }
+
+ &.#{$classPrefix}Even #{$childSelector} {
+ animation: #{$animName}_even $duration;
+ }
+
+ &.#{$classPrefix}Odd #{$childSelector} {
+ animation: #{$animName}_odd $duration;
+ }
+}
+
+// ----------------------------------------
+/* Allows to use and define an animation without specifying its name */
+@mixin InlineAnimation($duration) {
+ $animName: autogen_anim_#{unique-id()};
+
+ @at-root {
+ @keyframes #{$animName} {
+ @content;
+ }
+ }
+
+ animation: $animName $duration !important;
+}
+
+// ----------------------------------------
+/* Animation prefab for a double bounce pop-in animation, useful for dialogs */
+@mixin DoubleBounceAnim($duration: 0.5s ease-in-out, $amount: 0.2, $initialOpacity: 0) {
+ @include InlineAnimation($duration) {
+ 0% {
+ opacity: $initialOpacity;
+ transform: scale(0) $hardwareAcc;
+ }
+
+ 25% {
+ opacity: 0.5;
+ transform: scale(1 + $amount) $hardwareAcc;
+ }
+
+ 50% {
+ opacity: 1;
+ transform: scale(1 - $amount * 0.5) $hardwareAcc;
+ }
+
+ 75% {
+ transform: scale(1 + $amount * 0.25) $hardwareAcc;
+ }
+
+ 100% {
+ transform: scale(1) $hardwareAcc;
+ }
+ }
+
+ opacity: 1;
+}
+
+// ----------------------------------------
+/* Define a style which is only applied in horizontal mode */
+@mixin HorizontalStyle {
+ @include AppendGlobal(".h") {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied in vertical mode */
+@mixin VerticalStyle {
+ @include AppendGlobal(".v") {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only while the hardware keyboard is open */
+@mixin AndroidHwKeyboardOpen {
+ @include AppendGlobal(".kb") {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Automatically transforms the game state if a hardware keyboard is open */
+@mixin TransformToMatchKeyboard {
+ transition: transform 0.2s ease-in-out;
+ @include AndroidHwKeyboardOpen {
+ @include VerticalStyle {
+ transform: translateY(#{D(-125px)}) $hardwareAcc;
+ }
+ @include HorizontalStyle {
+ transform: translateY(#{D(-100px)}) $hardwareAcc;
+ }
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied when the viewport is at least X pixels wide */
+@mixin StyleAtWidth($minW) {
+ @media (min-width: #{$minW}) {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied when the viewport is at least X pixels height */
+@mixin StyleAtHeight($minH) {
+ @media (min-height: #{$minH}) {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied when the viewport has at least the given dimensions */
+@mixin StyleAtDims($minW, $minH) {
+ @media (min-height: #{$minH}) and (min-width: #{$minW}) {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied when the viewport has at maximum the given dimensions */
+@mixin StyleBelowDims($maxW, $maxH) {
+ @media (max-height: #{$maxH}) and (max-width: #{$maxW}) {
+ @content;
+ }
+}
+
+// ----------------------------------------
+/* Define a style which is only applied when the viewport has at maximum the given height */
+@mixin StyleBelowHeight($maxH) {
+ @media (max-height: #{$maxH}) {
+ @content;
+ }
+}
+// ----------------------------------------
+/* Define a style which is only applied when the viewport has at maximum the given width */
+@mixin StyleBelowWidth($maxW) {
+ @media (max-width: #{$maxW}) {
+ @content;
+ }
+}
+
+// ----------------------------------------
+// Dynamic graphics quality styles
+
+@mixin BoxShadow3D($bgColor, $size: 3px, $pressEffect: true) {
+ background-color: $bgColor;
+
+ $borderSize: 1.5px;
+ $borderColor: rgb(18, 20, 24);
+
+ // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
+ // 0 D($size) 0 D($borderSize) $borderColor;
+
+ // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 D($borderSize) $borderColor,
+ // D(-$size * 1.5) D($size * 2) 0 D($borderSize) rgba(0, 0, 0, 0.1);
+
+ // transition: box-shadow 0.1s ease-in-out;
+
+ // @if $pressEffect {
+ // &.pressed {
+ // transform: none !important;
+ // $pSize: max(0, $size - 1.5px);
+ // transition: none !important;
+ // box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($pSize) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
+ // 0 D($pSize) 0 D($borderSize) $borderColor;
+ // top: D($size - $pSize);
+ // }
+ // }
+}
+
+@mixin BorderRadius($v1: 2px, $v2: "", $v3: "", $v4: "") {
+ @include S(border-radius, $v1, $v2, $v3, $v4);
+}
+
+@mixin BoxShadow($x, $y, $blur, $offset, $color) {
+ box-shadow: D($x) D($y) D($blur) D($offset) $color;
+}
+
+@mixin DropShadow($yOffset: 2px, $blur: 2px, $amount: 0.2) {
+ @include BoxShadow(0, $yOffset, $blur, 0, rgba(#000, $amount));
+}
+
+@mixin TextShadow($yOffset: 2px, $blur: 1px, $amount: 0.6) {
+ text-shadow: 0 D($yOffset) D($blur) rgba(#000, $amount);
+}
+
+@mixin Button3D($bgColor, $pressEffect: true) {
+ @include BoxShadow3D($bgColor, 2px, $pressEffect);
+}
+
+@mixin ButtonDisabled3D($bgColor) {
+ @include BoxShadow3D($bgColor, 0.5px, false);
+}
+
+@mixin BoxShadowInset($bgColor, $size: 3px) {
+ background-color: $bgColor;
+
+ $borderSize: 1px;
+ $borderColor: rgb(15, 19, 24);
+ box-shadow: 0 0 0 D($borderSize) $borderColor, 0 D($size) 0 rgba(#fff, 0.07);
+ border-top: D($size) solid rgba(#000, 0.1);
+
+ //, 0 D($size) 0 0px rgba(mix(darken($bgColor, 9), #b0e2ff, 95%), 1),
+ // 0 D($size + $borderSize) 0 0 $borderColor;
+}
+
+@mixin TextShadow3D($color: rgb(222, 234, 238), $borderColor: #000) {
+ color: $color;
+}
+
+// ----------------------------------------
+/* String replacement */
+@function str-replace($string, $search, $replace: "") {
+ $index: str-index($string, $search);
+
+ @if $index {
+ @return str-slice($string, 1, $index - 1) + $replace +
+ str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+ }
+
+ @return $string;
+}
+
+@mixin BounceInFromSide($mul, $duration: 0.18s ease-in-out) {
+ @include InlineAnimation($duration) {
+ 0% {
+ transform: translateY(#{D(-100px * $mul)}) scale(0.9);
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ transform: none;
+ }
+ }
+ opacity: 1;
+ transform: none;
+}
+
+@mixin BreakText {
+ word-wrap: break-word;
+ word-break: break-all;
+ overflow-wrap: break-all;
+}
+
+@mixin SupportsAndroidNotchQuery {
+ @supports (color: constant(--notch-inset-left)) {
+ @content;
+ }
+}
+@mixin SupportsiOsNotchQuery {
+ @supports (color: env(safe-area-inset-left, 0px)) {
+ @content;
+ }
+}
+
+@mixin DarkThemeOverride {
+ @at-root html[data-theme="dark"] &,
+ &[data-theme="dark"] {
+ @content;
+ }
+}
+
+@mixin DarkThemeInvert {
+ @include DarkThemeOverride {
+ filter: invert(1);
+ }
+}
diff --git a/src/css/resources.scss b/src/css/resources.scss
new file mode 100644
index 00000000..08bfa43f
--- /dev/null
+++ b/src/css/resources.scss
@@ -0,0 +1,91 @@
+$buildings: belt, cutter, miner, mixer, painter, rotater, balancer, stacker, trash, underground_belt, wire,
+ constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, storage,
+ transistor, analyzer, comparator, item_producer;
+
+@each $building in $buildings {
+ [data-icon="building_icons/#{$building}.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_icons/#{$building}.png") !important;
+ }
+}
+
+$buildingsAndVariants: belt, balancer, underground_belt, underground_belt-tier2, miner, miner-chainable,
+ cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, painter-double, painter-quad, trash, storage,
+ reader, rotater-rotate180, display, constant_signal, wire, wire_tunnel, logic_gate-or, logic_gate-not,
+ logic_gate-xor, analyzer, virtual_processor-rotater, virtual_processor-unstacker, item_producer,
+ virtual_processor-stacker, virtual_processor-painter, wire-second, painter, painter-mirrored, comparator;
+@each $building in $buildingsAndVariants {
+ [data-icon="building_tutorials/#{$building}.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/#{$building}.png") !important;
+ }
+}
+
+[data-icon="building_tutorials/balancer-merger.png"],
+[data-icon="building_tutorials/balancer-merger-inverse.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/balancer-merger.png") !important;
+}
+
+[data-icon="building_tutorials/balancer-splitter.png"],
+[data-icon="building_tutorials/balancer-splitter-inverse.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/balancer-splitter.png") !important;
+}
+
+[data-icon="building_tutorials/transistor.png"],
+[data-icon="building_tutorials/transistor-mirrored.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/transistor.png") !important;
+}
+
+// Filter and lever share tutorials
+[data-icon="building_tutorials/filter.png"],
+[data-icon="building_tutorials/lever.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/lever.png") !important;
+}
+
+// Logic gate
+[data-icon="building_tutorials/logic_gate.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/logic_gate-and.png") !important;
+}
+
+// Virtual processor
+[data-icon="building_tutorials/virtual_processor.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/building_tutorials/virtual_processor-cutter.png") !important;
+}
+
+$icons: notification_saved, notification_success, notification_upgrade;
+@each $icon in $icons {
+ [data-icon="icons/#{$icon}.png"] {
+ /* @load-async */
+ background-image: uiResource("res/ui/icons/#{$icon}.png") !important;
+ }
+}
+
+$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi,
+ th, hu, pl, ja, kor, no, pt-PT;
+
+@each $language in $languages {
+ [data-languageicon="#{$language}"] {
+ /* @load-async */
+ background-image: uiResource("languages/#{$language}.svg") !important;
+ }
+}
+
+/*
+PRICE
+*/
+
+.steam_1_pr {
+ /* @load-async */
+ background-image: uiResource("get_on_steam_with_price.png") !important;
+}
+
+.steam_2_npr {
+ /* @load-async */
+ background-image: uiResource("get_on_steam.png") !important;
+}
diff --git a/src/css/states/ingame.scss b/src/css/states/ingame.scss
index 3f220a5d..d67ee00f 100644
--- a/src/css/states/ingame.scss
+++ b/src/css/states/ingame.scss
@@ -1,37 +1,52 @@
-#state_InGameState {
- .gameLoadingOverlay {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 9999;
- align-items: center;
- justify-content: center;
- pointer-events: all;
- display: flex;
- background: $mainBgColor;
- flex-direction: column;
- }
-
- #ingame_Canvas {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- }
- #ingame_HUD_ModalDialogs {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- }
-
- @include DarkThemeOverride {
- .gameLoadingOverlay {
- background: $darkModeGameBackground;
- }
- }
-}
+#state_InGameState {
+ .gameLoadingOverlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
+ align-items: center;
+ justify-content: center;
+ pointer-events: all;
+ display: flex;
+ background: $mainBgColor;
+ flex-direction: column;
+ }
+
+ .prefab_GameHint {
+ position: absolute;
+ @include S(bottom, 40px);
+ @include S(left, 20px);
+ @include S(right, 20px);
+ @include PlainText;
+ text-align: center;
+
+ color: #666;
+
+ @include DarkThemeOverride() {
+ color: lighten($darkModeGameBackground, 50);
+ }
+ }
+
+ #ingame_Canvas {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+ #ingame_HUD_ModalDialogs {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+
+ @include DarkThemeOverride {
+ .gameLoadingOverlay {
+ background: $darkModeGameBackground;
+ }
+ }
+}
diff --git a/src/css/states/keybindings.scss b/src/css/states/keybindings.scss
index cf211403..186a8bef 100644
--- a/src/css/states/keybindings.scss
+++ b/src/css/states/keybindings.scss
@@ -1,71 +1,73 @@
-#state_KeybindingsState {
- .content {
- .topEntries {
- display: grid;
- grid-template-columns: 1fr auto;
- @include S(grid-gap, 5px);
- @include S(margin-bottom, 10px);
- }
-
- .hint {
- display: block;
- background: #eee;
- @include S(padding, 4px);
- @include PlainText;
- }
-
- .category {
- .entry {
- display: grid;
- @include S(margin-top, 2px);
- @include S(padding-top, 2px);
- @include S(grid-gap, 4px);
- grid-template-columns: 1fr #{D(100px)} auto auto;
- border-bottom: #{D(1px)} dotted #eee;
- color: #888c8f;
- .mapping {
- color: $colorBlueBright;
- text-align: center;
- }
-
- button {
- @include S(height, 15px);
- @include S(width, 15px);
- @include IncreasedClickArea(0px);
- background: transparent center center / 40% no-repeat;
- opacity: 0.9;
- &.editKeybinding {
- background-image: uiResource("icons/edit_key.png");
- }
-
- &.resetKeybinding {
- background-image: uiResource("icons/reset_key.png");
- }
-
- &.disabled {
- pointer-events: none;
- cursor: default;
- opacity: 0.1 !important;
- }
- }
- }
- }
- }
-
- @include DarkThemeOverride {
- .content {
- .hint {
- background: #3b3d40;
- }
-
- .category .entry {
- color: #c0c4c8;
- border-bottom-color: #888;
-
- button {
- filter: invert(1);
- }
- }
- }
- }
-}
+#state_KeybindingsState {
+ .content {
+ .topEntries {
+ display: grid;
+ grid-template-columns: 1fr auto;
+ @include S(grid-gap, 5px);
+ @include S(margin-bottom, 10px);
+ }
+
+ .hint {
+ display: block;
+ background: #eee;
+ @include S(padding, 4px);
+ @include PlainText;
+ }
+
+ .category {
+ .entry {
+ display: grid;
+ @include S(margin-top, 2px);
+ @include S(padding-top, 2px);
+ @include S(grid-gap, 4px);
+ grid-template-columns: 1fr #{D(100px)} auto auto;
+ border-bottom: #{D(1px)} dotted #eee;
+ color: #888c8f;
+ .mapping {
+ color: $colorBlueBright;
+ text-align: center;
+ }
+
+ button {
+ @include S(height, 15px);
+ @include S(width, 15px);
+ @include IncreasedClickArea(0px);
+ background: transparent center center / 40% no-repeat;
+ opacity: 0.9;
+ &.editKeybinding {
+ /* @load-async */
+ background-image: uiResource("icons/edit_key.png");
+ }
+
+ &.resetKeybinding {
+ /* @load-async */
+ background-image: uiResource("icons/reset_key.png");
+ }
+
+ &.disabled {
+ pointer-events: none;
+ cursor: default;
+ opacity: 0.1 !important;
+ }
+ }
+ }
+ }
+ }
+
+ @include DarkThemeOverride {
+ .content {
+ .hint {
+ background: darken($darkModeControlsBackground, 4);
+ }
+
+ .category .entry {
+ color: #c0c4c8;
+ border-bottom-color: #888;
+
+ button {
+ filter: invert(1);
+ }
+ }
+ }
+ }
+}
diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss
index 0d0a289e..cf0ab718 100644
--- a/src/css/states/main_menu.scss
+++ b/src/css/states/main_menu.scss
@@ -22,16 +22,22 @@
@include S(height, 25px);
pointer-events: all;
cursor: pointer;
- background: uiResource("icons/main_menu_settings.png") center center / contain no-repeat;
+ & {
+ /* @load-async */
+ background: uiResource("icons/main_menu_settings.png") center center / contain no-repeat;
+ }
transition: opacity 0.12s ease-in-out;
@include IncreasedClickArea(2px);
+ opacity: 0.7;
&:hover {
- opacity: 0.9;
+ opacity: 1;
}
}
.exitAppButton {
+ /* @load-async */
background-image: uiResource("icons/main_menu_exit.png");
+ background-size: 90%;
}
.languageChoose {
@@ -40,6 +46,7 @@
background-color: #fff;
@include S(border-width, 2px);
background-size: cover;
+ opacity: 0.8;
}
}
@@ -57,7 +64,7 @@
transform: translate(50%, 50%);
filter: blur(D(3px));
- $opacity: 0.2;
+ $opacity: 0.07;
&.loaded {
display: block;
opacity: $opacity;
@@ -121,10 +128,12 @@
}
.steamLink {
+ align-self: center;
+ justify-self: center;
width: 100%;
@include S(height, 40px);
-
- background: uiResource("get_on_steam.png") center center / contain no-repeat;
+ @include S(width, 180px);
+ background: #171a23 center center / contain no-repeat;
overflow: hidden;
display: block;
text-indent: -999em;
@@ -134,8 +143,11 @@
transition: all 0.12s ease-in;
transition-property: opacity, transform;
transform: skewX(-0.5deg);
+
+ @include S(border-radius, $globalBorderRadius);
+
&:hover {
- transform: skewX(-1deg) scale(1.02);
+ transform: scale(1.02);
opacity: 0.9;
}
}
@@ -158,7 +170,10 @@
@include S(margin, 10px, 0);
@include S(width, 100px);
@include S(height, 30px);
- background: uiResource("demo_badge.png") center center / contain no-repeat;
+ & {
+ /* @load-async */
+ background: uiResource("demo_badge.png") center center / contain no-repeat;
+ }
display: inline-block;
}
@@ -326,48 +341,82 @@
align-self: center;
justify-self: center;
@include IncreasedClickArea(0px);
- background: #44484a uiResource("icons/play.png") center center / 40% no-repeat;
+ background: #44484a center center / 40% no-repeat;
+ }
+
+ button.resumeGame {
+ background-color: #44484a;
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/play.png");
+ }
}
button.downloadGame {
grid-column: 3 / 4;
grid-row: 1 / 2;
- background-color: $colorBlueBright;
- background-image: uiResource("icons/download.png");
+ background-color: transparent;
+
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/download.png");
+ }
@include S(width, 15px);
@include IncreasedClickArea(0px);
@include S(height, 15px);
- background-size: 60%;
+ background-size: 80%;
align-self: start;
+ opacity: 0.4;
+
+ &:hover {
+ opacity: 0.5;
+ }
+
+ @include DarkThemeInvert;
}
button.deleteGame {
grid-column: 3 / 4;
grid-row: 2 / 3;
- background-color: $colorRedBright;
+ background-color: transparent;
@include IncreasedClickArea(0px);
- background-image: uiResource("icons/delete.png");
+
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/delete.png");
+ }
@include S(width, 15px);
@include S(height, 15px);
align-self: end;
- background-size: 60%;
+ background-size: 80%;
+ opacity: 0.4;
+
+ &:hover {
+ opacity: 0.5;
+ }
+
+ @include DarkThemeInvert;
}
button.renameGame {
background-color: transparent;
@include IncreasedClickArea(2px);
- background-image: uiResource("icons/edit_key.png");
+
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/edit_key.png");
+ }
@include S(width, 10px);
@include S(height, 10px);
align-self: center;
justify-self: center;
background-size: 90%;
- opacity: 0.25;
+ opacity: 0.4;
@include S(margin-left, 4px);
&:hover {
- opacity: 0.35;
+ opacity: 0.5;
}
@include DarkThemeInvert;
@@ -379,6 +428,11 @@
margin: 0;
@include S(width, 32px);
height: 100%;
+ @include S(margin-left, 4px);
+
+ @include DarkThemeOverride {
+ background-color: lighten($darkModeControlsBackground, 10);
+ }
}
}
}
@@ -407,13 +461,21 @@
@include S(padding, 15px);
+ $linkBg: #fdfdff;
+ $linkBgHover: darken($linkBg, 2);
+ $linkColor: #55586a;
+
> .boxLink {
display: grid;
align-items: center;
grid-template-columns: 1fr auto;
justify-content: center;
- background: #fdfdfd uiResource("icons/link.png") top D(3px) right D(3px) / D(9px) no-repeat;
+
+ & {
+ /* @load-async */
+ background: $linkBg uiResource("icons/link.png") top D(3px) right D(3px) / D(9px) no-repeat;
+ }
@include S(padding, 5px);
@include S(padding-left, 10px);
@include S(border-radius, $globalBorderRadius);
@@ -422,7 +484,7 @@
font-weight: bold;
box-sizing: border-box;
text-transform: uppercase;
- color: #616266;
+ color: $linkColor;
transition: background-color 0.12s ease-in-out;
pointer-events: all;
@@ -431,7 +493,7 @@
cursor: pointer;
&:hover {
- background-color: #f0f6ff;
+ background-color: $linkBgHover;
}
.thirdpartyLogo {
@@ -440,9 +502,11 @@
@include S(height, 50px);
background: center center / 80% no-repeat;
&.githubLogo {
+ /* @load-async */
background-image: uiResource("main_menu/github.png");
}
&.discordLogo {
+ /* @load-async */
background-image: uiResource("main_menu/discord.png");
background-size: 95%;
}
@@ -458,12 +522,12 @@
@include S(height, 60px);
> a {
- color: #616266;
- background: #fdfdfd;
+ color: $linkColor;
+ background: $linkBg;
height: 100%;
&:hover {
- background-color: #f0f6ff;
+ background-color: $linkBgHover;
}
@include SuperSmallText;
text-transform: uppercase;
@@ -484,12 +548,15 @@
transition: background-color 0.12s ease-in-out;
&.redditLink {
+ /* @load-async */
background-image: uiResource("main_menu/reddit.svg");
}
&.changelog {
+ /* @load-async */
background-image: uiResource("main_menu/changelog.svg");
}
&.helpTranslate {
+ /* @load-async */
background-image: uiResource("main_menu/translate.svg");
}
}
@@ -499,19 +566,11 @@
@include DarkThemeOverride {
background: $darkModeGameBackground center center / cover !important;
- .topButtons {
- filter: invert(1);
-
- .languageChoose {
- filter: invert(1);
- }
- }
-
.mainContainer {
- background: darken($darkModeGameBackground, 10);
+ background: $darkModeControlsBackground;
.savegames .savegame {
- background: darken($darkModeGameBackground, 15);
+ background: darken($darkModeControlsBackground, 5);
color: white;
}
}
@@ -519,11 +578,11 @@
.footer {
> a,
.sidelinks > a {
- background-color: darken($darkModeGameBackground, 10);
+ background-color: $darkModeControlsBackground;
color: #eee;
&:hover {
- background-color: darken($darkModeGameBackground, 8);
+ background-color: darken($darkModeControlsBackground, 5);
}
}
diff --git a/src/css/states/mobile_warning.scss b/src/css/states/mobile_warning.scss
index 6dc84e3c..25e3d9ba 100644
--- a/src/css/states/mobile_warning.scss
+++ b/src/css/states/mobile_warning.scss
@@ -1,48 +1,51 @@
-#state_MobileWarningState {
- display: flex;
- align-items: center;
- background: #333438 !important;
- @include S(padding, 20px);
- box-sizing: border-box;
- justify-content: center;
- flex-direction: column;
-
- .logo {
- width: 80%;
- max-width: 200px;
- margin-bottom: 10px;
- }
-
- p {
- color: #aaacaf;
- display: block;
- margin-bottom: 13px;
- font-size: 16px;
- line-height: 20px;
- max-width: 300px;
- text-align: left;
- a {
- color: $colorBlueBright;
- }
- }
-
- .standaloneLink {
- width: 200px;
- height: 80px;
- min-height: 40px;
- background: uiResource("get_on_steam.png") center center / contain no-repeat;
- overflow: hidden;
- display: block;
- text-indent: -999em;
- cursor: pointer;
- margin-top: 10px;
- pointer-events: all;
- transition: all 0.12s ease-in;
- transition-property: opacity, transform;
- transform: skewX(-0.5deg);
- &:hover {
- transform: skewX(-1deg) scale(1.02);
- opacity: 0.9;
- }
- }
-}
+#state_MobileWarningState {
+ display: flex;
+ align-items: center;
+ background: #333438 !important;
+ @include S(padding, 20px);
+ box-sizing: border-box;
+ justify-content: center;
+ flex-direction: column;
+
+ .logo {
+ width: 80%;
+ max-width: 200px;
+ margin-bottom: 10px;
+ }
+
+ p {
+ color: #aaacaf;
+ display: block;
+ margin-bottom: 13px;
+ font-size: 16px;
+ line-height: 20px;
+ max-width: 300px;
+ text-align: left;
+ a {
+ color: $colorBlueBright;
+ }
+ }
+
+ .standaloneLink {
+ width: 200px;
+ height: 80px;
+ min-height: 40px;
+ & {
+ /* @load-async */
+ background: uiResource("get_on_steam.png") center center / contain no-repeat;
+ }
+ overflow: hidden;
+ display: block;
+ text-indent: -999em;
+ cursor: pointer;
+ margin-top: 10px;
+ pointer-events: all;
+ transition: all 0.12s ease-in;
+ transition-property: opacity, transform;
+ transform: skewX(-0.5deg);
+ &:hover {
+ transform: skewX(-1deg) scale(1.02);
+ opacity: 0.9;
+ }
+ }
+}
diff --git a/src/css/states/preload.scss b/src/css/states/preload.scss
index ba0a372d..1187a2d4 100644
--- a/src/css/states/preload.scss
+++ b/src/css/states/preload.scss
@@ -1,145 +1,145 @@
-#state_PreloadState {
- &.failure {
- .loadingImage,
- .loadingStatus {
- display: none;
- }
- }
-
- .changelogDialogEntry {
- margin-top: 10px;
- width: 100%;
- flex-direction: column;
- text-align: left;
- padding: 10px;
- box-sizing: border-box;
- background: #eef1f4;
-
- @include DarkThemeOverride {
- background: #424242;
- }
-
- .version {
- @include Heading;
- }
- .date {
- @include PlainText;
- &::before {
- content: " | ";
- }
- color: #aaabaf;
- }
-
- .changes {
- @include PlainText;
- @include S(padding-left, 15px);
- strong {
- background: $colorBlueBright;
- color: #fff;
- text-transform: uppercase;
- @include S(padding, 1px, 2px);
- @include S(margin-right, 3px);
- }
- a {
- color: $colorBlueBright;
- }
- li {
- @include SuperSmallText;
- @include S(margin-bottom, 10px);
- }
- }
- }
-
- .failureBox {
- .logo {
- img {
- @include S(width, 240px);
- }
-
- @include S(margin-bottom, 30px);
- }
-
- @include InlineAnimation(0.3s ease-in-out) {
- 0% {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
- }
-
- .failureInner {
- // background: darken($mainBgColor, 6);
- @include S(max-width, 350px);
- margin: 0 20px;
- text-align: left;
-
- @include BoxShadow3D(#fff);
- @include S(padding, 15px);
- @include S(border-radius, $globalBorderRadius);
- @include DropShadow;
-
- .errorHeader {
- color: #ef5072;
- }
-
- .errorMessage {
- @include PlainText;
- display: block;
- color: #666;
- text-align: left;
- @include BreakText;
- hyphens: auto;
- // border: dotted #666;
- // @include S(border-width, 1px, 0);
- @include S(padding, 10px, 0);
- @include S(margin-top, 10px);
- }
-
- .supportHelp {
- @include S(margin-top, 10px);
- @include PlainText;
-
- .email {
- color: $themeColor;
- cursor: pointer;
- pointer-events: all;
- }
- }
-
- .lower {
- display: flex;
- align-items: center;
- @include S(margin-top, 16px);
-
- i {
- flex-grow: 1;
- text-align: right;
- color: #777;
- @include PlainText;
- }
-
- button.resetApp {
- @include Button3D($colorRedBright);
- @include PlainText;
- @include S(padding, 5px, 8px, 4px);
- color: #fff;
- }
- }
- }
- }
-
- /* Animations */
- .status {
- transform: scale(0.7) $hardwareAcc;
- opacity: 0;
- @include StateAnim(transform, opacity);
- }
-
- &.arrived {
- .status {
- opacity: 1;
- transform: none;
- }
- }
-}
+#state_PreloadState {
+ &.failure {
+ .loadingImage,
+ .loadingStatus {
+ display: none;
+ }
+ }
+
+ .changelogDialogEntry {
+ margin-top: 10px;
+ width: 100%;
+ flex-direction: column;
+ text-align: left;
+ padding: 10px;
+ box-sizing: border-box;
+ background: #eef1f4;
+
+ @include DarkThemeOverride {
+ background: #424242;
+ }
+
+ .version {
+ @include Heading;
+ }
+ .date {
+ @include PlainText;
+ &::before {
+ content: " | ";
+ }
+ color: #aaabaf;
+ }
+
+ .changes {
+ @include PlainText;
+ @include S(padding-left, 15px);
+ strong {
+ background: $colorBlueBright;
+ color: #fff;
+ text-transform: uppercase;
+ @include S(padding, 1px, 2px);
+ @include S(margin-right, 3px);
+ }
+ a {
+ color: $colorBlueBright;
+ }
+ li {
+ @include SuperSmallText;
+ @include S(margin-bottom, 10px);
+ }
+ }
+ }
+
+ .failureBox {
+ .logo {
+ img {
+ @include S(width, 240px);
+ }
+
+ @include S(margin-bottom, 30px);
+ }
+
+ @include InlineAnimation(0.3s ease-in-out) {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+ }
+
+ .failureInner {
+ // background: darken($mainBgColor, 6);
+ @include S(max-width, 350px);
+ margin: 0 20px;
+ text-align: left;
+
+ @include BoxShadow3D(#fff);
+ @include S(padding, 15px);
+ @include S(border-radius, $globalBorderRadius);
+ @include DropShadow;
+
+ .errorHeader {
+ color: #ef5072;
+ }
+
+ .errorMessage {
+ @include PlainText;
+ display: block;
+ color: #666;
+ text-align: left;
+ @include BreakText;
+ hyphens: auto;
+ // border: dotted #666;
+ // @include S(border-width, 1px, 0);
+ @include S(padding, 10px, 0);
+ @include S(margin-top, 10px);
+ }
+
+ .supportHelp {
+ @include S(margin-top, 10px);
+ @include PlainText;
+
+ .email {
+ color: $themeColor;
+ cursor: pointer;
+ pointer-events: all;
+ }
+ }
+
+ .lower {
+ display: flex;
+ align-items: center;
+ @include S(margin-top, 16px);
+
+ i {
+ flex-grow: 1;
+ text-align: right;
+ color: #777;
+ @include PlainText;
+ }
+
+ button.resetApp {
+ @include Button3D($colorRedBright);
+ @include PlainText;
+ @include S(padding, 5px, 8px, 4px);
+ color: #fff;
+ }
+ }
+ }
+ }
+
+ /* Animations */
+ .status {
+ transform: scale(0.7) $hardwareAcc;
+ opacity: 0;
+ @include StateAnim(transform, opacity);
+ }
+
+ &.arrived {
+ .status {
+ opacity: 1;
+ transform: none;
+ }
+ }
+}
diff --git a/src/css/states/settings.scss b/src/css/states/settings.scss
index 9b7df8fb..50afcaa3 100644
--- a/src/css/states/settings.scss
+++ b/src/css/states/settings.scss
@@ -1,13 +1,96 @@
#state_SettingsState {
- $colorCategoryButton: #eee;
- $colorCategoryButtonSelected: #5f748b;
+ $colorCategoryButton: #eeeff5;
+ $colorCategoryButtonSelected: $colorBlueBright;
+
+ $layoutBreak: 1000px;
.container .content {
- display: flex;
- overflow-y: scroll;
+ display: grid;
+ grid-template-columns: auto 1fr;
+ @include S(grid-gap, 10px);
+
+ @include StyleBelowWidth($layoutBreak) {
+ grid-template-columns: 1fr;
+ grid-template-rows: auto 1fr;
+ }
+
+ .sidebar {
+ display: grid;
+ @include S(min-width, 210px);
+ @include S(max-width, 320px);
+ @include S(grid-gap, 3px);
+ grid-template-rows: auto auto auto auto auto 1fr;
+
+ @include StyleBelowWidth($layoutBreak) {
+ grid-template-rows: 1fr 1fr;
+ grid-template-columns: auto auto;
+ max-width: unset !important;
+ }
+
+ button {
+ text-align: left;
+ &::after {
+ content: unset;
+ }
+ width: 100%;
+ box-sizing: border-box;
+
+ @include StyleBelowWidth($layoutBreak) {
+ text-align: center;
+ }
+ }
+
+ .other {
+ @include S(margin-top, 10px);
+ align-self: end;
+
+ @include StyleBelowWidth($layoutBreak) {
+ margin-top: 0;
+ }
+ }
+
+ button.categoryButton,
+ button.about {
+ background-color: $colorCategoryButton;
+ color: #777a7f;
+
+ &.active {
+ background-color: $colorCategoryButtonSelected;
+ color: #fff;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ &.pressed {
+ transform: none !important;
+ }
+ }
+
+ .versionbar {
+ @include S(margin-top, 10px);
+
+ @include StyleBelowWidth($layoutBreak) {
+ display: none;
+ }
+
+ @include SuperSmallText;
+ display: grid;
+ align-items: center;
+ grid-template-columns: 1fr auto;
+ .buildVersion {
+ display: flex;
+ flex-direction: column;
+ color: #aaadaf;
+ }
+ }
+ }
.categoryContainer {
- width: 100%;
+ overflow-y: scroll;
+ pointer-events: all;
+ @include S(padding-right, 10px);
.category {
display: none;
@@ -77,8 +160,11 @@
@include S(padding, 4px);
@include S(padding-right, 15px);
- background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
- calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
+ & {
+ /* @load-async */
+ background: #fff uiResource("icons/enum_selector.png") calc(100% - #{D(5px)})
+ calc(50% + #{D(1px)}) / #{D(15px)} no-repeat;
+ }
transition: background-color 0.12s ease-in-out;
&:hover {
@@ -88,65 +174,6 @@
}
}
}
-
- .sidebar {
- display: flex;
- flex-direction: column;
- @include S(min-width, 210px);
- @include S(max-width, 320px);
- width: 30%;
- height: 100%;
- position: sticky;
- top: 0;
- @include S(margin-left, 20px);
- @include S(margin-right, 32px);
-
- .other {
- margin-top: auto;
- }
-
- button {
- @include S(margin-top, 4px);
- width: calc(100% - #{D(20px)});
- text-align: start;
-
- &::after {
- content: unset;
- }
- }
-
- button.categoryButton,
- button.about {
- background-color: $colorCategoryButton;
- color: #777a7f;
-
- &.active {
- background-color: $colorCategoryButtonSelected;
- color: #fff;
-
- &:hover {
- opacity: 1;
- }
- }
-
- &.pressed {
- transform: none !important;
- }
- }
-
- .versionbar {
- @include S(margin-top, 20px);
- @include SuperSmallText;
- display: grid;
- align-items: center;
- grid-template-columns: 1fr auto;
- .buildVersion {
- display: flex;
- flex-direction: column;
- color: #aaadaf;
- }
- }
- }
}
@include DarkThemeOverride {
@@ -154,10 +181,12 @@
.sidebar {
button.categoryButton,
button.about {
- background-color: #3f3f47;
+ color: #ccc;
+ background-color: darken($darkModeControlsBackground, 5);
&.active {
- background-color: $colorBlueBright;
+ color: #fff;
+ background-color: $colorCategoryButtonSelected;
}
}
}
@@ -169,8 +198,17 @@
.value.enum {
// dirty but works
- filter: invert(0.78) sepia(40%) hue-rotate(190deg);
- color: #222;
+ // color: #222;
+ background-color: $darkModeControlsBackground;
+
+ & {
+ /* @load-async */
+ background-image: uiResource("icons/enum_selector_white.png");
+ }
+ color: #ddd;
+ &:hover {
+ background-color: darken($darkModeControlsBackground, 2);
+ }
}
.value.checkbox {
diff --git a/src/css/textual_game_state.scss b/src/css/textual_game_state.scss
index 54c5dbb3..d5967523 100644
--- a/src/css/textual_game_state.scss
+++ b/src/css/textual_game_state.scss
@@ -1,81 +1,83 @@
-.gameState.textualState {
- display: grid;
- grid-template-rows: auto 1fr;
- box-sizing: border-box;
- @include S(padding, 32px);
- height: 100vh;
-
- .headerBar {
- display: flex;
-
- h1 {
- display: grid;
- grid-template-columns: auto 1fr;
- align-items: center;
- pointer-events: all;
- cursor: pointer;
- @include SuperHeading;
- text-transform: uppercase;
- color: #333438;
- position: relative;
- @include IncreasedClickArea(10px);
- }
-
- .backButton {
- @include S(width, 30px);
- @include S(height, 30px);
- @include S(margin-right, 10px);
- @include S(margin-left, -5px);
- background: uiResource("icons/state_back_button.png") center center / 70% no-repeat;
- }
-
- @include S(margin-bottom, 20px);
- }
-
- > .container {
- display: flex;
- justify-content: center;
- width: 100%;
- overflow-y: auto;
-
- > .content {
- width: 100%;
- background: #fff;
- @include S(border-radius, $globalBorderRadius);
- @include S(padding, 10px);
- height: 100%;
- overflow-y: auto;
- box-sizing: border-box;
- pointer-events: all;
-
- a {
- color: $colorBlueBright;
- }
-
- .categoryLabel {
- display: block;
- text-transform: uppercase;
- @include S(margin-top, 15px);
- @include S(margin-bottom, 15px);
- @include Heading;
- }
- }
- }
-
- @include DarkThemeOverride {
- .headerBar {
- h1 {
- color: #e2e0db;
- }
-
- .backButton {
- filter: invert(1);
- }
- }
-
- > .container > .content {
- background: darken($darkModeGameBackground, 3);
- color: #eee;
- }
- }
-}
+.gameState.textualState {
+ display: grid;
+ grid-template-rows: auto 1fr;
+ box-sizing: border-box;
+ @include S(padding, 32px);
+ height: 100vh;
+
+ .headerBar {
+ display: flex;
+
+ h1 {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ align-items: center;
+ pointer-events: all;
+ cursor: pointer;
+ @include SuperHeading;
+ text-transform: uppercase;
+ color: #333438;
+ position: relative;
+ @include IncreasedClickArea(10px);
+ }
+
+ .backButton {
+ @include S(width, 30px);
+ @include S(height, 30px);
+ @include S(margin-right, 10px);
+ @include S(margin-left, -5px);
+ & {
+ /* @load-async */
+ background: uiResource("icons/state_back_button.png") center center / 70% no-repeat;
+ }
+ }
+ @include S(margin-bottom, 20px);
+ }
+
+ > .container {
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ overflow-y: auto;
+
+ > .content {
+ width: 100%;
+ background: #fff;
+ @include S(border-radius, $globalBorderRadius);
+ @include S(padding, 10px);
+ height: 100%;
+ overflow-y: auto;
+ box-sizing: border-box;
+ pointer-events: all;
+
+ a {
+ color: $colorBlueBright;
+ }
+
+ .categoryLabel {
+ display: block;
+ text-transform: uppercase;
+ @include S(margin-top, 15px);
+ @include S(margin-bottom, 15px);
+ @include Heading;
+ }
+ }
+ }
+
+ @include DarkThemeOverride {
+ .headerBar {
+ h1 {
+ color: #e2e0db;
+ }
+
+ .backButton {
+ filter: invert(1);
+ }
+ }
+
+ > .container > .content {
+ background: $darkModeControlsBackground;
+ color: #eee;
+ }
+ }
+}
diff --git a/src/css/variables.scss b/src/css/variables.scss
index 7646e471..d2798f41 100644
--- a/src/css/variables.scss
+++ b/src/css/variables.scss
@@ -1,198 +1,199 @@
-$globalBorderRadius: 2px;
-
-// When to reduce control elements size for small devices
-$layoutExpandMinWidth: 340px;
-
-// Font sizes and line heights
-$superHeadingFontSize: 25px;
-$superHeadingLineHeight: 24px;
-
-$breakTooltipShowStatsPx: 1023px;
-
-$headingFontSize: 19px;
-$headingLineHeight: 21px;
-
-$textFontSize: 16px;
-$textLineHeight: 21px;
-
-$plainTextFontSize: 13px;
-$plainTextLineHeight: 17px;
-
-$supersmallTextFontSize: 10px;
-$supersmallTextLineHeight: 13px;
-$buttonFontSize: 14px;
-$buttonLineHeight: 18px;
-
-// Main background color
-$mainBgColor: #dee1ea;
-
-// Accent colors
-
-$accentColorBright: #e1e4ed;
-$accentColorDark: #7d808a;
-$colorGreenBright: #66bb6a;
-$colorBlueBright: rgb(74, 163, 223);
-$colorRedBright: #ef5072;
-$themeColor: #393747;
-$ingameHudBg: rgba(#333438, 0.9);
-
-$text3dColor: #f4ffff;
-
-$darkModeGameBackground: #5c606c;
-
-// Dialog properties
-$modalDialogBg: rgba(160, 165, 180, 0.8);
-$dialogBgColor: lighten($mainBgColor, 10);
-
-$lightFontWeight: normal;
-$boldFontWeight: 600;
-
-$iconSizeSmall: 30px;
-$iconSizeMedium: 40px;
-$iconSizeLarge: 60px;
-
-// Poppins 500
-// Rubik 400
-// Cairo 400
-// Viga 400
-// Sniglet 400
-
-$mainFont: "GameFont", sans-serif;
-// $mainFont: "DK Canoodle";
-// $mainFont: "MADE Florence Sans";
-$numberFont: $mainFont;
-$textFont: $mainFont;
-
-$mainFontWeight: 400;
-$mainFontSpacing: 0.04em;
-$mainFontScale: 1;
-
-@mixin DebugText($color) {
- // font-size: 3px;
- // &,
- // * {
- // color: $color !important;
- // }
-}
-
-@mixin SuperSmallText {
- @include ScaleFont($supersmallTextFontSize, $supersmallTextLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
- letter-spacing: $mainFontSpacing;
- @include DebugText(green);
-}
-
-@mixin PlainText {
- @include ScaleFont($plainTextFontSize, $plainTextLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
- letter-spacing: $mainFontSpacing;
-
- @include DebugText(red);
-}
-
-@mixin Text {
- @include ScaleFont($textFontSize, $textLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
-
- letter-spacing: $mainFontSpacing;
-
- @include DebugText(blue);
-}
-
-@mixin Heading {
- @include ScaleFont($headingFontSize, $headingLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
- letter-spacing: $mainFontSpacing;
-
- @include DebugText(yellow);
-}
-
-@mixin SuperHeading {
- @include ScaleFont($superHeadingFontSize, $superHeadingLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
- letter-spacing: $mainFontSpacing;
-
- @include DebugText(orange);
-}
-
-@mixin ButtonText {
- @include ScaleFont($buttonFontSize, $buttonLineHeight);
- font-weight: $mainFontWeight;
- font-family: $mainFont;
- letter-spacing: $mainFontSpacing;
- @include DebugText(purple);
-}
-
-@function str-split($string, $separator) {
- // empty array/list
- $split-arr: ();
- // first index of separator in string
- $index: str-index($string, $separator);
- // loop through string
- @while $index != null {
- // get the substring from the first character to the separator
- $item: str-slice($string, 1, $index - 1);
- // push item to array
- $split-arr: append($split-arr, $item);
- // remove item and separator from string
- $string: str-slice($string, $index + 1);
- // find new index of separator
- $index: str-index($string, $separator);
- }
- // add the remaining string to list (the last item)
- $split-arr: append($split-arr, $string);
-
- @return $split-arr;
-}
-
-@function _first-index($string, $direction: "left") {
- @for $i from 1 through str-length($string) {
- $index: if($direction == "left", $i, -$i);
-
- @if str-slice($string, $index, $index) != " " {
- @return $index;
- }
- }
-
- @return 0;
-}
-
-@function trim($string) {
- @return str-slice($string, _first-index($string, "left"), _first-index($string, "right"));
-}
-
-@mixin AppendGlobal($prefix) {
- $strSelector: quote(&);
- $selectors: str-split($strSelector, ",");
-
- $builtSelector: null;
-
- @if (& == null) {
- $builtSelector: "html" + $prefix;
- } @else {
- $builtSelector: ();
- // @debug ($strSelector, "->>>", $selectors);
- @each $srcSelector in $selectors {
- $srcSelector: trim($srcSelector);
- // @debug ("___", $srcSelector);
- $selector: "html" + $prefix + " " + $srcSelector;
- @if str-index($srcSelector, "html.") {
- $selector: "html" +
- $prefix +
- "." +
- str-slice($srcSelector, str-index($srcSelector, "html.") + 5);
- }
- // @debug ("_______", $selector);
- $builtSelector: append($builtSelector, $selector, comma);
- }
- }
-
- @at-root #{$builtSelector} {
- @content;
- }
-}
+$globalBorderRadius: 2px;
+
+// When to reduce control elements size for small devices
+$layoutExpandMinWidth: 340px;
+
+// Font sizes and line heights
+$superHeadingFontSize: 25px;
+$superHeadingLineHeight: 24px;
+
+$breakTooltipShowStatsPx: 1023px;
+
+$headingFontSize: 19px;
+$headingLineHeight: 21px;
+
+$textFontSize: 16px;
+$textLineHeight: 21px;
+
+$plainTextFontSize: 13px;
+$plainTextLineHeight: 17px;
+
+$supersmallTextFontSize: 10px;
+$supersmallTextLineHeight: 13px;
+$buttonFontSize: 14px;
+$buttonLineHeight: 18px;
+
+// Main background color
+$mainBgColor: #dee1ea;
+
+// Accent colors
+
+$accentColorBright: #e1e4ed;
+$accentColorDark: #7d808a;
+$colorGreenBright: #66bb6a;
+$colorBlueBright: rgb(74, 151, 223);
+$colorRedBright: #ef5072;
+$themeColor: #393747;
+$ingameHudBg: rgba(#333438, 0.9);
+
+$text3dColor: #f4ffff;
+
+$darkModeGameBackground: #535866;
+$darkModeControlsBackground: darken($darkModeGameBackground, 5);
+
+// Dialog properties
+$modalDialogBg: rgba(160, 165, 180, 0.8);
+$dialogBgColor: lighten($mainBgColor, 10);
+
+$lightFontWeight: normal;
+$boldFontWeight: 600;
+
+$iconSizeSmall: 30px;
+$iconSizeMedium: 40px;
+$iconSizeLarge: 60px;
+
+// Poppins 500
+// Rubik 400
+// Cairo 400
+// Viga 400
+// Sniglet 400
+
+$mainFont: "GameFont", sans-serif;
+// $mainFont: "DK Canoodle";
+// $mainFont: "MADE Florence Sans";
+$numberFont: $mainFont;
+$textFont: $mainFont;
+
+$mainFontWeight: 400;
+$mainFontSpacing: 0.04em;
+$mainFontScale: 1;
+
+@mixin DebugText($color) {
+ // font-size: 3px;
+ // &,
+ // * {
+ // color: $color !important;
+ // }
+}
+
+@mixin SuperSmallText {
+ @include ScaleFont($supersmallTextFontSize, $supersmallTextLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+ letter-spacing: $mainFontSpacing;
+ @include DebugText(green);
+}
+
+@mixin PlainText {
+ @include ScaleFont($plainTextFontSize, $plainTextLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+ letter-spacing: $mainFontSpacing;
+
+ @include DebugText(red);
+}
+
+@mixin Text {
+ @include ScaleFont($textFontSize, $textLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+
+ letter-spacing: $mainFontSpacing;
+
+ @include DebugText(blue);
+}
+
+@mixin Heading {
+ @include ScaleFont($headingFontSize, $headingLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+ letter-spacing: $mainFontSpacing;
+
+ @include DebugText(yellow);
+}
+
+@mixin SuperHeading {
+ @include ScaleFont($superHeadingFontSize, $superHeadingLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+ letter-spacing: $mainFontSpacing;
+
+ @include DebugText(orange);
+}
+
+@mixin ButtonText {
+ @include ScaleFont($buttonFontSize, $buttonLineHeight);
+ font-weight: $mainFontWeight;
+ font-family: $mainFont;
+ letter-spacing: $mainFontSpacing;
+ @include DebugText(purple);
+}
+
+@function str-split($string, $separator) {
+ // empty array/list
+ $split-arr: ();
+ // first index of separator in string
+ $index: str-index($string, $separator);
+ // loop through string
+ @while $index != null {
+ // get the substring from the first character to the separator
+ $item: str-slice($string, 1, $index - 1);
+ // push item to array
+ $split-arr: append($split-arr, $item);
+ // remove item and separator from string
+ $string: str-slice($string, $index + 1);
+ // find new index of separator
+ $index: str-index($string, $separator);
+ }
+ // add the remaining string to list (the last item)
+ $split-arr: append($split-arr, $string);
+
+ @return $split-arr;
+}
+
+@function _first-index($string, $direction: "left") {
+ @for $i from 1 through str-length($string) {
+ $index: if($direction == "left", $i, -$i);
+
+ @if str-slice($string, $index, $index) != " " {
+ @return $index;
+ }
+ }
+
+ @return 0;
+}
+
+@function trim($string) {
+ @return str-slice($string, _first-index($string, "left"), _first-index($string, "right"));
+}
+
+@mixin AppendGlobal($prefix) {
+ $strSelector: quote(&);
+ $selectors: str-split($strSelector, ",");
+
+ $builtSelector: null;
+
+ @if (& == null) {
+ $builtSelector: "html" + $prefix;
+ } @else {
+ $builtSelector: ();
+ // @debug ($strSelector, "->>>", $selectors);
+ @each $srcSelector in $selectors {
+ $srcSelector: trim($srcSelector);
+ // @debug ("___", $srcSelector);
+ $selector: "html" + $prefix + " " + $srcSelector;
+ @if str-index($srcSelector, "html.") {
+ $selector: "html" +
+ $prefix +
+ "." +
+ str-slice($srcSelector, str-index($srcSelector, "html.") + 5);
+ }
+ // @debug ("_______", $selector);
+ $builtSelector: append($builtSelector, $selector, comma);
+ }
+ }
+
+ @at-root #{$builtSelector} {
+ @content;
+ }
+}
diff --git a/src/js/application.js b/src/js/application.js
index e5e22b60..d9ca7641 100644
--- a/src/js/application.js
+++ b/src/js/application.js
@@ -1,408 +1,415 @@
-import { AnimationFrame } from "./core/animation_frame";
-import { BackgroundResourcesLoader } from "./core/background_resources_loader";
-import { IS_MOBILE } from "./core/config";
-import { GameState } from "./core/game_state";
-import { GLOBAL_APP, setGlobalApp } from "./core/globals";
-import { InputDistributor } from "./core/input_distributor";
-import { Loader } from "./core/loader";
-import { createLogger, logSection } from "./core/logging";
-import { StateManager } from "./core/state_manager";
-import { TrackedState } from "./core/tracked_state";
-import { getPlatformName, waitNextFrame } from "./core/utils";
-import { Vector } from "./core/vector";
-import { AdProviderInterface } from "./platform/ad_provider";
-import { NoAdProvider } from "./platform/ad_providers/no_ad_provider";
-import { AnalyticsInterface } from "./platform/analytics";
-import { GoogleAnalyticsImpl } from "./platform/browser/google_analytics";
-import { SoundImplBrowser } from "./platform/browser/sound";
-import { PlatformWrapperImplBrowser } from "./platform/browser/wrapper";
-import { PlatformWrapperImplElectron } from "./platform/electron/wrapper";
-import { PlatformWrapperInterface } from "./platform/wrapper";
-import { ApplicationSettings } from "./profile/application_settings";
-import { SavegameManager } from "./savegame/savegame_manager";
-import { AboutState } from "./states/about";
-import { ChangelogState } from "./states/changelog";
-import { InGameState } from "./states/ingame";
-import { KeybindingsState } from "./states/keybindings";
-import { MainMenuState } from "./states/main_menu";
-import { MobileWarningState } from "./states/mobile_warning";
-import { PreloadState } from "./states/preload";
-import { SettingsState } from "./states/settings";
-import { ShapezGameAnalytics } from "./platform/browser/game_analytics";
-
-/**
- * @typedef {import("./platform/game_analytics").GameAnalyticsInterface} GameAnalyticsInterface
- * @typedef {import("./platform/sound").SoundInterface} SoundInterface
- * @typedef {import("./platform/storage").StorageInterface} StorageInterface
- */
-
-const logger = createLogger("application");
-
-// Set the name of the hidden property and the change event for visibility
-let pageHiddenPropName, pageVisibilityEventName;
-if (typeof document.hidden !== "undefined") {
- // Opera 12.10 and Firefox 18 and later support
- pageHiddenPropName = "hidden";
- pageVisibilityEventName = "visibilitychange";
- // @ts-ignore
-} else if (typeof document.msHidden !== "undefined") {
- pageHiddenPropName = "msHidden";
- pageVisibilityEventName = "msvisibilitychange";
- // @ts-ignore
-} else if (typeof document.webkitHidden !== "undefined") {
- pageHiddenPropName = "webkitHidden";
- pageVisibilityEventName = "webkitvisibilitychange";
-}
-
-export class Application {
- constructor() {
- assert(!GLOBAL_APP, "Tried to construct application twice");
- logger.log("Creating application, platform =", getPlatformName());
- setGlobalApp(this);
-
- this.unloaded = false;
-
- // Global stuff
- this.settings = new ApplicationSettings(this);
- this.ticker = new AnimationFrame();
- this.stateMgr = new StateManager(this);
- this.savegameMgr = new SavegameManager(this);
- this.inputMgr = new InputDistributor(this);
- this.backgroundResourceLoader = new BackgroundResourcesLoader(this);
-
- // Platform dependent stuff
-
- /** @type {StorageInterface} */
- this.storage = null;
-
- /** @type {SoundInterface} */
- this.sound = null;
-
- /** @type {PlatformWrapperInterface} */
- this.platformWrapper = null;
-
- /** @type {AdProviderInterface} */
- this.adProvider = null;
-
- /** @type {AnalyticsInterface} */
- this.analytics = null;
-
- /** @type {GameAnalyticsInterface} */
- this.gameAnalytics = null;
-
- this.initPlatformDependentInstances();
-
- // Track if the window is focused (only relevant for browser)
- this.focused = true;
-
- // Track if the window is visible
- this.pageVisible = true;
-
- // Track if the app is paused (cordova)
- this.applicationPaused = false;
-
- /** @type {TypedTrackedState} */
- this.trackedIsRenderable = new TrackedState(this.onAppRenderableStateChanged, this);
-
- // Dimensions
- this.screenWidth = 0;
- this.screenHeight = 0;
-
- // Store the timestamp where we last checked for a screen resize, since orientationchange is unreliable with cordova
- this.lastResizeCheck = null;
-
- // Store the mouse position, or null if not available
- /** @type {Vector|null} */
- this.mousePosition = null;
- }
-
- /**
- * Initializes all platform instances
- */
- initPlatformDependentInstances() {
- logger.log("Creating platform dependent instances (standalone=", G_IS_STANDALONE, ")");
-
- if (G_IS_STANDALONE) {
- this.platformWrapper = new PlatformWrapperImplElectron(this);
- } else {
- this.platformWrapper = new PlatformWrapperImplBrowser(this);
- }
-
- // Start with empty ad provider
- this.adProvider = new NoAdProvider(this);
- this.sound = new SoundImplBrowser(this);
- this.analytics = new GoogleAnalyticsImpl(this);
- this.gameAnalytics = new ShapezGameAnalytics(this);
- }
-
- /**
- * Registers all game states
- */
- registerStates() {
- /** @type {Array} */
- const states = [
- PreloadState,
- MobileWarningState,
- MainMenuState,
- InGameState,
- SettingsState,
- KeybindingsState,
- AboutState,
- ChangelogState,
- ];
-
- for (let i = 0; i < states.length; ++i) {
- this.stateMgr.register(states[i]);
- }
- }
-
- /**
- * Registers all event listeners
- */
- registerEventListeners() {
- window.addEventListener("focus", this.onFocus.bind(this));
- window.addEventListener("blur", this.onBlur.bind(this));
-
- window.addEventListener("resize", () => this.checkResize(), true);
- window.addEventListener("orientationchange", () => this.checkResize(), true);
-
- if (!G_IS_MOBILE_APP && !IS_MOBILE) {
- window.addEventListener("mousemove", this.handleMousemove.bind(this));
- }
-
- // Unload events
- window.addEventListener("beforeunload", this.onBeforeUnload.bind(this), true);
- window.addEventListener("unload", this.onUnload.bind(this), true);
-
- document.addEventListener(pageVisibilityEventName, this.handleVisibilityChange.bind(this), false);
-
- // Track touches so we can update the focus appropriately
- document.addEventListener("touchstart", this.updateFocusAfterUserInteraction.bind(this), true);
- document.addEventListener("touchend", this.updateFocusAfterUserInteraction.bind(this), true);
- }
-
- /**
- * Checks the focus after a touch
- * @param {TouchEvent} event
- */
- updateFocusAfterUserInteraction(event) {
- const target = /** @type {HTMLElement} */ (event.target);
- if (!target || !target.tagName) {
- // Safety check
- logger.warn("Invalid touchstart/touchend event:", event);
- return;
- }
-
- // When clicking an element which is not the currently focused one, defocus it
- if (target !== document.activeElement) {
- // @ts-ignore
- if (document.activeElement.blur) {
- // @ts-ignore
- document.activeElement.blur();
- }
- }
-
- // If we click an input field, focus it now
- if (target.tagName.toLowerCase() === "input") {
- // We *really* need the focus
- waitNextFrame().then(() => target.focus());
- }
- }
-
- /**
- * Handles a page visibility change event
- * @param {Event} event
- */
- handleVisibilityChange(event) {
- window.focus();
- const pageVisible = !document[pageHiddenPropName];
- if (pageVisible !== this.pageVisible) {
- this.pageVisible = pageVisible;
- logger.log("Visibility changed:", this.pageVisible);
- this.trackedIsRenderable.set(this.isRenderable());
- }
- }
-
- /**
- * Handles a mouse move event
- * @param {MouseEvent} event
- */
- handleMousemove(event) {
- this.mousePosition = new Vector(event.clientX, event.clientY);
- }
-
- /**
- * Internal on focus handler
- */
- onFocus() {
- this.focused = true;
- }
-
- /**
- * Internal blur handler
- */
- onBlur() {
- this.focused = false;
- }
-
- /**
- * Returns if the app is currently visible
- */
- isRenderable() {
- return !this.applicationPaused && this.pageVisible;
- }
-
- onAppRenderableStateChanged(renderable) {
- logger.log("Application renderable:", renderable);
- window.focus();
- const currentState = this.stateMgr.getCurrentState();
- if (!renderable) {
- if (currentState) {
- currentState.onAppPause();
- }
- } else {
- if (currentState) {
- currentState.onAppResume();
- }
- this.checkResize();
- }
-
- this.sound.onPageRenderableStateChanged(renderable);
- }
-
- /**
- * Internal unload handler
- */
- onUnload(event) {
- if (!this.unloaded) {
- logSection("UNLOAD HANDLER", "#f77");
- this.unloaded = true;
- const currentState = this.stateMgr.getCurrentState();
- if (currentState) {
- currentState.onBeforeExit();
- }
- this.deinitialize();
- }
- }
-
- /**
- * Internal before-unload handler
- */
- onBeforeUnload(event) {
- logSection("BEFORE UNLOAD HANDLER", "#f77");
- const currentState = this.stateMgr.getCurrentState();
-
- if (!G_IS_DEV && currentState && currentState.getHasUnloadConfirmation()) {
- if (!G_IS_STANDALONE) {
- // Need to show a "Are you sure you want to exit"
- event.preventDefault();
- event.returnValue = "Are you sure you want to exit?";
- }
- }
- }
-
- /**
- * Boots the application
- */
- boot() {
- console.log("Booting ...");
- this.registerStates();
- this.registerEventListeners();
-
- Loader.linkAppAfterBoot(this);
-
- // Check for mobile
- if (IS_MOBILE) {
- this.stateMgr.moveToState("MobileWarningState");
- } else {
- this.stateMgr.moveToState("PreloadState");
- }
-
- // Starting rendering
- this.ticker.frameEmitted.add(this.onFrameEmitted, this);
- this.ticker.bgFrameEmitted.add(this.onBackgroundFrame, this);
- this.ticker.start();
-
- window.focus();
- }
-
- /**
- * Deinitializes the application
- */
- deinitialize() {
- return this.sound.deinitialize();
- }
-
- /**
- * Background frame update callback
- * @param {number} dt
- */
- onBackgroundFrame(dt) {
- if (this.isRenderable()) {
- return;
- }
-
- const currentState = this.stateMgr.getCurrentState();
- if (currentState) {
- currentState.onBackgroundTick(dt);
- }
- }
-
- /**
- * Frame update callback
- * @param {number} dt
- */
- onFrameEmitted(dt) {
- if (!this.isRenderable()) {
- return;
- }
-
- const time = performance.now();
-
- // Periodically check for resizes, this is expensive (takes 2-3ms so only do it once in a while!)
- if (!this.lastResizeCheck || time - this.lastResizeCheck > 1000) {
- this.checkResize();
- this.lastResizeCheck = time;
- }
-
- const currentState = this.stateMgr.getCurrentState();
- if (currentState) {
- currentState.onRender(dt);
- }
- }
-
- /**
- * Checks if the app resized. Only does this once in a while
- * @param {boolean} forceUpdate Forced update of the dimensions
- */
- checkResize(forceUpdate = false) {
- const w = window.innerWidth;
- const h = window.innerHeight;
- if (this.screenWidth !== w || this.screenHeight !== h || forceUpdate) {
- this.screenWidth = w;
- this.screenHeight = h;
- const currentState = this.stateMgr.getCurrentState();
- if (currentState) {
- currentState.onResized(this.screenWidth, this.screenHeight);
- }
-
- const scale = this.getEffectiveUiScale();
- waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", `${scale}`));
- window.focus();
- }
- }
-
- /**
- * Returns the effective ui sclae
- */
- getEffectiveUiScale() {
- return this.platformWrapper.getUiScale() * this.settings.getInterfaceScaleValue();
- }
-
- /**
- * Callback after ui scale has changed
- */
- updateAfterUiScaleChanged() {
- this.checkResize(true);
- }
-}
+import { AnimationFrame } from "./core/animation_frame";
+import { BackgroundResourcesLoader } from "./core/background_resources_loader";
+import { IS_MOBILE } from "./core/config";
+import { GameState } from "./core/game_state";
+import { GLOBAL_APP, setGlobalApp } from "./core/globals";
+import { InputDistributor } from "./core/input_distributor";
+import { Loader } from "./core/loader";
+import { createLogger, logSection } from "./core/logging";
+import { StateManager } from "./core/state_manager";
+import { TrackedState } from "./core/tracked_state";
+import { getPlatformName, waitNextFrame } from "./core/utils";
+import { Vector } from "./core/vector";
+import { AdProviderInterface } from "./platform/ad_provider";
+import { NoAdProvider } from "./platform/ad_providers/no_ad_provider";
+import { AnalyticsInterface } from "./platform/analytics";
+import { GoogleAnalyticsImpl } from "./platform/browser/google_analytics";
+import { SoundImplBrowser } from "./platform/browser/sound";
+import { PlatformWrapperImplBrowser } from "./platform/browser/wrapper";
+import { PlatformWrapperImplElectron } from "./platform/electron/wrapper";
+import { PlatformWrapperInterface } from "./platform/wrapper";
+import { ApplicationSettings } from "./profile/application_settings";
+import { SavegameManager } from "./savegame/savegame_manager";
+import { AboutState } from "./states/about";
+import { ChangelogState } from "./states/changelog";
+import { InGameState } from "./states/ingame";
+import { KeybindingsState } from "./states/keybindings";
+import { MainMenuState } from "./states/main_menu";
+import { MobileWarningState } from "./states/mobile_warning";
+import { PreloadState } from "./states/preload";
+import { SettingsState } from "./states/settings";
+import { ShapezGameAnalytics } from "./platform/browser/game_analytics";
+import { RestrictionManager } from "./core/restriction_manager";
+
+/**
+ * @typedef {import("./platform/game_analytics").GameAnalyticsInterface} GameAnalyticsInterface
+ * @typedef {import("./platform/sound").SoundInterface} SoundInterface
+ * @typedef {import("./platform/storage").StorageInterface} StorageInterface
+ */
+
+const logger = createLogger("application");
+
+// Set the name of the hidden property and the change event for visibility
+let pageHiddenPropName, pageVisibilityEventName;
+if (typeof document.hidden !== "undefined") {
+ // Opera 12.10 and Firefox 18 and later support
+ pageHiddenPropName = "hidden";
+ pageVisibilityEventName = "visibilitychange";
+ // @ts-ignore
+} else if (typeof document.msHidden !== "undefined") {
+ pageHiddenPropName = "msHidden";
+ pageVisibilityEventName = "msvisibilitychange";
+ // @ts-ignore
+} else if (typeof document.webkitHidden !== "undefined") {
+ pageHiddenPropName = "webkitHidden";
+ pageVisibilityEventName = "webkitvisibilitychange";
+}
+
+export class Application {
+ constructor() {
+ assert(!GLOBAL_APP, "Tried to construct application twice");
+ logger.log("Creating application, platform =", getPlatformName());
+ setGlobalApp(this);
+
+ this.unloaded = false;
+
+ // Global stuff
+ this.settings = new ApplicationSettings(this);
+ this.ticker = new AnimationFrame();
+ this.stateMgr = new StateManager(this);
+ this.savegameMgr = new SavegameManager(this);
+ this.inputMgr = new InputDistributor(this);
+ this.backgroundResourceLoader = new BackgroundResourcesLoader(this);
+
+ // Restrictions (Like demo etc)
+ this.restrictionMgr = new RestrictionManager(this);
+
+ // Platform dependent stuff
+
+ /** @type {StorageInterface} */
+ this.storage = null;
+
+ /** @type {SoundInterface} */
+ this.sound = null;
+
+ /** @type {PlatformWrapperInterface} */
+ this.platformWrapper = null;
+
+ /** @type {AdProviderInterface} */
+ this.adProvider = null;
+
+ /** @type {AnalyticsInterface} */
+ this.analytics = null;
+
+ /** @type {GameAnalyticsInterface} */
+ this.gameAnalytics = null;
+
+ this.initPlatformDependentInstances();
+
+ // Track if the window is focused (only relevant for browser)
+ this.focused = true;
+
+ // Track if the window is visible
+ this.pageVisible = true;
+
+ // Track if the app is paused (cordova)
+ this.applicationPaused = false;
+
+ /** @type {TypedTrackedState} */
+ this.trackedIsRenderable = new TrackedState(this.onAppRenderableStateChanged, this);
+
+ // Dimensions
+ this.screenWidth = 0;
+ this.screenHeight = 0;
+
+ // Store the timestamp where we last checked for a screen resize, since orientationchange is unreliable with cordova
+ this.lastResizeCheck = null;
+
+ // Store the mouse position, or null if not available
+ /** @type {Vector|null} */
+ this.mousePosition = null;
+ }
+
+ /**
+ * Initializes all platform instances
+ */
+ initPlatformDependentInstances() {
+ logger.log("Creating platform dependent instances (standalone=", G_IS_STANDALONE, ")");
+
+ if (G_IS_STANDALONE) {
+ this.platformWrapper = new PlatformWrapperImplElectron(this);
+ } else {
+ this.platformWrapper = new PlatformWrapperImplBrowser(this);
+ }
+
+ // Start with empty ad provider
+ this.adProvider = new NoAdProvider(this);
+ this.sound = new SoundImplBrowser(this);
+ this.analytics = new GoogleAnalyticsImpl(this);
+ this.gameAnalytics = new ShapezGameAnalytics(this);
+ }
+
+ /**
+ * Registers all game states
+ */
+ registerStates() {
+ /** @type {Array} */
+ const states = [
+ PreloadState,
+ MobileWarningState,
+ MainMenuState,
+ InGameState,
+ SettingsState,
+ KeybindingsState,
+ AboutState,
+ ChangelogState,
+ ];
+
+ for (let i = 0; i < states.length; ++i) {
+ this.stateMgr.register(states[i]);
+ }
+ }
+
+ /**
+ * Registers all event listeners
+ */
+ registerEventListeners() {
+ window.addEventListener("focus", this.onFocus.bind(this));
+ window.addEventListener("blur", this.onBlur.bind(this));
+
+ window.addEventListener("resize", () => this.checkResize(), true);
+ window.addEventListener("orientationchange", () => this.checkResize(), true);
+
+ if (!G_IS_MOBILE_APP && !IS_MOBILE) {
+ window.addEventListener("mousemove", this.handleMousemove.bind(this));
+ window.addEventListener("mouseout", this.handleMousemove.bind(this));
+ window.addEventListener("mouseover", this.handleMousemove.bind(this));
+ window.addEventListener("mouseleave", this.handleMousemove.bind(this));
+ }
+
+ // Unload events
+ window.addEventListener("beforeunload", this.onBeforeUnload.bind(this), true);
+ window.addEventListener("unload", this.onUnload.bind(this), true);
+
+ document.addEventListener(pageVisibilityEventName, this.handleVisibilityChange.bind(this), false);
+
+ // Track touches so we can update the focus appropriately
+ document.addEventListener("touchstart", this.updateFocusAfterUserInteraction.bind(this), true);
+ document.addEventListener("touchend", this.updateFocusAfterUserInteraction.bind(this), true);
+ }
+
+ /**
+ * Checks the focus after a touch
+ * @param {TouchEvent} event
+ */
+ updateFocusAfterUserInteraction(event) {
+ const target = /** @type {HTMLElement} */ (event.target);
+ if (!target || !target.tagName) {
+ // Safety check
+ logger.warn("Invalid touchstart/touchend event:", event);
+ return;
+ }
+
+ // When clicking an element which is not the currently focused one, defocus it
+ if (target !== document.activeElement) {
+ // @ts-ignore
+ if (document.activeElement.blur) {
+ // @ts-ignore
+ document.activeElement.blur();
+ }
+ }
+
+ // If we click an input field, focus it now
+ if (target.tagName.toLowerCase() === "input") {
+ // We *really* need the focus
+ waitNextFrame().then(() => target.focus());
+ }
+ }
+
+ /**
+ * Handles a page visibility change event
+ * @param {Event} event
+ */
+ handleVisibilityChange(event) {
+ window.focus();
+ const pageVisible = !document[pageHiddenPropName];
+ if (pageVisible !== this.pageVisible) {
+ this.pageVisible = pageVisible;
+ logger.log("Visibility changed:", this.pageVisible);
+ this.trackedIsRenderable.set(this.isRenderable());
+ }
+ }
+
+ /**
+ * Handles a mouse move event
+ * @param {MouseEvent} event
+ */
+ handleMousemove(event) {
+ this.mousePosition = new Vector(event.clientX, event.clientY);
+ }
+
+ /**
+ * Internal on focus handler
+ */
+ onFocus() {
+ this.focused = true;
+ }
+
+ /**
+ * Internal blur handler
+ */
+ onBlur() {
+ this.focused = false;
+ }
+
+ /**
+ * Returns if the app is currently visible
+ */
+ isRenderable() {
+ return !this.applicationPaused && this.pageVisible;
+ }
+
+ onAppRenderableStateChanged(renderable) {
+ logger.log("Application renderable:", renderable);
+ window.focus();
+ const currentState = this.stateMgr.getCurrentState();
+ if (!renderable) {
+ if (currentState) {
+ currentState.onAppPause();
+ }
+ } else {
+ if (currentState) {
+ currentState.onAppResume();
+ }
+ this.checkResize();
+ }
+
+ this.sound.onPageRenderableStateChanged(renderable);
+ }
+
+ /**
+ * Internal unload handler
+ */
+ onUnload(event) {
+ if (!this.unloaded) {
+ logSection("UNLOAD HANDLER", "#f77");
+ this.unloaded = true;
+ const currentState = this.stateMgr.getCurrentState();
+ if (currentState) {
+ currentState.onBeforeExit();
+ }
+ this.deinitialize();
+ }
+ }
+
+ /**
+ * Internal before-unload handler
+ */
+ onBeforeUnload(event) {
+ logSection("BEFORE UNLOAD HANDLER", "#f77");
+ const currentState = this.stateMgr.getCurrentState();
+
+ if (!G_IS_DEV && currentState && currentState.getHasUnloadConfirmation()) {
+ if (!G_IS_STANDALONE) {
+ // Need to show a "Are you sure you want to exit"
+ event.preventDefault();
+ event.returnValue = "Are you sure you want to exit?";
+ }
+ }
+ }
+
+ /**
+ * Boots the application
+ */
+ boot() {
+ console.log("Booting ...");
+ this.registerStates();
+ this.registerEventListeners();
+
+ Loader.linkAppAfterBoot(this);
+
+ // Check for mobile
+ if (IS_MOBILE) {
+ this.stateMgr.moveToState("MobileWarningState");
+ } else {
+ this.stateMgr.moveToState("PreloadState");
+ }
+
+ // Starting rendering
+ this.ticker.frameEmitted.add(this.onFrameEmitted, this);
+ this.ticker.bgFrameEmitted.add(this.onBackgroundFrame, this);
+ this.ticker.start();
+
+ window.focus();
+ }
+
+ /**
+ * Deinitializes the application
+ */
+ deinitialize() {
+ return this.sound.deinitialize();
+ }
+
+ /**
+ * Background frame update callback
+ * @param {number} dt
+ */
+ onBackgroundFrame(dt) {
+ if (this.isRenderable()) {
+ return;
+ }
+
+ const currentState = this.stateMgr.getCurrentState();
+ if (currentState) {
+ currentState.onBackgroundTick(dt);
+ }
+ }
+
+ /**
+ * Frame update callback
+ * @param {number} dt
+ */
+ onFrameEmitted(dt) {
+ if (!this.isRenderable()) {
+ return;
+ }
+
+ const time = performance.now();
+
+ // Periodically check for resizes, this is expensive (takes 2-3ms so only do it once in a while!)
+ if (!this.lastResizeCheck || time - this.lastResizeCheck > 1000) {
+ this.checkResize();
+ this.lastResizeCheck = time;
+ }
+
+ const currentState = this.stateMgr.getCurrentState();
+ if (currentState) {
+ currentState.onRender(dt);
+ }
+ }
+
+ /**
+ * Checks if the app resized. Only does this once in a while
+ * @param {boolean} forceUpdate Forced update of the dimensions
+ */
+ checkResize(forceUpdate = false) {
+ const w = window.innerWidth;
+ const h = window.innerHeight;
+ if (this.screenWidth !== w || this.screenHeight !== h || forceUpdate) {
+ this.screenWidth = w;
+ this.screenHeight = h;
+ const currentState = this.stateMgr.getCurrentState();
+ if (currentState) {
+ currentState.onResized(this.screenWidth, this.screenHeight);
+ }
+
+ const scale = this.getEffectiveUiScale();
+ waitNextFrame().then(() => document.documentElement.style.setProperty("--ui-scale", `${scale}`));
+ window.focus();
+ }
+ }
+
+ /**
+ * Returns the effective ui sclae
+ */
+ getEffectiveUiScale() {
+ return this.platformWrapper.getUiScale() * this.settings.getInterfaceScaleValue();
+ }
+
+ /**
+ * Callback after ui scale has changed
+ */
+ updateAfterUiScaleChanged() {
+ this.checkResize(true);
+ }
+}
diff --git a/src/js/changelog.js b/src/js/changelog.js
index bbc4a4fa..fcafbe2b 100644
--- a/src/js/changelog.js
+++ b/src/js/changelog.js
@@ -1,46 +1,23 @@
export const CHANGELOG = [
{
- version: "1.2.0",
+ version: "1.2.1",
date: "unreleased",
entries: [
- "WIRES",
- "Reworked menu UI design (by dengr1605)",
- "Allow holding ALT in belt planner to reverse direction (by jakobhellermann)",
- "Clear cursor when trying to pipette the same building twice (by hexy)",
- "Fixed level 18 stacker bug: If you experienced it already, you know it, if not, I don't want to spoiler (by hexy)",
- "Added keybinding to close menus (by isaisstillalive / Sandwichs-del)",
- "Fix rare crash regarding the buildings toolbar (by isaisstillalive)",
- "Fixed some phrases (by EnderDoom77)",
- "Zoom towards mouse cursor (by Dimava)",
- "Added multiple settings to optimize the performance",
- "Updated the soundtrack again, it is now 40 minutes in total!",
- "Added a button to the statistics dialog to disable the sorting (by squeek502)",
- "Tier 2 tunnels are now 9 tiles wide, so the gap between is 8 tiles (double the tier 1 range)",
- "Updated and added new translations (Thanks to all contributors!)",
- "Show connected chained miners on hover",
- "Added setting to be able to delete buildings while placing (inspired by hexy)",
- "You can now adjust the sound and music volumes! (inspired by Yoshie2000)",
- "Some hud elements now have reduced opacity when hovering, so you can see through (inspired by mvb005)",
- "Mark pinned shapes in statistics dialog and show them first (inspired by davidburhans)",
- "Added setting to show chunk borders",
- "Quad painters have been reworked! They now are integrated with the wires, and only paint the shape when the value is 1 (inspired by dengr1605)",
- "There are now compact 1x1 splitters available to be unlocked!",
- "Replaced level completion sound to be less distracting",
- "Allow editing waypoints (by isaisstillalive)",
- "Show confirmation when cutting area which is too expensive to get pasted again (by isaisstillalive)",
- "Show mouse and camera tile on debug overlay (F4) (by dengr)",
- "Fixed tunnels entrances connecting to exits sometimes when they shouldn't",
- "Added setting to auto select the extractor when pipetting a resource patch (by Exund)",
- "The initial belt planner direction is now based on the cursor movement (by MizardX)",
- "Fix preferred variant not getting saved when clicking on the hud (by Danacus)",
+ "Fixed stacking bug for level 26 which required restarting the game",
+ "Fix reward notification being too long sometimes (by LeopoldTal)",
+ "Use locale decimal separator on belt reader display (by LeopoldTal)",
+ "Vastly improved performance when saving games (by LeopoldTal)",
+ "Prevent some antivirus programs blocking the opening of external links (by LeopoldTal)",
+ "Match tutorials to the correct painter variants (by LeopoldTal)",
+ "Prevent throughput goals containing fractional numbers (by CEbbinghaus)",
+ "Updated translations and added Hungarian",
],
},
{
- version: "1.1.19",
- date: "02.07.2020",
+ version: "1.2.0",
+ date: "09.10.2020",
entries: [
- "There are now notifications every 15 minutes in the demo version to buy the full version (For further details and the reason, check the #surveys channel in the Discord)",
- "I'm still working on the wires update, I hope to release it mid july!",
+ "⚠️⚠️This update is HUGE, view the full changelog here ! ⚠️⚠️",
],
},
{
@@ -109,7 +86,7 @@ export const CHANGELOG = [
date: "17.06.2020",
entries: [
"You can now place straight belts (and tunnels) by holding SHIFT! (For you, @giantwaffle ❤️)",
- "Added continue button to main menu and add seperate 'New game' button (by jaysc)",
+ "Added continue button to main menu and add separate 'New game' button (by jaysc)",
"Added setting to disable smart tunnel placement introduced with the last update",
"Added setting to disable vignette",
"Update translations",
diff --git a/src/js/core/background_resources_loader.js b/src/js/core/background_resources_loader.js
index b3a7671b..bbd37036 100644
--- a/src/js/core/background_resources_loader.js
+++ b/src/js/core/background_resources_loader.js
@@ -1,215 +1,232 @@
-/* typehints:start */
-import { Application } from "../application";
-/* typehints:end */
-
-import { Loader } from "./loader";
-import { createLogger } from "./logging";
-import { Signal } from "./signal";
-import { SOUNDS, MUSIC } from "../platform/sound";
-import { AtlasDefinition, atlasFiles } from "./atlas_definitions";
-import { initBuildingCodesAfterResourcesLoaded } from "../game/meta_building_registry";
-
-const logger = createLogger("background_loader");
-
-const essentialMainMenuSprites = [
- "logo.png",
- ...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0),
-];
-const essentialMainMenuSounds = [
- SOUNDS.uiClick,
- SOUNDS.uiError,
- SOUNDS.dialogError,
- SOUNDS.dialogOk,
- SOUNDS.swishShow,
- SOUNDS.swishHide,
-];
-
-const essentialBareGameAtlases = atlasFiles;
-const essentialBareGameSprites = G_ALL_UI_IMAGES.filter(src => src.indexOf(".gif") < 0);
-const essentialBareGameSounds = [MUSIC.theme];
-
-const additionalGameSprites = [];
-// @ts-ignore
-const additionalGameSounds = [...Object.values(SOUNDS), ...Object.values(MUSIC)];
-
-export class BackgroundResourcesLoader {
- /**
- *
- * @param {Application} app
- */
- constructor(app) {
- this.app = app;
-
- this.registerReady = false;
- this.mainMenuReady = false;
- this.bareGameReady = false;
- this.additionalReady = false;
-
- this.signalMainMenuLoaded = new Signal();
- this.signalBareGameLoaded = new Signal();
- this.signalAdditionalLoaded = new Signal();
-
- this.numAssetsLoaded = 0;
- this.numAssetsToLoadTotal = 0;
-
- // Avoid loading stuff twice
- this.spritesLoaded = [];
- this.soundsLoaded = [];
- }
-
- getNumAssetsLoaded() {
- return this.numAssetsLoaded;
- }
-
- getNumAssetsTotal() {
- return this.numAssetsToLoadTotal;
- }
-
- getPromiseForMainMenu() {
- if (this.mainMenuReady) {
- return Promise.resolve();
- }
-
- return new Promise(resolve => {
- this.signalMainMenuLoaded.add(resolve);
- });
- }
-
- getPromiseForBareGame() {
- if (this.bareGameReady) {
- return Promise.resolve();
- }
-
- return new Promise(resolve => {
- this.signalBareGameLoaded.add(resolve);
- });
- }
-
- startLoading() {
- this.internalStartLoadingEssentialsForMainMenu();
- }
-
- internalStartLoadingEssentialsForMainMenu() {
- logger.log("⏰ Start load: main menu");
- this.internalLoadSpritesAndSounds(essentialMainMenuSprites, essentialMainMenuSounds)
- .catch(err => {
- logger.warn("⏰ Failed to load essentials for main menu:", err);
- })
- .then(() => {
- logger.log("⏰ Finish load: main menu");
- this.mainMenuReady = true;
- this.signalMainMenuLoaded.dispatch();
- this.internalStartLoadingEssentialsForBareGame();
- });
- }
-
- internalStartLoadingEssentialsForBareGame() {
- logger.log("⏰ Start load: bare game");
- this.internalLoadSpritesAndSounds(
- essentialBareGameSprites,
- essentialBareGameSounds,
- essentialBareGameAtlases
- )
- .catch(err => {
- logger.warn("⏰ Failed to load essentials for bare game:", err);
- })
- .then(() => {
- logger.log("⏰ Finish load: bare game");
- this.bareGameReady = true;
- initBuildingCodesAfterResourcesLoaded();
- this.signalBareGameLoaded.dispatch();
- this.internalStartLoadingAdditionalGameAssets();
- });
- }
-
- internalStartLoadingAdditionalGameAssets() {
- const additionalAtlases = [];
- logger.log("⏰ Start load: additional assets (", additionalAtlases.length, "images)");
- this.internalLoadSpritesAndSounds(additionalGameSprites, additionalGameSounds, additionalAtlases)
- .catch(err => {
- logger.warn("⏰ Failed to load additional assets:", err);
- })
- .then(() => {
- logger.log("⏰ Finish load: additional assets");
- this.additionalReady = true;
- this.signalAdditionalLoaded.dispatch();
- });
- }
-
- /**
- * @param {Array} sprites
- * @param {Array} sounds
- * @param {Array} atlases
- * @returns {Promise}
- */
- internalLoadSpritesAndSounds(sprites, sounds, atlases = []) {
- this.numAssetsToLoadTotal = sprites.length + sounds.length + atlases.length;
- this.numAssetsLoaded = 0;
-
- let promises = [];
-
- for (let i = 0; i < sounds.length; ++i) {
- if (this.soundsLoaded.indexOf(sounds[i]) >= 0) {
- // Already loaded
- continue;
- }
-
- this.soundsLoaded.push(sounds[i]);
- promises.push(
- this.app.sound
- .loadSound(sounds[i])
- .catch(err => {
- logger.warn("Failed to load sound:", sounds[i]);
- })
- .then(() => {
- this.numAssetsLoaded++;
- })
- );
- }
-
- for (let i = 0; i < sprites.length; ++i) {
- if (this.spritesLoaded.indexOf(sprites[i]) >= 0) {
- // Already loaded
- continue;
- }
- this.spritesLoaded.push(sprites[i]);
- promises.push(
- Loader.preloadCSSSprite(sprites[i])
- .catch(err => {
- logger.warn("Failed to load css sprite:", sprites[i]);
- })
- .then(() => {
- this.numAssetsLoaded++;
- })
- );
- }
-
- for (let i = 0; i < atlases.length; ++i) {
- const atlas = atlases[i];
- promises.push(
- Loader.preloadAtlas(atlas)
- .catch(err => {
- logger.warn("Failed to load atlas:", atlas.sourceFileName);
- })
- .then(() => {
- this.numAssetsLoaded++;
- })
- );
- }
-
- return (
- Promise.all(promises)
-
- // // Remove some pressure by waiting a bit
- // .then(() => {
- // return new Promise(resolve => {
- // setTimeout(resolve, 200);
- // });
- // })
- .then(() => {
- this.numAssetsToLoadTotal = 0;
- this.numAssetsLoaded = 0;
- })
- );
- }
-}
+/* typehints:start */
+import { Application } from "../application";
+/* typehints:end */
+
+import { Loader } from "./loader";
+import { createLogger } from "./logging";
+import { Signal } from "./signal";
+import { SOUNDS, MUSIC } from "../platform/sound";
+import { AtlasDefinition, atlasFiles } from "./atlas_definitions";
+import { initBuildingCodesAfterResourcesLoaded } from "../game/meta_building_registry";
+import { cachebust } from "./cachebust";
+
+const logger = createLogger("background_loader");
+
+const essentialMainMenuSprites = [
+ "logo.png",
+ ...G_ALL_UI_IMAGES.filter(src => src.startsWith("ui/") && src.indexOf(".gif") < 0),
+];
+const essentialMainMenuSounds = [
+ SOUNDS.uiClick,
+ SOUNDS.uiError,
+ SOUNDS.dialogError,
+ SOUNDS.dialogOk,
+ SOUNDS.swishShow,
+ SOUNDS.swishHide,
+];
+
+const essentialBareGameAtlases = atlasFiles;
+const essentialBareGameSprites = G_ALL_UI_IMAGES.filter(src => src.indexOf(".gif") < 0);
+const essentialBareGameSounds = [MUSIC.theme];
+
+const additionalGameSprites = [];
+// @ts-ignore
+const additionalGameSounds = [...Object.values(SOUNDS), ...Object.values(MUSIC)];
+
+export class BackgroundResourcesLoader {
+ /**
+ *
+ * @param {Application} app
+ */
+ constructor(app) {
+ this.app = app;
+
+ this.registerReady = false;
+ this.mainMenuReady = false;
+ this.bareGameReady = false;
+ this.additionalReady = false;
+
+ this.signalMainMenuLoaded = new Signal();
+ this.signalBareGameLoaded = new Signal();
+ this.signalAdditionalLoaded = new Signal();
+
+ this.numAssetsLoaded = 0;
+ this.numAssetsToLoadTotal = 0;
+
+ // Avoid loading stuff twice
+ this.spritesLoaded = [];
+ this.soundsLoaded = [];
+ }
+
+ getNumAssetsLoaded() {
+ return this.numAssetsLoaded;
+ }
+
+ getNumAssetsTotal() {
+ return this.numAssetsToLoadTotal;
+ }
+
+ getPromiseForMainMenu() {
+ if (this.mainMenuReady) {
+ return Promise.resolve();
+ }
+
+ return new Promise(resolve => {
+ this.signalMainMenuLoaded.add(resolve);
+ });
+ }
+
+ getPromiseForBareGame() {
+ if (this.bareGameReady) {
+ return Promise.resolve();
+ }
+
+ return new Promise(resolve => {
+ this.signalBareGameLoaded.add(resolve);
+ });
+ }
+
+ startLoading() {
+ this.internalStartLoadingEssentialsForMainMenu();
+ }
+
+ internalStartLoadingEssentialsForMainMenu() {
+ logger.log("⏰ Start load: main menu");
+ this.internalLoadSpritesAndSounds(essentialMainMenuSprites, essentialMainMenuSounds)
+ .catch(err => {
+ logger.warn("⏰ Failed to load essentials for main menu:", err);
+ })
+ .then(() => {
+ logger.log("⏰ Finish load: main menu");
+ this.mainMenuReady = true;
+ this.signalMainMenuLoaded.dispatch();
+ this.internalStartLoadingEssentialsForBareGame();
+ });
+ }
+
+ internalStartLoadingEssentialsForBareGame() {
+ logger.log("⏰ Start load: bare game");
+ this.internalLoadSpritesAndSounds(
+ essentialBareGameSprites,
+ essentialBareGameSounds,
+ essentialBareGameAtlases
+ )
+ .then(() => this.internalPreloadCss("async-resources.scss"))
+ .catch(err => {
+ logger.warn("⏰ Failed to load essentials for bare game:", err);
+ })
+ .then(() => {
+ logger.log("⏰ Finish load: bare game");
+ this.bareGameReady = true;
+ initBuildingCodesAfterResourcesLoaded();
+ this.signalBareGameLoaded.dispatch();
+ this.internalStartLoadingAdditionalGameAssets();
+ });
+ }
+
+ internalStartLoadingAdditionalGameAssets() {
+ const additionalAtlases = [];
+ logger.log("⏰ Start load: additional assets (", additionalAtlases.length, "images)");
+ this.internalLoadSpritesAndSounds(additionalGameSprites, additionalGameSounds, additionalAtlases)
+ .catch(err => {
+ logger.warn("⏰ Failed to load additional assets:", err);
+ })
+ .then(() => {
+ logger.log("⏰ Finish load: additional assets");
+ this.additionalReady = true;
+ this.signalAdditionalLoaded.dispatch();
+ });
+ }
+
+ internalPreloadCss(name) {
+ return new Promise((resolve, reject) => {
+ const link = document.createElement("link");
+
+ link.onload = resolve;
+ link.onerror = reject;
+
+ link.setAttribute("rel", "stylesheet");
+ link.setAttribute("media", "all");
+ link.setAttribute("type", "text/css");
+ link.setAttribute("href", cachebust("async-resources.css"));
+ document.head.appendChild(link);
+ });
+ }
+
+ /**
+ * @param {Array} sprites
+ * @param {Array} sounds
+ * @param {Array} atlases
+ * @returns {Promise}
+ */
+ internalLoadSpritesAndSounds(sprites, sounds, atlases = []) {
+ this.numAssetsToLoadTotal = sprites.length + sounds.length + atlases.length;
+ this.numAssetsLoaded = 0;
+
+ let promises = [];
+
+ for (let i = 0; i < sounds.length; ++i) {
+ if (this.soundsLoaded.indexOf(sounds[i]) >= 0) {
+ // Already loaded
+ continue;
+ }
+
+ this.soundsLoaded.push(sounds[i]);
+ promises.push(
+ this.app.sound
+ .loadSound(sounds[i])
+ .catch(err => {
+ logger.warn("Failed to load sound:", sounds[i]);
+ })
+ .then(() => {
+ this.numAssetsLoaded++;
+ })
+ );
+ }
+
+ for (let i = 0; i < sprites.length; ++i) {
+ if (this.spritesLoaded.indexOf(sprites[i]) >= 0) {
+ // Already loaded
+ continue;
+ }
+ this.spritesLoaded.push(sprites[i]);
+ promises.push(
+ Loader.preloadCSSSprite(sprites[i])
+ .catch(err => {
+ logger.warn("Failed to load css sprite:", sprites[i]);
+ })
+ .then(() => {
+ this.numAssetsLoaded++;
+ })
+ );
+ }
+
+ for (let i = 0; i < atlases.length; ++i) {
+ const atlas = atlases[i];
+ promises.push(
+ Loader.preloadAtlas(atlas)
+ .catch(err => {
+ logger.warn("Failed to load atlas:", atlas.sourceFileName);
+ })
+ .then(() => {
+ this.numAssetsLoaded++;
+ })
+ );
+ }
+
+ return (
+ Promise.all(promises)
+
+ // // Remove some pressure by waiting a bit
+ // .then(() => {
+ // return new Promise(resolve => {
+ // setTimeout(resolve, 200);
+ // });
+ // })
+ .then(() => {
+ this.numAssetsToLoadTotal = 0;
+ this.numAssetsLoaded = 0;
+ })
+ );
+ }
+}
diff --git a/src/js/core/buffer_maintainer.js b/src/js/core/buffer_maintainer.js
index 3d466f14..1d506803 100644
--- a/src/js/core/buffer_maintainer.js
+++ b/src/js/core/buffer_maintainer.js
@@ -13,7 +13,7 @@ import { round1Digit } from "./utils";
const logger = createLogger("buffers");
-const bufferGcDurationSeconds = 5;
+const bufferGcDurationSeconds = 0.5;
export class BufferMaintainer {
/**
@@ -86,27 +86,29 @@ export class BufferMaintainer {
// Make sure our backlog never gets too big
clearBufferBacklog();
- const bufferStats = getBufferStats();
- const mbUsed = round1Digit(bufferStats.vramUsage / (1024 * 1024));
- logger.log(
- "GC: Remove",
- (deletedKeys + "").padStart(4),
- ", Remain",
- (totalKeys + "").padStart(4),
- "(",
- (bufferStats.bufferCount + "").padStart(4),
- "total",
- ")",
+ // if (G_IS_DEV) {
+ // const bufferStats = getBufferStats();
+ // const mbUsed = round1Digit(bufferStats.vramUsage / (1024 * 1024));
+ // logger.log(
+ // "GC: Remove",
+ // (deletedKeys + "").padStart(4),
+ // ", Remain",
+ // (totalKeys + "").padStart(4),
+ // "(",
+ // (bufferStats.bufferCount + "").padStart(4),
+ // "total",
+ // ")",
- "(",
- (bufferStats.backlog + "").padStart(4),
- "backlog",
- ")",
+ // "(",
+ // (bufferStats.backlogSize + "").padStart(4),
+ // "backlog",
+ // ")",
- "VRAM:",
- mbUsed,
- "MB"
- );
+ // "VRAM:",
+ // mbUsed,
+ // "MB"
+ // );
+ // }
++this.iterationIndex;
}
diff --git a/src/js/core/buffer_utils.js b/src/js/core/buffer_utils.js
index 228560bc..310c315f 100644
--- a/src/js/core/buffer_utils.js
+++ b/src/js/core/buffer_utils.js
@@ -25,17 +25,43 @@ export function disableImageSmoothing(context) {
context.webkitImageSmoothingEnabled = false;
}
-const registeredCanvas = [];
-const freeCanvasList = [];
+/**
+ * @typedef {{
+ * canvas: HTMLCanvasElement,
+ * context: CanvasRenderingContext2D
+ * }} CanvasCacheEntry
+ */
-let vramUsage = 0;
-let bufferCount = 0;
+/**
+ * @type {Array}
+ */
+const registeredCanvas = [];
+
+/**
+ * Buckets for each width * height combination
+ * @type {Map>}
+ */
+const freeCanvasBuckets = new Map();
+
+/**
+ * Track statistics
+ */
+const stats = {
+ vramUsage: 0,
+ backlogVramUsage: 0,
+ bufferCount: 0,
+ numReused: 0,
+ numCreated: 0,
+};
/**
*
* @param {HTMLCanvasElement} canvas
*/
export function getBufferVramUsageBytes(canvas) {
+ assert(canvas, "no canvas given");
+ assert(Number.isFinite(canvas.width), "bad canvas width: " + canvas.width);
+ assert(Number.isFinite(canvas.height), "bad canvas height" + canvas.height);
return canvas.width * canvas.height * 4;
}
@@ -43,17 +69,31 @@ export function getBufferVramUsageBytes(canvas) {
* Returns stats on the allocated buffers
*/
export function getBufferStats() {
+ let numBuffersFree = 0;
+ freeCanvasBuckets.forEach(bucket => {
+ numBuffersFree += bucket.length;
+ });
+
return {
- vramUsage,
- bufferCount,
- backlog: freeCanvasList.length,
+ ...stats,
+ backlogKeys: freeCanvasBuckets.size,
+ backlogSize: numBuffersFree,
};
}
+/**
+ * Clears the backlog buffers if they grew too much
+ */
export function clearBufferBacklog() {
- while (freeCanvasList.length > 50) {
- freeCanvasList.pop();
- }
+ freeCanvasBuckets.forEach(bucket => {
+ while (bucket.length > 500) {
+ const entry = bucket[bucket.length - 1];
+ stats.backlogVramUsage -= getBufferVramUsageBytes(entry.canvas);
+ delete entry.canvas;
+ delete entry.context;
+ bucket.pop();
+ }
+ });
}
/**
@@ -84,53 +124,29 @@ export function makeOffscreenBuffer(w, h, { smooth = true, reusable = true, labe
let canvas = null;
let context = null;
- let bestMatchingOne = null;
- let bestMatchingPixelsDiff = 1e50;
-
- const currentPixels = w * h;
-
// Ok, search in cache first
- for (let i = 0; i < freeCanvasList.length; ++i) {
- const { canvas: useableCanvas, context: useableContext } = freeCanvasList[i];
+ const bucket = freeCanvasBuckets.get(w * h) || [];
+
+ for (let i = 0; i < bucket.length; ++i) {
+ const { canvas: useableCanvas, context: useableContext } = bucket[i];
if (useableCanvas.width === w && useableCanvas.height === h) {
// Ok we found one
canvas = useableCanvas;
context = useableContext;
- fastArrayDelete(freeCanvasList, i);
+ // Restore past state
+ context.restore();
+ context.save();
+ context.clearRect(0, 0, canvas.width, canvas.height);
+
+ delete canvas.style.width;
+ delete canvas.style.height;
+
+ stats.numReused++;
+ stats.backlogVramUsage -= getBufferVramUsageBytes(canvas);
+ fastArrayDelete(bucket, i);
break;
}
-
- const otherPixels = useableCanvas.width * useableCanvas.height;
- const diff = Math.abs(otherPixels - currentPixels);
- if (diff < bestMatchingPixelsDiff) {
- bestMatchingPixelsDiff = diff;
- bestMatchingOne = {
- canvas: useableCanvas,
- context: useableContext,
- index: i,
- };
- }
- }
-
- // Ok none matching, reuse one though
- if (!canvas && bestMatchingOne) {
- canvas = bestMatchingOne.canvas;
- context = bestMatchingOne.context;
- canvas.width = w;
- canvas.height = h;
- fastArrayDelete(freeCanvasList, bestMatchingOne.index);
- }
-
- // Reset context
- if (context) {
- // Restore past state
- context.restore();
- context.save();
- context.clearRect(0, 0, canvas.width, canvas.height);
-
- delete canvas.style.width;
- delete canvas.style.height;
}
// None found , create new one
@@ -138,6 +154,8 @@ export function makeOffscreenBuffer(w, h, { smooth = true, reusable = true, labe
canvas = document.createElement("canvas");
context = canvas.getContext("2d" /*, { alpha } */);
+ stats.numCreated++;
+
canvas.width = w;
canvas.height = h;
@@ -145,6 +163,7 @@ export function makeOffscreenBuffer(w, h, { smooth = true, reusable = true, labe
context.save();
}
+ // @ts-ignore
canvas.label = label;
if (smooth) {
@@ -167,8 +186,9 @@ export function makeOffscreenBuffer(w, h, { smooth = true, reusable = true, labe
export function registerCanvas(canvas, context) {
registeredCanvas.push({ canvas, context });
- bufferCount += 1;
- vramUsage += getBufferVramUsageBytes(canvas);
+ stats.bufferCount += 1;
+ const bytesUsed = getBufferVramUsageBytes(canvas);
+ stats.vramUsage += bytesUsed;
}
/**
@@ -180,6 +200,7 @@ export function freeCanvas(canvas) {
let index = -1;
let data = null;
+
for (let i = 0; i < registeredCanvas.length; ++i) {
if (registeredCanvas[i].canvas === canvas) {
index = i;
@@ -193,8 +214,18 @@ export function freeCanvas(canvas) {
return;
}
fastArrayDelete(registeredCanvas, index);
- freeCanvasList.push(data);
- bufferCount -= 1;
- vramUsage -= getBufferVramUsageBytes(canvas);
+ const key = canvas.width * canvas.height;
+ const bucket = freeCanvasBuckets.get(key);
+ if (bucket) {
+ bucket.push(data);
+ } else {
+ freeCanvasBuckets.set(key, [data]);
+ }
+
+ stats.bufferCount -= 1;
+
+ const bytesUsed = getBufferVramUsageBytes(canvas);
+ stats.vramUsage -= bytesUsed;
+ stats.backlogVramUsage += bytesUsed;
}
diff --git a/src/js/core/click_detector.js b/src/js/core/click_detector.js
index ea6abf48..fb62f0f1 100644
--- a/src/js/core/click_detector.js
+++ b/src/js/core/click_detector.js
@@ -1,467 +1,465 @@
-import { createLogger } from "../core/logging";
-import { Signal } from "../core/signal";
-import { fastArrayDelete, fastArrayDeleteValueIfContained } from "./utils";
-import { Vector } from "./vector";
-import { IS_MOBILE, SUPPORT_TOUCH } from "./config";
-import { SOUNDS } from "../platform/sound";
-import { GLOBAL_APP } from "./globals";
-
-const logger = createLogger("click_detector");
-
-export const MAX_MOVE_DISTANCE_PX = IS_MOBILE ? 20 : 80;
-
-// For debugging
-const registerClickDetectors = G_IS_DEV && true;
-if (registerClickDetectors) {
- /** @type {Array} */
- window.activeClickDetectors = [];
-}
-
-// Store active click detectors so we can cancel them
-/** @type {Array} */
-const ongoingClickDetectors = [];
-
-// Store when the last touch event was registered, to avoid accepting a touch *and* a click event
-
-export let clickDetectorGlobals = {
- lastTouchTime: -1000,
-};
-
-/**
- * Click detector creation payload typehints
- * @typedef {{
- * consumeEvents?: boolean,
- * preventDefault?: boolean,
- * applyCssClass?: string,
- * captureTouchmove?: boolean,
- * targetOnly?: boolean,
- * maxDistance?: number,
- * clickSound?: string,
- * preventClick?: boolean,
- * }} ClickDetectorConstructorArgs
- */
-
-// Detects clicks
-export class ClickDetector {
- /**
- *
- * @param {Element} element
- * @param {object} param1
- * @param {boolean=} param1.consumeEvents Whether to call stopPropagation
- * (Useful for nested elements where the parent has a click handler as wel)
- * @param {boolean=} param1.preventDefault Whether to call preventDefault (Usually makes the handler faster)
- * @param {string=} param1.applyCssClass The css class to add while the element is pressed
- * @param {boolean=} param1.captureTouchmove Whether to capture touchmove events as well
- * @param {boolean=} param1.targetOnly Whether to also accept clicks on child elements (e.target !== element)
- * @param {number=} param1.maxDistance The maximum distance in pixels to accept clicks
- * @param {string=} param1.clickSound Sound key to play on touchdown
- * @param {boolean=} param1.preventClick Whether to prevent click events
- */
- constructor(
- element,
- {
- consumeEvents = false,
- preventDefault = true,
- applyCssClass = "pressed",
- captureTouchmove = false,
- targetOnly = false,
- maxDistance = MAX_MOVE_DISTANCE_PX,
- clickSound = SOUNDS.uiClick,
- preventClick = false,
- }
- ) {
- assert(element, "No element given!");
- this.clickDownPosition = null;
-
- this.consumeEvents = consumeEvents;
- this.preventDefault = preventDefault;
- this.applyCssClass = applyCssClass;
- this.captureTouchmove = captureTouchmove;
- this.targetOnly = targetOnly;
- this.clickSound = clickSound;
- this.maxDistance = maxDistance;
- this.preventClick = preventClick;
-
- // Signals
- this.click = new Signal();
- this.rightClick = new Signal();
- this.touchstart = new Signal();
- this.touchmove = new Signal();
- this.touchend = new Signal();
- this.touchcancel = new Signal();
-
- // Simple signals which just receive the touch position
- this.touchstartSimple = new Signal();
- this.touchmoveSimple = new Signal();
- this.touchendSimple = new Signal();
-
- // Store time of touch start
- this.clickStartTime = null;
-
- // A click can be cancelled if another detector registers a click
- this.cancelled = false;
-
- this.internalBindTo(/** @type {HTMLElement} */ (element));
- }
-
- /**
- * Cleans up all event listeners of this detector
- */
- cleanup() {
- if (this.element) {
- if (registerClickDetectors) {
- const index = window.activeClickDetectors.indexOf(this);
- if (index < 0) {
- logger.error("Click detector cleanup but is not active");
- } else {
- window.activeClickDetectors.splice(index, 1);
- }
- }
- const options = this.internalGetEventListenerOptions();
-
- if (SUPPORT_TOUCH) {
- this.element.removeEventListener("touchstart", this.handlerTouchStart, options);
- this.element.removeEventListener("touchend", this.handlerTouchEnd, options);
- this.element.removeEventListener("touchcancel", this.handlerTouchCancel, options);
- }
-
- this.element.removeEventListener("mouseup", this.handlerTouchStart, options);
- this.element.removeEventListener("mousedown", this.handlerTouchEnd, options);
- this.element.removeEventListener("mouseout", this.handlerTouchCancel, options);
-
- if (this.captureTouchmove) {
- if (SUPPORT_TOUCH) {
- this.element.removeEventListener("touchmove", this.handlerTouchMove, options);
- }
- this.element.removeEventListener("mousemove", this.handlerTouchMove, options);
- }
-
- if (this.preventClick) {
- this.element.removeEventListener("click", this.handlerPreventClick, options);
- }
-
- this.click.removeAll();
- this.touchstart.removeAll();
- this.touchmove.removeAll();
- this.touchend.removeAll();
- this.touchcancel.removeAll();
-
- // TODO: Remove pointer captures
-
- this.element = null;
- }
- }
-
- // INTERNAL METHODS
-
- /**
- *
- * @param {Event} event
- */
- internalPreventClick(event) {
- window.focus();
- event.preventDefault();
- }
-
- /**
- * Internal method to get the options to pass to an event listener
- */
- internalGetEventListenerOptions() {
- return {
- capture: this.consumeEvents,
- passive: !this.preventDefault,
- };
- }
-
- /**
- * Binds the click detector to an element
- * @param {HTMLElement} element
- */
- internalBindTo(element) {
- const options = this.internalGetEventListenerOptions();
-
- this.handlerTouchStart = this.internalOnPointerDown.bind(this);
- this.handlerTouchEnd = this.internalOnPointerEnd.bind(this);
- this.handlerTouchMove = this.internalOnPointerMove.bind(this);
- this.handlerTouchCancel = this.internalOnTouchCancel.bind(this);
-
- if (this.preventClick) {
- this.handlerPreventClick = this.internalPreventClick.bind(this);
- element.addEventListener("click", this.handlerPreventClick, options);
- }
-
- if (SUPPORT_TOUCH) {
- element.addEventListener("touchstart", this.handlerTouchStart, options);
- element.addEventListener("touchend", this.handlerTouchEnd, options);
- element.addEventListener("touchcancel", this.handlerTouchCancel, options);
- }
-
- element.addEventListener("mousedown", this.handlerTouchStart, options);
- element.addEventListener("mouseup", this.handlerTouchEnd, options);
- element.addEventListener("mouseout", this.handlerTouchCancel, options);
-
- if (this.captureTouchmove) {
- if (SUPPORT_TOUCH) {
- element.addEventListener("touchmove", this.handlerTouchMove, options);
- }
- element.addEventListener("mousemove", this.handlerTouchMove, options);
- }
-
- if (registerClickDetectors) {
- window.activeClickDetectors.push(this);
- }
- this.element = element;
- }
-
- /**
- * Returns if the bound element is currently in the DOM.
- */
- internalIsDomElementAttached() {
- return this.element && document.documentElement.contains(this.element);
- }
-
- /**
- * Checks if the given event is relevant for this detector
- * @param {TouchEvent|MouseEvent} event
- */
- internalEventPreHandler(event, expectedRemainingTouches = 1) {
- if (!this.element) {
- // Already cleaned up
- return false;
- }
-
- if (this.targetOnly && event.target !== this.element) {
- // Clicked a child element
- return false;
- }
-
- // Stop any propagation and defaults if configured
- if (this.consumeEvents && event.cancelable) {
- event.stopPropagation();
- }
-
- if (this.preventDefault && event.cancelable) {
- event.preventDefault();
- }
-
- if (window.TouchEvent && event instanceof TouchEvent) {
- clickDetectorGlobals.lastTouchTime = performance.now();
-
- // console.log("Got touches", event.targetTouches.length, "vs", expectedRemainingTouches);
- if (event.targetTouches.length !== expectedRemainingTouches) {
- return false;
- }
- }
-
- if (event instanceof MouseEvent) {
- if (performance.now() - clickDetectorGlobals.lastTouchTime < 1000.0) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Extracts the mous position from an event
- * @param {TouchEvent|MouseEvent} event
- * @returns {Vector} The client space position
- */
- static extractPointerPosition(event) {
- if (window.TouchEvent && event instanceof TouchEvent) {
- if (event.changedTouches.length !== 1) {
- logger.warn(
- "Got unexpected target touches:",
- event.targetTouches.length,
- "->",
- event.targetTouches
- );
- return new Vector(0, 0);
- }
-
- const touch = event.changedTouches[0];
- return new Vector(touch.clientX, touch.clientY);
- }
-
- if (event instanceof MouseEvent) {
- return new Vector(event.clientX, event.clientY);
- }
-
- assertAlways(false, "Got unknown event: " + event);
-
- return new Vector(0, 0);
- }
-
- /**
- * Cacnels all ongoing events on this detector
- */
- cancelOngoingEvents() {
- if (this.applyCssClass && this.element) {
- this.element.classList.remove(this.applyCssClass);
- }
- this.clickDownPosition = null;
- this.clickStartTime = null;
- this.cancelled = true;
- fastArrayDeleteValueIfContained(ongoingClickDetectors, this);
- }
-
- /**
- * Internal pointer down handler
- * @param {TouchEvent|MouseEvent} event
- */
- internalOnPointerDown(event) {
- window.focus();
-
- if (!this.internalEventPreHandler(event, 1)) {
- return false;
- }
-
- const position = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
-
- if (event instanceof MouseEvent) {
- const isRightClick = event.button === 2;
- if (isRightClick) {
- // Ignore right clicks
- this.rightClick.dispatch(position, event);
- this.cancelled = true;
- this.clickDownPosition = null;
- return;
- }
- }
-
- if (this.clickDownPosition) {
- logger.warn("Ignoring double click");
- return false;
- }
-
- this.cancelled = false;
- this.touchstart.dispatch(event);
-
- // Store where the touch started
- this.clickDownPosition = position;
- this.clickStartTime = performance.now();
- this.touchstartSimple.dispatch(this.clickDownPosition.x, this.clickDownPosition.y);
-
- // If we are not currently within a click, register it
- if (ongoingClickDetectors.indexOf(this) < 0) {
- ongoingClickDetectors.push(this);
- } else {
- logger.warn("Click detector got pointer down of active pointer twice");
- }
-
- // If we should apply any classes, do this now
- if (this.applyCssClass) {
- this.element.classList.add(this.applyCssClass);
- }
-
- // If we should play any sound, do this
- if (this.clickSound) {
- GLOBAL_APP.sound.playUiSound(this.clickSound);
- }
-
- return false;
- }
-
- /**
- * Internal pointer move handler
- * @param {TouchEvent|MouseEvent} event
- */
- internalOnPointerMove(event) {
- if (!this.internalEventPreHandler(event, 1)) {
- return false;
- }
- this.touchmove.dispatch(event);
- const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
- this.touchmoveSimple.dispatch(pos.x, pos.y);
- return false;
- }
-
- /**
- * Internal pointer end handler
- * @param {TouchEvent|MouseEvent} event
- */
- internalOnPointerEnd(event) {
- window.focus();
-
- if (!this.internalEventPreHandler(event, 0)) {
- return false;
- }
-
- if (this.cancelled) {
- // warn(this, "Not dispatching touchend on cancelled listener");
- return false;
- }
-
- if (event instanceof MouseEvent) {
- const isRightClick = event.button === 2;
- if (isRightClick) {
- return;
- }
- }
-
- const index = ongoingClickDetectors.indexOf(this);
- if (index < 0) {
- logger.warn("Got pointer end but click detector is not in pressed state");
- } else {
- fastArrayDelete(ongoingClickDetectors, index);
- }
-
- let dispatchClick = false;
- let dispatchClickPos = null;
-
- // Check for correct down position, otherwise must have pinched or so
- if (this.clickDownPosition) {
- const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
- const distance = pos.distance(this.clickDownPosition);
- if (!IS_MOBILE || distance <= this.maxDistance) {
- dispatchClick = true;
- dispatchClickPos = pos;
- } else {
- console.warn("[ClickDetector] Touch does not count as click:", "(was", distance, ")");
- }
- }
-
- this.clickDownPosition = null;
- this.clickStartTime = null;
-
- if (this.applyCssClass) {
- this.element.classList.remove(this.applyCssClass);
- }
-
- // Dispatch in the end to avoid the element getting invalidated
- // Also make sure that the element is still in the dom
- if (this.internalIsDomElementAttached()) {
- this.touchend.dispatch(event);
- this.touchendSimple.dispatch();
-
- if (dispatchClick) {
- const detectors = ongoingClickDetectors.slice();
- for (let i = 0; i < detectors.length; ++i) {
- detectors[i].cancelOngoingEvents();
- }
- this.click.dispatch(dispatchClickPos, event);
- }
- }
- return false;
- }
-
- /**
- * Internal touch cancel handler
- * @param {TouchEvent|MouseEvent} event
- */
- internalOnTouchCancel(event) {
- if (!this.internalEventPreHandler(event, 0)) {
- return false;
- }
-
- if (this.cancelled) {
- // warn(this, "Not dispatching touchcancel on cancelled listener");
- return false;
- }
-
- this.cancelOngoingEvents();
- this.touchcancel.dispatch(event);
- this.touchendSimple.dispatch(event);
- return false;
- }
-}
+import { createLogger } from "../core/logging";
+import { Signal } from "../core/signal";
+import { fastArrayDelete, fastArrayDeleteValueIfContained } from "./utils";
+import { Vector } from "./vector";
+import { IS_MOBILE, SUPPORT_TOUCH } from "./config";
+import { SOUNDS } from "../platform/sound";
+import { GLOBAL_APP } from "./globals";
+
+const logger = createLogger("click_detector");
+
+export const MAX_MOVE_DISTANCE_PX = IS_MOBILE ? 20 : 80;
+
+// For debugging
+const registerClickDetectors = G_IS_DEV && true;
+if (registerClickDetectors) {
+ /** @type {Array} */
+ window.activeClickDetectors = [];
+}
+
+// Store active click detectors so we can cancel them
+/** @type {Array} */
+const ongoingClickDetectors = [];
+
+// Store when the last touch event was registered, to avoid accepting a touch *and* a click event
+
+export let clickDetectorGlobals = {
+ lastTouchTime: -1000,
+};
+
+/**
+ * Click detector creation payload typehints
+ * @typedef {{
+ * consumeEvents?: boolean,
+ * preventDefault?: boolean,
+ * applyCssClass?: string,
+ * captureTouchmove?: boolean,
+ * targetOnly?: boolean,
+ * maxDistance?: number,
+ * clickSound?: string,
+ * preventClick?: boolean,
+ * }} ClickDetectorConstructorArgs
+ */
+
+// Detects clicks
+export class ClickDetector {
+ /**
+ *
+ * @param {Element} element
+ * @param {object} param1
+ * @param {boolean=} param1.consumeEvents Whether to call stopPropagation
+ * (Useful for nested elements where the parent has a click handler as wel)
+ * @param {boolean=} param1.preventDefault Whether to call preventDefault (Usually makes the handler faster)
+ * @param {string=} param1.applyCssClass The css class to add while the element is pressed
+ * @param {boolean=} param1.captureTouchmove Whether to capture touchmove events as well
+ * @param {boolean=} param1.targetOnly Whether to also accept clicks on child elements (e.target !== element)
+ * @param {number=} param1.maxDistance The maximum distance in pixels to accept clicks
+ * @param {string=} param1.clickSound Sound key to play on touchdown
+ * @param {boolean=} param1.preventClick Whether to prevent click events
+ */
+ constructor(
+ element,
+ {
+ consumeEvents = false,
+ preventDefault = true,
+ applyCssClass = "pressed",
+ captureTouchmove = false,
+ targetOnly = false,
+ maxDistance = MAX_MOVE_DISTANCE_PX,
+ clickSound = SOUNDS.uiClick,
+ preventClick = false,
+ }
+ ) {
+ assert(element, "No element given!");
+ this.clickDownPosition = null;
+
+ this.consumeEvents = consumeEvents;
+ this.preventDefault = preventDefault;
+ this.applyCssClass = applyCssClass;
+ this.captureTouchmove = captureTouchmove;
+ this.targetOnly = targetOnly;
+ this.clickSound = clickSound;
+ this.maxDistance = maxDistance;
+ this.preventClick = preventClick;
+
+ // Signals
+ this.click = new Signal();
+ this.rightClick = new Signal();
+ this.touchstart = new Signal();
+ this.touchmove = new Signal();
+ this.touchend = new Signal();
+ this.touchcancel = new Signal();
+
+ // Simple signals which just receive the touch position
+ this.touchstartSimple = new Signal();
+ this.touchmoveSimple = new Signal();
+ this.touchendSimple = new Signal();
+
+ // Store time of touch start
+ this.clickStartTime = null;
+
+ // A click can be cancelled if another detector registers a click
+ this.cancelled = false;
+
+ this.internalBindTo(/** @type {HTMLElement} */ (element));
+ }
+
+ /**
+ * Cleans up all event listeners of this detector
+ */
+ cleanup() {
+ if (this.element) {
+ if (registerClickDetectors) {
+ const index = window.activeClickDetectors.indexOf(this);
+ if (index < 0) {
+ logger.error("Click detector cleanup but is not active");
+ } else {
+ window.activeClickDetectors.splice(index, 1);
+ }
+ }
+ const options = this.internalGetEventListenerOptions();
+
+ if (SUPPORT_TOUCH) {
+ this.element.removeEventListener("touchstart", this.handlerTouchStart, options);
+ this.element.removeEventListener("touchend", this.handlerTouchEnd, options);
+ this.element.removeEventListener("touchcancel", this.handlerTouchCancel, options);
+ }
+
+ this.element.removeEventListener("mouseup", this.handlerTouchStart, options);
+ this.element.removeEventListener("mousedown", this.handlerTouchEnd, options);
+ this.element.removeEventListener("mouseout", this.handlerTouchCancel, options);
+
+ if (this.captureTouchmove) {
+ if (SUPPORT_TOUCH) {
+ this.element.removeEventListener("touchmove", this.handlerTouchMove, options);
+ }
+ this.element.removeEventListener("mousemove", this.handlerTouchMove, options);
+ }
+
+ if (this.preventClick) {
+ this.element.removeEventListener("click", this.handlerPreventClick, options);
+ }
+
+ this.click.removeAll();
+ this.touchstart.removeAll();
+ this.touchmove.removeAll();
+ this.touchend.removeAll();
+ this.touchcancel.removeAll();
+
+ this.element = null;
+ }
+ }
+
+ // INTERNAL METHODS
+
+ /**
+ *
+ * @param {Event} event
+ */
+ internalPreventClick(event) {
+ window.focus();
+ event.preventDefault();
+ }
+
+ /**
+ * Internal method to get the options to pass to an event listener
+ */
+ internalGetEventListenerOptions() {
+ return {
+ capture: this.consumeEvents,
+ passive: !this.preventDefault,
+ };
+ }
+
+ /**
+ * Binds the click detector to an element
+ * @param {HTMLElement} element
+ */
+ internalBindTo(element) {
+ const options = this.internalGetEventListenerOptions();
+
+ this.handlerTouchStart = this.internalOnPointerDown.bind(this);
+ this.handlerTouchEnd = this.internalOnPointerEnd.bind(this);
+ this.handlerTouchMove = this.internalOnPointerMove.bind(this);
+ this.handlerTouchCancel = this.internalOnTouchCancel.bind(this);
+
+ if (this.preventClick) {
+ this.handlerPreventClick = this.internalPreventClick.bind(this);
+ element.addEventListener("click", this.handlerPreventClick, options);
+ }
+
+ if (SUPPORT_TOUCH) {
+ element.addEventListener("touchstart", this.handlerTouchStart, options);
+ element.addEventListener("touchend", this.handlerTouchEnd, options);
+ element.addEventListener("touchcancel", this.handlerTouchCancel, options);
+ }
+
+ element.addEventListener("mousedown", this.handlerTouchStart, options);
+ element.addEventListener("mouseup", this.handlerTouchEnd, options);
+ element.addEventListener("mouseout", this.handlerTouchCancel, options);
+
+ if (this.captureTouchmove) {
+ if (SUPPORT_TOUCH) {
+ element.addEventListener("touchmove", this.handlerTouchMove, options);
+ }
+ element.addEventListener("mousemove", this.handlerTouchMove, options);
+ }
+
+ if (registerClickDetectors) {
+ window.activeClickDetectors.push(this);
+ }
+ this.element = element;
+ }
+
+ /**
+ * Returns if the bound element is currently in the DOM.
+ */
+ internalIsDomElementAttached() {
+ return this.element && document.documentElement.contains(this.element);
+ }
+
+ /**
+ * Checks if the given event is relevant for this detector
+ * @param {TouchEvent|MouseEvent} event
+ */
+ internalEventPreHandler(event, expectedRemainingTouches = 1) {
+ if (!this.element) {
+ // Already cleaned up
+ return false;
+ }
+
+ if (this.targetOnly && event.target !== this.element) {
+ // Clicked a child element
+ return false;
+ }
+
+ // Stop any propagation and defaults if configured
+ if (this.consumeEvents && event.cancelable) {
+ event.stopPropagation();
+ }
+
+ if (this.preventDefault && event.cancelable) {
+ event.preventDefault();
+ }
+
+ if (window.TouchEvent && event instanceof TouchEvent) {
+ clickDetectorGlobals.lastTouchTime = performance.now();
+
+ // console.log("Got touches", event.targetTouches.length, "vs", expectedRemainingTouches);
+ if (event.targetTouches.length !== expectedRemainingTouches) {
+ return false;
+ }
+ }
+
+ if (event instanceof MouseEvent) {
+ if (performance.now() - clickDetectorGlobals.lastTouchTime < 1000.0) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Extracts the mous position from an event
+ * @param {TouchEvent|MouseEvent} event
+ * @returns {Vector} The client space position
+ */
+ static extractPointerPosition(event) {
+ if (window.TouchEvent && event instanceof TouchEvent) {
+ if (event.changedTouches.length !== 1) {
+ logger.warn(
+ "Got unexpected target touches:",
+ event.targetTouches.length,
+ "->",
+ event.targetTouches
+ );
+ return new Vector(0, 0);
+ }
+
+ const touch = event.changedTouches[0];
+ return new Vector(touch.clientX, touch.clientY);
+ }
+
+ if (event instanceof MouseEvent) {
+ return new Vector(event.clientX, event.clientY);
+ }
+
+ assertAlways(false, "Got unknown event: " + event);
+
+ return new Vector(0, 0);
+ }
+
+ /**
+ * Cacnels all ongoing events on this detector
+ */
+ cancelOngoingEvents() {
+ if (this.applyCssClass && this.element) {
+ this.element.classList.remove(this.applyCssClass);
+ }
+ this.clickDownPosition = null;
+ this.clickStartTime = null;
+ this.cancelled = true;
+ fastArrayDeleteValueIfContained(ongoingClickDetectors, this);
+ }
+
+ /**
+ * Internal pointer down handler
+ * @param {TouchEvent|MouseEvent} event
+ */
+ internalOnPointerDown(event) {
+ window.focus();
+
+ if (!this.internalEventPreHandler(event, 1)) {
+ return false;
+ }
+
+ const position = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
+
+ if (event instanceof MouseEvent) {
+ const isRightClick = event.button === 2;
+ if (isRightClick) {
+ // Ignore right clicks
+ this.rightClick.dispatch(position, event);
+ this.cancelled = true;
+ this.clickDownPosition = null;
+ return;
+ }
+ }
+
+ if (this.clickDownPosition) {
+ logger.warn("Ignoring double click");
+ return false;
+ }
+
+ this.cancelled = false;
+ this.touchstart.dispatch(event);
+
+ // Store where the touch started
+ this.clickDownPosition = position;
+ this.clickStartTime = performance.now();
+ this.touchstartSimple.dispatch(this.clickDownPosition.x, this.clickDownPosition.y);
+
+ // If we are not currently within a click, register it
+ if (ongoingClickDetectors.indexOf(this) < 0) {
+ ongoingClickDetectors.push(this);
+ } else {
+ logger.warn("Click detector got pointer down of active pointer twice");
+ }
+
+ // If we should apply any classes, do this now
+ if (this.applyCssClass) {
+ this.element.classList.add(this.applyCssClass);
+ }
+
+ // If we should play any sound, do this
+ if (this.clickSound) {
+ GLOBAL_APP.sound.playUiSound(this.clickSound);
+ }
+
+ return false;
+ }
+
+ /**
+ * Internal pointer move handler
+ * @param {TouchEvent|MouseEvent} event
+ */
+ internalOnPointerMove(event) {
+ if (!this.internalEventPreHandler(event, 1)) {
+ return false;
+ }
+ this.touchmove.dispatch(event);
+ const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
+ this.touchmoveSimple.dispatch(pos.x, pos.y);
+ return false;
+ }
+
+ /**
+ * Internal pointer end handler
+ * @param {TouchEvent|MouseEvent} event
+ */
+ internalOnPointerEnd(event) {
+ window.focus();
+
+ if (!this.internalEventPreHandler(event, 0)) {
+ return false;
+ }
+
+ if (this.cancelled) {
+ // warn(this, "Not dispatching touchend on cancelled listener");
+ return false;
+ }
+
+ if (event instanceof MouseEvent) {
+ const isRightClick = event.button === 2;
+ if (isRightClick) {
+ return;
+ }
+ }
+
+ const index = ongoingClickDetectors.indexOf(this);
+ if (index < 0) {
+ logger.warn("Got pointer end but click detector is not in pressed state");
+ } else {
+ fastArrayDelete(ongoingClickDetectors, index);
+ }
+
+ let dispatchClick = false;
+ let dispatchClickPos = null;
+
+ // Check for correct down position, otherwise must have pinched or so
+ if (this.clickDownPosition) {
+ const pos = /** @type {typeof ClickDetector} */ (this.constructor).extractPointerPosition(event);
+ const distance = pos.distance(this.clickDownPosition);
+ if (!IS_MOBILE || distance <= this.maxDistance) {
+ dispatchClick = true;
+ dispatchClickPos = pos;
+ } else {
+ console.warn("[ClickDetector] Touch does not count as click:", "(was", distance, ")");
+ }
+ }
+
+ this.clickDownPosition = null;
+ this.clickStartTime = null;
+
+ if (this.applyCssClass) {
+ this.element.classList.remove(this.applyCssClass);
+ }
+
+ // Dispatch in the end to avoid the element getting invalidated
+ // Also make sure that the element is still in the dom
+ if (this.internalIsDomElementAttached()) {
+ this.touchend.dispatch(event);
+ this.touchendSimple.dispatch();
+
+ if (dispatchClick) {
+ const detectors = ongoingClickDetectors.slice();
+ for (let i = 0; i < detectors.length; ++i) {
+ detectors[i].cancelOngoingEvents();
+ }
+ this.click.dispatch(dispatchClickPos, event);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Internal touch cancel handler
+ * @param {TouchEvent|MouseEvent} event
+ */
+ internalOnTouchCancel(event) {
+ if (!this.internalEventPreHandler(event, 0)) {
+ return false;
+ }
+
+ if (this.cancelled) {
+ // warn(this, "Not dispatching touchcancel on cancelled listener");
+ return false;
+ }
+
+ this.cancelOngoingEvents();
+ this.touchcancel.dispatch(event);
+ this.touchendSimple.dispatch(event);
+ return false;
+ }
+}
diff --git a/src/js/core/config.js b/src/js/core/config.js
index a6d6ed63..4169a0c2 100644
--- a/src/js/core/config.js
+++ b/src/js/core/config.js
@@ -1,5 +1,3 @@
-import { queryParamOptions } from "./query_parameters";
-
export const IS_DEBUG =
G_IS_DEV &&
typeof window !== "undefined" &&
@@ -7,23 +5,30 @@ export const IS_DEBUG =
(window.location.host.indexOf("localhost:") >= 0 || window.location.host.indexOf("192.168.0.") >= 0) &&
window.location.search.indexOf("nodebug") < 0;
-export const IS_DEMO = queryParamOptions.fullVersion
- ? false
- : (!G_IS_DEV && !G_IS_STANDALONE) ||
- (typeof window !== "undefined" && window.location.search.indexOf("demo") >= 0);
-
export const SUPPORT_TOUCH = false;
+export const IS_MAC = navigator.platform.toLowerCase().indexOf("mac") >= 0;
+
const smoothCanvas = true;
export const THIRDPARTY_URLS = {
discord: "https://discord.gg/HN7EVzV",
github: "https://github.com/tobspr/shapez.io",
reddit: "https://www.reddit.com/r/shapezio",
+ shapeViewer: "https://viewer.shapez.io",
standaloneStorePage: "https://store.steampowered.com/app/1318690/shapezio/",
+
+ levelTutorialVideos: {
+ 21: "https://www.youtube.com/watch?v=0nUfRLMCcgo&",
+ 25: "https://www.youtube.com/watch?v=7OCV1g40Iew&",
+ 26: "https://www.youtube.com/watch?v=gfm6dS1dCoY",
+ },
};
+// export const A_B_TESTING_LINK_TYPE = Math.random() > 0.95 ? "steam_1_pr" : "steam_2_npr";
+export const A_B_TESTING_LINK_TYPE = "steam_2_npr";
+
export const globalConfig = {
// Size of a single tile in Pixels.
// NOTICE: Update webpack.production.config too!
@@ -61,19 +66,19 @@ export const globalConfig = {
undergroundBeltMaxTilesByTier: [5, 9],
- readerAnalyzeIntervalSeconds: G_IS_DEV ? 3 : 10,
+ readerAnalyzeIntervalSeconds: 10,
buildingSpeeds: {
cutter: 1 / 4,
cutterQuad: 1 / 4,
rotater: 1 / 1,
rotaterCCW: 1 / 1,
- rotaterFL: 1 / 1,
+ rotater180: 1 / 1,
painter: 1 / 6,
painterDouble: 1 / 8,
- painterQuad: 1 / 8,
+ painterQuad: 1 / 2,
mixer: 1 / 5,
- stacker: 1 / 6,
+ stacker: 1 / 8,
},
// Zooming
@@ -84,8 +89,8 @@ export const globalConfig = {
// Global game speed
gameSpeed: 1,
- warmupTimeSecondsFast: 0.1,
- warmupTimeSecondsRegular: 1,
+ warmupTimeSecondsFast: 0.5,
+ warmupTimeSecondsRegular: 3,
smoothing: {
smoothMainCanvas: smoothCanvas && true,
@@ -132,5 +137,10 @@ if (G_IS_DEV && globalConfig.debug.renderForTrailer) {
}
if (globalConfig.debug.fastGameEnter) {
- globalConfig.debug.noArtificalDelays = true;
+ globalConfig.debug.noArtificialDelays = true;
+}
+
+if (G_IS_DEV && globalConfig.debug.noArtificialDelays) {
+ globalConfig.warmupTimeSecondsFast = 0;
+ globalConfig.warmupTimeSecondsRegular = 0;
}
diff --git a/src/js/core/config.local.js b/src/js/core/config.local.js
index b75c5650..87aaaa14 100644
--- a/src/js/core/config.local.js
+++ b/src/js/core/config.local.js
@@ -26,9 +26,6 @@ export default {
// Allow to zoom freely without limits
// disableZoomLimits: true,
// -----------------------------------------------------------------------------------
- // Shows a border arround every chunk
- // showChunkBorders: true,
- // -----------------------------------------------------------------------------------
// All rewards can be unlocked by passing just 1 of any shape
// rewardsInstant: true,
// -----------------------------------------------------------------------------------
@@ -110,5 +107,8 @@ export default {
// Allows manual ticking
// manualTickOnly: true,
// -----------------------------------------------------------------------------------
+ // Disables slow asserts, useful for debugging performance
+ // disableSlowAsserts: true,
+ // -----------------------------------------------------------------------------------
/* dev:end */
};
diff --git a/src/js/core/dpi_manager.js b/src/js/core/dpi_manager.js
index b944d155..4fb792c0 100644
--- a/src/js/core/dpi_manager.js
+++ b/src/js/core/dpi_manager.js
@@ -15,14 +15,16 @@ export function getDeviceDPI() {
* @returns {number} Smoothed dpi
*/
export function smoothenDpi(dpi) {
- if (dpi < 0.02) {
- return 0.02;
- } else if (dpi < 0.1) {
- return round2Digits(dpi);
+ if (dpi < 0.05) {
+ return 0.05;
+ } else if (dpi < 0.2) {
+ return round2Digits(Math.round(dpi / 0.04) * 0.04);
} else if (dpi < 1) {
- return round1Digit(dpi);
- } else {
+ return round1Digit(Math.round(dpi / 0.1) * 0.1);
+ } else if (dpi < 4) {
return round1Digit(Math.round(dpi / 0.5) * 0.5);
+ } else {
+ return 4;
}
}
diff --git a/src/js/core/draw_parameters.js b/src/js/core/draw_parameters.js
index 71971ed1..95e71bf2 100644
--- a/src/js/core/draw_parameters.js
+++ b/src/js/core/draw_parameters.js
@@ -1,26 +1,25 @@
-import { globalConfig } from "./config";
-
-/**
- * @typedef {import("../game/root").GameRoot} GameRoot
- * @typedef {import("./rectangle").Rectangle} Rectangle
- */
-
-export class DrawParameters {
- constructor({ context, visibleRect, desiredAtlasScale, zoomLevel, root }) {
- /** @type {CanvasRenderingContext2D} */
- this.context = context;
-
- /** @type {Rectangle} */
- this.visibleRect = visibleRect;
-
- /** @type {string} */
- this.desiredAtlasScale = desiredAtlasScale;
-
- /** @type {number} */
- this.zoomLevel = zoomLevel;
-
- // FIXME: Not really nice
- /** @type {GameRoot} */
- this.root = root;
- }
-}
+import { globalConfig } from "./config";
+
+/**
+ * @typedef {import("../game/root").GameRoot} GameRoot
+ * @typedef {import("./rectangle").Rectangle} Rectangle
+ */
+
+export class DrawParameters {
+ constructor({ context, visibleRect, desiredAtlasScale, zoomLevel, root }) {
+ /** @type {CanvasRenderingContext2D} */
+ this.context = context;
+
+ /** @type {Rectangle} */
+ this.visibleRect = visibleRect;
+
+ /** @type {string} */
+ this.desiredAtlasScale = desiredAtlasScale;
+
+ /** @type {number} */
+ this.zoomLevel = zoomLevel;
+
+ /** @type {GameRoot} */
+ this.root = root;
+ }
+}
diff --git a/src/js/core/loader.js b/src/js/core/loader.js
index d7f544e3..cadbc048 100644
--- a/src/js/core/loader.js
+++ b/src/js/core/loader.js
@@ -1,230 +1,230 @@
-import { makeOffscreenBuffer } from "./buffer_utils";
-import { AtlasSprite, BaseSprite, RegularSprite, SpriteAtlasLink } from "./sprites";
-import { cachebust } from "./cachebust";
-import { createLogger } from "./logging";
-
-/**
- * @typedef {import("../application").Application} Application
- * @typedef {import("./atlas_definitions").AtlasDefinition} AtlasDefinition;
- */
-
-const logger = createLogger("loader");
-
-const missingSpriteIds = {};
-
-class LoaderImpl {
- constructor() {
- this.app = null;
-
- /** @type {Map} */
- this.sprites = new Map();
-
- this.rawImages = [];
- }
-
- /**
- * @param {Application} app
- */
- linkAppAfterBoot(app) {
- this.app = app;
- this.makeSpriteNotFoundCanvas();
- }
-
- /**
- * Fetches a given sprite from the cache
- * @param {string} key
- * @returns {BaseSprite}
- */
- getSpriteInternal(key) {
- const sprite = this.sprites.get(key);
- if (!sprite) {
- if (!missingSpriteIds[key]) {
- // Only show error once
- missingSpriteIds[key] = true;
- logger.error("Sprite '" + key + "' not found!");
- }
- return this.spriteNotFoundSprite;
- }
- return sprite;
- }
-
- /**
- * Returns an atlas sprite from the cache
- * @param {string} key
- * @returns {AtlasSprite}
- */
- getSprite(key) {
- const sprite = this.getSpriteInternal(key);
- assert(sprite instanceof AtlasSprite || sprite === this.spriteNotFoundSprite, "Not an atlas sprite");
- return /** @type {AtlasSprite} */ (sprite);
- }
-
- /**
- * Returns a regular sprite from the cache
- * @param {string} key
- * @returns {RegularSprite}
- */
- getRegularSprite(key) {
- const sprite = this.getSpriteInternal(key);
- assert(
- sprite instanceof RegularSprite || sprite === this.spriteNotFoundSprite,
- "Not a regular sprite"
- );
- return /** @type {RegularSprite} */ (sprite);
- }
-
- /**
- *
- * @param {string} key
- * @returns {Promise}
- */
- internalPreloadImage(key) {
- const url = cachebust("res/" + key);
- const image = new Image();
-
- let triesSoFar = 0;
-
- return Promise.race([
- new Promise((resolve, reject) => {
- setTimeout(reject, G_IS_DEV ? 500 : 10000);
- }),
-
- new Promise(resolve => {
- image.onload = () => {
- image.onerror = null;
- image.onload = null;
-
- if (typeof image.decode === "function") {
- // SAFARI: Image.decode() fails on safari with svgs -> we dont want to fail
- // on that
- // FIREFOX: Decode never returns if the image is in cache, so call it in background
- image.decode().then(
- () => null,
- () => null
- );
- }
- resolve(image);
- };
-
- image.onerror = reason => {
- logger.warn("Failed to load '" + url + "':", reason);
- if (++triesSoFar < 4) {
- logger.log("Retrying to load image from", url);
- image.src = url + "?try=" + triesSoFar;
- } else {
- logger.warn("Failed to load", url, "after", triesSoFar, "tries with reason", reason);
- image.onerror = null;
- image.onload = null;
- resolve(null);
- }
- };
-
- image.src = url;
- }),
- ]);
- }
-
- /**
- * Preloads a sprite
- * @param {string} key
- * @returns {Promise}
- */
- preloadCSSSprite(key) {
- return this.internalPreloadImage(key).then(image => {
- if (key.indexOf("game_misc") >= 0) {
- // Allow access to regular sprites
- this.sprites.set(key, new RegularSprite(image, image.width, image.height));
- }
- this.rawImages.push(image);
- });
- }
-
- /**
- * Preloads an atlas
- * @param {AtlasDefinition} atlas
- * @returns {Promise}
- */
- preloadAtlas(atlas) {
- return this.internalPreloadImage(atlas.getFullSourcePath()).then(image => {
- // @ts-ignore
- image.label = atlas.sourceFileName;
- return this.internalParseAtlas(atlas, image);
- });
- }
-
- /**
- *
- * @param {AtlasDefinition} atlas
- * @param {HTMLImageElement} loadedImage
- */
- internalParseAtlas({ meta: { scale }, sourceData }, loadedImage) {
- this.rawImages.push(loadedImage);
-
- for (const spriteName in sourceData) {
- const { frame, sourceSize, spriteSourceSize } = sourceData[spriteName];
-
- let sprite = /** @type {AtlasSprite} */ (this.sprites.get(spriteName));
-
- if (!sprite) {
- sprite = new AtlasSprite(spriteName);
- this.sprites.set(spriteName, sprite);
- }
-
- const link = new SpriteAtlasLink({
- packedX: frame.x,
- packedY: frame.y,
- packedW: frame.w,
- packedH: frame.h,
- packOffsetX: spriteSourceSize.x,
- packOffsetY: spriteSourceSize.y,
- atlas: loadedImage,
- w: sourceSize.w,
- h: sourceSize.h,
- });
- sprite.linksByResolution[scale] = link;
- }
- }
-
- /**
- * Makes the canvas which shows the question mark, shown when a sprite was not found
- */
- makeSpriteNotFoundCanvas() {
- const dims = 128;
-
- const [canvas, context] = makeOffscreenBuffer(dims, dims, {
- smooth: false,
- label: "not-found-sprite",
- });
- context.fillStyle = "#f77";
- context.fillRect(0, 0, dims, dims);
-
- context.textAlign = "center";
- context.textBaseline = "middle";
- context.fillStyle = "#eee";
- context.font = "25px Arial";
- context.fillText("???", dims / 2, dims / 2);
-
- // TODO: Not sure why this is set here
- // @ts-ignore
- canvas.src = "not-found";
-
- const sprite = new AtlasSprite("not-found");
- ["0.1", "0.25", "0.5", "0.75", "1"].forEach(resolution => {
- sprite.linksByResolution[resolution] = new SpriteAtlasLink({
- packedX: 0,
- packedY: 0,
- w: dims,
- h: dims,
- packOffsetX: 0,
- packOffsetY: 0,
- packedW: dims,
- packedH: dims,
- atlas: canvas,
- });
- });
-
- this.spriteNotFoundSprite = sprite;
- }
-}
-
-export const Loader = new LoaderImpl();
+import { makeOffscreenBuffer } from "./buffer_utils";
+import { AtlasSprite, BaseSprite, RegularSprite, SpriteAtlasLink } from "./sprites";
+import { cachebust } from "./cachebust";
+import { createLogger } from "./logging";
+
+/**
+ * @typedef {import("../application").Application} Application
+ * @typedef {import("./atlas_definitions").AtlasDefinition} AtlasDefinition;
+ */
+
+const logger = createLogger("loader");
+
+const missingSpriteIds = {};
+
+class LoaderImpl {
+ constructor() {
+ this.app = null;
+
+ /** @type {Map} */
+ this.sprites = new Map();
+
+ this.rawImages = [];
+ }
+
+ /**
+ * @param {Application} app
+ */
+ linkAppAfterBoot(app) {
+ this.app = app;
+ this.makeSpriteNotFoundCanvas();
+ }
+
+ /**
+ * Fetches a given sprite from the cache
+ * @param {string} key
+ * @returns {BaseSprite}
+ */
+ getSpriteInternal(key) {
+ const sprite = this.sprites.get(key);
+ if (!sprite) {
+ if (!missingSpriteIds[key]) {
+ // Only show error once
+ missingSpriteIds[key] = true;
+ logger.error("Sprite '" + key + "' not found!");
+ }
+ return this.spriteNotFoundSprite;
+ }
+ return sprite;
+ }
+
+ /**
+ * Returns an atlas sprite from the cache
+ * @param {string} key
+ * @returns {AtlasSprite}
+ */
+ getSprite(key) {
+ const sprite = this.getSpriteInternal(key);
+ assert(sprite instanceof AtlasSprite || sprite === this.spriteNotFoundSprite, "Not an atlas sprite");
+ return /** @type {AtlasSprite} */ (sprite);
+ }
+
+ /**
+ * Returns a regular sprite from the cache
+ * @param {string} key
+ * @returns {RegularSprite}
+ */
+ getRegularSprite(key) {
+ const sprite = this.getSpriteInternal(key);
+ assert(
+ sprite instanceof RegularSprite || sprite === this.spriteNotFoundSprite,
+ "Not a regular sprite"
+ );
+ return /** @type {RegularSprite} */ (sprite);
+ }
+
+ /**
+ *
+ * @param {string} key
+ * @returns {Promise}
+ */
+ internalPreloadImage(key) {
+ const url = cachebust("res/" + key);
+ const image = new Image();
+
+ let triesSoFar = 0;
+
+ return Promise.race([
+ new Promise((resolve, reject) => {
+ setTimeout(reject, G_IS_DEV ? 500 : 10000);
+ }),
+
+ new Promise(resolve => {
+ image.onload = () => {
+ image.onerror = null;
+ image.onload = null;
+
+ if (typeof image.decode === "function") {
+ // SAFARI: Image.decode() fails on safari with svgs -> we dont want to fail
+ // on that
+ // FIREFOX: Decode never returns if the image is in cache, so call it in background
+ image.decode().then(
+ () => null,
+ () => null
+ );
+ }
+ resolve(image);
+ };
+
+ image.onerror = reason => {
+ logger.warn("Failed to load '" + url + "':", reason);
+ if (++triesSoFar < 4) {
+ logger.log("Retrying to load image from", url);
+ image.src = url + "?try=" + triesSoFar;
+ } else {
+ logger.warn("Failed to load", url, "after", triesSoFar, "tries with reason", reason);
+ image.onerror = null;
+ image.onload = null;
+ resolve(null);
+ }
+ };
+
+ image.src = url;
+ }),
+ ]);
+ }
+
+ /**
+ * Preloads a sprite
+ * @param {string} key
+ * @returns {Promise}
+ */
+ preloadCSSSprite(key) {
+ return this.internalPreloadImage(key).then(image => {
+ if (key.indexOf("game_misc") >= 0) {
+ // Allow access to regular sprites
+ this.sprites.set(key, new RegularSprite(image, image.width, image.height));
+ }
+ this.rawImages.push(image);
+ });
+ }
+
+ /**
+ * Preloads an atlas
+ * @param {AtlasDefinition} atlas
+ * @returns {Promise}
+ */
+ preloadAtlas(atlas) {
+ return this.internalPreloadImage(atlas.getFullSourcePath()).then(image => {
+ // @ts-ignore
+ image.label = atlas.sourceFileName;
+ return this.internalParseAtlas(atlas, image);
+ });
+ }
+
+ /**
+ *
+ * @param {AtlasDefinition} atlas
+ * @param {HTMLImageElement} loadedImage
+ */
+ internalParseAtlas({ meta: { scale }, sourceData }, loadedImage) {
+ this.rawImages.push(loadedImage);
+
+ for (const spriteName in sourceData) {
+ const { frame, sourceSize, spriteSourceSize } = sourceData[spriteName];
+
+ let sprite = /** @type {AtlasSprite} */ (this.sprites.get(spriteName));
+
+ if (!sprite) {
+ sprite = new AtlasSprite(spriteName);
+ this.sprites.set(spriteName, sprite);
+ }
+
+ const link = new SpriteAtlasLink({
+ packedX: frame.x,
+ packedY: frame.y,
+ packedW: frame.w,
+ packedH: frame.h,
+ packOffsetX: spriteSourceSize.x,
+ packOffsetY: spriteSourceSize.y,
+ atlas: loadedImage,
+ w: sourceSize.w,
+ h: sourceSize.h,
+ });
+ sprite.linksByResolution[scale] = link;
+ }
+ }
+
+ /**
+ * Makes the canvas which shows the question mark, shown when a sprite was not found
+ */
+ makeSpriteNotFoundCanvas() {
+ const dims = 128;
+
+ const [canvas, context] = makeOffscreenBuffer(dims, dims, {
+ smooth: false,
+ label: "not-found-sprite",
+ });
+ context.fillStyle = "#f77";
+ context.fillRect(0, 0, dims, dims);
+
+ context.textAlign = "center";
+ context.textBaseline = "middle";
+ context.fillStyle = "#eee";
+ context.font = "25px Arial";
+ context.fillText("???", dims / 2, dims / 2);
+
+ // TODO: Not sure why this is set here
+ // @ts-ignore
+ canvas.src = "not-found";
+
+ const sprite = new AtlasSprite("not-found");
+ ["0.1", "0.25", "0.5", "0.75", "1"].forEach(resolution => {
+ sprite.linksByResolution[resolution] = new SpriteAtlasLink({
+ packedX: 0,
+ packedY: 0,
+ w: dims,
+ h: dims,
+ packOffsetX: 0,
+ packOffsetY: 0,
+ packedW: dims,
+ packedH: dims,
+ atlas: canvas,
+ });
+ });
+
+ this.spriteNotFoundSprite = sprite;
+ }
+}
+
+export const Loader = new LoaderImpl();
diff --git a/src/js/core/modal_dialog_elements.js b/src/js/core/modal_dialog_elements.js
index 54b69402..5f0ed59f 100644
--- a/src/js/core/modal_dialog_elements.js
+++ b/src/js/core/modal_dialog_elements.js
@@ -13,6 +13,17 @@ import { getStringForKeyCode } from "../game/key_action_mapper";
import { createLogger } from "./logging";
import { T } from "../translations";
+/*
+ * ***************************************************
+ *
+ * LEGACY CODE WARNING
+ *
+ * This is old code from yorg3.io and needs to be refactored
+ * @TODO
+ *
+ * ***************************************************
+ */
+
const kbEnter = 13;
const kbCancel = 27;
@@ -30,10 +41,10 @@ export class Dialog {
* @param {string} param0.title Title of the dialog
* @param {string} param0.contentHTML Inner dialog html
* @param {Array} param0.buttons
- * Button list, each button contains of up to 3 parts seperated by ':'.
+ * Button list, each button contains of up to 3 parts separated by ':'.
* Part 0: The id, one of the one defined in dialog_buttons.yaml
* Part 1: The style, either good, bad or misc
- * Part 2 (optional): Additional parameters seperated by '/', available are:
+ * Part 2 (optional): Additional parameters separated by '/', available are:
* timeout: This button is only available after some waiting time
* kb_enter: This button is triggered by the enter key
* kb_escape This button is triggered by the escape key
@@ -60,6 +71,8 @@ export class Dialog {
this.buttonSignals[buttonId] = new Signal();
}
+ this.valueChosen = new Signal();
+
this.timeouts = [];
this.clickDetectors = [];
@@ -164,7 +177,7 @@ export class Dialog {
const timeout = setTimeout(() => {
button.classList.remove("timedButton");
arrayDeleteValue(this.timeouts, timeout);
- }, 5000);
+ }, 3000);
this.timeouts.push(timeout);
}
if (isEnter || isEscape) {
@@ -277,7 +290,6 @@ export class DialogLoading extends Dialog {
const loader = document.createElement("div");
loader.classList.add("prefab_LoadingTextWithAnim");
loader.classList.add("loadingIndicator");
- loader.innerText = T.global.loading;
elem.appendChild(loader);
this.app.inputMgr.pushReciever(this.inputReciever);
@@ -432,10 +444,12 @@ export class DialogWithForm extends Dialog {
for (let i = 0; i < this.formElements.length; ++i) {
const elem = this.formElements[i];
elem.bindEvents(div, this.clickDetectors);
+ elem.valueChosen.add(this.closeRequested.dispatch, this.closeRequested);
+ elem.valueChosen.add(this.valueChosen.dispatch, this.valueChosen);
}
waitNextFrame().then(() => {
- this.formElements[0].focus();
+ this.formElements[this.formElements.length - 1].focus();
});
return div;
diff --git a/src/js/core/modal_dialog_forms.js b/src/js/core/modal_dialog_forms.js
index 1ded9a8b..1c5b1986 100644
--- a/src/js/core/modal_dialog_forms.js
+++ b/src/js/core/modal_dialog_forms.js
@@ -1,150 +1,232 @@
-import { ClickDetector } from "./click_detector";
-
-export class FormElement {
- constructor(id, label) {
- this.id = id;
- this.label = label;
- }
-
- getHtml() {
- abstract;
- return "";
- }
-
- getFormElement(parent) {
- return parent.querySelector("[data-formId='" + this.id + "']");
- }
-
- bindEvents(parent, clickTrackers) {
- abstract;
- }
-
- focus() {}
-
- isValid() {
- return true;
- }
-
- /** @returns {any} */
- getValue() {
- abstract;
- }
-}
-
-export class FormElementInput extends FormElement {
- constructor({ id, label = null, placeholder, defaultValue = "", inputType = "text", validator = null }) {
- super(id, label);
- this.placeholder = placeholder;
- this.defaultValue = defaultValue;
- this.inputType = inputType;
- this.validator = validator;
-
- this.element = null;
- }
-
- getHtml() {
- let classes = [];
- let inputType = "text";
- let maxlength = 256;
- switch (this.inputType) {
- case "text": {
- classes.push("input-text");
- break;
- }
-
- case "email": {
- classes.push("input-email");
- inputType = "email";
- break;
- }
-
- case "token": {
- classes.push("input-token");
- inputType = "text";
- maxlength = 4;
- break;
- }
- }
-
- return `
-
- ${this.label ? `${this.label} ` : ""}
-
-
- `;
- }
-
- bindEvents(parent, clickTrackers) {
- this.element = this.getFormElement(parent);
- this.element.addEventListener("input", event => this.updateErrorState());
- this.updateErrorState();
- }
-
- updateErrorState() {
- this.element.classList.toggle("errored", !this.isValid());
- }
-
- isValid() {
- return !this.validator || this.validator(this.element.value);
- }
-
- getValue() {
- return this.element.value;
- }
-
- focus() {
- this.element.focus();
- }
-}
-
-export class FormElementCheckbox extends FormElement {
- constructor({ id, label, defaultValue = true }) {
- super(id, label);
- this.defaultValue = defaultValue;
- this.value = this.defaultValue;
-
- this.element = null;
- }
-
- getHtml() {
- return `
-
- `;
- }
-
- bindEvents(parent, clickTrackers) {
- this.element = this.getFormElement(parent);
- const detector = new ClickDetector(this.element, {
- consumeEvents: false,
- preventDefault: false,
- });
- clickTrackers.push(detector);
- detector.click.add(this.toggle, this);
- }
-
- getValue() {
- return this.value;
- }
-
- toggle() {
- this.value = !this.value;
- this.element.classList.toggle("checked", this.value);
- }
-
- focus(parent) {}
-}
+import { BaseItem } from "../game/base_item";
+import { ClickDetector } from "./click_detector";
+import { Signal } from "./signal";
+
+/*
+ * ***************************************************
+ *
+ * LEGACY CODE WARNING
+ *
+ * This is old code from yorg3.io and needs to be refactored
+ * @TODO
+ *
+ * ***************************************************
+ */
+
+export class FormElement {
+ constructor(id, label) {
+ this.id = id;
+ this.label = label;
+
+ this.valueChosen = new Signal();
+ }
+
+ getHtml() {
+ abstract;
+ return "";
+ }
+
+ getFormElement(parent) {
+ return parent.querySelector("[data-formId='" + this.id + "']");
+ }
+
+ bindEvents(parent, clickTrackers) {
+ abstract;
+ }
+
+ focus() {}
+
+ isValid() {
+ return true;
+ }
+
+ /** @returns {any} */
+ getValue() {
+ abstract;
+ }
+}
+
+export class FormElementInput extends FormElement {
+ constructor({ id, label = null, placeholder, defaultValue = "", inputType = "text", validator = null }) {
+ super(id, label);
+ this.placeholder = placeholder;
+ this.defaultValue = defaultValue;
+ this.inputType = inputType;
+ this.validator = validator;
+
+ this.element = null;
+ }
+
+ getHtml() {
+ let classes = [];
+ let inputType = "text";
+ let maxlength = 256;
+ switch (this.inputType) {
+ case "text": {
+ classes.push("input-text");
+ break;
+ }
+
+ case "email": {
+ classes.push("input-email");
+ inputType = "email";
+ break;
+ }
+
+ case "token": {
+ classes.push("input-token");
+ inputType = "text";
+ maxlength = 4;
+ break;
+ }
+ }
+
+ return `
+
+ ${this.label ? `${this.label} ` : ""}
+
+
+ `;
+ }
+
+ bindEvents(parent, clickTrackers) {
+ this.element = this.getFormElement(parent);
+ this.element.addEventListener("input", event => this.updateErrorState());
+ this.updateErrorState();
+ }
+
+ updateErrorState() {
+ this.element.classList.toggle("errored", !this.isValid());
+ }
+
+ isValid() {
+ return !this.validator || this.validator(this.element.value);
+ }
+
+ getValue() {
+ return this.element.value;
+ }
+
+ focus() {
+ this.element.focus();
+ }
+}
+
+export class FormElementCheckbox extends FormElement {
+ constructor({ id, label, defaultValue = true }) {
+ super(id, label);
+ this.defaultValue = defaultValue;
+ this.value = this.defaultValue;
+
+ this.element = null;
+ }
+
+ getHtml() {
+ return `
+
+ `;
+ }
+
+ bindEvents(parent, clickTrackers) {
+ this.element = this.getFormElement(parent);
+ const detector = new ClickDetector(this.element, {
+ consumeEvents: false,
+ preventDefault: false,
+ });
+ clickTrackers.push(detector);
+ detector.click.add(this.toggle, this);
+ }
+
+ getValue() {
+ return this.value;
+ }
+
+ toggle() {
+ this.value = !this.value;
+ this.element.classList.toggle("checked", this.value);
+ }
+
+ focus(parent) {}
+}
+
+export class FormElementItemChooser extends FormElement {
+ /**
+ *
+ * @param {object} param0
+ * @param {string} param0.id
+ * @param {string=} param0.label
+ * @param {Array} param0.items
+ */
+ constructor({ id, label, items = [] }) {
+ super(id, label);
+ this.items = items;
+ this.element = null;
+
+ /**
+ * @type {BaseItem}
+ */
+ this.chosenItem = null;
+ }
+
+ getHtml() {
+ let classes = [];
+
+ return `
+
+ `;
+ }
+
+ /**
+ * @param {HTMLElement} parent
+ * @param {Array} clickTrackers
+ */
+ bindEvents(parent, clickTrackers) {
+ this.element = this.getFormElement(parent);
+
+ for (let i = 0; i < this.items.length; ++i) {
+ const item = this.items[i];
+
+ const canvas = document.createElement("canvas");
+ canvas.width = 128;
+ canvas.height = 128;
+ const context = canvas.getContext("2d");
+ item.drawFullSizeOnCanvas(context, 128);
+ this.element.appendChild(canvas);
+
+ const detector = new ClickDetector(canvas, {});
+ clickTrackers.push(detector);
+ detector.click.add(() => {
+ this.chosenItem = item;
+ this.valueChosen.dispatch(item);
+ });
+ }
+ }
+
+ isValid() {
+ return true;
+ }
+
+ getValue() {
+ return null;
+ }
+
+ focus() {}
+}
diff --git a/src/js/core/read_write_proxy.js b/src/js/core/read_write_proxy.js
index 74b13efa..7c96149b 100644
--- a/src/js/core/read_write_proxy.js
+++ b/src/js/core/read_write_proxy.js
@@ -81,10 +81,6 @@ export class ReadWriteProxy {
return this.writeAsync();
}
- getCurrentData() {
- return this.currentData;
- }
-
/**
*
* @param {object} obj
@@ -224,7 +220,7 @@ export class ReadWriteProxy {
return rawData;
})
- // Parse JSON, this could throw but thats fine
+ // Parse JSON, this could throw but that's fine
.then(res => {
try {
return JSON.parse(res);
diff --git a/src/js/core/restriction_manager.js b/src/js/core/restriction_manager.js
new file mode 100644
index 00000000..2912d30f
--- /dev/null
+++ b/src/js/core/restriction_manager.js
@@ -0,0 +1,154 @@
+/* typehints:start */
+import { Application } from "../application";
+/* typehints:end */
+import { IS_MAC } from "./config";
+import { ExplainedResult } from "./explained_result";
+import { queryParamOptions } from "./query_parameters";
+import { ReadWriteProxy } from "./read_write_proxy";
+
+export class RestrictionManager extends ReadWriteProxy {
+ /**
+ * @param {Application} app
+ */
+ constructor(app) {
+ super(app, "restriction-flags.bin");
+
+ this.currentData = this.getDefaultData();
+ }
+
+ // -- RW Proxy Impl
+
+ /**
+ * @param {any} data
+ */
+ verify(data) {
+ return ExplainedResult.good();
+ }
+
+ /**
+ */
+ getDefaultData() {
+ return {
+ version: this.getCurrentVersion(),
+ savegameV1119Imported: false,
+ };
+ }
+
+ /**
+ */
+ getCurrentVersion() {
+ return 1;
+ }
+
+ /**
+ * @param {any} data
+ */
+ migrate(data) {
+ return ExplainedResult.good();
+ }
+
+ initialize() {
+ return this.readAsync().then(() => {
+ if (this.currentData.savegameV1119Imported) {
+ console.warn("Levelunlock is granted to current user due to past savegame");
+ }
+ });
+ }
+
+ // -- End RW Proxy Impl
+
+ /**
+ * Checks if there are any savegames from the 1.1.19 version
+ */
+ onHasLegacySavegamesChanged(has119Savegames = false) {
+ if (has119Savegames && !this.currentData.savegameV1119Imported) {
+ this.currentData.savegameV1119Imported = true;
+ console.warn("Current user now has access to all levels due to 1119 savegame");
+ return this.writeAsync();
+ }
+ return Promise.resolve();
+ }
+
+ /**
+ * Returns if the app is currently running as the limited version
+ * @returns {boolean}
+ */
+ isLimitedVersion() {
+ if (IS_MAC) {
+ // On mac, the full version is always active
+ return false;
+ }
+
+ if (G_IS_STANDALONE) {
+ // Standalone is never limited
+ return false;
+ }
+
+ if (queryParamOptions.fullVersion) {
+ // Full version is activated via flag
+ return false;
+ }
+
+ if (G_IS_DEV) {
+ return typeof window !== "undefined" && window.location.search.indexOf("demo") >= 0;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns if the app markets the standalone version on steam
+ * @returns {boolean}
+ */
+ getIsStandaloneMarketingActive() {
+ return this.isLimitedVersion();
+ }
+
+ /**
+ * Returns if exporting the base as a screenshot is possible
+ * @returns {boolean}
+ */
+ getIsExportingScreenshotsPossible() {
+ return !this.isLimitedVersion();
+ }
+
+ /**
+ * Returns the maximum number of supported waypoints
+ * @returns {number}
+ */
+ getMaximumWaypoints() {
+ return this.isLimitedVersion() ? 2 : 1e20;
+ }
+
+ /**
+ * Returns if the user has unlimited savegames
+ * @returns {boolean}
+ */
+ getHasUnlimitedSavegames() {
+ return !this.isLimitedVersion();
+ }
+
+ /**
+ * Returns if the app has all settings available
+ * @returns {boolean}
+ */
+ getHasExtendedSettings() {
+ return !this.isLimitedVersion();
+ }
+
+ /**
+ * Returns if all upgrades are available
+ * @returns {boolean}
+ */
+ getHasExtendedUpgrades() {
+ return !this.isLimitedVersion() || this.currentData.savegameV1119Imported;
+ }
+
+ /**
+ * Returns if all levels & freeplay is available
+ * @returns {boolean}
+ */
+ getHasExtendedLevelsAndFreeplay() {
+ return !this.isLimitedVersion() || this.currentData.savegameV1119Imported;
+ }
+}
diff --git a/src/js/core/rng.js b/src/js/core/rng.js
index 9c5c1c43..7a6766cd 100644
--- a/src/js/core/rng.js
+++ b/src/js/core/rng.js
@@ -108,17 +108,6 @@ export class RandomNumberGenerator {
assert(max > min, "rng: max <= min");
return Math.floor(this.next() * (max - min) + min);
}
- /**
- * @param {number} min
- * @param {number} max
- * @returns {number} Integer in range [min, max]
- */
- nextIntRangeInclusive(min, max) {
- assert(Number.isFinite(min), "Minimum is no integer");
- assert(Number.isFinite(max), "Maximum is no integer");
- assert(max > min, "rng: max <= min");
- return Math.round(this.next() * (max - min) + min);
- }
/**
* @param {number} min
diff --git a/src/js/core/sprites.js b/src/js/core/sprites.js
index bdcc65b4..1019d8f7 100644
--- a/src/js/core/sprites.js
+++ b/src/js/core/sprites.js
@@ -1,360 +1,395 @@
-import { DrawParameters } from "./draw_parameters";
-import { Rectangle } from "./rectangle";
-import { round3Digits } from "./utils";
-
-const floorSpriteCoordinates = false;
-
-export const ORIGINAL_SPRITE_SCALE = "0.75";
-
-export class BaseSprite {
- /**
- * Returns the raw handle
- * @returns {HTMLImageElement|HTMLCanvasElement}
- */
- getRawTexture() {
- abstract;
- return null;
- }
-
- /**
- * Draws the sprite
- * @param {CanvasRenderingContext2D} context
- * @param {number} x
- * @param {number} y
- * @param {number} w
- * @param {number} h
- */
- draw(context, x, y, w, h) {
- // eslint-disable-line no-unused-vars
- abstract;
- }
-}
-
-/**
- * Position of a sprite within an atlas
- */
-export class SpriteAtlasLink {
- /**
- *
- * @param {object} param0
- * @param {number} param0.packedX
- * @param {number} param0.packedY
- * @param {number} param0.packOffsetX
- * @param {number} param0.packOffsetY
- * @param {number} param0.packedW
- * @param {number} param0.packedH
- * @param {number} param0.w
- * @param {number} param0.h
- * @param {HTMLImageElement|HTMLCanvasElement} param0.atlas
- */
- constructor({ w, h, packedX, packedY, packOffsetX, packOffsetY, packedW, packedH, atlas }) {
- this.packedX = packedX;
- this.packedY = packedY;
- this.packedW = packedW;
- this.packedH = packedH;
- this.packOffsetX = packOffsetX;
- this.packOffsetY = packOffsetY;
- this.atlas = atlas;
- this.w = w;
- this.h = h;
- }
-}
-
-export class AtlasSprite extends BaseSprite {
- /**
- *
- * @param {string} spriteName
- */
- constructor(spriteName = "sprite") {
- super();
- /** @type {Object.} */
- this.linksByResolution = {};
- this.spriteName = spriteName;
- }
-
- getRawTexture() {
- return this.linksByResolution[ORIGINAL_SPRITE_SCALE].atlas;
- }
-
- /**
- * Draws the sprite onto a regular context using no contexts
- * @see {BaseSprite.draw}
- */
- draw(context, x, y, w, h) {
- if (G_IS_DEV) {
- assert(context instanceof CanvasRenderingContext2D, "Not a valid context");
- }
-
- const link = this.linksByResolution[ORIGINAL_SPRITE_SCALE];
-
- assert(
- link,
- "Link not known: " +
- ORIGINAL_SPRITE_SCALE +
- " (having " +
- Object.keys(this.linksByResolution) +
- ")"
- );
-
- const width = w || link.w;
- const height = h || link.h;
-
- const scaleW = width / link.w;
- const scaleH = height / link.h;
-
- context.drawImage(
- link.atlas,
-
- link.packedX,
- link.packedY,
- link.packedW,
- link.packedH,
-
- x + link.packOffsetX * scaleW,
- y + link.packOffsetY * scaleH,
- link.packedW * scaleW,
- link.packedH * scaleH
- );
- }
-
- /**
- *
- * @param {DrawParameters} parameters
- * @param {number} x
- * @param {number} y
- * @param {number} size
- * @param {boolean=} clipping
- */
- drawCachedCentered(parameters, x, y, size, clipping = true) {
- this.drawCached(parameters, x - size / 2, y - size / 2, size, size, clipping);
- }
-
- /**
- *
- * @param {CanvasRenderingContext2D} context
- * @param {number} x
- * @param {number} y
- * @param {number} size
- */
- drawCentered(context, x, y, size) {
- this.draw(context, x - size / 2, y - size / 2, size, size);
- }
-
- /**
- * Draws the sprite
- * @param {DrawParameters} parameters
- * @param {number} x
- * @param {number} y
- * @param {number} w
- * @param {number} h
- * @param {boolean=} clipping Whether to perform culling
- */
- drawCached(parameters, x, y, w = null, h = null, clipping = true) {
- if (G_IS_DEV) {
- assert(parameters instanceof DrawParameters, "Not a valid context");
- assert(!!w && w > 0, "Not a valid width:" + w);
- assert(!!h && h > 0, "Not a valid height:" + h);
- }
-
- const visibleRect = parameters.visibleRect;
-
- const scale = parameters.desiredAtlasScale;
- const link = this.linksByResolution[scale];
-
- if (!link) {
- assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`);
- }
-
- const scaleW = w / link.w;
- const scaleH = h / link.h;
-
- let destX = x + link.packOffsetX * scaleW;
- let destY = y + link.packOffsetY * scaleH;
- let destW = link.packedW * scaleW;
- let destH = link.packedH * scaleH;
-
- let srcX = link.packedX;
- let srcY = link.packedY;
- let srcW = link.packedW;
- let srcH = link.packedH;
-
- let intersection = null;
-
- if (clipping) {
- const rect = new Rectangle(destX, destY, destW, destH);
- intersection = rect.getIntersection(visibleRect);
- if (!intersection) {
- return;
- }
-
- srcX += (intersection.x - destX) / scaleW;
- srcY += (intersection.y - destY) / scaleH;
-
- srcW *= intersection.w / destW;
- srcH *= intersection.h / destH;
-
- destX = intersection.x;
- destY = intersection.y;
-
- destW = intersection.w;
- destH = intersection.h;
- }
-
- if (floorSpriteCoordinates) {
- parameters.context.drawImage(
- link.atlas,
-
- // atlas src pos
- Math.floor(srcX),
- Math.floor(srcY),
-
- // atlas src size
- Math.floor(srcW),
- Math.floor(srcH),
-
- // dest pos
- Math.floor(destX),
- Math.floor(destY),
-
- // dest size
- Math.floor(destW),
- Math.floor(destH)
- );
- } else {
- parameters.context.drawImage(
- link.atlas,
-
- // atlas src pos
- srcX,
- srcY,
-
- // atlas src siize
- srcW,
- srcH,
-
- // dest pos and size
- destX,
- destY,
- destW,
- destH
- );
- }
- }
-
- /**
- * Renders into an html element
- * @param {HTMLElement} element
- * @param {number} w
- * @param {number} h
- */
- renderToHTMLElement(element, w = 1, h = 1) {
- element.style.position = "relative";
- element.innerHTML = this.getAsHTML(w, h);
- }
-
- /**
- * Returns the html to render as icon
- * @param {number} w
- * @param {number} h
- */
- getAsHTML(w, h) {
- const link = this.linksByResolution["0.5"];
-
- // Find out how much we have to scale it so that it fits
- const scaleX = w / link.w;
- const scaleY = h / link.h;
-
- // Find out how big the scaled atlas is
- const atlasW = link.atlas.width * scaleX;
- const atlasH = link.atlas.height * scaleY;
-
- // @ts-ignore
- const srcSafe = link.atlas.src.replaceAll("\\", "/");
-
- // Find out how big we render the sprite
- const widthAbsolute = scaleX * link.packedW;
- const heightAbsolute = scaleY * link.packedH;
-
- // Compute the position in the relative container
- const leftRelative = (link.packOffsetX * scaleX) / w;
- const topRelative = (link.packOffsetY * scaleY) / h;
- const widthRelative = widthAbsolute / w;
- const heightRelative = heightAbsolute / h;
-
- // Scale the atlas relative to the width and height of the element
- const bgW = atlasW / widthAbsolute;
- const bgH = atlasH / heightAbsolute;
-
- // Figure out what the position of the atlas is
- const bgX = link.packedX * scaleX;
- const bgY = link.packedY * scaleY;
-
- // Fuck you, whoever thought its a good idea to make background-position work like it does now
- const bgXRelative = -bgX / (widthAbsolute - atlasW);
- const bgYRelative = -bgY / (heightAbsolute - atlasH);
-
- return `
-
- `;
- }
-}
-
-export class RegularSprite extends BaseSprite {
- constructor(sprite, w, h) {
- super();
- this.w = w;
- this.h = h;
- this.sprite = sprite;
- }
-
- getRawTexture() {
- return this.sprite;
- }
-
- /**
- * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing
- * images into buffers
- * @param {CanvasRenderingContext2D} context
- * @param {number} x
- * @param {number} y
- * @param {number} w
- * @param {number} h
- */
- draw(context, x, y, w, h) {
- assert(context, "No context given");
- assert(x !== undefined, "No x given");
- assert(y !== undefined, "No y given");
- assert(w !== undefined, "No width given");
- assert(h !== undefined, "No height given");
- context.drawImage(this.sprite, x, y, w, h);
- }
-
- /**
- * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing
- * images into buffers
- * @param {CanvasRenderingContext2D} context
- * @param {number} x
- * @param {number} y
- * @param {number} w
- * @param {number} h
- */
- drawCentered(context, x, y, w, h) {
- assert(context, "No context given");
- assert(x !== undefined, "No x given");
- assert(y !== undefined, "No y given");
- assert(w !== undefined, "No width given");
- assert(h !== undefined, "No height given");
- context.drawImage(this.sprite, x - w / 2, y - h / 2, w, h);
- }
-}
+import { DrawParameters } from "./draw_parameters";
+import { Rectangle } from "./rectangle";
+import { round3Digits } from "./utils";
+
+export const ORIGINAL_SPRITE_SCALE = "0.75";
+export const FULL_CLIP_RECT = new Rectangle(0, 0, 1, 1);
+
+const EXTRUDE = 0.1;
+
+export class BaseSprite {
+ /**
+ * Returns the raw handle
+ * @returns {HTMLImageElement|HTMLCanvasElement}
+ */
+ getRawTexture() {
+ abstract;
+ return null;
+ }
+
+ /**
+ * Draws the sprite
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ */
+ draw(context, x, y, w, h) {
+ // eslint-disable-line no-unused-vars
+ abstract;
+ }
+}
+
+/**
+ * Position of a sprite within an atlas
+ */
+export class SpriteAtlasLink {
+ /**
+ *
+ * @param {object} param0
+ * @param {number} param0.packedX
+ * @param {number} param0.packedY
+ * @param {number} param0.packOffsetX
+ * @param {number} param0.packOffsetY
+ * @param {number} param0.packedW
+ * @param {number} param0.packedH
+ * @param {number} param0.w
+ * @param {number} param0.h
+ * @param {HTMLImageElement|HTMLCanvasElement} param0.atlas
+ */
+ constructor({ w, h, packedX, packedY, packOffsetX, packOffsetY, packedW, packedH, atlas }) {
+ this.packedX = packedX;
+ this.packedY = packedY;
+ this.packedW = packedW;
+ this.packedH = packedH;
+ this.packOffsetX = packOffsetX;
+ this.packOffsetY = packOffsetY;
+ this.atlas = atlas;
+ this.w = w;
+ this.h = h;
+ }
+}
+
+export class AtlasSprite extends BaseSprite {
+ /**
+ *
+ * @param {string} spriteName
+ */
+ constructor(spriteName = "sprite") {
+ super();
+ /** @type {Object.} */
+ this.linksByResolution = {};
+ this.spriteName = spriteName;
+ }
+
+ getRawTexture() {
+ return this.linksByResolution[ORIGINAL_SPRITE_SCALE].atlas;
+ }
+
+ /**
+ * Draws the sprite onto a regular context using no contexts
+ * @see {BaseSprite.draw}
+ */
+ draw(context, x, y, w, h) {
+ if (G_IS_DEV) {
+ assert(context instanceof CanvasRenderingContext2D, "Not a valid context");
+ }
+
+ const link = this.linksByResolution[ORIGINAL_SPRITE_SCALE];
+
+ assert(
+ link,
+ "Link not known: " +
+ ORIGINAL_SPRITE_SCALE +
+ " (having " +
+ Object.keys(this.linksByResolution) +
+ ")"
+ );
+
+ const width = w || link.w;
+ const height = h || link.h;
+
+ const scaleW = width / link.w;
+ const scaleH = height / link.h;
+
+ context.drawImage(
+ link.atlas,
+
+ link.packedX,
+ link.packedY,
+ link.packedW,
+ link.packedH,
+
+ x + link.packOffsetX * scaleW,
+ y + link.packOffsetY * scaleH,
+ link.packedW * scaleW,
+ link.packedH * scaleH
+ );
+ }
+
+ /**
+ *
+ * @param {DrawParameters} parameters
+ * @param {number} x
+ * @param {number} y
+ * @param {number} size
+ * @param {boolean=} clipping
+ */
+ drawCachedCentered(parameters, x, y, size, clipping = true) {
+ this.drawCached(parameters, x - size / 2, y - size / 2, size, size, clipping);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x
+ * @param {number} y
+ * @param {number} size
+ */
+ drawCentered(context, x, y, size) {
+ this.draw(context, x - size / 2, y - size / 2, size, size);
+ }
+
+ /**
+ * Draws the sprite
+ * @param {DrawParameters} parameters
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ * @param {boolean=} clipping Whether to perform culling
+ */
+ drawCached(parameters, x, y, w = null, h = null, clipping = true) {
+ if (G_IS_DEV) {
+ assert(parameters instanceof DrawParameters, "Not a valid context");
+ assert(!!w && w > 0, "Not a valid width:" + w);
+ assert(!!h && h > 0, "Not a valid height:" + h);
+ }
+
+ const visibleRect = parameters.visibleRect;
+
+ const scale = parameters.desiredAtlasScale;
+ const link = this.linksByResolution[scale];
+
+ if (!link) {
+ assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`);
+ }
+
+ const scaleW = w / link.w;
+ const scaleH = h / link.h;
+
+ let destX = x + link.packOffsetX * scaleW;
+ let destY = y + link.packOffsetY * scaleH;
+ let destW = link.packedW * scaleW;
+ let destH = link.packedH * scaleH;
+
+ let srcX = link.packedX;
+ let srcY = link.packedY;
+ let srcW = link.packedW;
+ let srcH = link.packedH;
+
+ let intersection = null;
+
+ if (clipping) {
+ const rect = new Rectangle(destX, destY, destW, destH);
+ intersection = rect.getIntersection(visibleRect);
+ if (!intersection) {
+ return;
+ }
+
+ srcX += (intersection.x - destX) / scaleW;
+ srcY += (intersection.y - destY) / scaleH;
+
+ srcW *= intersection.w / destW;
+ srcH *= intersection.h / destH;
+
+ destX = intersection.x;
+ destY = intersection.y;
+
+ destW = intersection.w;
+ destH = intersection.h;
+ }
+
+ parameters.context.drawImage(
+ link.atlas,
+
+ // atlas src pos
+ srcX,
+ srcY,
+
+ // atlas src size
+ srcW,
+ srcH,
+
+ // dest pos and size
+ destX - EXTRUDE,
+ destY - EXTRUDE,
+ destW + 2 * EXTRUDE,
+ destH + 2 * EXTRUDE
+ );
+ }
+
+ /**
+ * Draws a subset of the sprite. Does NO culling
+ * @param {DrawParameters} parameters
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ * @param {Rectangle=} clipRect The rectangle in local space (0 ... 1) to draw of the image
+ */
+ drawCachedWithClipRect(parameters, x, y, w = null, h = null, clipRect = FULL_CLIP_RECT) {
+ if (G_IS_DEV) {
+ assert(parameters instanceof DrawParameters, "Not a valid context");
+ assert(!!w && w > 0, "Not a valid width:" + w);
+ assert(!!h && h > 0, "Not a valid height:" + h);
+ assert(clipRect, "No clip rect given!");
+ }
+
+ const scale = parameters.desiredAtlasScale;
+ const link = this.linksByResolution[scale];
+
+ if (!link) {
+ assert(false, `Link not known: ${scale} (having ${Object.keys(this.linksByResolution)})`);
+ }
+
+ const scaleW = w / link.w;
+ const scaleH = h / link.h;
+
+ let destX = x + link.packOffsetX * scaleW + clipRect.x * w;
+ let destY = y + link.packOffsetY * scaleH + clipRect.y * h;
+ let destW = link.packedW * scaleW * clipRect.w;
+ let destH = link.packedH * scaleH * clipRect.h;
+
+ let srcX = link.packedX + clipRect.x * link.packedW;
+ let srcY = link.packedY + clipRect.y * link.packedH;
+ let srcW = link.packedW * clipRect.w;
+ let srcH = link.packedH * clipRect.h;
+
+ parameters.context.drawImage(
+ link.atlas,
+
+ // atlas src pos
+ srcX,
+ srcY,
+
+ // atlas src siize
+ srcW,
+ srcH,
+
+ // dest pos and size
+ destX - EXTRUDE,
+ destY - EXTRUDE,
+ destW + 2 * EXTRUDE,
+ destH + 2 * EXTRUDE
+ );
+ }
+
+ /**
+ * Renders into an html element
+ * @param {HTMLElement} element
+ * @param {number} w
+ * @param {number} h
+ */
+ renderToHTMLElement(element, w = 1, h = 1) {
+ element.style.position = "relative";
+ element.innerHTML = this.getAsHTML(w, h);
+ }
+
+ /**
+ * Returns the html to render as icon
+ * @param {number} w
+ * @param {number} h
+ */
+ getAsHTML(w, h) {
+ const link = this.linksByResolution["0.5"];
+
+ // Find out how much we have to scale it so that it fits
+ const scaleX = w / link.w;
+ const scaleY = h / link.h;
+
+ // Find out how big the scaled atlas is
+ const atlasW = link.atlas.width * scaleX;
+ const atlasH = link.atlas.height * scaleY;
+
+ // @ts-ignore
+ const srcSafe = link.atlas.src.replaceAll("\\", "/");
+
+ // Find out how big we render the sprite
+ const widthAbsolute = scaleX * link.packedW;
+ const heightAbsolute = scaleY * link.packedH;
+
+ // Compute the position in the relative container
+ const leftRelative = (link.packOffsetX * scaleX) / w;
+ const topRelative = (link.packOffsetY * scaleY) / h;
+ const widthRelative = widthAbsolute / w;
+ const heightRelative = heightAbsolute / h;
+
+ // Scale the atlas relative to the width and height of the element
+ const bgW = atlasW / widthAbsolute;
+ const bgH = atlasH / heightAbsolute;
+
+ // Figure out what the position of the atlas is
+ const bgX = link.packedX * scaleX;
+ const bgY = link.packedY * scaleY;
+
+ // Fuck you, whoever thought its a good idea to make background-position work like it does now
+ const bgXRelative = -bgX / (widthAbsolute - atlasW);
+ const bgYRelative = -bgY / (heightAbsolute - atlasH);
+
+ return `
+
+ `;
+ }
+}
+
+export class RegularSprite extends BaseSprite {
+ constructor(sprite, w, h) {
+ super();
+ this.w = w;
+ this.h = h;
+ this.sprite = sprite;
+ }
+
+ getRawTexture() {
+ return this.sprite;
+ }
+
+ /**
+ * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing
+ * images into buffers
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ */
+ draw(context, x, y, w, h) {
+ assert(context, "No context given");
+ assert(x !== undefined, "No x given");
+ assert(y !== undefined, "No y given");
+ assert(w !== undefined, "No width given");
+ assert(h !== undefined, "No height given");
+ context.drawImage(this.sprite, x, y, w, h);
+ }
+
+ /**
+ * Draws the sprite, do *not* use this for sprites which are rendered! Only for drawing
+ * images into buffers
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ */
+ drawCentered(context, x, y, w, h) {
+ assert(context, "No context given");
+ assert(x !== undefined, "No x given");
+ assert(y !== undefined, "No y given");
+ assert(w !== undefined, "No width given");
+ assert(h !== undefined, "No height given");
+ context.drawImage(this.sprite, x - w / 2, y - h / 2, w, h);
+ }
+}
diff --git a/src/js/core/stale_area_detector.js b/src/js/core/stale_area_detector.js
index f8e77f0c..5048ee37 100644
--- a/src/js/core/stale_area_detector.js
+++ b/src/js/core/stale_area_detector.js
@@ -1,50 +1,90 @@
-import { createLogger } from "./logging";
-import { Rectangle } from "./rectangle";
-import { globalConfig } from "./config";
-
-const logger = createLogger("stale_areas");
-
-export class StaleAreaDetector {
- /**
- *
- * @param {object} param0
- * @param {import("../game/root").GameRoot} param0.root
- * @param {string} param0.name The name for reference
- * @param {(Rectangle) => void} param0.recomputeMethod Method which recomputes the given area
- */
- constructor({ root, name, recomputeMethod }) {
- this.root = root;
- this.name = name;
- this.recomputeMethod = recomputeMethod;
-
- /** @type {Rectangle} */
- this.staleArea = null;
- }
-
- /**
- * Invalidates the given area
- * @param {Rectangle} area
- */
- invalidate(area) {
- // logger.log(this.name, "invalidated", area.toString());
- if (this.staleArea) {
- this.staleArea = this.staleArea.getUnion(area);
- } else {
- this.staleArea = area.clone();
- }
- }
-
- /**
- * Updates the stale area
- */
- update() {
- if (this.staleArea) {
- logger.log(this.name, "is recomputing", this.staleArea.toString());
- if (G_IS_DEV && globalConfig.debug.renderChanges) {
- this.root.hud.parts.changesDebugger.renderChange(this.name, this.staleArea, "#fd145b");
- }
- this.recomputeMethod(this.staleArea);
- this.staleArea = null;
- }
- }
-}
+import { Component } from "../game/component";
+import { Entity } from "../game/entity";
+import { globalConfig } from "./config";
+import { createLogger } from "./logging";
+import { Rectangle } from "./rectangle";
+
+const logger = createLogger("stale_areas");
+
+export class StaleAreaDetector {
+ /**
+ *
+ * @param {object} param0
+ * @param {import("../game/root").GameRoot} param0.root
+ * @param {string} param0.name The name for reference
+ * @param {(Rectangle) => void} param0.recomputeMethod Method which recomputes the given area
+ */
+ constructor({ root, name, recomputeMethod }) {
+ this.root = root;
+ this.name = name;
+ this.recomputeMethod = recomputeMethod;
+
+ /** @type {Rectangle} */
+ this.staleArea = null;
+ }
+
+ /**
+ * Invalidates the given area
+ * @param {Rectangle} area
+ */
+ invalidate(area) {
+ // logger.log(this.name, "invalidated", area.toString());
+ if (this.staleArea) {
+ this.staleArea = this.staleArea.getUnion(area);
+ } else {
+ this.staleArea = area.clone();
+ }
+ }
+
+ /**
+ * Makes this detector recompute the area of an entity whenever
+ * it changes in any way
+ * @param {Array} components
+ * @param {number} tilesAround How many tiles arround to expand the area
+ */
+ recomputeOnComponentsChanged(components, tilesAround) {
+ const componentIds = components.map(component => component.getId());
+
+ /**
+ * Internal checker method
+ * @param {Entity} entity
+ */
+ const checker = entity => {
+ if (!this.root.gameInitialized) {
+ return;
+ }
+
+ // Check for all components
+ for (let i = 0; i < componentIds.length; ++i) {
+ if (entity.components[componentIds[i]]) {
+ // Entity is relevant, compute affected area
+ const area = entity.components.StaticMapEntity.getTileSpaceBounds().expandedInAllDirections(
+ tilesAround
+ );
+ this.invalidate(area);
+ return;
+ }
+ }
+ };
+
+ this.root.signals.entityAdded.add(checker);
+ this.root.signals.entityChanged.add(checker);
+ this.root.signals.entityComponentRemoved.add(checker);
+ this.root.signals.entityGotNewComponent.add(checker);
+ this.root.signals.entityDestroyed.add(checker);
+ }
+
+ /**
+ * Updates the stale area
+ */
+ update() {
+ if (this.staleArea) {
+ logger.log(this.name, "is recomputing", this.staleArea.toString());
+ if (G_IS_DEV && globalConfig.debug.renderChanges) {
+ this.root.hud.parts.changesDebugger.renderChange(this.name, this.staleArea, "#fd145b");
+ }
+ this.recomputeMethod(this.staleArea);
+ this.staleArea = null;
+ }
+ }
+}
diff --git a/src/js/core/utils.js b/src/js/core/utils.js
index a469a7a0..50657841 100644
--- a/src/js/core/utils.js
+++ b/src/js/core/utils.js
@@ -558,7 +558,16 @@ export function formatSeconds(secs) {
}
/**
- * Formats a number like 2.5 to "2.5 items / s"
+ * Formats a number like 2.51 to "2.5"
+ * @param {number} speed
+ * @param {string=} separator The decimal separator for numbers like 50.1 (separator='.')
+ */
+export function round1DigitLocalized(speed, separator = T.global.decimalSeparator) {
+ return round1Digit(speed).toString().replace(".", separator);
+}
+
+/**
+ * Formats a number like 2.51 to "2.51 items / s"
* @param {number} speed
* @param {boolean=} double
* @param {string=} separator The decimal separator for numbers like 50.1 (separator='.')
@@ -670,3 +679,83 @@ export function safeModulo(n, m) {
export function smoothPulse(time) {
return Math.sin(time * 4) * 0.5 + 0.5;
}
+
+/**
+ * Fills in a tag
+ * @param {string} translation
+ * @param {string} link
+ */
+export function fillInLinkIntoTranslation(translation, link) {
+ return translation
+ .replace(" ", "")
+ .replace("", " ");
+}
+
+/**
+ * Generates a file download
+ * @param {string} filename
+ * @param {string} text
+ */
+export function generateFileDownload(filename, text) {
+ var element = document.createElement("a");
+ element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(text));
+ element.setAttribute("download", filename);
+
+ element.style.display = "none";
+ document.body.appendChild(element);
+
+ element.click();
+ document.body.removeChild(element);
+}
+
+/**
+ * Starts a file chooser
+ * @param {string} acceptedType
+ */
+export function startFileChoose(acceptedType = ".bin") {
+ var input = document.createElement("input");
+ input.type = "file";
+ input.accept = acceptedType;
+
+ return new Promise(resolve => {
+ input.onchange = _ => resolve(input.files[0]);
+ input.click();
+ });
+}
+
+const romanLiterals = [
+ "0", // NULL
+ "I",
+ "II",
+ "III",
+ "IV",
+ "V",
+ "VI",
+ "VII",
+ "VIII",
+ "IX",
+ "X",
+ "XI",
+ "XII",
+ "XIII",
+ "XIV",
+ "XV",
+ "XVI",
+ "XVII",
+ "XVIII",
+ "XIX",
+ "XX",
+];
+
+/**
+ *
+ * @param {number} number
+ * @returns {string}
+ */
+export function getRomanNumber(number) {
+ number = Math.max(0, Math.round(number));
+ if (number < romanLiterals.length) {
+ return romanLiterals[number];
+ }
+ return String(number);
+}
diff --git a/src/js/game/base_item.js b/src/js/game/base_item.js
index cbd89e7f..0075e6c1 100644
--- a/src/js/game/base_item.js
+++ b/src/js/game/base_item.js
@@ -1,82 +1,100 @@
-import { globalConfig } from "../core/config";
-import { DrawParameters } from "../core/draw_parameters";
-import { BasicSerializableObject } from "../savegame/serialization";
-
-/** @type {ItemType[]} **/
-export const itemTypes = ["shape", "color", "boolean"];
-
-/**
- * Class for items on belts etc. Not an entity for performance reasons
- */
-export class BaseItem extends BasicSerializableObject {
- constructor() {
- super();
- }
-
- static getId() {
- return "base_item";
- }
-
- /** @returns {object} */
- static getSchema() {
- return {};
- }
-
- /** @returns {ItemType} **/
- getItemType() {
- abstract;
- return "shape";
- }
-
- /**
- * Returns if the item equals the other itme
- * @param {BaseItem} other
- * @returns {boolean}
- */
- equals(other) {
- if (this.getItemType() !== other.getItemType()) {
- return false;
- }
- return this.equalsImpl(other);
- }
-
- /**
- * Override for custom comparison
- * @abstract
- * @param {BaseItem} other
- * @returns {boolean}
- */
- equalsImpl(other) {
- abstract;
- return false;
- }
-
- /**
- * Draws the item at the given position
- * @param {number} x
- * @param {number} y
- * @param {DrawParameters} parameters
- * @param {number=} diameter
- */
- drawItemCenteredClipped(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
- if (parameters.visibleRect.containsCircle(x, y, diameter / 2)) {
- this.drawItemCenteredImpl(x, y, parameters, diameter);
- }
- }
-
- /**
- * INTERNAL
- * @param {number} x
- * @param {number} y
- * @param {DrawParameters} parameters
- * @param {number=} diameter
- */
- drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
- abstract;
- }
-
- getBackgroundColorAsResource() {
- abstract;
- return "";
- }
-}
+import { globalConfig } from "../core/config";
+import { DrawParameters } from "../core/draw_parameters";
+import { BasicSerializableObject } from "../savegame/serialization";
+
+/** @type {ItemType[]} **/
+export const itemTypes = ["shape", "color", "boolean"];
+
+/**
+ * Class for items on belts etc. Not an entity for performance reasons
+ */
+export class BaseItem extends BasicSerializableObject {
+ constructor() {
+ super();
+ }
+
+ static getId() {
+ return "base_item";
+ }
+
+ /** @returns {object} */
+ static getSchema() {
+ return {};
+ }
+
+ /** @returns {ItemType} **/
+ getItemType() {
+ abstract;
+ return "shape";
+ }
+
+ /**
+ * Returns a string id of the item
+ * @returns {string}
+ */
+ getAsCopyableKey() {
+ abstract;
+ return "";
+ }
+
+ /**
+ * Returns if the item equals the other itme
+ * @param {BaseItem} other
+ * @returns {boolean}
+ */
+ equals(other) {
+ if (this.getItemType() !== other.getItemType()) {
+ return false;
+ }
+ return this.equalsImpl(other);
+ }
+
+ /**
+ * Override for custom comparison
+ * @abstract
+ * @param {BaseItem} other
+ * @returns {boolean}
+ */
+ equalsImpl(other) {
+ abstract;
+ return false;
+ }
+
+ /**
+ * Draws the item to a canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} size
+ */
+ drawFullSizeOnCanvas(context, size) {
+ abstract;
+ }
+
+ /**
+ * Draws the item at the given position
+ * @param {number} x
+ * @param {number} y
+ * @param {DrawParameters} parameters
+ * @param {number=} diameter
+ */
+ drawItemCenteredClipped(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
+ if (parameters.visibleRect.containsCircle(x, y, diameter / 2)) {
+ this.drawItemCenteredImpl(x, y, parameters, diameter);
+ }
+ }
+
+ /**
+ * INTERNAL
+ * @param {number} x
+ * @param {number} y
+ * @param {DrawParameters} parameters
+ * @param {number=} diameter
+ */
+ drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
+ abstract;
+ }
+
+ getBackgroundColorAsResource() {
+ abstract;
+ return "";
+ }
+}
diff --git a/src/js/game/belt_path.js b/src/js/game/belt_path.js
index b999e0ee..eb55d613 100644
--- a/src/js/game/belt_path.js
+++ b/src/js/game/belt_path.js
@@ -2,7 +2,7 @@ import { globalConfig } from "../core/config";
import { DrawParameters } from "../core/draw_parameters";
import { createLogger } from "../core/logging";
import { Rectangle } from "../core/rectangle";
-import { epsilonCompare, round4Digits, clamp } from "../core/utils";
+import { clamp, epsilonCompare, round4Digits } from "../core/utils";
import { enumDirection, enumDirectionToVector, enumInvertedDirections, Vector } from "../core/vector";
import { BasicSerializableObject, types } from "../savegame/serialization";
import { BaseItem } from "./base_item";
@@ -175,6 +175,11 @@ export class BeltPath extends BasicSerializableObject {
*/
onPathChanged() {
this.acceptorTarget = this.computeAcceptingEntityAndSlot();
+
+ /**
+ * How many items past the first item are compressed
+ */
+ this.numCompressedItemsAfterFirstItem = 0;
}
/**
@@ -186,9 +191,12 @@ export class BeltPath extends BasicSerializableObject {
/**
* Finds the entity which accepts our items
+ * @param {boolean=} debug_Silent Whether debug output should be silent
* @return {{ entity: Entity, slot: number, direction?: enumDirection }}
*/
- computeAcceptingEntityAndSlot() {
+ computeAcceptingEntityAndSlot(debug_Silent = false) {
+ DEBUG && !debug_Silent && logger.log("Recomputing acceptor target");
+
const lastEntity = this.entityPath[this.entityPath.length - 1];
const lastStatic = lastEntity.components.StaticMapEntity;
const lastBeltComp = lastEntity.components.Belt;
@@ -207,12 +215,23 @@ export class BeltPath extends BasicSerializableObject {
);
if (targetEntity) {
+ DEBUG && !debug_Silent && logger.log(" Found target entity", targetEntity.uid);
const targetStaticComp = targetEntity.components.StaticMapEntity;
const targetBeltComp = targetEntity.components.Belt;
// Check for belts (special case)
if (targetBeltComp) {
const beltAcceptingDirection = targetStaticComp.localDirectionToWorld(enumDirection.top);
+ DEBUG &&
+ !debug_Silent &&
+ logger.log(
+ " Entity is accepting items from",
+ ejectSlotWsDirection,
+ "vs",
+ beltAcceptingDirection,
+ "Rotation:",
+ targetStaticComp.rotation
+ );
if (ejectSlotWsDirection === beltAcceptingDirection) {
return {
entity: targetEntity,
@@ -377,6 +396,61 @@ export class BeltPath extends BasicSerializableObject {
if (!actualBounds.equalsEpsilon(this.worldBounds, 0.01)) {
return fail("Bounds are stale");
}
+
+ // Check acceptor
+ const acceptor = this.computeAcceptingEntityAndSlot(true);
+ if (!!acceptor !== !!this.acceptorTarget) {
+ return fail("Acceptor target mismatch, acceptor", !!acceptor, "vs stored", !!this.acceptorTarget);
+ }
+
+ if (acceptor) {
+ if (this.acceptorTarget.entity !== acceptor.entity) {
+ return fail(
+ "Mismatching entity on acceptor target:",
+ acceptor.entity.uid,
+ "vs",
+ this.acceptorTarget.entity.uid
+ );
+ }
+
+ if (this.acceptorTarget.slot !== acceptor.slot) {
+ return fail(
+ "Mismatching entity on acceptor target:",
+ acceptor.slot,
+ "vs stored",
+ this.acceptorTarget.slot
+ );
+ }
+
+ if (this.acceptorTarget.direction !== acceptor.direction) {
+ return fail(
+ "Mismatching direction on acceptor target:",
+ acceptor.direction,
+ "vs stored",
+ this.acceptorTarget.direction
+ );
+ }
+ }
+
+ // Check first nonzero offset
+ let firstNonzero = 0;
+ for (let i = this.items.length - 2; i >= 0; --i) {
+ if (this.items[i][_nextDistance] < globalConfig.itemSpacingOnBelts + 1e-5) {
+ ++firstNonzero;
+ } else {
+ break;
+ }
+ }
+
+ // Should warn, but this check isn't actually accurate
+ // if (firstNonzero !== this.numCompressedItemsAfterFirstItem) {
+ // console.warn(
+ // "First nonzero index is " +
+ // firstNonzero +
+ // " but stored is " +
+ // this.numCompressedItemsAfterFirstItem
+ // );
+ // }
}
/* dev:end */
@@ -989,11 +1063,15 @@ export class BeltPath extends BasicSerializableObject {
// Store how much velocity (strictly its distance, not velocity) we have to distribute over all items
let remainingVelocity = beltSpeed;
- for (let i = this.items.length - 1; i >= 0; --i) {
- const nextDistanceAndItem = this.items[i];
+ // Store the last item we processed, so we can skip clashed ones
+ let lastItemProcessed;
+
+ for (lastItemProcessed = this.items.length - 1; lastItemProcessed >= 0; --lastItemProcessed) {
+ const nextDistanceAndItem = this.items[lastItemProcessed];
// Compute how much spacing we need at least
- const minimumSpacing = i === this.items.length - 1 ? 0 : globalConfig.itemSpacingOnBelts;
+ const minimumSpacing =
+ lastItemProcessed === this.items.length - 1 ? 0 : globalConfig.itemSpacingOnBelts;
// Compute how much we can advance
const clampedProgress = Math.max(
@@ -1018,21 +1096,42 @@ export class BeltPath extends BasicSerializableObject {
// Try to directly get rid of the item
if (this.tryHandOverItem(nextDistanceAndItem[_item], excessVelocity)) {
this.items.pop();
+
+ this.numCompressedItemsAfterFirstItem = Math.max(
+ 0,
+ this.numCompressedItemsAfterFirstItem - 1
+ );
}
}
+ if (isFirstItemProcessed) {
+ // Skip N null items after first items
+ lastItemProcessed -= this.numCompressedItemsAfterFirstItem;
+ }
+
isFirstItemProcessed = false;
this.spacingToFirstItem += clampedProgress;
- if (remainingVelocity < 0.01) {
+ if (remainingVelocity < 1e-7) {
break;
}
}
+ // Compute compressed item count
+ this.numCompressedItemsAfterFirstItem = Math.max(
+ 0,
+ this.numCompressedItemsAfterFirstItem,
+ this.items.length - 2 - lastItemProcessed
+ );
+
// Check if we have an item which is ready to be emitted
const lastItem = this.items[this.items.length - 1];
if (lastItem && lastItem[_nextDistance] === 0 && this.acceptorTarget) {
if (this.tryHandOverItem(lastItem[_item])) {
this.items.pop();
+ this.numCompressedItemsAfterFirstItem = Math.max(
+ 0,
+ this.numCompressedItemsAfterFirstItem - 1
+ );
}
}
@@ -1069,12 +1168,14 @@ export class BeltPath extends BasicSerializableObject {
// Trigger animation on the acceptor comp
const targetAcceptorComp = this.acceptorTarget.entity.components.ItemAcceptor;
if (targetAcceptorComp) {
- targetAcceptorComp.onItemAccepted(
- this.acceptorTarget.slot,
- this.acceptorTarget.direction,
- item,
- remainingProgress
- );
+ if (!this.root.app.settings.getAllSettings().simplifiedBelts) {
+ targetAcceptorComp.onItemAccepted(
+ this.acceptorTarget.slot,
+ this.acceptorTarget.direction,
+ item,
+ remainingProgress
+ );
+ }
}
return true;
@@ -1091,7 +1192,7 @@ export class BeltPath extends BasicSerializableObject {
computePositionFromProgress(progress) {
let currentLength = 0;
- // floating point issuses ..
+ // floating point issues ..
assert(progress <= this.totalLength + 0.02, "Progress too big: " + progress);
for (let i = 0; i < this.entityPath.length; ++i) {
@@ -1154,6 +1255,11 @@ export class BeltPath extends BasicSerializableObject {
worldPos.y + 2
);
progress += nextDistanceAndItem[_nextDistance];
+
+ if (this.items.length - 1 - this.numCompressedItemsAfterFirstItem === i) {
+ parameters.context.fillStyle = "red";
+ parameters.context.fillRect(worldPos.x + 5, worldPos.y, 20, 3);
+ }
}
for (let i = 0; i < this.entityPath.length; ++i) {
@@ -1179,6 +1285,40 @@ export class BeltPath extends BasicSerializableObject {
parameters.context.fillRect(firstItemIndicator.x - 3, firstItemIndicator.y - 1, 6, 2);
}
+ /**
+ * Checks if this belt path should render simplified
+ */
+ checkIsPotatoMode() {
+ // POTATO Mode: Only show items when belt is hovered
+ if (!this.root.app.settings.getAllSettings().simplifiedBelts) {
+ return false;
+ }
+
+ if (this.root.currentLayer !== "regular") {
+ // Not in regular layer
+ return true;
+ }
+
+ const mousePos = this.root.app.mousePosition;
+ if (!mousePos) {
+ // Mouse not registered
+ return true;
+ }
+
+ const tile = this.root.camera.screenToWorld(mousePos).toTileSpace();
+ const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "regular");
+ if (!contents || !contents.components.Belt) {
+ // Nothing below
+ return true;
+ }
+
+ if (contents.components.Belt.assignedPath !== this) {
+ // Not this path
+ return true;
+ }
+ return false;
+ }
+
/**
* Draws the path
* @param {DrawParameters} parameters
@@ -1193,6 +1333,30 @@ export class BeltPath extends BasicSerializableObject {
return;
}
+ if (this.checkIsPotatoMode()) {
+ const firstItem = this.items[0];
+ if (this.entityPath.length > 1 && firstItem) {
+ const medianBeltIndex = clamp(
+ Math.round(this.entityPath.length / 2 - 1),
+ 0,
+ this.entityPath.length - 1
+ );
+ const medianBelt = this.entityPath[medianBeltIndex];
+ const beltComp = medianBelt.components.Belt;
+ const staticComp = medianBelt.components.StaticMapEntity;
+ const centerPosLocal = beltComp.transformBeltToLocalSpace(
+ this.entityPath.length % 2 === 0 ? beltComp.getEffectiveLengthTiles() : 0.5
+ );
+ const centerPos = staticComp.localTileToWorld(centerPosLocal).toWorldSpaceCenterOfTile();
+
+ parameters.context.globalAlpha = 0.5;
+ firstItem[_item].drawItemCenteredClipped(centerPos.x, centerPos.y, parameters);
+ parameters.context.globalAlpha = 1;
+ }
+
+ return;
+ }
+
let currentItemPos = this.spacingToFirstItem;
let currentItemIndex = 0;
@@ -1206,7 +1370,7 @@ export class BeltPath extends BasicSerializableObject {
// Check if the current items are on the belt
while (trackPos + beltLength >= currentItemPos - 1e-5) {
- // Its on the belt, render it now
+ // It's on the belt, render it now
const staticComp = entity.components.StaticMapEntity;
assert(
currentItemPos - trackPos >= 0,
diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js
index ccbbc248..63989393 100644
--- a/src/js/game/blueprint.js
+++ b/src/js/game/blueprint.js
@@ -1,14 +1,9 @@
+import { globalConfig } from "../core/config";
import { DrawParameters } from "../core/draw_parameters";
-import { Loader } from "../core/loader";
-import { createLogger } from "../core/logging";
+import { findNiceIntegerValue } from "../core/utils";
import { Vector } from "../core/vector";
import { Entity } from "./entity";
import { GameRoot } from "./root";
-import { findNiceIntegerValue } from "../core/utils";
-import { blueprintShape } from "./upgrades";
-import { globalConfig } from "../core/config";
-
-const logger = createLogger("blueprint");
export class Blueprint {
/**
@@ -44,7 +39,7 @@ export class Blueprint {
const entity = root.entityMgr.findByUid(uids[i]);
assert(entity, "Entity for blueprint not found:" + uids[i]);
- const clone = entity.duplicateWithoutContents();
+ const clone = entity.clone();
newEntities.push(clone);
const pos = entity.components.StaticMapEntity.getTileSpaceBounds().getCenter();
@@ -143,7 +138,7 @@ export class Blueprint {
* @param {GameRoot} root
*/
canAfford(root) {
- return root.hubGoals.getShapesStoredByKey(blueprintShape) >= this.getCost();
+ return root.hubGoals.getShapesStoredByKey(root.gameMode.getBlueprintShapeKey()) >= this.getCost();
}
/**
@@ -160,7 +155,7 @@ export class Blueprint {
continue;
}
- const clone = entity.duplicateWithoutContents();
+ const clone = entity.clone();
clone.components.StaticMapEntity.origin.addInplace(tile);
root.logic.freeEntityAreaBeforeBuild(clone);
root.map.placeStaticEntity(clone);
diff --git a/src/js/game/building_codes.js b/src/js/game/building_codes.js
index 05c27f57..78240c31 100644
--- a/src/js/game/building_codes.js
+++ b/src/js/game/building_codes.js
@@ -1,83 +1,95 @@
-/* typehints:start */
-import { MetaBuilding } from "./meta_building";
-import { AtlasSprite } from "../core/sprites";
-import { Vector } from "../core/vector";
-/* typehints:end */
-
-/**
- * @typedef {{
- * metaClass: typeof MetaBuilding,
- * metaInstance?: MetaBuilding,
- * variant?: string,
- * rotationVariant?: number,
- * tileSize?: Vector,
- * sprite?: AtlasSprite,
- * blueprintSprite?: AtlasSprite,
- * silhouetteColor?: string
- * }} BuildingVariantIdentifier
- */
-
-/**
- * Stores a lookup table for all building variants (for better performance)
- * @type {Object}
- */
-export const gBuildingVariants = {
- // Set later
-};
-
-/**
- * Registers a new variant
- * @param {number} id
- * @param {typeof MetaBuilding} meta
- * @param {string} variant
- * @param {number} rotationVariant
- */
-export function registerBuildingVariant(
- id,
- meta,
- variant = "default" /* FIXME: Circular dependency, actually its defaultBuildingVariant */,
- rotationVariant = 0
-) {
- assert(!gBuildingVariants[id], "Duplicate id: " + id);
- gBuildingVariants[id] = {
- metaClass: meta,
- variant,
- rotationVariant,
- // @ts-ignore
- tileSize: new meta().getDimensions(variant),
- };
-}
-
-/**
- *
- * @param {number} code
- * @returns {BuildingVariantIdentifier}
- */
-export function getBuildingDataFromCode(code) {
- assert(gBuildingVariants[code], "Invalid building code: " + code);
- return gBuildingVariants[code];
-}
-
-/**
- * Finds the code for a given variant
- * @param {MetaBuilding} metaBuilding
- * @param {string} variant
- * @param {number} rotationVariant
- */
-export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant) {
- for (const key in gBuildingVariants) {
- const data = gBuildingVariants[key];
- if (
- data.metaInstance.getId() === metaBuilding.getId() &&
- data.variant === variant &&
- data.rotationVariant === rotationVariant
- ) {
- return +key;
- }
- }
- assertAlways(
- false,
- "Building not found by data: " + metaBuilding.getId() + " / " + variant + " / " + rotationVariant
- );
- return 0;
-}
+/* typehints:start */
+import { MetaBuilding } from "./meta_building";
+import { AtlasSprite } from "../core/sprites";
+import { Vector } from "../core/vector";
+/* typehints:end */
+
+/**
+ * @typedef {{
+ * metaClass: typeof MetaBuilding,
+ * metaInstance?: MetaBuilding,
+ * variant?: string,
+ * rotationVariant?: number,
+ * tileSize?: Vector,
+ * sprite?: AtlasSprite,
+ * blueprintSprite?: AtlasSprite,
+ * silhouetteColor?: string
+ * }} BuildingVariantIdentifier
+ */
+
+/**
+ * Stores a lookup table for all building variants (for better performance)
+ * @type {Object}
+ */
+export const gBuildingVariants = {
+ // Set later
+};
+
+/**
+ * Mapping from 'metaBuildingId/variant/rotationVariant' to building code
+ * @type {Map}
+ */
+const variantsCache = new Map();
+
+/**
+ * Registers a new variant
+ * @param {number} code
+ * @param {typeof MetaBuilding} meta
+ * @param {string} variant
+ * @param {number} rotationVariant
+ */
+export function registerBuildingVariant(
+ code,
+ meta,
+ variant = "default" /* @TODO: Circular dependency, actually its defaultBuildingVariant */,
+ rotationVariant = 0
+) {
+ assert(!gBuildingVariants[code], "Duplicate id: " + code);
+ gBuildingVariants[code] = {
+ metaClass: meta,
+ variant,
+ rotationVariant,
+ // @ts-ignore
+ tileSize: new meta().getDimensions(variant),
+ };
+}
+
+/**
+ *
+ * @param {number} code
+ * @returns {BuildingVariantIdentifier}
+ */
+export function getBuildingDataFromCode(code) {
+ assert(gBuildingVariants[code], "Invalid building code: " + code);
+ return gBuildingVariants[code];
+}
+
+/**
+ * Builds the cache for the codes
+ */
+export function buildBuildingCodeCache() {
+ for (const code in gBuildingVariants) {
+ const data = gBuildingVariants[code];
+ const hash = data.metaInstance.getId() + "/" + data.variant + "/" + data.rotationVariant;
+ variantsCache.set(hash, +code);
+ }
+}
+
+/**
+ * Finds the code for a given variant
+ * @param {MetaBuilding} metaBuilding
+ * @param {string} variant
+ * @param {number} rotationVariant
+ * @returns {number}
+ */
+export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant) {
+ const hash = metaBuilding.getId() + "/" + variant + "/" + rotationVariant;
+ const result = variantsCache.get(hash);
+ if (G_IS_DEV) {
+ if (!result) {
+ console.warn("Known hashes:", Array.from(variantsCache.keys()));
+ assertAlways(false, "Building not found by data: " + hash);
+ }
+ }
+ return result;
+}
diff --git a/src/js/game/buildings/analyzer.js b/src/js/game/buildings/analyzer.js
new file mode 100644
index 00000000..8335f730
--- /dev/null
+++ b/src/js/game/buildings/analyzer.js
@@ -0,0 +1,79 @@
+import { generateMatrixRotations } from "../../core/utils";
+import { enumDirection, Vector } from "../../core/vector";
+import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+const overlayMatrix = generateMatrixRotations([1, 1, 0, 1, 1, 1, 0, 1, 0]);
+
+export class MetaAnalyzerBuilding extends MetaBuilding {
+ constructor() {
+ super("analyzer");
+ }
+
+ getSilhouetteColor() {
+ return "#3a52bc";
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_virtual_processing);
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getRenderPins() {
+ // We already have it included
+ return false;
+ }
+
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) {
+ return overlayMatrix[rotation];
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.left,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.right,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.bottom,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ],
+ })
+ );
+
+ entity.addComponent(
+ new LogicGateComponent({
+ type: enumLogicGateType.analyzer,
+ })
+ );
+ }
+}
diff --git a/src/js/game/buildings/splitter.js b/src/js/game/buildings/balancer.js
similarity index 63%
rename from src/js/game/buildings/splitter.js
rename to src/js/game/buildings/balancer.js
index d512e002..2f14e36c 100644
--- a/src/js/game/buildings/splitter.js
+++ b/src/js/game/buildings/balancer.js
@@ -7,48 +7,81 @@ import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
import { GameRoot } from "../root";
import { enumHubGoalRewards } from "../tutorial_goals";
import { T } from "../../translations";
-import { formatItemsPerSecond } from "../../core/utils";
+import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
import { BeltUnderlaysComponent } from "../components/belt_underlays";
/** @enum {string} */
-export const enumSplitterVariants = {
- compact: "compact",
- compactInverse: "compact-inverse",
- compactMerge: "compact-merge",
- compactMergeInverse: "compact-merge-inverse",
+export const enumBalancerVariants = {
+ merger: "merger",
+ mergerInverse: "merger-inverse",
+ splitter: "splitter",
+ splitterInverse: "splitter-inverse",
};
-export class MetaSplitterBuilding extends MetaBuilding {
+const overlayMatrices = {
+ [defaultBuildingVariant]: null,
+ [enumBalancerVariants.merger]: generateMatrixRotations([0, 1, 0, 0, 1, 1, 0, 1, 0]),
+ [enumBalancerVariants.mergerInverse]: generateMatrixRotations([0, 1, 0, 1, 1, 0, 0, 1, 0]),
+ [enumBalancerVariants.splitter]: generateMatrixRotations([0, 1, 0, 0, 1, 1, 0, 1, 0]),
+ [enumBalancerVariants.splitterInverse]: generateMatrixRotations([0, 1, 0, 1, 1, 0, 0, 1, 0]),
+};
+
+export class MetaBalancerBuilding extends MetaBuilding {
constructor() {
- super("splitter");
+ super("balancer");
}
getDimensions(variant) {
switch (variant) {
case defaultBuildingVariant:
return new Vector(2, 1);
- case enumSplitterVariants.compact:
- case enumSplitterVariants.compactInverse:
- case enumSplitterVariants.compactMerge:
- case enumSplitterVariants.compactMergeInverse:
+ case enumBalancerVariants.merger:
+ case enumBalancerVariants.mergerInverse:
+ case enumBalancerVariants.splitter:
+ case enumBalancerVariants.splitterInverse:
return new Vector(1, 1);
default:
- assertAlways(false, "Unknown splitter variant: " + variant);
+ assertAlways(false, "Unknown balancer variant: " + variant);
}
}
+ /**
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ * @returns {Array|null}
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ const matrix = overlayMatrices[variant];
+ if (matrix) {
+ return matrix[rotation];
+ }
+ return null;
+ }
+
/**
* @param {GameRoot} root
* @param {string} variant
* @returns {Array<[string, string]>}
*/
getAdditionalStatistics(root, variant) {
- const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.splitter);
+ let speedMultiplier = 2;
+ switch (variant) {
+ case enumBalancerVariants.merger:
+ case enumBalancerVariants.mergerInverse:
+ case enumBalancerVariants.splitter:
+ case enumBalancerVariants.splitterInverse:
+ speedMultiplier = 1;
+ }
+
+ const speed =
+ (root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.balancer) / 2) * speedMultiplier;
return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
}
getSilhouetteColor() {
- return "#444";
+ return "#555759";
}
/**
@@ -57,12 +90,12 @@ export class MetaSplitterBuilding extends MetaBuilding {
getAvailableVariants(root) {
let available = [defaultBuildingVariant];
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_splitter_compact)) {
- available.push(enumSplitterVariants.compact, enumSplitterVariants.compactInverse);
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_merger)) {
+ available.push(enumBalancerVariants.merger, enumBalancerVariants.mergerInverse);
}
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_merger_compact)) {
- available.push(enumSplitterVariants.compactMerge, enumSplitterVariants.compactMergeInverse);
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_splitter)) {
+ available.push(enumBalancerVariants.splitter, enumBalancerVariants.splitterInverse);
}
return available;
@@ -72,7 +105,7 @@ export class MetaSplitterBuilding extends MetaBuilding {
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_splitter);
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_balancer);
}
/**
@@ -89,13 +122,14 @@ export class MetaSplitterBuilding extends MetaBuilding {
entity.addComponent(
new ItemProcessorComponent({
inputsPerCharge: 1,
- processorType: enumItemProcessorTypes.splitter,
+ processorType: enumItemProcessorTypes.balancer,
})
);
entity.addComponent(
new ItemEjectorComponent({
slots: [], // set later
+ renderFloatingItems: false,
})
);
@@ -134,8 +168,8 @@ export class MetaSplitterBuilding extends MetaBuilding {
break;
}
- case enumSplitterVariants.compact:
- case enumSplitterVariants.compactInverse: {
+ case enumBalancerVariants.merger:
+ case enumBalancerVariants.mergerInverse: {
entity.components.ItemAcceptor.setSlots([
{
pos: new Vector(0, 0),
@@ -144,7 +178,7 @@ export class MetaSplitterBuilding extends MetaBuilding {
{
pos: new Vector(0, 0),
directions: [
- variant === enumSplitterVariants.compactInverse
+ variant === enumBalancerVariants.mergerInverse
? enumDirection.left
: enumDirection.right,
],
@@ -161,8 +195,8 @@ export class MetaSplitterBuilding extends MetaBuilding {
break;
}
- case enumSplitterVariants.compactMerge:
- case enumSplitterVariants.compactMergeInverse: {
+ case enumBalancerVariants.splitter:
+ case enumBalancerVariants.splitterInverse: {
entity.components.ItemAcceptor.setSlots([
{
pos: new Vector(0, 0),
@@ -178,7 +212,7 @@ export class MetaSplitterBuilding extends MetaBuilding {
{
pos: new Vector(0, 0),
direction:
- variant === enumSplitterVariants.compactMergeInverse
+ variant === enumBalancerVariants.splitterInverse
? enumDirection.left
: enumDirection.right,
},
@@ -191,7 +225,7 @@ export class MetaSplitterBuilding extends MetaBuilding {
break;
}
default:
- assertAlways(false, "Unknown splitter variant: " + variant);
+ assertAlways(false, "Unknown balancer variant: " + variant);
}
}
}
diff --git a/src/js/game/buildings/belt.js b/src/js/game/buildings/belt.js
index 1fb80b88..84646b19 100644
--- a/src/js/game/buildings/belt.js
+++ b/src/js/game/buildings/belt.js
@@ -1,52 +1,229 @@
-import { Loader } from "../../core/loader";
-import { enumDirection } from "../../core/vector";
-import { SOUNDS } from "../../platform/sound";
-import { arrayBeltVariantToRotation, MetaBeltBaseBuilding } from "./belt_base";
-
-export class MetaBeltBuilding extends MetaBeltBaseBuilding {
- constructor() {
- super("belt");
- }
-
- getSilhouetteColor() {
- return "#777";
- }
-
- getPlacementSound() {
- return SOUNDS.placeBelt;
- }
-
- getPreviewSprite(rotationVariant) {
- switch (arrayBeltVariantToRotation[rotationVariant]) {
- case enumDirection.top: {
- return Loader.getSprite("sprites/buildings/belt_top.png");
- }
- case enumDirection.left: {
- return Loader.getSprite("sprites/buildings/belt_left.png");
- }
- case enumDirection.right: {
- return Loader.getSprite("sprites/buildings/belt_right.png");
- }
- default: {
- assertAlways(false, "Invalid belt rotation variant");
- }
- }
- }
-
- getBlueprintSprite(rotationVariant) {
- switch (arrayBeltVariantToRotation[rotationVariant]) {
- case enumDirection.top: {
- return Loader.getSprite("sprites/blueprints/belt_top.png");
- }
- case enumDirection.left: {
- return Loader.getSprite("sprites/blueprints/belt_left.png");
- }
- case enumDirection.right: {
- return Loader.getSprite("sprites/blueprints/belt_right.png");
- }
- default: {
- assertAlways(false, "Invalid belt rotation variant");
- }
- }
- }
-}
+import { Loader } from "../../core/loader";
+import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
+import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector";
+import { SOUNDS } from "../../platform/sound";
+import { T } from "../../translations";
+import { BeltComponent } from "../components/belt";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { THEME } from "../theme";
+
+export const arrayBeltVariantToRotation = [enumDirection.top, enumDirection.left, enumDirection.right];
+
+export const beltOverlayMatrices = {
+ [enumDirection.top]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
+ [enumDirection.left]: generateMatrixRotations([0, 0, 0, 1, 1, 0, 0, 1, 0]),
+ [enumDirection.right]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]),
+};
+
+export class MetaBeltBuilding extends MetaBuilding {
+ constructor() {
+ super("belt");
+ }
+
+ getSilhouetteColor() {
+ return THEME.map.chunkOverview.beltColor;
+ }
+
+ getPlacementSound() {
+ return SOUNDS.placeBelt;
+ }
+
+ getHasDirectionLockAvailable() {
+ return true;
+ }
+ getStayInPlacementMode() {
+ return true;
+ }
+
+ getRotateAutomaticallyWhilePlacing() {
+ return true;
+ }
+
+ getSprite() {
+ return null;
+ }
+
+ getIsReplaceable() {
+ return true;
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ const beltSpeed = root.hubGoals.getBeltBaseSpeed();
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)]];
+ }
+
+ getPreviewSprite(rotationVariant) {
+ switch (arrayBeltVariantToRotation[rotationVariant]) {
+ case enumDirection.top: {
+ return Loader.getSprite("sprites/buildings/belt_top.png");
+ }
+ case enumDirection.left: {
+ return Loader.getSprite("sprites/buildings/belt_left.png");
+ }
+ case enumDirection.right: {
+ return Loader.getSprite("sprites/buildings/belt_right.png");
+ }
+ default: {
+ assertAlways(false, "Invalid belt rotation variant");
+ }
+ }
+ }
+
+ getBlueprintSprite(rotationVariant) {
+ switch (arrayBeltVariantToRotation[rotationVariant]) {
+ case enumDirection.top: {
+ return Loader.getSprite("sprites/blueprints/belt_top.png");
+ }
+ case enumDirection.left: {
+ return Loader.getSprite("sprites/blueprints/belt_left.png");
+ }
+ case enumDirection.right: {
+ return Loader.getSprite("sprites/blueprints/belt_right.png");
+ }
+ default: {
+ assertAlways(false, "Invalid belt rotation variant");
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return beltOverlayMatrices[entity.components.Belt.direction][rotation];
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new BeltComponent({
+ direction: enumDirection.top, // updated later
+ })
+ );
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ */
+ updateVariants(entity, rotationVariant) {
+ entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant];
+ }
+
+ /**
+ * Should compute the optimal rotation variant on the given tile
+ * @param {object} param0
+ * @param {GameRoot} param0.root
+ * @param {Vector} param0.tile
+ * @param {number} param0.rotation
+ * @param {string} param0.variant
+ * @param {Layer} param0.layer
+ * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
+ */
+ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
+ const topDirection = enumAngleToDirection[rotation];
+ const rightDirection = enumAngleToDirection[(rotation + 90) % 360];
+ const bottomDirection = enumAngleToDirection[(rotation + 180) % 360];
+ const leftDirection = enumAngleToDirection[(rotation + 270) % 360];
+
+ const { ejectors, acceptors } = root.logic.getEjectorsAndAcceptorsAtTile(tile);
+
+ let hasBottomEjector = false;
+ let hasRightEjector = false;
+ let hasLeftEjector = false;
+
+ let hasTopAcceptor = false;
+ let hasLeftAcceptor = false;
+ let hasRightAcceptor = false;
+
+ // Check all ejectors
+ for (let i = 0; i < ejectors.length; ++i) {
+ const ejector = ejectors[i];
+
+ if (ejector.toDirection === topDirection) {
+ hasBottomEjector = true;
+ } else if (ejector.toDirection === leftDirection) {
+ hasRightEjector = true;
+ } else if (ejector.toDirection === rightDirection) {
+ hasLeftEjector = true;
+ }
+ }
+
+ // Check all acceptors
+ for (let i = 0; i < acceptors.length; ++i) {
+ const acceptor = acceptors[i];
+ if (acceptor.fromDirection === bottomDirection) {
+ hasTopAcceptor = true;
+ } else if (acceptor.fromDirection === rightDirection) {
+ hasLeftAcceptor = true;
+ } else if (acceptor.fromDirection === leftDirection) {
+ hasRightAcceptor = true;
+ }
+ }
+
+ // Soo .. if there is any ejector below us we always prioritize
+ // this ejector
+ if (!hasBottomEjector) {
+ // When something ejects to us from the left and nothing from the right,
+ // do a curve from the left to the top
+
+ if (hasRightEjector && !hasLeftEjector) {
+ return {
+ rotation: (rotation + 270) % 360,
+ rotationVariant: 2,
+ };
+ }
+
+ // When something ejects to us from the right and nothing from the left,
+ // do a curve from the right to the top
+ if (hasLeftEjector && !hasRightEjector) {
+ return {
+ rotation: (rotation + 90) % 360,
+ rotationVariant: 1,
+ };
+ }
+ }
+
+ // When there is a top acceptor, ignore sides
+ // NOTICE: This makes the belt prefer side turns *way* too much!
+ if (!hasTopAcceptor) {
+ // When there is an acceptor to the right but no acceptor to the left,
+ // do a turn to the right
+ if (hasRightAcceptor && !hasLeftAcceptor) {
+ return {
+ rotation,
+ rotationVariant: 2,
+ };
+ }
+
+ // When there is an acceptor to the left but no acceptor to the right,
+ // do a turn to the left
+ if (hasLeftAcceptor && !hasRightAcceptor) {
+ return {
+ rotation,
+ rotationVariant: 1,
+ };
+ }
+ }
+
+ return {
+ rotation,
+ rotationVariant: 0,
+ };
+ }
+}
diff --git a/src/js/game/buildings/belt_base.js b/src/js/game/buildings/belt_base.js
deleted file mode 100644
index 1aafa9e1..00000000
--- a/src/js/game/buildings/belt_base.js
+++ /dev/null
@@ -1,186 +0,0 @@
-import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
-import { enumAngleToDirection, enumDirection, Vector } from "../../core/vector";
-import { SOUNDS } from "../../platform/sound";
-import { T } from "../../translations";
-import { BeltComponent } from "../components/belt";
-import { Entity } from "../entity";
-import { MetaBuilding } from "../meta_building";
-import { GameRoot } from "../root";
-
-export const arrayBeltVariantToRotation = [enumDirection.top, enumDirection.left, enumDirection.right];
-
-export const beltOverlayMatrices = {
- [enumDirection.top]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
- [enumDirection.left]: generateMatrixRotations([0, 0, 0, 1, 1, 0, 0, 1, 0]),
- [enumDirection.right]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]),
-};
-
-export class MetaBeltBaseBuilding extends MetaBuilding {
- getHasDirectionLockAvailable() {
- return true;
- }
-
- /**
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- const beltSpeed = root.hubGoals.getBeltBaseSpeed();
- return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)]];
- }
-
- getStayInPlacementMode() {
- return true;
- }
-
- getRotateAutomaticallyWhilePlacing() {
- return true;
- }
-
- getPlacementSound() {
- return SOUNDS.placeBelt;
- }
-
- getSprite() {
- return null;
- }
-
- getIsReplaceable() {
- return true;
- }
-
- /**
- *
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return beltOverlayMatrices[entity.components.Belt.direction][rotation];
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(
- new BeltComponent({
- direction: enumDirection.top, // updated later
- })
- );
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- */
- updateVariants(entity, rotationVariant) {
- entity.components.Belt.direction = arrayBeltVariantToRotation[rotationVariant];
- }
-
- /**
- * Should compute the optimal rotation variant on the given tile
- * @param {object} param0
- * @param {GameRoot} param0.root
- * @param {Vector} param0.tile
- * @param {number} param0.rotation
- * @param {string} param0.variant
- * @param {Layer} param0.layer
- * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
- */
- computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
- const topDirection = enumAngleToDirection[rotation];
- const rightDirection = enumAngleToDirection[(rotation + 90) % 360];
- const bottomDirection = enumAngleToDirection[(rotation + 180) % 360];
- const leftDirection = enumAngleToDirection[(rotation + 270) % 360];
-
- const { ejectors, acceptors } = root.logic.getEjectorsAndAcceptorsAtTile(tile);
-
- let hasBottomEjector = false;
- let hasRightEjector = false;
- let hasLeftEjector = false;
-
- let hasTopAcceptor = false;
- let hasLeftAcceptor = false;
- let hasRightAcceptor = false;
-
- // Check all ejectors
- for (let i = 0; i < ejectors.length; ++i) {
- const ejector = ejectors[i];
-
- if (ejector.toDirection === topDirection) {
- hasBottomEjector = true;
- } else if (ejector.toDirection === leftDirection) {
- hasRightEjector = true;
- } else if (ejector.toDirection === rightDirection) {
- hasLeftEjector = true;
- }
- }
-
- // Check all acceptors
- for (let i = 0; i < acceptors.length; ++i) {
- const acceptor = acceptors[i];
- if (acceptor.fromDirection === bottomDirection) {
- hasTopAcceptor = true;
- } else if (acceptor.fromDirection === rightDirection) {
- hasLeftAcceptor = true;
- } else if (acceptor.fromDirection === leftDirection) {
- hasRightAcceptor = true;
- }
- }
-
- // Soo .. if there is any ejector below us we always prioritize
- // this ejector
- if (!hasBottomEjector) {
- // When something ejects to us from the left and nothing from the right,
- // do a curve from the left to the top
-
- if (hasRightEjector && !hasLeftEjector) {
- return {
- rotation: (rotation + 270) % 360,
- rotationVariant: 2,
- };
- }
-
- // When something ejects to us from the right and nothing from the left,
- // do a curve from the right to the top
- if (hasLeftEjector && !hasRightEjector) {
- return {
- rotation: (rotation + 90) % 360,
- rotationVariant: 1,
- };
- }
- }
-
- // When there is a top acceptor, ignore sides
- // NOTICE: This makes the belt prefer side turns *way* too much!
- if (!hasTopAcceptor) {
- // When there is an acceptor to the right but no acceptor to the left,
- // do a turn to the right
- if (hasRightAcceptor && !hasLeftAcceptor) {
- return {
- rotation,
- rotationVariant: 2,
- };
- }
-
- // When there is an acceptor to the left but no acceptor to the right,
- // do a turn to the left
- if (hasLeftAcceptor && !hasRightAcceptor) {
- return {
- rotation,
- rotationVariant: 1,
- };
- }
- }
-
- return {
- rotation,
- rotationVariant: 0,
- };
- }
-}
diff --git a/src/js/game/buildings/comparator.js b/src/js/game/buildings/comparator.js
new file mode 100644
index 00000000..6738d514
--- /dev/null
+++ b/src/js/game/buildings/comparator.js
@@ -0,0 +1,72 @@
+import { enumDirection, Vector } from "../../core/vector";
+import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+export class MetaComparatorBuilding extends MetaBuilding {
+ constructor() {
+ super("comparator");
+ }
+
+ getSilhouetteColor() {
+ return "#823cab";
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_virtual_processing);
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getRenderPins() {
+ // We already have it included
+ return false;
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.left,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.right,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ],
+ })
+ );
+
+ entity.addComponent(
+ new LogicGateComponent({
+ type: enumLogicGateType.compare,
+ })
+ );
+ }
+}
diff --git a/src/js/game/buildings/constant_signal.js b/src/js/game/buildings/constant_signal.js
index d2c47c26..983594cb 100644
--- a/src/js/game/buildings/constant_signal.js
+++ b/src/js/game/buildings/constant_signal.js
@@ -4,6 +4,10 @@ import { Entity } from "../entity";
import { MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
import { ConstantSignalComponent } from "../components/constant_signal";
+import { generateMatrixRotations } from "../../core/utils";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+const overlayMatrix = generateMatrixRotations([0, 1, 0, 1, 1, 1, 1, 1, 1]);
export class MetaConstantSignalBuilding extends MetaBuilding {
constructor() {
@@ -11,15 +15,14 @@ export class MetaConstantSignalBuilding extends MetaBuilding {
}
getSilhouetteColor() {
- return "#2bafda";
+ return "#2b84fd";
}
/**
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- // @todo
- return true;
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_constant_signal);
}
/** @returns {"wires"} **/
@@ -35,6 +38,10 @@ export class MetaConstantSignalBuilding extends MetaBuilding {
return false;
}
+ getSpecialOverlayRenderMatrix(rotation) {
+ return overlayMatrix[rotation];
+ }
+
/**
* Creates the entity at the given location
* @param {Entity} entity
diff --git a/src/js/game/buildings/display.js b/src/js/game/buildings/display.js
index 9c072af9..422bea81 100644
--- a/src/js/game/buildings/display.js
+++ b/src/js/game/buildings/display.js
@@ -1,51 +1,51 @@
-import { enumDirection, Vector } from "../../core/vector";
-import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
-import { Entity } from "../entity";
-import { MetaBuilding } from "../meta_building";
-import { GameRoot } from "../root";
-import { DisplayComponent } from "../components/display";
-
-export class MetaDisplayBuilding extends MetaBuilding {
- constructor() {
- super("display");
- }
-
- getSilhouetteColor() {
- return "#aaaaaa";
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- // @todo
- return true;
- }
-
- getDimensions() {
- return new Vector(1, 1);
- }
-
- getShowWiresLayerPreview() {
- return true;
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(
- new WiredPinsComponent({
- slots: [
- {
- pos: new Vector(0, 0),
- direction: enumDirection.bottom,
- type: enumPinSlotType.logicalAcceptor,
- },
- ],
- })
- );
- entity.addComponent(new DisplayComponent());
- }
-}
+import { enumDirection, Vector } from "../../core/vector";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { DisplayComponent } from "../components/display";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+export class MetaDisplayBuilding extends MetaBuilding {
+ constructor() {
+ super("display");
+ }
+
+ getSilhouetteColor() {
+ return "#aaaaaa";
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_display);
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getShowWiresLayerPreview() {
+ return true;
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.bottom,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ],
+ })
+ );
+ entity.addComponent(new DisplayComponent());
+ }
+}
diff --git a/src/js/game/buildings/filter.js b/src/js/game/buildings/filter.js
index fb368fc7..2d81ce83 100644
--- a/src/js/game/buildings/filter.js
+++ b/src/js/game/buildings/filter.js
@@ -1,15 +1,14 @@
+import { formatItemsPerSecond } from "../../core/utils";
import { enumDirection, Vector } from "../../core/vector";
+import { T } from "../../translations";
+import { FilterComponent } from "../components/filter";
import { ItemAcceptorComponent } from "../components/item_acceptor";
import { ItemEjectorComponent } from "../components/item_ejector";
-import {
- enumItemProcessorRequirements,
- enumItemProcessorTypes,
- ItemProcessorComponent,
-} from "../components/item_processor";
import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
import { Entity } from "../entity";
import { MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
export class MetaFilterBuilding extends MetaBuilding {
constructor() {
@@ -24,8 +23,7 @@ export class MetaFilterBuilding extends MetaBuilding {
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- // @todo
- return true;
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_filter);
}
getDimensions() {
@@ -36,6 +34,16 @@ export class MetaFilterBuilding extends MetaBuilding {
return true;
}
+ /**
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ const beltSpeed = root.hubGoals.getBeltBaseSpeed();
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)]];
+ }
+
/**
* Creates the entity at the given location
* @param {Entity} entity
@@ -79,12 +87,6 @@ export class MetaFilterBuilding extends MetaBuilding {
})
);
- entity.addComponent(
- new ItemProcessorComponent({
- processorType: enumItemProcessorTypes.filter,
- inputsPerCharge: 1,
- processingRequirement: enumItemProcessorRequirements.filter,
- })
- );
+ entity.addComponent(new FilterComponent());
}
}
diff --git a/src/js/game/buildings/item_producer.js b/src/js/game/buildings/item_producer.js
new file mode 100644
index 00000000..477ed603
--- /dev/null
+++ b/src/js/game/buildings/item_producer.js
@@ -0,0 +1,44 @@
+import { enumDirection, Vector } from "../../core/vector";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { ItemProducerComponent } from "../components/item_producer";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+
+export class MetaItemProducerBuilding extends MetaBuilding {
+ constructor() {
+ super("item_producer");
+ }
+
+ getSilhouetteColor() {
+ return "#b37dcd";
+ }
+
+ getShowWiresLayerPreview() {
+ return true;
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new ItemEjectorComponent({
+ slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
+ })
+ );
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ type: enumPinSlotType.logicalAcceptor,
+ direction: enumDirection.bottom,
+ },
+ ],
+ })
+ );
+ entity.addComponent(new ItemProducerComponent());
+ }
+}
diff --git a/src/js/game/buildings/lever.js b/src/js/game/buildings/lever.js
index 244a9b17..7ddaf65f 100644
--- a/src/js/game/buildings/lever.js
+++ b/src/js/game/buildings/lever.js
@@ -4,6 +4,7 @@ import { Entity } from "../entity";
import { MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
import { LeverComponent } from "../components/lever";
+import { enumHubGoalRewards } from "../tutorial_goals";
export class MetaLeverBuilding extends MetaBuilding {
constructor() {
@@ -19,8 +20,7 @@ export class MetaLeverBuilding extends MetaBuilding {
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- // @todo
- return true;
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers);
}
getDimensions() {
diff --git a/src/js/game/buildings/logic_gate.js b/src/js/game/buildings/logic_gate.js
index e07db3ea..b61d4373 100644
--- a/src/js/game/buildings/logic_gate.js
+++ b/src/js/game/buildings/logic_gate.js
@@ -1,155 +1,151 @@
-import { enumDirection, Vector } from "../../core/vector";
-import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
-import { Entity } from "../entity";
-import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
-import { GameRoot } from "../root";
-import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
-
-/** @enum {string} */
-export const enumLogicGateVariants = {
- not: "not",
- xor: "xor",
- or: "or",
- transistor: "transistor",
-};
-
-/** @enum {string} */
-export const enumVariantToGate = {
- [defaultBuildingVariant]: enumLogicGateType.and,
- [enumLogicGateVariants.not]: enumLogicGateType.not,
- [enumLogicGateVariants.xor]: enumLogicGateType.xor,
- [enumLogicGateVariants.or]: enumLogicGateType.or,
- [enumLogicGateVariants.transistor]: enumLogicGateType.transistor,
-};
-
-export class MetaLogicGateBuilding extends MetaBuilding {
- constructor() {
- super("logic_gate");
- }
-
- getSilhouetteColor() {
- return "#89dc60";
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- // @todo
- return true;
- }
-
- /** @returns {"wires"} **/
- getLayer() {
- return "wires";
- }
-
- getDimensions() {
- return new Vector(1, 1);
- }
-
- getAvailableVariants() {
- return [
- defaultBuildingVariant,
- enumLogicGateVariants.not,
- enumLogicGateVariants.xor,
- enumLogicGateVariants.or,
- enumLogicGateVariants.transistor,
- ];
- }
-
- getRenderPins() {
- // We already have it included
- return false;
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- */
- updateVariants(entity, rotationVariant, variant) {
- const gateType = enumVariantToGate[variant];
- entity.components.LogicGate.type = gateType;
-
- const pinComp = entity.components.WiredPins;
-
- switch (gateType) {
- case enumLogicGateType.and:
- case enumLogicGateType.xor:
- case enumLogicGateType.or: {
- pinComp.setSlots([
- {
- pos: new Vector(0, 0),
- direction: enumDirection.top,
- type: enumPinSlotType.logicalEjector,
- },
- {
- pos: new Vector(0, 0),
- direction: enumDirection.left,
- type: enumPinSlotType.logicalAcceptor,
- },
- {
- pos: new Vector(0, 0),
- direction: enumDirection.right,
- type: enumPinSlotType.logicalAcceptor,
- },
- ]);
- break;
- }
- case enumLogicGateType.transistor: {
- pinComp.setSlots([
- {
- pos: new Vector(0, 0),
- direction: enumDirection.top,
- type: enumPinSlotType.logicalEjector,
- },
- {
- pos: new Vector(0, 0),
- direction: enumDirection.left,
- type: enumPinSlotType.logicalAcceptor,
- },
- {
- pos: new Vector(0, 0),
- direction: enumDirection.bottom,
- type: enumPinSlotType.logicalAcceptor,
- },
- ]);
- break;
- }
-
- case enumLogicGateType.not: {
- pinComp.setSlots([
- {
- pos: new Vector(0, 0),
- direction: enumDirection.top,
- type: enumPinSlotType.logicalEjector,
- },
- {
- pos: new Vector(0, 0),
- direction: enumDirection.bottom,
- type: enumPinSlotType.logicalAcceptor,
- },
- ]);
- break;
- }
-
- default:
- assertAlways("unknown logic gate type: " + gateType);
- }
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(
- new WiredPinsComponent({
- slots: [],
- })
- );
-
- entity.addComponent(new LogicGateComponent({}));
- }
-}
+import { enumDirection, Vector } from "../../core/vector";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
+import { generateMatrixRotations } from "../../core/utils";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+/** @enum {string} */
+export const enumLogicGateVariants = {
+ not: "not",
+ xor: "xor",
+ or: "or",
+};
+
+/** @enum {string} */
+export const enumVariantToGate = {
+ [defaultBuildingVariant]: enumLogicGateType.and,
+ [enumLogicGateVariants.not]: enumLogicGateType.not,
+ [enumLogicGateVariants.xor]: enumLogicGateType.xor,
+ [enumLogicGateVariants.or]: enumLogicGateType.or,
+};
+
+const overlayMatrices = {
+ [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]),
+ [enumLogicGateVariants.xor]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]),
+ [enumLogicGateVariants.or]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 1]),
+ [enumLogicGateVariants.not]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
+};
+
+const colors = {
+ [defaultBuildingVariant]: "#f48d41",
+ [enumLogicGateVariants.xor]: "#f4a241",
+ [enumLogicGateVariants.or]: "#f4d041",
+ [enumLogicGateVariants.not]: "#f44184",
+};
+
+export class MetaLogicGateBuilding extends MetaBuilding {
+ constructor() {
+ super("logic_gate");
+ }
+
+ getSilhouetteColor(variant) {
+ return colors[variant];
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_logic_gates);
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) {
+ return overlayMatrices[variant][rotation];
+ }
+
+ getAvailableVariants() {
+ return [
+ defaultBuildingVariant,
+ enumLogicGateVariants.or,
+ enumLogicGateVariants.not,
+ enumLogicGateVariants.xor,
+ ];
+ }
+
+ getRenderPins() {
+ // We already have it included
+ return false;
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ const gateType = enumVariantToGate[variant];
+ entity.components.LogicGate.type = gateType;
+
+ const pinComp = entity.components.WiredPins;
+
+ switch (gateType) {
+ case enumLogicGateType.and:
+ case enumLogicGateType.xor:
+ case enumLogicGateType.or: {
+ pinComp.setSlots([
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.left,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.right,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ]);
+ break;
+ }
+
+ case enumLogicGateType.not: {
+ pinComp.setSlots([
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.bottom,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ]);
+ break;
+ }
+
+ default:
+ assertAlways("unknown logic gate type: " + gateType);
+ }
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [],
+ })
+ );
+
+ entity.addComponent(new LogicGateComponent({}));
+ }
+}
diff --git a/src/js/game/buildings/miner.js b/src/js/game/buildings/miner.js
index 1a9c97ff..f0b837a1 100644
--- a/src/js/game/buildings/miner.js
+++ b/src/js/game/buildings/miner.js
@@ -1,78 +1,81 @@
-import { enumDirection, Vector } from "../../core/vector";
-import { ItemEjectorComponent } from "../components/item_ejector";
-import { MinerComponent } from "../components/miner";
-import { Entity } from "../entity";
-import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
-import { GameRoot } from "../root";
-import { enumHubGoalRewards } from "../tutorial_goals";
-import { T } from "../../translations";
-import { formatItemsPerSecond } from "../../core/utils";
-
-/** @enum {string} */
-export const enumMinerVariants = { chainable: "chainable" };
-
-const overlayMatrix = [1, 1, 1, 1, 0, 1, 1, 1, 1];
-
-export class MetaMinerBuilding extends MetaBuilding {
- constructor() {
- super("miner");
- }
-
- getSilhouetteColor() {
- return "#b37dcd";
- }
-
- /**
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- const speed = root.hubGoals.getMinerBaseSpeed();
- return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
- }
-
- /**
- *
- * @param {GameRoot} root
- */
- getAvailableVariants(root) {
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) {
- return [defaultBuildingVariant, enumMinerVariants.chainable];
- }
- return super.getAvailableVariants(root);
- }
-
- /**
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return overlayMatrix;
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(new MinerComponent({}));
- entity.addComponent(
- new ItemEjectorComponent({
- slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
- })
- );
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {
- entity.components.Miner.chainable = variant === enumMinerVariants.chainable;
- }
-}
+import { enumDirection, Vector } from "../../core/vector";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { MinerComponent } from "../components/miner";
+import { Entity } from "../entity";
+import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+import { T } from "../../translations";
+import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
+
+/** @enum {string} */
+export const enumMinerVariants = { chainable: "chainable" };
+
+const overlayMatrix = {
+ [defaultBuildingVariant]: generateMatrixRotations([1, 1, 1, 1, 0, 1, 1, 1, 1]),
+ [enumMinerVariants.chainable]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 1, 1, 1]),
+};
+
+export class MetaMinerBuilding extends MetaBuilding {
+ constructor() {
+ super("miner");
+ }
+
+ getSilhouetteColor() {
+ return "#b37dcd";
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ const speed = root.hubGoals.getMinerBaseSpeed();
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
+ }
+
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ getAvailableVariants(root) {
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) {
+ return [enumMinerVariants.chainable];
+ }
+ return super.getAvailableVariants(root);
+ }
+
+ /**
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return overlayMatrix[variant][rotation];
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(new MinerComponent({}));
+ entity.addComponent(
+ new ItemEjectorComponent({
+ slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
+ })
+ );
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ entity.components.Miner.chainable = variant === enumMinerVariants.chainable;
+ }
+}
diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js
index b74d24b9..6e941403 100644
--- a/src/js/game/buildings/painter.js
+++ b/src/js/game/buildings/painter.js
@@ -71,7 +71,7 @@ export class MetaPainterBuilding extends MetaBuilding {
if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter_double)) {
variants.push(enumPainterVariants.double);
}
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter_quad)) {
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers)) {
variants.push(enumPainterVariants.quad);
}
return variants;
diff --git a/src/js/game/buildings/reader.js b/src/js/game/buildings/reader.js
index cc3bd6b0..006d6582 100644
--- a/src/js/game/buildings/reader.js
+++ b/src/js/game/buildings/reader.js
@@ -8,6 +8,10 @@ import { MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
import { BeltUnderlaysComponent } from "../components/belt_underlays";
import { BeltReaderComponent } from "../components/belt_reader";
+import { enumHubGoalRewards } from "../tutorial_goals";
+import { generateMatrixRotations } from "../../core/utils";
+
+const overlayMatrix = generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]);
export class MetaReaderBuilding extends MetaBuilding {
constructor() {
@@ -22,8 +26,7 @@ export class MetaReaderBuilding extends MetaBuilding {
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- // @todo
- return true;
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_belt_reader);
}
getDimensions() {
@@ -34,6 +37,17 @@ export class MetaReaderBuilding extends MetaBuilding {
return true;
}
+ /**
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ * @returns {Array|null}
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return overlayMatrix[rotation];
+ }
+
/**
* Creates the entity at the given location
* @param {Entity} entity
diff --git a/src/js/game/buildings/rotater.js b/src/js/game/buildings/rotater.js
index c278ef0d..7df94d16 100644
--- a/src/js/game/buildings/rotater.js
+++ b/src/js/game/buildings/rotater.js
@@ -1,122 +1,143 @@
-import { formatItemsPerSecond } from "../../core/utils";
-import { enumDirection, Vector } from "../../core/vector";
-import { T } from "../../translations";
-import { ItemAcceptorComponent } from "../components/item_acceptor";
-import { ItemEjectorComponent } from "../components/item_ejector";
-import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
-import { Entity } from "../entity";
-import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
-import { GameRoot } from "../root";
-import { enumHubGoalRewards } from "../tutorial_goals";
-
-/** @enum {string} */
-export const enumRotaterVariants = { ccw: "ccw", fl: "fl" };
-
-export class MetaRotaterBuilding extends MetaBuilding {
- constructor() {
- super("rotater");
- }
-
- getSilhouetteColor() {
- return "#7dc6cd";
- }
-
- /**
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- switch (variant) {
- case defaultBuildingVariant: {
- const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotater);
- return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
- }
- case enumRotaterVariants.ccw: {
- const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotaterCCW);
- return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
- }
- case enumRotaterVariants.fl: {
- const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotaterFL);
- return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
- }
- }
- }
-
- /**
- *
- * @param {GameRoot} root
- */
- getAvailableVariants(root) {
- let variants = [defaultBuildingVariant];
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater_ccw)) {
- variants.push(enumRotaterVariants.ccw);
- }
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater_fl)) {
- variants.push(enumRotaterVariants.fl);
- }
- return variants;
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater);
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(
- new ItemProcessorComponent({
- inputsPerCharge: 1,
- processorType: enumItemProcessorTypes.rotater,
- })
- );
-
- entity.addComponent(
- new ItemEjectorComponent({
- slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
- })
- );
- entity.addComponent(
- new ItemAcceptorComponent({
- slots: [
- {
- pos: new Vector(0, 0),
- directions: [enumDirection.bottom],
- filter: "shape",
- },
- ],
- })
- );
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {
- switch (variant) {
- case defaultBuildingVariant: {
- entity.components.ItemProcessor.type = enumItemProcessorTypes.rotater;
- break;
- }
- case enumRotaterVariants.ccw: {
- entity.components.ItemProcessor.type = enumItemProcessorTypes.rotaterCCW;
- break;
- }
- case enumRotaterVariants.fl: {
- entity.components.ItemProcessor.type = enumItemProcessorTypes.rotaterFL;
- break;
- }
- default:
- assertAlways(false, "Unknown rotater variant: " + variant);
- }
- }
-}
+import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
+import { enumDirection, Vector } from "../../core/vector";
+import { T } from "../../translations";
+import { ItemAcceptorComponent } from "../components/item_acceptor";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
+import { Entity } from "../entity";
+import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+/** @enum {string} */
+export const enumRotaterVariants = { ccw: "ccw", rotate180: "rotate180" };
+
+const overlayMatrices = {
+ [defaultBuildingVariant]: generateMatrixRotations([0, 1, 1, 1, 1, 0, 0, 1, 1]),
+ [enumRotaterVariants.ccw]: generateMatrixRotations([1, 1, 0, 0, 1, 1, 1, 1, 0]),
+ [enumRotaterVariants.rotate180]: generateMatrixRotations([1, 1, 0, 1, 1, 1, 0, 1, 1]),
+};
+
+export class MetaRotaterBuilding extends MetaBuilding {
+ constructor() {
+ super("rotater");
+ }
+
+ getSilhouetteColor() {
+ return "#7dc6cd";
+ }
+
+ /**
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ * @returns {Array|null}
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ const matrix = overlayMatrices[variant];
+ if (matrix) {
+ return matrix[rotation];
+ }
+ return null;
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ switch (variant) {
+ case defaultBuildingVariant: {
+ const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotater);
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
+ }
+ case enumRotaterVariants.ccw: {
+ const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotaterCCW);
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
+ }
+ case enumRotaterVariants.rotate180: {
+ const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.rotater180);
+ return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ getAvailableVariants(root) {
+ let variants = [defaultBuildingVariant];
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater_ccw)) {
+ variants.push(enumRotaterVariants.ccw);
+ }
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater_180)) {
+ variants.push(enumRotaterVariants.rotate180);
+ }
+ return variants;
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater);
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new ItemProcessorComponent({
+ inputsPerCharge: 1,
+ processorType: enumItemProcessorTypes.rotater,
+ })
+ );
+
+ entity.addComponent(
+ new ItemEjectorComponent({
+ slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
+ })
+ );
+ entity.addComponent(
+ new ItemAcceptorComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ directions: [enumDirection.bottom],
+ filter: "shape",
+ },
+ ],
+ })
+ );
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ switch (variant) {
+ case defaultBuildingVariant: {
+ entity.components.ItemProcessor.type = enumItemProcessorTypes.rotater;
+ break;
+ }
+ case enumRotaterVariants.ccw: {
+ entity.components.ItemProcessor.type = enumItemProcessorTypes.rotaterCCW;
+ break;
+ }
+ case enumRotaterVariants.rotate180: {
+ entity.components.ItemProcessor.type = enumItemProcessorTypes.rotater180;
+ break;
+ }
+ default:
+ assertAlways(false, "Unknown rotater variant: " + variant);
+ }
+ }
+}
diff --git a/src/js/game/buildings/storage.js b/src/js/game/buildings/storage.js
new file mode 100644
index 00000000..5574e137
--- /dev/null
+++ b/src/js/game/buildings/storage.js
@@ -0,0 +1,101 @@
+import { formatBigNumber } from "../../core/utils";
+import { enumDirection, Vector } from "../../core/vector";
+import { T } from "../../translations";
+import { ItemAcceptorComponent } from "../components/item_acceptor";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { StorageComponent } from "../components/storage";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+const storageSize = 5000;
+
+export class MetaStorageBuilding extends MetaBuilding {
+ constructor() {
+ super("storage");
+ }
+
+ getSilhouetteColor() {
+ return "#bbdf6d";
+ }
+
+ /**
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ return [[T.ingame.buildingPlacement.infoTexts.storage, formatBigNumber(storageSize)]];
+ }
+
+ getDimensions() {
+ return new Vector(2, 2);
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_storage);
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ // Required, since the item processor needs this.
+ entity.addComponent(
+ new ItemEjectorComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ },
+ {
+ pos: new Vector(1, 0),
+ direction: enumDirection.top,
+ },
+ ],
+ })
+ );
+
+ entity.addComponent(
+ new ItemAcceptorComponent({
+ slots: [
+ {
+ pos: new Vector(0, 1),
+ directions: [enumDirection.bottom],
+ },
+ {
+ pos: new Vector(1, 1),
+ directions: [enumDirection.bottom],
+ },
+ ],
+ })
+ );
+
+ entity.addComponent(
+ new StorageComponent({
+ maximumStorage: storageSize,
+ })
+ );
+
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(1, 1),
+ direction: enumDirection.right,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 1),
+ direction: enumDirection.left,
+ type: enumPinSlotType.logicalEjector,
+ },
+ ],
+ })
+ );
+ }
+}
diff --git a/src/js/game/buildings/transistor.js b/src/js/game/buildings/transistor.js
new file mode 100644
index 00000000..ebcfeac3
--- /dev/null
+++ b/src/js/game/buildings/transistor.js
@@ -0,0 +1,101 @@
+import { generateMatrixRotations } from "../../core/utils";
+import { enumDirection, Vector } from "../../core/vector";
+import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
+import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
+import { Entity } from "../entity";
+import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+/** @enum {string} */
+export const enumTransistorVariants = {
+ mirrored: "mirrored",
+};
+
+const overlayMatrices = {
+ [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 0, 0, 1, 0]),
+ [enumTransistorVariants.mirrored]: generateMatrixRotations([0, 1, 0, 0, 1, 1, 0, 1, 0]),
+};
+
+export class MetaTransistorBuilding extends MetaBuilding {
+ constructor() {
+ super("transistor");
+ }
+
+ getSilhouetteColor() {
+ return "#bc3a61";
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_logic_gates);
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getAvailableVariants() {
+ return [defaultBuildingVariant, enumTransistorVariants.mirrored];
+ }
+
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant) {
+ return overlayMatrices[variant][rotation];
+ }
+
+ getRenderPins() {
+ // We already have it included
+ return false;
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ entity.components.WiredPins.slots[1].direction =
+ variant === enumTransistorVariants.mirrored ? enumDirection.right : enumDirection.left;
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(
+ new WiredPinsComponent({
+ slots: [
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ type: enumPinSlotType.logicalEjector,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.left,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.bottom,
+ type: enumPinSlotType.logicalAcceptor,
+ },
+ ],
+ })
+ );
+
+ entity.addComponent(
+ new LogicGateComponent({
+ type: enumLogicGateType.transistor,
+ })
+ );
+ }
+}
diff --git a/src/js/game/buildings/trash.js b/src/js/game/buildings/trash.js
index dfd47dfe..43108b9e 100644
--- a/src/js/game/buildings/trash.js
+++ b/src/js/game/buildings/trash.js
@@ -1,65 +1,33 @@
-import { formatBigNumber } from "../../core/utils";
+import { generateMatrixRotations } from "../../core/utils";
import { enumDirection, Vector } from "../../core/vector";
-import { T } from "../../translations";
import { ItemAcceptorComponent } from "../components/item_acceptor";
-import { ItemEjectorComponent } from "../components/item_ejector";
import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
-import { StorageComponent } from "../components/storage";
-import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
import { Entity } from "../entity";
-import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
+import { MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
import { enumHubGoalRewards } from "../tutorial_goals";
-/** @enum {string} */
-export const enumTrashVariants = { storage: "storage" };
-
-const trashSize = 5000;
+const overlayMatrix = generateMatrixRotations([1, 1, 0, 1, 1, 1, 0, 1, 1]);
export class MetaTrashBuilding extends MetaBuilding {
constructor() {
super("trash");
}
- getIsRotateable(variant) {
- return variant !== defaultBuildingVariant;
+ getIsRotateable() {
+ return false;
}
getSilhouetteColor() {
- return "#cd7d86";
+ return "#ed1d5d";
}
- /**
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- if (variant === enumTrashVariants.storage) {
- return [[T.ingame.buildingPlacement.infoTexts.storage, formatBigNumber(trashSize)]];
- }
- return [];
+ getDimensions() {
+ return new Vector(1, 1);
}
- getDimensions(variant) {
- switch (variant) {
- case defaultBuildingVariant:
- return new Vector(1, 1);
- case enumTrashVariants.storage:
- return new Vector(2, 2);
- default:
- assertAlways(false, "Unknown trash variant: " + variant);
- }
- }
-
- /**
- * @param {GameRoot} root
- */
- getAvailableVariants(root) {
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_storage)) {
- return [defaultBuildingVariant, enumTrashVariants.storage];
- }
- return super.getAvailableVariants(root);
+ getSpecialOverlayRenderMatrix(rotation) {
+ return overlayMatrix[rotation];
}
/**
@@ -74,13 +42,6 @@ export class MetaTrashBuilding extends MetaBuilding {
* @param {Entity} entity
*/
setupEntityComponents(entity) {
- // Required, since the item processor needs this.
- entity.addComponent(
- new ItemEjectorComponent({
- slots: [],
- })
- );
-
entity.addComponent(
new ItemAcceptorComponent({
slots: [
@@ -96,99 +57,11 @@ export class MetaTrashBuilding extends MetaBuilding {
],
})
);
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {
- switch (variant) {
- case defaultBuildingVariant: {
- if (!entity.components.ItemProcessor) {
- entity.addComponent(
- new ItemProcessorComponent({
- inputsPerCharge: 1,
- processorType: enumItemProcessorTypes.trash,
- })
- );
- }
- if (entity.components.Storage) {
- entity.removeComponent(StorageComponent);
- }
- if (entity.components.WiredPins) {
- entity.removeComponent(WiredPinsComponent);
- }
-
- entity.components.ItemAcceptor.setSlots([
- {
- pos: new Vector(0, 0),
- directions: [
- enumDirection.top,
- enumDirection.right,
- enumDirection.bottom,
- enumDirection.left,
- ],
- },
- ]);
- entity.components.ItemEjector.setSlots([]);
- entity.components.ItemProcessor.type = enumItemProcessorTypes.trash;
- break;
- }
- case enumTrashVariants.storage: {
- if (entity.components.ItemProcessor) {
- entity.removeComponent(ItemProcessorComponent);
- }
- if (!entity.components.Storage) {
- entity.addComponent(new StorageComponent({}));
- }
- if (!entity.components.WiredPins) {
- entity.addComponent(
- new WiredPinsComponent({
- slots: [
- {
- pos: new Vector(1, 1),
- direction: enumDirection.right,
- type: enumPinSlotType.logicalEjector,
- },
- {
- pos: new Vector(0, 1),
- direction: enumDirection.left,
- type: enumPinSlotType.logicalEjector,
- },
- ],
- })
- );
- }
-
- entity.components.Storage.maximumStorage = trashSize;
- entity.components.ItemAcceptor.setSlots([
- {
- pos: new Vector(0, 1),
- directions: [enumDirection.bottom],
- },
- {
- pos: new Vector(1, 1),
- directions: [enumDirection.bottom],
- },
- ]);
-
- entity.components.ItemEjector.setSlots([
- {
- pos: new Vector(0, 0),
- direction: enumDirection.top,
- },
- {
- pos: new Vector(1, 0),
- direction: enumDirection.top,
- },
- ]);
- break;
- }
- default:
- assertAlways(false, "Unknown trash variant: " + variant);
- }
+ entity.addComponent(
+ new ItemProcessorComponent({
+ inputsPerCharge: 1,
+ processorType: enumItemProcessorTypes.trash,
+ })
+ );
}
}
diff --git a/src/js/game/buildings/underground_belt.js b/src/js/game/buildings/underground_belt.js
index 155b69e2..2761443d 100644
--- a/src/js/game/buildings/underground_belt.js
+++ b/src/js/game/buildings/underground_belt.js
@@ -1,266 +1,267 @@
-import { Loader } from "../../core/loader";
-import { enumDirection, Vector, enumAngleToDirection, enumDirectionToVector } from "../../core/vector";
-import { ItemAcceptorComponent } from "../components/item_acceptor";
-import { ItemEjectorComponent } from "../components/item_ejector";
-import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt";
-import { Entity } from "../entity";
-import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
-import { GameRoot } from "../root";
-import { globalConfig } from "../../core/config";
-import { enumHubGoalRewards } from "../tutorial_goals";
-import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
-import { T } from "../../translations";
-
-/** @enum {string} */
-export const arrayUndergroundRotationVariantToMode = [
- enumUndergroundBeltMode.sender,
- enumUndergroundBeltMode.receiver,
-];
-
-/** @enum {string} */
-export const enumUndergroundBeltVariants = { tier2: "tier2" };
-
-export const enumUndergroundBeltVariantToTier = {
- [defaultBuildingVariant]: 0,
- [enumUndergroundBeltVariants.tier2]: 1,
-};
-
-const overlayMatrices = [
- // Sender
- generateMatrixRotations([1, 1, 1, 0, 1, 0, 0, 1, 0]),
-
- // Receiver
- generateMatrixRotations([0, 1, 0, 0, 1, 0, 1, 1, 1]),
-];
-
-export class MetaUndergroundBeltBuilding extends MetaBuilding {
- constructor() {
- super("underground_belt");
- }
-
- getSilhouetteColor() {
- return "#222";
- }
-
- getFlipOrientationAfterPlacement() {
- return true;
- }
-
- getStayInPlacementMode() {
- return true;
- }
-
- /**
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return overlayMatrices[rotationVariant][rotation];
- }
-
- /**
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- const rangeTiles =
- globalConfig.undergroundBeltMaxTilesByTier[enumUndergroundBeltVariantToTier[variant]];
-
- const beltSpeed = root.hubGoals.getUndergroundBeltBaseSpeed();
- return [
- [
- T.ingame.buildingPlacement.infoTexts.range,
- T.ingame.buildingPlacement.infoTexts.tiles.replace("", "" + rangeTiles),
- ],
- [T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)],
- ];
- }
-
- /**
- * @param {GameRoot} root
- */
- getAvailableVariants(root) {
- if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_underground_belt_tier_2)) {
- return [defaultBuildingVariant, enumUndergroundBeltVariants.tier2];
- }
- return super.getAvailableVariants(root);
- }
-
- /**
- * @param {number} rotationVariant
- * @param {string} variant
- */
- getPreviewSprite(rotationVariant, variant) {
- let suffix = "";
- if (variant !== defaultBuildingVariant) {
- suffix = "-" + variant;
- }
-
- switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
- case enumUndergroundBeltMode.sender:
- return Loader.getSprite("sprites/buildings/underground_belt_entry" + suffix + ".png");
- case enumUndergroundBeltMode.receiver:
- return Loader.getSprite("sprites/buildings/underground_belt_exit" + suffix + ".png");
- default:
- assertAlways(false, "Invalid rotation variant");
- }
- }
-
- /**
- * @param {number} rotationVariant
- * @param {string} variant
- */
- getBlueprintSprite(rotationVariant, variant) {
- let suffix = "";
- if (variant !== defaultBuildingVariant) {
- suffix = "-" + variant;
- }
-
- switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
- case enumUndergroundBeltMode.sender:
- return Loader.getSprite("sprites/blueprints/underground_belt_entry" + suffix + ".png");
- case enumUndergroundBeltMode.receiver:
- return Loader.getSprite("sprites/blueprints/underground_belt_exit" + suffix + ".png");
- default:
- assertAlways(false, "Invalid rotation variant");
- }
- }
-
- /**
- * @param {number} rotationVariant
- * @param {string} variant
- */
- getSprite(rotationVariant, variant) {
- return this.getPreviewSprite(rotationVariant, variant);
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_tunnel);
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- // Required, since the item processor needs this.
- entity.addComponent(
- new ItemEjectorComponent({
- slots: [],
- })
- );
-
- entity.addComponent(new UndergroundBeltComponent({}));
- entity.addComponent(
- new ItemAcceptorComponent({
- slots: [],
- })
- );
- }
-
- /**
- * Should compute the optimal rotation variant on the given tile
- * @param {object} param0
- * @param {GameRoot} param0.root
- * @param {Vector} param0.tile
- * @param {number} param0.rotation
- * @param {string} param0.variant
- * @param {Layer} param0.layer
- * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
- */
- computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
- const searchDirection = enumAngleToDirection[rotation];
- const searchVector = enumDirectionToVector[searchDirection];
- const tier = enumUndergroundBeltVariantToTier[variant];
-
- const targetRotation = (rotation + 180) % 360;
- const targetSenderRotation = rotation;
-
- for (
- let searchOffset = 1;
- searchOffset <= globalConfig.undergroundBeltMaxTilesByTier[tier];
- ++searchOffset
- ) {
- tile = tile.addScalars(searchVector.x, searchVector.y);
-
- /* WIRES: FIXME */
- const contents = root.map.getTileContent(tile, "regular");
- if (contents) {
- const undergroundComp = contents.components.UndergroundBelt;
- if (undergroundComp && undergroundComp.tier === tier) {
- const staticComp = contents.components.StaticMapEntity;
- if (staticComp.rotation === targetRotation) {
- if (undergroundComp.mode !== enumUndergroundBeltMode.sender) {
- // If we encounter an underground receiver on our way which is also faced in our direction, we don't accept that
- break;
- }
- return {
- rotation: targetRotation,
- rotationVariant: 1,
- connectedEntities: [contents],
- };
- } else if (staticComp.rotation === targetSenderRotation) {
- // Draw connections to receivers
- if (undergroundComp.mode === enumUndergroundBeltMode.receiver) {
- return {
- rotation: rotation,
- rotationVariant: 0,
- connectedEntities: [contents],
- };
- } else {
- break;
- }
- }
- }
- }
- }
-
- return {
- rotation,
- rotationVariant: 0,
- };
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {
- entity.components.UndergroundBelt.tier = enumUndergroundBeltVariantToTier[variant];
-
- switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
- case enumUndergroundBeltMode.sender: {
- entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.sender;
- entity.components.ItemEjector.setSlots([]);
- entity.components.ItemAcceptor.setSlots([
- {
- pos: new Vector(0, 0),
- directions: [enumDirection.bottom],
- },
- ]);
- return;
- }
- case enumUndergroundBeltMode.receiver: {
- entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.receiver;
- entity.components.ItemAcceptor.setSlots([]);
- entity.components.ItemEjector.setSlots([
- {
- pos: new Vector(0, 0),
- direction: enumDirection.top,
- },
- ]);
- return;
- }
- default:
- assertAlways(false, "Invalid rotation variant");
- }
- }
-}
+import { Loader } from "../../core/loader";
+import { enumDirection, Vector, enumAngleToDirection, enumDirectionToVector } from "../../core/vector";
+import { ItemAcceptorComponent } from "../components/item_acceptor";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt";
+import { Entity } from "../entity";
+import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
+import { GameRoot } from "../root";
+import { globalConfig } from "../../core/config";
+import { enumHubGoalRewards } from "../tutorial_goals";
+import { formatItemsPerSecond, generateMatrixRotations } from "../../core/utils";
+import { T } from "../../translations";
+
+/** @enum {string} */
+export const arrayUndergroundRotationVariantToMode = [
+ enumUndergroundBeltMode.sender,
+ enumUndergroundBeltMode.receiver,
+];
+
+/** @enum {string} */
+export const enumUndergroundBeltVariants = { tier2: "tier2" };
+
+export const enumUndergroundBeltVariantToTier = {
+ [defaultBuildingVariant]: 0,
+ [enumUndergroundBeltVariants.tier2]: 1,
+};
+
+const colorsByRotationVariant = ["#6d9dff", "#71ff9c"];
+
+const overlayMatrices = [
+ // Sender
+ generateMatrixRotations([1, 1, 1, 0, 1, 0, 0, 1, 0]),
+
+ // Receiver
+ generateMatrixRotations([0, 1, 0, 0, 1, 0, 1, 1, 1]),
+];
+
+export class MetaUndergroundBeltBuilding extends MetaBuilding {
+ constructor() {
+ super("underground_belt");
+ }
+
+ getSilhouetteColor(variant, rotationVariant) {
+ return colorsByRotationVariant[rotationVariant];
+ }
+
+ getFlipOrientationAfterPlacement() {
+ return true;
+ }
+
+ getStayInPlacementMode() {
+ return true;
+ }
+
+ /**
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return overlayMatrices[rotationVariant][rotation];
+ }
+
+ /**
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ const rangeTiles =
+ globalConfig.undergroundBeltMaxTilesByTier[enumUndergroundBeltVariantToTier[variant]];
+
+ const beltSpeed = root.hubGoals.getUndergroundBeltBaseSpeed();
+ return [
+ [
+ T.ingame.buildingPlacement.infoTexts.range,
+ T.ingame.buildingPlacement.infoTexts.tiles.replace("", "" + rangeTiles),
+ ],
+ [T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)],
+ ];
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getAvailableVariants(root) {
+ if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_underground_belt_tier_2)) {
+ return [defaultBuildingVariant, enumUndergroundBeltVariants.tier2];
+ }
+ return super.getAvailableVariants(root);
+ }
+
+ /**
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ getPreviewSprite(rotationVariant, variant) {
+ let suffix = "";
+ if (variant !== defaultBuildingVariant) {
+ suffix = "-" + variant;
+ }
+
+ switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
+ case enumUndergroundBeltMode.sender:
+ return Loader.getSprite("sprites/buildings/underground_belt_entry" + suffix + ".png");
+ case enumUndergroundBeltMode.receiver:
+ return Loader.getSprite("sprites/buildings/underground_belt_exit" + suffix + ".png");
+ default:
+ assertAlways(false, "Invalid rotation variant");
+ }
+ }
+
+ /**
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ getBlueprintSprite(rotationVariant, variant) {
+ let suffix = "";
+ if (variant !== defaultBuildingVariant) {
+ suffix = "-" + variant;
+ }
+
+ switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
+ case enumUndergroundBeltMode.sender:
+ return Loader.getSprite("sprites/blueprints/underground_belt_entry" + suffix + ".png");
+ case enumUndergroundBeltMode.receiver:
+ return Loader.getSprite("sprites/blueprints/underground_belt_exit" + suffix + ".png");
+ default:
+ assertAlways(false, "Invalid rotation variant");
+ }
+ }
+
+ /**
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ getSprite(rotationVariant, variant) {
+ return this.getPreviewSprite(rotationVariant, variant);
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_tunnel);
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ // Required, since the item processor needs this.
+ entity.addComponent(
+ new ItemEjectorComponent({
+ slots: [],
+ })
+ );
+
+ entity.addComponent(new UndergroundBeltComponent({}));
+ entity.addComponent(
+ new ItemAcceptorComponent({
+ slots: [],
+ })
+ );
+ }
+
+ /**
+ * Should compute the optimal rotation variant on the given tile
+ * @param {object} param0
+ * @param {GameRoot} param0.root
+ * @param {Vector} param0.tile
+ * @param {number} param0.rotation
+ * @param {string} param0.variant
+ * @param {Layer} param0.layer
+ * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
+ */
+ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
+ const searchDirection = enumAngleToDirection[rotation];
+ const searchVector = enumDirectionToVector[searchDirection];
+ const tier = enumUndergroundBeltVariantToTier[variant];
+
+ const targetRotation = (rotation + 180) % 360;
+ const targetSenderRotation = rotation;
+
+ for (
+ let searchOffset = 1;
+ searchOffset <= globalConfig.undergroundBeltMaxTilesByTier[tier];
+ ++searchOffset
+ ) {
+ tile = tile.addScalars(searchVector.x, searchVector.y);
+
+ const contents = root.map.getTileContent(tile, "regular");
+ if (contents) {
+ const undergroundComp = contents.components.UndergroundBelt;
+ if (undergroundComp && undergroundComp.tier === tier) {
+ const staticComp = contents.components.StaticMapEntity;
+ if (staticComp.rotation === targetRotation) {
+ if (undergroundComp.mode !== enumUndergroundBeltMode.sender) {
+ // If we encounter an underground receiver on our way which is also faced in our direction, we don't accept that
+ break;
+ }
+ return {
+ rotation: targetRotation,
+ rotationVariant: 1,
+ connectedEntities: [contents],
+ };
+ } else if (staticComp.rotation === targetSenderRotation) {
+ // Draw connections to receivers
+ if (undergroundComp.mode === enumUndergroundBeltMode.receiver) {
+ return {
+ rotation: rotation,
+ rotationVariant: 0,
+ connectedEntities: [contents],
+ };
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ rotation,
+ rotationVariant: 0,
+ };
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ entity.components.UndergroundBelt.tier = enumUndergroundBeltVariantToTier[variant];
+
+ switch (arrayUndergroundRotationVariantToMode[rotationVariant]) {
+ case enumUndergroundBeltMode.sender: {
+ entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.sender;
+ entity.components.ItemEjector.setSlots([]);
+ entity.components.ItemAcceptor.setSlots([
+ {
+ pos: new Vector(0, 0),
+ directions: [enumDirection.bottom],
+ },
+ ]);
+ return;
+ }
+ case enumUndergroundBeltMode.receiver: {
+ entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.receiver;
+ entity.components.ItemAcceptor.setSlots([]);
+ entity.components.ItemEjector.setSlots([
+ {
+ pos: new Vector(0, 0),
+ direction: enumDirection.top,
+ },
+ ]);
+ return;
+ }
+ default:
+ assertAlways(false, "Invalid rotation variant");
+ }
+ }
+}
diff --git a/src/js/game/buildings/virtual_processor.js b/src/js/game/buildings/virtual_processor.js
index dba8978a..b4f91762 100644
--- a/src/js/game/buildings/virtual_processor.js
+++ b/src/js/game/buildings/virtual_processor.js
@@ -4,22 +4,35 @@ import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins";
import { Entity } from "../entity";
import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+import { MetaCutterBuilding } from "./cutter";
+import { MetaPainterBuilding } from "./painter";
+import { MetaRotaterBuilding } from "./rotater";
+import { MetaStackerBuilding } from "./stacker";
/** @enum {string} */
export const enumVirtualProcessorVariants = {
- analyzer: "analyzer",
rotater: "rotater",
unstacker: "unstacker",
- shapecompare: "shapecompare",
+ stacker: "stacker",
+ painter: "painter",
};
/** @enum {string} */
export const enumVariantToGate = {
[defaultBuildingVariant]: enumLogicGateType.cutter,
- [enumVirtualProcessorVariants.analyzer]: enumLogicGateType.analyzer,
[enumVirtualProcessorVariants.rotater]: enumLogicGateType.rotater,
[enumVirtualProcessorVariants.unstacker]: enumLogicGateType.unstacker,
- [enumVirtualProcessorVariants.shapecompare]: enumLogicGateType.shapecompare,
+ [enumVirtualProcessorVariants.stacker]: enumLogicGateType.stacker,
+ [enumVirtualProcessorVariants.painter]: enumLogicGateType.painter,
+};
+
+const colors = {
+ [defaultBuildingVariant]: new MetaCutterBuilding().getSilhouetteColor(),
+ [enumVirtualProcessorVariants.rotater]: new MetaRotaterBuilding().getSilhouetteColor(),
+ [enumVirtualProcessorVariants.unstacker]: new MetaStackerBuilding().getSilhouetteColor(),
+ [enumVirtualProcessorVariants.stacker]: new MetaStackerBuilding().getSilhouetteColor(),
+ [enumVirtualProcessorVariants.painter]: new MetaPainterBuilding().getSilhouetteColor(),
};
export class MetaVirtualProcessorBuilding extends MetaBuilding {
@@ -27,16 +40,15 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding {
super("virtual_processor");
}
- getSilhouetteColor() {
- return "#823cab";
+ getSilhouetteColor(variant) {
+ return colors[variant];
}
/**
* @param {GameRoot} root
*/
getIsUnlocked(root) {
- // @todo
- return true;
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_virtual_processing);
}
/** @returns {"wires"} **/
@@ -52,9 +64,9 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding {
return [
defaultBuildingVariant,
enumVirtualProcessorVariants.rotater,
+ enumVirtualProcessorVariants.stacker,
+ enumVirtualProcessorVariants.painter,
enumVirtualProcessorVariants.unstacker,
- enumVirtualProcessorVariants.analyzer,
- enumVirtualProcessorVariants.shapecompare,
];
}
@@ -74,7 +86,6 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding {
const pinComp = entity.components.WiredPins;
switch (gateType) {
case enumLogicGateType.cutter:
- case enumLogicGateType.analyzer:
case enumLogicGateType.unstacker: {
pinComp.setSlots([
{
@@ -110,7 +121,8 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding {
]);
break;
}
- case enumLogicGateType.shapecompare: {
+ case enumLogicGateType.stacker:
+ case enumLogicGateType.painter: {
pinComp.setSlots([
{
pos: new Vector(0, 0),
@@ -119,7 +131,7 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding {
},
{
pos: new Vector(0, 0),
- direction: enumDirection.left,
+ direction: enumDirection.bottom,
type: enumPinSlotType.logicalAcceptor,
},
{
diff --git a/src/js/game/buildings/wire.js b/src/js/game/buildings/wire.js
index 59c9cb7d..61b75073 100644
--- a/src/js/game/buildings/wire.js
+++ b/src/js/game/buildings/wire.js
@@ -1,263 +1,270 @@
-import { Loader } from "../../core/loader";
-import { generateMatrixRotations } from "../../core/utils";
-import { enumDirection, enumDirectionToAngle, enumDirectionToVector, Vector } from "../../core/vector";
-import { SOUNDS } from "../../platform/sound";
-import { enumWireType, WireComponent } from "../components/wire";
-import { Entity } from "../entity";
-import { MetaBuilding } from "../meta_building";
-import { GameRoot } from "../root";
-
-export const arrayWireRotationVariantToType = [
- enumWireType.regular,
- enumWireType.turn,
- enumWireType.split,
- enumWireType.cross,
-];
-
-export const wireOverlayMatrices = {
- [enumWireType.regular]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
- [enumWireType.split]: generateMatrixRotations([0, 0, 0, 1, 1, 1, 0, 1, 0]),
- [enumWireType.turn]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]),
- [enumWireType.cross]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]),
-};
-
-export class MetaWireBuilding extends MetaBuilding {
- constructor() {
- super("wire");
- }
-
- getHasDirectionLockAvailable() {
- return true;
- }
-
- getSilhouetteColor() {
- return "#25fff2";
- }
-
- getDimensions() {
- return new Vector(1, 1);
- }
-
- getStayInPlacementMode() {
- return true;
- }
-
- getPlacementSound() {
- return SOUNDS.placeBelt;
- }
-
- getRotateAutomaticallyWhilePlacing() {
- return true;
- }
-
- /** @returns {"wires"} **/
- getLayer() {
- return "wires";
- }
-
- getSprite() {
- return null;
- }
-
- getIsReplaceable() {
- return true;
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- // @todo
- return true;
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- // @todo
- entity.addComponent(new WireComponent({}));
- }
-
- /**
- *
- * @param {Entity} entity
- * @param {number} rotationVariant
- */
- updateVariants(entity, rotationVariant) {
- entity.components.Wire.type = arrayWireRotationVariantToType[rotationVariant];
- }
-
- /**
- *
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return wireOverlayMatrices[entity.components.Wire.type][rotation];
- }
-
- getPreviewSprite(rotationVariant) {
- switch (arrayWireRotationVariantToType[rotationVariant]) {
- case enumWireType.regular: {
- return Loader.getSprite("sprites/buildings/wire.png");
- }
- case enumWireType.turn: {
- return Loader.getSprite("sprites/buildings/wire-turn.png");
- }
- case enumWireType.split: {
- return Loader.getSprite("sprites/buildings/wire-split.png");
- }
- case enumWireType.cross: {
- return Loader.getSprite("sprites/buildings/wire-cross.png");
- }
- default: {
- assertAlways(false, "Invalid wire rotation variant");
- }
- }
- }
-
- getBlueprintSprite(rotationVariant) {
- switch (arrayWireRotationVariantToType[rotationVariant]) {
- case enumWireType.regular: {
- return Loader.getSprite("sprites/blueprints/wire.png");
- }
- case enumWireType.turn: {
- return Loader.getSprite("sprites/blueprints/wire-turn.png");
- }
- case enumWireType.split: {
- return Loader.getSprite("sprites/blueprints/wire-split.png");
- }
- case enumWireType.cross: {
- return Loader.getSprite("sprites/blueprints/wire-cross.png");
- }
- default: {
- assertAlways(false, "Invalid wire rotation variant");
- }
- }
- }
-
- /**
- * Should compute the optimal rotation variant on the given tile
- * @param {object} param0
- * @param {GameRoot} param0.root
- * @param {Vector} param0.tile
- * @param {number} param0.rotation
- * @param {string} param0.variant
- * @param {string} param0.layer
- * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
- */
- computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
- const connections = {
- top: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.top }),
- right: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.right }),
- bottom: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.bottom }),
- left: root.logic.computeWireEdgeStatus({ tile, rotation, edge: enumDirection.left }),
- };
-
- let flag = 0;
- flag |= connections.top ? 0x1000 : 0;
- flag |= connections.right ? 0x100 : 0;
- flag |= connections.bottom ? 0x10 : 0;
- flag |= connections.left ? 0x1 : 0;
-
- let targetType = enumWireType.regular;
-
- // First, reset rotation
- rotation = 0;
-
- switch (flag) {
- case 0x0000:
- // Nothing
- break;
-
- case 0x0001:
- // Left
- rotation += 90;
- break;
-
- case 0x0010:
- // Bottom
- // END
- break;
-
- case 0x0011:
- // Bottom | Left
- targetType = enumWireType.turn;
- rotation += 90;
- break;
-
- case 0x0100:
- // Right
- rotation += 90;
- break;
-
- case 0x0101:
- // Right | Left
- rotation += 90;
- break;
-
- case 0x0110:
- // Right | Bottom
- targetType = enumWireType.turn;
- break;
-
- case 0x0111:
- // Right | Bottom | Left
- targetType = enumWireType.split;
- break;
-
- case 0x1000:
- // Top
- break;
-
- case 0x1001:
- // Top | Left
- targetType = enumWireType.turn;
- rotation += 180;
- break;
-
- case 0x1010:
- // Top | Bottom
- break;
-
- case 0x1011:
- // Top | Bottom | Left
- targetType = enumWireType.split;
- rotation += 90;
- break;
-
- case 0x1100:
- // Top | Right
- targetType = enumWireType.turn;
- rotation -= 90;
- break;
-
- case 0x1101:
- // Top | Right | Left
- targetType = enumWireType.split;
- rotation += 180;
- break;
-
- case 0x1110:
- // Top | Right | Bottom
- targetType = enumWireType.split;
- rotation -= 90;
- break;
-
- case 0x1111:
- // Top | Right | Bottom | Left
- targetType = enumWireType.cross;
- break;
- }
-
- return {
- // Clamp rotation
- rotation: (rotation + 360 * 10) % 360,
- rotationVariant: arrayWireRotationVariantToType.indexOf(targetType),
- };
- }
-}
+import { Loader } from "../../core/loader";
+import { generateMatrixRotations } from "../../core/utils";
+import { enumDirection, Vector } from "../../core/vector";
+import { SOUNDS } from "../../platform/sound";
+import { enumWireType, enumWireVariant, WireComponent } from "../components/wire";
+import { Entity } from "../entity";
+import { defaultBuildingVariant, MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+export const arrayWireRotationVariantToType = [
+ enumWireType.forward,
+ enumWireType.turn,
+ enumWireType.split,
+ enumWireType.cross,
+];
+
+export const wireOverlayMatrices = {
+ [enumWireType.forward]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
+ [enumWireType.split]: generateMatrixRotations([0, 0, 0, 1, 1, 1, 0, 1, 0]),
+ [enumWireType.turn]: generateMatrixRotations([0, 0, 0, 0, 1, 1, 0, 1, 0]),
+ [enumWireType.cross]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]),
+};
+
+/** @enum {string} */
+export const wireVariants = {
+ second: "second",
+};
+
+const enumWireVariantToVariant = {
+ [defaultBuildingVariant]: enumWireVariant.first,
+ [wireVariants.second]: enumWireVariant.second,
+};
+
+export class MetaWireBuilding extends MetaBuilding {
+ constructor() {
+ super("wire");
+ }
+
+ getHasDirectionLockAvailable() {
+ return true;
+ }
+
+ getSilhouetteColor() {
+ return "#61ef6f";
+ }
+
+ getAvailableVariants() {
+ return [defaultBuildingVariant, wireVariants.second];
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ getStayInPlacementMode() {
+ return true;
+ }
+
+ getPlacementSound() {
+ return SOUNDS.placeBelt;
+ }
+
+ getRotateAutomaticallyWhilePlacing() {
+ return true;
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ getSprite() {
+ return null;
+ }
+
+ getIsReplaceable() {
+ return true;
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers);
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(new WireComponent({}));
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ updateVariants(entity, rotationVariant, variant) {
+ entity.components.Wire.type = arrayWireRotationVariantToType[rotationVariant];
+ entity.components.Wire.variant = enumWireVariantToVariant[variant];
+ }
+
+ /**
+ *
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return wireOverlayMatrices[entity.components.Wire.type][rotation];
+ }
+
+ /**
+ *
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @returns {import("../../core/draw_utils").AtlasSprite}
+ */
+ getPreviewSprite(rotationVariant, variant) {
+ const wireVariant = enumWireVariantToVariant[variant];
+ switch (arrayWireRotationVariantToType[rotationVariant]) {
+ case enumWireType.forward: {
+ return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_forward.png");
+ }
+ case enumWireType.turn: {
+ return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_turn.png");
+ }
+ case enumWireType.split: {
+ return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_split.png");
+ }
+ case enumWireType.cross: {
+ return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_cross.png");
+ }
+ default: {
+ assertAlways(false, "Invalid wire rotation variant");
+ }
+ }
+ }
+
+ getBlueprintSprite(rotationVariant, variant) {
+ return this.getPreviewSprite(rotationVariant, variant);
+ }
+
+ /**
+ * Should compute the optimal rotation variant on the given tile
+ * @param {object} param0
+ * @param {GameRoot} param0.root
+ * @param {Vector} param0.tile
+ * @param {number} param0.rotation
+ * @param {string} param0.variant
+ * @param {string} param0.layer
+ * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
+ */
+ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
+ const wireVariant = enumWireVariantToVariant[variant];
+ const connections = {
+ top: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.top }),
+ right: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.right }),
+ bottom: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.bottom }),
+ left: root.logic.computeWireEdgeStatus({ tile, wireVariant, edge: enumDirection.left }),
+ };
+
+ let flag = 0;
+ flag |= connections.top ? 0x1000 : 0;
+ flag |= connections.right ? 0x100 : 0;
+ flag |= connections.bottom ? 0x10 : 0;
+ flag |= connections.left ? 0x1 : 0;
+
+ let targetType = enumWireType.forward;
+
+ // First, reset rotation
+ rotation = 0;
+
+ switch (flag) {
+ case 0x0000:
+ // Nothing
+ break;
+
+ case 0x0001:
+ // Left
+ rotation += 90;
+ break;
+
+ case 0x0010:
+ // Bottom
+ // END
+ break;
+
+ case 0x0011:
+ // Bottom | Left
+ targetType = enumWireType.turn;
+ rotation += 90;
+ break;
+
+ case 0x0100:
+ // Right
+ rotation += 90;
+ break;
+
+ case 0x0101:
+ // Right | Left
+ rotation += 90;
+ break;
+
+ case 0x0110:
+ // Right | Bottom
+ targetType = enumWireType.turn;
+ break;
+
+ case 0x0111:
+ // Right | Bottom | Left
+ targetType = enumWireType.split;
+ break;
+
+ case 0x1000:
+ // Top
+ break;
+
+ case 0x1001:
+ // Top | Left
+ targetType = enumWireType.turn;
+ rotation += 180;
+ break;
+
+ case 0x1010:
+ // Top | Bottom
+ break;
+
+ case 0x1011:
+ // Top | Bottom | Left
+ targetType = enumWireType.split;
+ rotation += 90;
+ break;
+
+ case 0x1100:
+ // Top | Right
+ targetType = enumWireType.turn;
+ rotation -= 90;
+ break;
+
+ case 0x1101:
+ // Top | Right | Left
+ targetType = enumWireType.split;
+ rotation += 180;
+ break;
+
+ case 0x1110:
+ // Top | Right | Bottom
+ targetType = enumWireType.split;
+ rotation -= 90;
+ break;
+
+ case 0x1111:
+ // Top | Right | Bottom | Left
+ targetType = enumWireType.cross;
+ break;
+ }
+
+ return {
+ // Clamp rotation
+ rotation: (rotation + 360 * 10) % 360,
+ rotationVariant: arrayWireRotationVariantToType.indexOf(targetType),
+ };
+ }
+}
diff --git a/src/js/game/buildings/wire_tunnel.js b/src/js/game/buildings/wire_tunnel.js
index f885abc6..2626dd12 100644
--- a/src/js/game/buildings/wire_tunnel.js
+++ b/src/js/game/buildings/wire_tunnel.js
@@ -1,87 +1,58 @@
-import { Vector } from "../../core/vector";
-import { Entity } from "../entity";
-import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
-import { GameRoot } from "../root";
-import { WireTunnelComponent } from "../components/wire_tunnel";
-import { generateMatrixRotations } from "../../core/utils";
-
-/** @enum {string} */
-export const enumWireTunnelVariants = {
- coating: "coating",
-};
-
-const wireTunnelOverlayMatrices = {
- [defaultBuildingVariant]: generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]),
- [enumWireTunnelVariants.coating]: generateMatrixRotations([0, 1, 0, 0, 1, 0, 0, 1, 0]),
-};
-
-export class MetaWireTunnelBuilding extends MetaBuilding {
- constructor() {
- super("wire_tunnel");
- }
-
- getSilhouetteColor() {
- return "#777a86";
- }
-
- /**
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- // @todo
- return true;
- }
-
- /**
- *
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return wireTunnelOverlayMatrices[variant][rotation];
- }
-
- getIsRotateable(variant) {
- return variant !== defaultBuildingVariant;
- }
-
- getDimensions() {
- return new Vector(1, 1);
- }
-
- getAvailableVariants() {
- return [defaultBuildingVariant, enumWireTunnelVariants.coating];
- }
-
- /** @returns {"wires"} **/
- getLayer() {
- return "wires";
- }
-
- getRotateAutomaticallyWhilePlacing() {
- return true;
- }
-
- getStayInPlacementMode() {
- return true;
- }
-
- /**
- * Creates the entity at the given location
- * @param {Entity} entity
- */
- setupEntityComponents(entity) {
- entity.addComponent(new WireTunnelComponent({}));
- }
-
- /**
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {
- entity.components.WireTunnel.multipleDirections = variant === defaultBuildingVariant;
- }
-}
+import { generateMatrixRotations } from "../../core/utils";
+import { Vector } from "../../core/vector";
+import { WireTunnelComponent } from "../components/wire_tunnel";
+import { Entity } from "../entity";
+import { MetaBuilding } from "../meta_building";
+import { GameRoot } from "../root";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+const wireTunnelOverlayMatrix = generateMatrixRotations([0, 1, 0, 1, 1, 1, 0, 1, 0]);
+
+export class MetaWireTunnelBuilding extends MetaBuilding {
+ constructor() {
+ super("wire_tunnel");
+ }
+
+ getSilhouetteColor() {
+ return "#777a86";
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers);
+ }
+
+ /**
+ *
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return wireTunnelOverlayMatrix[rotation];
+ }
+
+ getIsRotateable() {
+ return false;
+ }
+
+ getDimensions() {
+ return new Vector(1, 1);
+ }
+
+ /** @returns {"wires"} **/
+ getLayer() {
+ return "wires";
+ }
+
+ /**
+ * Creates the entity at the given location
+ * @param {Entity} entity
+ */
+ setupEntityComponents(entity) {
+ entity.addComponent(new WireTunnelComponent());
+ }
+}
diff --git a/src/js/game/camera.js b/src/js/game/camera.js
index ab73fc83..107d1fb4 100644
--- a/src/js/game/camera.js
+++ b/src/js/game/camera.js
@@ -1,942 +1,1011 @@
-import { clickDetectorGlobals } from "../core/click_detector";
-import { globalConfig, SUPPORT_TOUCH } from "../core/config";
-import { createLogger } from "../core/logging";
-import { Rectangle } from "../core/rectangle";
-import { Signal, STOP_PROPAGATION } from "../core/signal";
-import { clamp } from "../core/utils";
-import { mixVector, Vector } from "../core/vector";
-import { BasicSerializableObject, types } from "../savegame/serialization";
-import { KEYMAPPINGS } from "./key_action_mapper";
-import { GameRoot } from "./root";
-
-const logger = createLogger("camera");
-
-export const USER_INTERACT_MOVE = "move";
-export const USER_INTERACT_ZOOM = "zoom";
-export const USER_INTERACT_TOUCHEND = "touchend";
-
-const velocitySmoothing = 0.5;
-const velocityFade = 0.98;
-const velocityStrength = 0.4;
-const velocityMax = 20;
-const ticksBeforeErasingVelocity = 10;
-
-/**
- * @enum {string}
- */
-export const enumMouseButton = {
- left: "left",
- middle: "middle",
- right: "right",
-};
-
-export class Camera extends BasicSerializableObject {
- constructor(root) {
- super();
-
- /** @type {GameRoot} */
- this.root = root;
-
- // Zoom level, 2 means double size
-
- // Find optimal initial zoom
-
- this.zoomLevel = this.findInitialZoom();
- this.clampZoomLevel();
-
- /** @type {Vector} */
- this.center = new Vector(0, 0);
-
- // Input handling
- this.currentlyMoving = false;
- this.lastMovingPosition = null;
- this.lastMovingPositionLastTick = null;
- this.numTicksStandingStill = null;
- this.cameraUpdateTimeBucket = 0.0;
- this.didMoveSinceTouchStart = false;
- this.currentlyPinching = false;
- this.lastPinchPositions = null;
-
- this.keyboardForce = new Vector();
-
- // Signal which gets emitted once the user changed something
- this.userInteraction = new Signal();
-
- /** @type {Vector} */
- this.currentShake = new Vector(0, 0);
-
- /** @type {Vector} */
- this.currentPan = new Vector(0, 0);
-
- // Set desired pan (camera movement)
- /** @type {Vector} */
- this.desiredPan = new Vector(0, 0);
-
- // Set desired camera center
- /** @type {Vector} */
- this.desiredCenter = null;
-
- // Set desired camera zoom
- /** @type {number} */
- this.desiredZoom = null;
-
- /** @type {Vector} */
- this.touchPostMoveVelocity = new Vector(0, 0);
-
- // Handlers
- this.downPreHandler = /** @type {TypedSignal<[Vector, enumMouseButton]>} */ (new Signal());
- this.movePreHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
- // this.pinchPreHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
- this.upPostHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
-
- this.internalInitEvents();
- this.clampZoomLevel();
- this.bindKeys();
- if (G_IS_DEV) {
- window.addEventListener("keydown", ev => {
- if (ev.key === "i") {
- this.zoomLevel = 3;
- }
- });
- }
- }
-
- // Serialization
- static getId() {
- return "Camera";
- }
-
- static getSchema() {
- return {
- zoomLevel: types.float,
- center: types.vector,
- };
- }
-
- deserialize(data) {
- const errorCode = super.deserialize(data);
- if (errorCode) {
- return errorCode;
- }
-
- // Safety
- this.clampZoomLevel();
- }
-
- // Simple geters & setters
-
- addScreenShake(amount) {
- const currentShakeAmount = this.currentShake.length();
- const scale = 1 / (1 + 3 * currentShakeAmount);
- this.currentShake.x = this.currentShake.x + 2 * (Math.random() - 0.5) * scale * amount;
- this.currentShake.y = this.currentShake.y + 2 * (Math.random() - 0.5) * scale * amount;
- }
-
- /**
- * Sets a point in world space to focus on
- * @param {Vector} center
- */
- setDesiredCenter(center) {
- this.desiredCenter = center.copy();
- this.currentlyMoving = false;
- }
-
- /**
- * Sets a desired zoom level
- * @param {number} zoom
- */
- setDesiredZoom(zoom) {
- this.desiredZoom = zoom;
- }
-
- /**
- * Returns if this camera is currently moving by a non-user interaction
- */
- isCurrentlyMovingToDesiredCenter() {
- return this.desiredCenter !== null;
- }
-
- /**
- * Sets the camera pan, every frame the camera will move by this amount
- * @param {Vector} pan
- */
- setPan(pan) {
- this.desiredPan = pan.copy();
- }
-
- /**
- * Finds a good initial zoom level
- */
- findInitialZoom() {
- const desiredWorldSpaceWidth = 15 * globalConfig.tileSize;
- const zoomLevelX = this.root.gameWidth / desiredWorldSpaceWidth;
- const zoomLevelY = this.root.gameHeight / desiredWorldSpaceWidth;
-
- const finalLevel = Math.min(zoomLevelX, zoomLevelY);
- assert(
- Number.isFinite(finalLevel) && finalLevel > 0,
- "Invalid zoom level computed for initial zoom: " + finalLevel
- );
- return finalLevel;
- }
-
- /**
- * Clears all animations
- */
- clearAnimations() {
- this.touchPostMoveVelocity.x = 0;
- this.touchPostMoveVelocity.y = 0;
- this.desiredCenter = null;
- this.desiredPan.x = 0;
- this.desiredPan.y = 0;
- this.currentPan.x = 0;
- this.currentPan.y = 0;
- this.currentlyPinching = false;
- this.currentlyMoving = false;
- this.lastMovingPosition = null;
- this.didMoveSinceTouchStart = false;
- this.desiredZoom = null;
- }
-
- /**
- * Returns if the user is currently interacting with the camera
- * @returns {boolean} true if the user interacts
- */
- isCurrentlyInteracting() {
- if (this.currentlyPinching) {
- return true;
- }
- if (this.currentlyMoving) {
- // Only interacting if moved at least once
- return this.didMoveSinceTouchStart;
- }
- if (this.touchPostMoveVelocity.lengthSquare() > 1) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns if in the next frame the viewport will change
- * @returns {boolean} true if it willchange
- */
- viewportWillChange() {
- return this.desiredCenter !== null || this.desiredZoom !== null || this.isCurrentlyInteracting();
- }
-
- /**
- * Cancels all interactions, that is user interaction and non user interaction
- */
- cancelAllInteractions() {
- this.touchPostMoveVelocity = new Vector(0, 0);
- this.desiredCenter = null;
- this.currentlyMoving = false;
- this.currentlyPinching = false;
- this.desiredZoom = null;
- }
-
- /**
- * Returns effective viewport width
- */
- getViewportWidth() {
- return this.root.gameWidth / this.zoomLevel;
- }
-
- /**
- * Returns effective viewport height
- */
- getViewportHeight() {
- return this.root.gameHeight / this.zoomLevel;
- }
-
- /**
- * Returns effective world space viewport left
- */
- getViewportLeft() {
- return this.center.x - this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
- }
-
- /**
- * Returns effective world space viewport right
- */
- getViewportRight() {
- return this.center.x + this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
- }
-
- /**
- * Returns effective world space viewport top
- */
- getViewportTop() {
- return this.center.y - this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
- }
-
- /**
- * Returns effective world space viewport bottom
- */
- getViewportBottom() {
- return this.center.y + this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
- }
-
- /**
- * Returns the visible world space rect
- * @returns {Rectangle}
- */
- getVisibleRect() {
- return Rectangle.fromTRBL(
- Math.floor(this.getViewportTop()),
- Math.ceil(this.getViewportRight()),
- Math.ceil(this.getViewportBottom()),
- Math.floor(this.getViewportLeft())
- );
- }
-
- getIsMapOverlayActive() {
- return this.zoomLevel < globalConfig.mapChunkOverviewMinZoom;
- }
-
- /**
- * Attaches all event listeners
- */
- internalInitEvents() {
- this.eventListenerTouchStart = this.onTouchStart.bind(this);
- this.eventListenerTouchEnd = this.onTouchEnd.bind(this);
- this.eventListenerTouchMove = this.onTouchMove.bind(this);
- this.eventListenerMousewheel = this.onMouseWheel.bind(this);
- this.eventListenerMouseDown = this.onMouseDown.bind(this);
- this.eventListenerMouseMove = this.onMouseMove.bind(this);
- this.eventListenerMouseUp = this.onMouseUp.bind(this);
-
- if (SUPPORT_TOUCH) {
- this.root.canvas.addEventListener("touchstart", this.eventListenerTouchStart);
- this.root.canvas.addEventListener("touchend", this.eventListenerTouchEnd);
- this.root.canvas.addEventListener("touchcancel", this.eventListenerTouchEnd);
- this.root.canvas.addEventListener("touchmove", this.eventListenerTouchMove);
- }
-
- this.root.canvas.addEventListener("wheel", this.eventListenerMousewheel);
- this.root.canvas.addEventListener("mousedown", this.eventListenerMouseDown);
- this.root.canvas.addEventListener("mousemove", this.eventListenerMouseMove);
- window.addEventListener("mouseup", this.eventListenerMouseUp);
- // this.root.canvas.addEventListener("mouseout", this.eventListenerMouseUp);
- }
-
- /**
- * Cleans up all event listeners
- */
- cleanup() {
- if (SUPPORT_TOUCH) {
- this.root.canvas.removeEventListener("touchstart", this.eventListenerTouchStart);
- this.root.canvas.removeEventListener("touchend", this.eventListenerTouchEnd);
- this.root.canvas.removeEventListener("touchcancel", this.eventListenerTouchEnd);
- this.root.canvas.removeEventListener("touchmove", this.eventListenerTouchMove);
- }
-
- this.root.canvas.removeEventListener("wheel", this.eventListenerMousewheel);
- this.root.canvas.removeEventListener("mousedown", this.eventListenerMouseDown);
- this.root.canvas.removeEventListener("mousemove", this.eventListenerMouseMove);
- window.removeEventListener("mouseup", this.eventListenerMouseUp);
- // this.root.canvas.removeEventListener("mouseout", this.eventListenerMouseUp);
- }
-
- /**
- * Binds the arrow keys
- */
- bindKeys() {
- const mapper = this.root.keyMapper;
- mapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).add(() => (this.keyboardForce.y = -1));
- mapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).add(() => (this.keyboardForce.y = 1));
- mapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).add(() => (this.keyboardForce.x = 1));
- mapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).add(() => (this.keyboardForce.x = -1));
-
- mapper
- .getBinding(KEYMAPPINGS.navigation.mapZoomIn)
- .add(() => (this.desiredZoom = this.zoomLevel * 1.2));
- mapper
- .getBinding(KEYMAPPINGS.navigation.mapZoomOut)
- .add(() => (this.desiredZoom = this.zoomLevel * 0.8));
-
- mapper.getBinding(KEYMAPPINGS.navigation.centerMap).add(() => this.centerOnMap());
- }
-
- centerOnMap() {
- this.desiredCenter = new Vector(0, 0);
- }
-
- /**
- * Converts from screen to world space
- * @param {Vector} screen
- * @returns {Vector} world space
- */
- screenToWorld(screen) {
- const centerSpace = screen.subScalars(this.root.gameWidth / 2, this.root.gameHeight / 2);
- return centerSpace.divideScalar(this.zoomLevel).add(this.center);
- }
-
- /**
- * Converts from world to screen space
- * @param {Vector} world
- * @returns {Vector} screen space
- */
- worldToScreen(world) {
- const screenSpace = world.sub(this.center).multiplyScalar(this.zoomLevel);
- return screenSpace.addScalars(this.root.gameWidth / 2, this.root.gameHeight / 2);
- }
-
- /**
- * Returns if a point is on screen
- * @param {Vector} point
- * @returns {boolean} true if its on screen
- */
- isWorldPointOnScreen(point) {
- const rect = this.getVisibleRect();
- return rect.containsPoint(point.x, point.y);
- }
-
- /**
- * Returns if we can further zoom in
- * @returns {boolean}
- */
- canZoomIn() {
- const maxLevel = this.root.app.platformWrapper.getMaximumZoom();
- return this.zoomLevel <= maxLevel - 0.01;
- }
-
- /**
- * Returns if we can further zoom out
- * @returns {boolean}
- */
- canZoomOut() {
- const minLevel = this.root.app.platformWrapper.getMinimumZoom();
- return this.zoomLevel >= minLevel + 0.01;
- }
-
- // EVENTS
-
- /**
- * Checks if the mouse event is too close after a touch event and thus
- * should get ignored
- */
- checkPreventDoubleMouse() {
- if (performance.now() - clickDetectorGlobals.lastTouchTime < 1000.0) {
- return false;
- }
- return true;
- }
-
- /**
- * Mousedown handler
- * @param {MouseEvent} event
- */
- onMouseDown(event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
-
- if (!this.checkPreventDoubleMouse()) {
- return;
- }
-
- this.touchPostMoveVelocity = new Vector(0, 0);
- if (event.button === 0) {
- this.combinedSingleTouchStartHandler(event.clientX, event.clientY);
- } else if (event.button === 1) {
- this.downPreHandler.dispatch(new Vector(event.clientX, event.clientY), enumMouseButton.middle);
- } else if (event.button === 2) {
- this.downPreHandler.dispatch(new Vector(event.clientX, event.clientY), enumMouseButton.right);
- }
- return false;
- }
-
- /**
- * Mousemove handler
- * @param {MouseEvent} event
- */
- onMouseMove(event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
-
- if (!this.checkPreventDoubleMouse()) {
- return;
- }
-
- if (event.button === 0) {
- this.combinedSingleTouchMoveHandler(event.clientX, event.clientY);
- }
-
- // Clamp everything afterwards
- this.clampZoomLevel();
- return false;
- }
-
- /**
- * Mouseup handler
- * @param {MouseEvent=} event
- */
- onMouseUp(event) {
- if (event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
- }
-
- if (!this.checkPreventDoubleMouse()) {
- return;
- }
-
- this.combinedSingleTouchStopHandler(event.clientX, event.clientY);
- return false;
- }
-
- /**
- * Mousewheel event
- * @param {WheelEvent} event
- */
- onMouseWheel(event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
- const prevZoom = this.zoomLevel;
-
- const delta = Math.sign(event.deltaY) * -0.15 * this.root.app.settings.getScrollWheelSensitivity();
- assert(Number.isFinite(delta), "Got invalid delta in mouse wheel event: " + event.deltaY);
- assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *before* wheel: " + this.zoomLevel);
- this.zoomLevel *= 1 + delta;
- assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *after* wheel: " + this.zoomLevel);
-
- this.clampZoomLevel();
- this.desiredZoom = null;
-
- const mousePosition = this.root.app.mousePosition;
- if (mousePosition) {
- const worldPos = this.root.camera.screenToWorld(mousePosition);
- const worldDelta = worldPos.sub(this.center);
- const actualDelta = this.zoomLevel / prevZoom - 1;
- this.center = this.center.add(worldDelta.multiplyScalar(actualDelta));
- this.desiredCenter = null;
- }
-
- return false;
- }
-
- /**
- * Touch start handler
- * @param {TouchEvent} event
- */
- onTouchStart(event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
-
- clickDetectorGlobals.lastTouchTime = performance.now();
- this.touchPostMoveVelocity = new Vector(0, 0);
-
- if (event.touches.length === 1) {
- const touch = event.touches[0];
- this.combinedSingleTouchStartHandler(touch.clientX, touch.clientY);
- } else if (event.touches.length === 2) {
- // if (this.pinchPreHandler.dispatch() === STOP_PROPAGATION) {
- // // Something prevented pinching
- // return false;
- // }
-
- const touch1 = event.touches[0];
- const touch2 = event.touches[1];
- this.currentlyMoving = false;
- this.currentlyPinching = true;
- this.lastPinchPositions = [
- new Vector(touch1.clientX, touch1.clientY),
- new Vector(touch2.clientX, touch2.clientY),
- ];
- }
- return false;
- }
-
- /**
- * Touch move handler
- * @param {TouchEvent} event
- */
- onTouchMove(event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
-
- clickDetectorGlobals.lastTouchTime = performance.now();
-
- if (event.touches.length === 1) {
- const touch = event.touches[0];
- this.combinedSingleTouchMoveHandler(touch.clientX, touch.clientY);
- } else if (event.touches.length === 2) {
- if (this.currentlyPinching) {
- const touch1 = event.touches[0];
- const touch2 = event.touches[1];
-
- const newPinchPositions = [
- new Vector(touch1.clientX, touch1.clientY),
- new Vector(touch2.clientX, touch2.clientY),
- ];
-
- // Get distance of taps last time and now
- const lastDistance = this.lastPinchPositions[0].distance(this.lastPinchPositions[1]);
- const thisDistance = newPinchPositions[0].distance(newPinchPositions[1]);
-
- // IMPORTANT to do math max here to avoid NaN and causing an invalid zoom level
- const difference = thisDistance / Math.max(0.001, lastDistance);
-
- // Find old center of zoom
- let oldCenter = this.lastPinchPositions[0].centerPoint(this.lastPinchPositions[1]);
-
- // Find new center of zoom
- let center = newPinchPositions[0].centerPoint(newPinchPositions[1]);
-
- // Compute movement
- let movement = oldCenter.sub(center);
- this.center.x += movement.x / this.zoomLevel;
- this.center.y += movement.y / this.zoomLevel;
-
- // Compute zoom
- center = center.sub(new Vector(this.root.gameWidth / 2, this.root.gameHeight / 2));
-
- // Apply zoom
- assert(
- Number.isFinite(difference),
- "Invalid pinch difference: " +
- difference +
- "(last=" +
- lastDistance +
- ", new = " +
- thisDistance +
- ")"
- );
- this.zoomLevel *= difference;
-
- // Stick to pivot point
- const correcture = center.multiplyScalar(difference - 1).divideScalar(this.zoomLevel);
-
- this.center = this.center.add(correcture);
- this.lastPinchPositions = newPinchPositions;
- this.userInteraction.dispatch(USER_INTERACT_MOVE);
-
- // Since we zoomed, abort any programmed zooming
- if (this.desiredZoom) {
- this.desiredZoom = null;
- }
- }
- }
-
- // Clamp everything afterwards
- this.clampZoomLevel();
- return false;
- }
-
- /**
- * Touch end and cancel handler
- * @param {TouchEvent=} event
- */
- onTouchEnd(event) {
- if (event) {
- if (event.cancelable) {
- event.preventDefault();
- // event.stopPropagation();
- }
- }
-
- clickDetectorGlobals.lastTouchTime = performance.now();
- if (event.changedTouches.length === 0) {
- logger.warn("Touch end without changed touches");
- }
-
- const touch = event.changedTouches[0];
- this.combinedSingleTouchStopHandler(touch.clientX, touch.clientY);
- return false;
- }
-
- /**
- * Internal touch start handler
- * @param {number} x
- * @param {number} y
- */
- combinedSingleTouchStartHandler(x, y) {
- const pos = new Vector(x, y);
- if (this.downPreHandler.dispatch(pos, enumMouseButton.left) === STOP_PROPAGATION) {
- // Somebody else captured it
- return;
- }
-
- this.touchPostMoveVelocity = new Vector(0, 0);
- this.currentlyMoving = true;
- this.lastMovingPosition = pos;
- this.lastMovingPositionLastTick = null;
- this.numTicksStandingStill = 0;
- this.didMoveSinceTouchStart = false;
- }
-
- /**
- * Internal touch move handler
- * @param {number} x
- * @param {number} y
- */
- combinedSingleTouchMoveHandler(x, y) {
- const pos = new Vector(x, y);
- if (this.movePreHandler.dispatch(pos) === STOP_PROPAGATION) {
- // Somebody else captured it
- return;
- }
-
- if (!this.currentlyMoving) {
- return false;
- }
-
- let delta = this.lastMovingPosition.sub(pos).divideScalar(this.zoomLevel);
- if (G_IS_DEV && globalConfig.debug.testCulling) {
- // When testing culling, we see everything from the same distance
- delta = delta.multiplyScalar(this.zoomLevel * -2);
- }
-
- this.didMoveSinceTouchStart = this.didMoveSinceTouchStart || delta.length() > 0;
- this.center = this.center.add(delta);
-
- this.touchPostMoveVelocity = this.touchPostMoveVelocity
- .multiplyScalar(velocitySmoothing)
- .add(delta.multiplyScalar(1 - velocitySmoothing));
-
- this.lastMovingPosition = pos;
- this.userInteraction.dispatch(USER_INTERACT_MOVE);
-
- // Since we moved, abort any programmed moving
- if (this.desiredCenter) {
- this.desiredCenter = null;
- }
- }
-
- /**
- * Internal touch stop handler
- */
- combinedSingleTouchStopHandler(x, y) {
- if (this.currentlyMoving || this.currentlyPinching) {
- this.currentlyMoving = false;
- this.currentlyPinching = false;
- this.lastMovingPosition = null;
- this.lastMovingPositionLastTick = null;
- this.numTicksStandingStill = 0;
- this.lastPinchPositions = null;
- this.userInteraction.dispatch(USER_INTERACT_TOUCHEND);
- this.didMoveSinceTouchStart = false;
- }
- this.upPostHandler.dispatch(new Vector(x, y));
- }
-
- /**
- * Clamps the camera zoom level within the allowed range
- */
- clampZoomLevel() {
- if (G_IS_DEV && globalConfig.debug.disableZoomLimits) {
- return;
- }
- const wrapper = this.root.app.platformWrapper;
-
- assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *before* clamp: " + this.zoomLevel);
- this.zoomLevel = clamp(this.zoomLevel, wrapper.getMinimumZoom(), wrapper.getMaximumZoom());
- assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *after* clamp: " + this.zoomLevel);
-
- if (this.desiredZoom) {
- this.desiredZoom = clamp(this.desiredZoom, wrapper.getMinimumZoom(), wrapper.getMaximumZoom());
- }
- }
-
- /**
- * Updates the camera
- * @param {number} dt Delta time in milliseconds
- */
- update(dt) {
- dt = Math.min(dt, 33);
- this.cameraUpdateTimeBucket += dt;
-
- // Simulate movement of N FPS
- const updatesPerFrame = 4;
- const physicsStepSizeMs = 1000.0 / (60.0 * updatesPerFrame);
-
- let now = this.root.time.systemNow() - 3 * physicsStepSizeMs;
-
- while (this.cameraUpdateTimeBucket > physicsStepSizeMs) {
- now += physicsStepSizeMs;
- this.cameraUpdateTimeBucket -= physicsStepSizeMs;
-
- this.internalUpdatePanning(now, physicsStepSizeMs);
- this.internalUpdateZooming(now, physicsStepSizeMs);
- this.internalUpdateCentering(now, physicsStepSizeMs);
- this.internalUpdateShake(now, physicsStepSizeMs);
- this.internalUpdateKeyboardForce(now, physicsStepSizeMs);
- }
- this.clampZoomLevel();
- }
-
- /**
- * Prepares a context to transform it
- * @param {CanvasRenderingContext2D} context
- */
- transform(context) {
- if (G_IS_DEV && globalConfig.debug.testCulling) {
- context.transform(1, 0, 0, 1, 100, 100);
- return;
- }
-
- this.clampZoomLevel();
- const zoom = this.zoomLevel;
-
- context.transform(
- // Scale, skew, rotate
- zoom,
- 0,
- 0,
- zoom,
-
- // Translate
- -zoom * this.getViewportLeft(),
- -zoom * this.getViewportTop()
- );
- }
-
- /**
- * Internal shake handler
- * @param {number} now Time now in seconds
- * @param {number} dt Delta time
- */
- internalUpdateShake(now, dt) {
- this.currentShake = this.currentShake.multiplyScalar(0.92);
- }
-
- /**
- * Internal pan handler
- * @param {number} now Time now in seconds
- * @param {number} dt Delta time
- */
- internalUpdatePanning(now, dt) {
- const baseStrength = velocityStrength * this.root.app.platformWrapper.getTouchPanStrength();
-
- this.touchPostMoveVelocity = this.touchPostMoveVelocity.multiplyScalar(velocityFade);
-
- // Check if the camera is being dragged but standing still: if not, zero out `touchPostMoveVelocity`.
- if (this.currentlyMoving && this.desiredCenter === null) {
- if (
- this.lastMovingPositionLastTick !== null &&
- this.lastMovingPositionLastTick.equalsEpsilon(this.lastMovingPosition)
- ) {
- this.numTicksStandingStill++;
- } else {
- this.numTicksStandingStill = 0;
- }
- this.lastMovingPositionLastTick = this.lastMovingPosition.copy();
-
- if (this.numTicksStandingStill >= ticksBeforeErasingVelocity) {
- this.touchPostMoveVelocity.x = 0;
- this.touchPostMoveVelocity.y = 0;
- }
- }
- // Check influence of past points
- if (!this.currentlyMoving && !this.currentlyPinching) {
- const len = this.touchPostMoveVelocity.length();
- if (len >= velocityMax) {
- this.touchPostMoveVelocity.x = (this.touchPostMoveVelocity.x * velocityMax) / len;
- this.touchPostMoveVelocity.y = (this.touchPostMoveVelocity.y * velocityMax) / len;
- }
-
- this.center = this.center.add(this.touchPostMoveVelocity.multiplyScalar(baseStrength));
-
- // Panning
- this.currentPan = mixVector(this.currentPan, this.desiredPan, 0.06);
- this.center = this.center.add(this.currentPan.multiplyScalar((0.5 * dt) / this.zoomLevel));
- }
- }
-
- /**
- * Updates the non user interaction zooming
- * @param {number} now Time now in seconds
- * @param {number} dt Delta time
- */
- internalUpdateZooming(now, dt) {
- if (!this.currentlyPinching && this.desiredZoom !== null) {
- const diff = this.zoomLevel - this.desiredZoom;
- if (Math.abs(diff) > 0.0001) {
- let fade = 0.94;
- if (diff > 0) {
- // Zoom out faster than in
- fade = 0.9;
- }
-
- assert(Number.isFinite(this.desiredZoom), "Desired zoom is NaN: " + this.desiredZoom);
- assert(Number.isFinite(fade), "Zoom fade is NaN: " + fade);
- this.zoomLevel = this.zoomLevel * fade + this.desiredZoom * (1 - fade);
- assert(Number.isFinite(this.zoomLevel), "Zoom level is NaN after fade: " + this.zoomLevel);
- } else {
- this.desiredZoom = null;
- }
- }
- }
-
- /**
- * Updates the non user interaction centering
- * @param {number} now Time now in seconds
- * @param {number} dt Delta time
- */
- internalUpdateCentering(now, dt) {
- if (!this.currentlyMoving && this.desiredCenter !== null) {
- const diff = this.center.direction(this.desiredCenter);
- const length = diff.length();
- const tolerance = 1 / this.zoomLevel;
- if (length > tolerance) {
- const movement = diff.multiplyScalar(Math.min(1, dt * 0.008));
- this.center.x += movement.x;
- this.center.y += movement.y;
- } else {
- this.desiredCenter = null;
- }
- }
- }
-
- /**
- * Updates the keyboard forces
- * @param {number} now
- * @param {number} dt Delta time
- */
- internalUpdateKeyboardForce(now, dt) {
- if (!this.currentlyMoving && this.desiredCenter == null) {
- const limitingDimension = Math.min(this.root.gameWidth, this.root.gameHeight);
-
- const moveAmount = ((limitingDimension / 2048) * dt) / this.zoomLevel;
-
- let forceX = 0;
- let forceY = 0;
-
- const actionMapper = this.root.keyMapper;
- if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).pressed) {
- forceY -= 1;
- }
-
- if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).pressed) {
- forceY += 1;
- }
-
- if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).pressed) {
- forceX -= 1;
- }
-
- if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).pressed) {
- forceX += 1;
- }
-
- let movementSpeed =
- this.root.app.settings.getMovementSpeed() *
- (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveFaster).pressed ? 4 : 1);
-
- this.center.x += moveAmount * forceX * movementSpeed;
- this.center.y += moveAmount * forceY * movementSpeed;
- }
- }
-}
+import { clickDetectorGlobals } from "../core/click_detector";
+import { globalConfig, SUPPORT_TOUCH } from "../core/config";
+import { createLogger } from "../core/logging";
+import { Rectangle } from "../core/rectangle";
+import { Signal, STOP_PROPAGATION } from "../core/signal";
+import { clamp } from "../core/utils";
+import { mixVector, Vector } from "../core/vector";
+import { BasicSerializableObject, types } from "../savegame/serialization";
+import { KEYMAPPINGS } from "./key_action_mapper";
+import { GameRoot } from "./root";
+
+const logger = createLogger("camera");
+
+export const USER_INTERACT_MOVE = "move";
+export const USER_INTERACT_ZOOM = "zoom";
+export const USER_INTERACT_TOUCHEND = "touchend";
+
+const velocitySmoothing = 0.5;
+const velocityFade = 0.98;
+const velocityStrength = 0.4;
+const velocityMax = 20;
+const ticksBeforeErasingVelocity = 10;
+
+/**
+ * @enum {string}
+ */
+export const enumMouseButton = {
+ left: "left",
+ middle: "middle",
+ right: "right",
+};
+
+export class Camera extends BasicSerializableObject {
+ constructor(root) {
+ super();
+
+ /** @type {GameRoot} */
+ this.root = root;
+
+ // Zoom level, 2 means double size
+
+ // Find optimal initial zoom
+
+ this.zoomLevel = this.findInitialZoom();
+ this.clampZoomLevel();
+
+ /** @type {Vector} */
+ this.center = new Vector(0, 0);
+
+ // Input handling
+ this.currentlyMoving = false;
+ this.lastMovingPosition = null;
+ this.lastMovingPositionLastTick = null;
+ this.numTicksStandingStill = null;
+ this.cameraUpdateTimeBucket = 0.0;
+ this.didMoveSinceTouchStart = false;
+ this.currentlyPinching = false;
+ this.lastPinchPositions = null;
+
+ this.keyboardForce = new Vector();
+
+ // Signal which gets emitted once the user changed something
+ this.userInteraction = new Signal();
+
+ /** @type {Vector} */
+ this.currentShake = new Vector(0, 0);
+
+ /** @type {Vector} */
+ this.currentPan = new Vector(0, 0);
+
+ // Set desired pan (camera movement)
+ /** @type {Vector} */
+ this.desiredPan = new Vector(0, 0);
+
+ // Set desired camera center
+ /** @type {Vector} */
+ this.desiredCenter = null;
+
+ // Set desired camera zoom
+ /** @type {number} */
+ this.desiredZoom = null;
+
+ /** @type {Vector} */
+ this.touchPostMoveVelocity = new Vector(0, 0);
+
+ // Handlers
+ this.downPreHandler = /** @type {TypedSignal<[Vector, enumMouseButton]>} */ (new Signal());
+ this.movePreHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
+ // this.pinchPreHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
+ this.upPostHandler = /** @type {TypedSignal<[Vector]>} */ (new Signal());
+
+ this.internalInitEvents();
+ this.clampZoomLevel();
+ this.bindKeys();
+ if (G_IS_DEV) {
+ window.addEventListener("keydown", ev => {
+ if (ev.key === "i") {
+ this.zoomLevel = 3;
+ }
+ });
+ }
+ }
+
+ // Serialization
+ static getId() {
+ return "Camera";
+ }
+
+ static getSchema() {
+ return {
+ zoomLevel: types.float,
+ center: types.vector,
+ };
+ }
+
+ deserialize(data) {
+ const errorCode = super.deserialize(data);
+ if (errorCode) {
+ return errorCode;
+ }
+
+ // Safety
+ this.clampZoomLevel();
+ }
+
+ // Simple getters & setters
+
+ addScreenShake(amount) {
+ const currentShakeAmount = this.currentShake.length();
+ const scale = 1 / (1 + 3 * currentShakeAmount);
+ this.currentShake.x = this.currentShake.x + 2 * (Math.random() - 0.5) * scale * amount;
+ this.currentShake.y = this.currentShake.y + 2 * (Math.random() - 0.5) * scale * amount;
+ }
+
+ /**
+ * Sets a point in world space to focus on
+ * @param {Vector} center
+ */
+ setDesiredCenter(center) {
+ this.desiredCenter = center.copy();
+ this.currentlyMoving = false;
+ }
+
+ /**
+ * Sets a desired zoom level
+ * @param {number} zoom
+ */
+ setDesiredZoom(zoom) {
+ this.desiredZoom = zoom;
+ }
+
+ /**
+ * Returns if this camera is currently moving by a non-user interaction
+ */
+ isCurrentlyMovingToDesiredCenter() {
+ return this.desiredCenter !== null;
+ }
+
+ /**
+ * Sets the camera pan, every frame the camera will move by this amount
+ * @param {Vector} pan
+ */
+ setPan(pan) {
+ this.desiredPan = pan.copy();
+ }
+
+ /**
+ * Finds a good initial zoom level
+ */
+ findInitialZoom() {
+ const desiredWorldSpaceWidth = 15 * globalConfig.tileSize;
+ const zoomLevelX = this.root.gameWidth / desiredWorldSpaceWidth;
+ const zoomLevelY = this.root.gameHeight / desiredWorldSpaceWidth;
+
+ const finalLevel = Math.min(zoomLevelX, zoomLevelY);
+ assert(
+ Number.isFinite(finalLevel) && finalLevel > 0,
+ "Invalid zoom level computed for initial zoom: " + finalLevel
+ );
+ return finalLevel;
+ }
+
+ /**
+ * Clears all animations
+ */
+ clearAnimations() {
+ this.touchPostMoveVelocity.x = 0;
+ this.touchPostMoveVelocity.y = 0;
+ this.desiredCenter = null;
+ this.desiredPan.x = 0;
+ this.desiredPan.y = 0;
+ this.currentPan.x = 0;
+ this.currentPan.y = 0;
+ this.currentlyPinching = false;
+ this.currentlyMoving = false;
+ this.lastMovingPosition = null;
+ this.didMoveSinceTouchStart = false;
+ this.desiredZoom = null;
+ }
+
+ /**
+ * Returns if the user is currently interacting with the camera
+ * @returns {boolean} true if the user interacts
+ */
+ isCurrentlyInteracting() {
+ if (this.currentlyPinching) {
+ return true;
+ }
+ if (this.currentlyMoving) {
+ // Only interacting if moved at least once
+ return this.didMoveSinceTouchStart;
+ }
+ if (this.touchPostMoveVelocity.lengthSquare() > 1) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns if in the next frame the viewport will change
+ * @returns {boolean} true if it willchange
+ */
+ viewportWillChange() {
+ return this.desiredCenter !== null || this.desiredZoom !== null || this.isCurrentlyInteracting();
+ }
+
+ /**
+ * Cancels all interactions, that is user interaction and non user interaction
+ */
+ cancelAllInteractions() {
+ this.touchPostMoveVelocity = new Vector(0, 0);
+ this.desiredCenter = null;
+ this.currentlyMoving = false;
+ this.currentlyPinching = false;
+ this.desiredZoom = null;
+ }
+
+ /**
+ * Returns effective viewport width
+ */
+ getViewportWidth() {
+ return this.root.gameWidth / this.zoomLevel;
+ }
+
+ /**
+ * Returns effective viewport height
+ */
+ getViewportHeight() {
+ return this.root.gameHeight / this.zoomLevel;
+ }
+
+ /**
+ * Returns effective world space viewport left
+ */
+ getViewportLeft() {
+ return this.center.x - this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
+ }
+
+ /**
+ * Returns effective world space viewport right
+ */
+ getViewportRight() {
+ return this.center.x + this.getViewportWidth() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
+ }
+
+ /**
+ * Returns effective world space viewport top
+ */
+ getViewportTop() {
+ return this.center.y - this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
+ }
+
+ /**
+ * Returns effective world space viewport bottom
+ */
+ getViewportBottom() {
+ return this.center.y + this.getViewportHeight() / 2 + (this.currentShake.x * 10) / this.zoomLevel;
+ }
+
+ /**
+ * Returns the visible world space rect
+ * @returns {Rectangle}
+ */
+ getVisibleRect() {
+ return Rectangle.fromTRBL(
+ Math.floor(this.getViewportTop()),
+ Math.ceil(this.getViewportRight()),
+ Math.ceil(this.getViewportBottom()),
+ Math.floor(this.getViewportLeft())
+ );
+ }
+
+ getIsMapOverlayActive() {
+ return this.zoomLevel < globalConfig.mapChunkOverviewMinZoom;
+ }
+
+ /**
+ * Attaches all event listeners
+ */
+ internalInitEvents() {
+ this.eventListenerTouchStart = this.onTouchStart.bind(this);
+ this.eventListenerTouchEnd = this.onTouchEnd.bind(this);
+ this.eventListenerTouchMove = this.onTouchMove.bind(this);
+ this.eventListenerMousewheel = this.onMouseWheel.bind(this);
+ this.eventListenerMouseDown = this.onMouseDown.bind(this);
+ this.eventListenerMouseMove = this.onMouseMove.bind(this);
+ this.eventListenerMouseUp = this.onMouseUp.bind(this);
+
+ if (SUPPORT_TOUCH) {
+ this.root.canvas.addEventListener("touchstart", this.eventListenerTouchStart);
+ this.root.canvas.addEventListener("touchend", this.eventListenerTouchEnd);
+ this.root.canvas.addEventListener("touchcancel", this.eventListenerTouchEnd);
+ this.root.canvas.addEventListener("touchmove", this.eventListenerTouchMove);
+ }
+
+ this.root.canvas.addEventListener("wheel", this.eventListenerMousewheel);
+ this.root.canvas.addEventListener("mousedown", this.eventListenerMouseDown);
+ this.root.canvas.addEventListener("mousemove", this.eventListenerMouseMove);
+ window.addEventListener("mouseup", this.eventListenerMouseUp);
+ // this.root.canvas.addEventListener("mouseout", this.eventListenerMouseUp);
+ }
+
+ /**
+ * Cleans up all event listeners
+ */
+ cleanup() {
+ if (SUPPORT_TOUCH) {
+ this.root.canvas.removeEventListener("touchstart", this.eventListenerTouchStart);
+ this.root.canvas.removeEventListener("touchend", this.eventListenerTouchEnd);
+ this.root.canvas.removeEventListener("touchcancel", this.eventListenerTouchEnd);
+ this.root.canvas.removeEventListener("touchmove", this.eventListenerTouchMove);
+ }
+
+ this.root.canvas.removeEventListener("wheel", this.eventListenerMousewheel);
+ this.root.canvas.removeEventListener("mousedown", this.eventListenerMouseDown);
+ this.root.canvas.removeEventListener("mousemove", this.eventListenerMouseMove);
+ window.removeEventListener("mouseup", this.eventListenerMouseUp);
+ // this.root.canvas.removeEventListener("mouseout", this.eventListenerMouseUp);
+ }
+
+ /**
+ * Binds the arrow keys
+ */
+ bindKeys() {
+ const mapper = this.root.keyMapper;
+ mapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).add(() => (this.keyboardForce.y = -1));
+ mapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).add(() => (this.keyboardForce.y = 1));
+ mapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).add(() => (this.keyboardForce.x = 1));
+ mapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).add(() => (this.keyboardForce.x = -1));
+
+ mapper
+ .getBinding(KEYMAPPINGS.navigation.mapZoomIn)
+ .add(() => (this.desiredZoom = this.zoomLevel * 1.2));
+ mapper
+ .getBinding(KEYMAPPINGS.navigation.mapZoomOut)
+ .add(() => (this.desiredZoom = this.zoomLevel / 1.2));
+
+ mapper.getBinding(KEYMAPPINGS.navigation.centerMap).add(() => this.centerOnMap());
+ }
+
+ centerOnMap() {
+ this.desiredCenter = new Vector(0, 0);
+ }
+
+ /**
+ * Converts from screen to world space
+ * @param {Vector} screen
+ * @returns {Vector} world space
+ */
+ screenToWorld(screen) {
+ const centerSpace = screen.subScalars(this.root.gameWidth / 2, this.root.gameHeight / 2);
+ return centerSpace.divideScalar(this.zoomLevel).add(this.center);
+ }
+
+ /**
+ * Converts from world to screen space
+ * @param {Vector} world
+ * @returns {Vector} screen space
+ */
+ worldToScreen(world) {
+ const screenSpace = world.sub(this.center).multiplyScalar(this.zoomLevel);
+ return screenSpace.addScalars(this.root.gameWidth / 2, this.root.gameHeight / 2);
+ }
+
+ /**
+ * Returns if a point is on screen
+ * @param {Vector} point
+ * @returns {boolean} true if its on screen
+ */
+ isWorldPointOnScreen(point) {
+ const rect = this.getVisibleRect();
+ return rect.containsPoint(point.x, point.y);
+ }
+
+ /**
+ * Returns if we can further zoom in
+ * @returns {boolean}
+ */
+ canZoomIn() {
+ const maxLevel = this.root.app.platformWrapper.getMaximumZoom();
+ return this.zoomLevel <= maxLevel - 0.01;
+ }
+
+ /**
+ * Returns if we can further zoom out
+ * @returns {boolean}
+ */
+ canZoomOut() {
+ const minLevel = this.root.app.platformWrapper.getMinimumZoom();
+ return this.zoomLevel >= minLevel + 0.01;
+ }
+
+ // EVENTS
+
+ /**
+ * Checks if the mouse event is too close after a touch event and thus
+ * should get ignored
+ */
+ checkPreventDoubleMouse() {
+ if (performance.now() - clickDetectorGlobals.lastTouchTime < 1000.0) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Mousedown handler
+ * @param {MouseEvent} event
+ */
+ onMouseDown(event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+
+ if (!this.checkPreventDoubleMouse()) {
+ return;
+ }
+
+ this.touchPostMoveVelocity = new Vector(0, 0);
+ if (event.button === 0) {
+ this.combinedSingleTouchStartHandler(event.clientX, event.clientY);
+ } else if (event.button === 1) {
+ this.downPreHandler.dispatch(new Vector(event.clientX, event.clientY), enumMouseButton.middle);
+ } else if (event.button === 2) {
+ this.downPreHandler.dispatch(new Vector(event.clientX, event.clientY), enumMouseButton.right);
+ }
+ return false;
+ }
+
+ /**
+ * Mousemove handler
+ * @param {MouseEvent} event
+ */
+ onMouseMove(event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+
+ if (!this.checkPreventDoubleMouse()) {
+ return;
+ }
+
+ if (event.button === 0) {
+ this.combinedSingleTouchMoveHandler(event.clientX, event.clientY);
+ }
+
+ // Clamp everything afterwards
+ this.clampZoomLevel();
+ return false;
+ }
+
+ /**
+ * Mouseup handler
+ * @param {MouseEvent=} event
+ */
+ onMouseUp(event) {
+ if (event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+ }
+
+ if (!this.checkPreventDoubleMouse()) {
+ return;
+ }
+
+ this.combinedSingleTouchStopHandler(event.clientX, event.clientY);
+ return false;
+ }
+
+ /**
+ * Mousewheel event
+ * @param {WheelEvent} event
+ */
+ onMouseWheel(event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+ const prevZoom = this.zoomLevel;
+
+ const scale = 1 + 0.15 * this.root.app.settings.getScrollWheelSensitivity();
+ assert(Number.isFinite(scale), "Got invalid scale in mouse wheel event: " + event.deltaY);
+ assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *before* wheel: " + this.zoomLevel);
+ this.zoomLevel *= event.deltaY < 0 ? scale : 1 / scale;
+ assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *after* wheel: " + this.zoomLevel);
+
+ this.clampZoomLevel();
+ this.desiredZoom = null;
+
+ let mousePosition = this.root.app.mousePosition;
+ if (!this.root.app.settings.getAllSettings().zoomToCursor) {
+ mousePosition = new Vector(this.root.gameWidth / 2, this.root.gameHeight / 2);
+ }
+
+ if (mousePosition) {
+ const worldPos = this.root.camera.screenToWorld(mousePosition);
+ const worldDelta = worldPos.sub(this.center);
+ const actualDelta = this.zoomLevel / prevZoom - 1;
+ this.center = this.center.add(worldDelta.multiplyScalar(actualDelta));
+ this.desiredCenter = null;
+ }
+
+ return false;
+ }
+
+ /**
+ * Touch start handler
+ * @param {TouchEvent} event
+ */
+ onTouchStart(event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+
+ clickDetectorGlobals.lastTouchTime = performance.now();
+ this.touchPostMoveVelocity = new Vector(0, 0);
+
+ if (event.touches.length === 1) {
+ const touch = event.touches[0];
+ this.combinedSingleTouchStartHandler(touch.clientX, touch.clientY);
+ } else if (event.touches.length === 2) {
+ // if (this.pinchPreHandler.dispatch() === STOP_PROPAGATION) {
+ // // Something prevented pinching
+ // return false;
+ // }
+
+ const touch1 = event.touches[0];
+ const touch2 = event.touches[1];
+ this.currentlyMoving = false;
+ this.currentlyPinching = true;
+ this.lastPinchPositions = [
+ new Vector(touch1.clientX, touch1.clientY),
+ new Vector(touch2.clientX, touch2.clientY),
+ ];
+ }
+ return false;
+ }
+
+ /**
+ * Touch move handler
+ * @param {TouchEvent} event
+ */
+ onTouchMove(event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+
+ clickDetectorGlobals.lastTouchTime = performance.now();
+
+ if (event.touches.length === 1) {
+ const touch = event.touches[0];
+ this.combinedSingleTouchMoveHandler(touch.clientX, touch.clientY);
+ } else if (event.touches.length === 2) {
+ if (this.currentlyPinching) {
+ const touch1 = event.touches[0];
+ const touch2 = event.touches[1];
+
+ const newPinchPositions = [
+ new Vector(touch1.clientX, touch1.clientY),
+ new Vector(touch2.clientX, touch2.clientY),
+ ];
+
+ // Get distance of taps last time and now
+ const lastDistance = this.lastPinchPositions[0].distance(this.lastPinchPositions[1]);
+ const thisDistance = newPinchPositions[0].distance(newPinchPositions[1]);
+
+ // IMPORTANT to do math max here to avoid NaN and causing an invalid zoom level
+ const difference = thisDistance / Math.max(0.001, lastDistance);
+
+ // Find old center of zoom
+ let oldCenter = this.lastPinchPositions[0].centerPoint(this.lastPinchPositions[1]);
+
+ // Find new center of zoom
+ let center = newPinchPositions[0].centerPoint(newPinchPositions[1]);
+
+ // Compute movement
+ let movement = oldCenter.sub(center);
+ this.center.x += movement.x / this.zoomLevel;
+ this.center.y += movement.y / this.zoomLevel;
+
+ // Compute zoom
+ center = center.sub(new Vector(this.root.gameWidth / 2, this.root.gameHeight / 2));
+
+ // Apply zoom
+ assert(
+ Number.isFinite(difference),
+ "Invalid pinch difference: " +
+ difference +
+ "(last=" +
+ lastDistance +
+ ", new = " +
+ thisDistance +
+ ")"
+ );
+ this.zoomLevel *= difference;
+
+ // Stick to pivot point
+ const correcture = center.multiplyScalar(difference - 1).divideScalar(this.zoomLevel);
+
+ this.center = this.center.add(correcture);
+ this.lastPinchPositions = newPinchPositions;
+ this.userInteraction.dispatch(USER_INTERACT_MOVE);
+
+ // Since we zoomed, abort any programmed zooming
+ if (this.desiredZoom) {
+ this.desiredZoom = null;
+ }
+ }
+ }
+
+ // Clamp everything afterwards
+ this.clampZoomLevel();
+ return false;
+ }
+
+ /**
+ * Touch end and cancel handler
+ * @param {TouchEvent=} event
+ */
+ onTouchEnd(event) {
+ if (event) {
+ if (event.cancelable) {
+ event.preventDefault();
+ // event.stopPropagation();
+ }
+ }
+
+ clickDetectorGlobals.lastTouchTime = performance.now();
+ if (event.changedTouches.length === 0) {
+ logger.warn("Touch end without changed touches");
+ }
+
+ const touch = event.changedTouches[0];
+ this.combinedSingleTouchStopHandler(touch.clientX, touch.clientY);
+ return false;
+ }
+
+ /**
+ * Internal touch start handler
+ * @param {number} x
+ * @param {number} y
+ */
+ combinedSingleTouchStartHandler(x, y) {
+ const pos = new Vector(x, y);
+ if (this.downPreHandler.dispatch(pos, enumMouseButton.left) === STOP_PROPAGATION) {
+ // Somebody else captured it
+ return;
+ }
+
+ this.touchPostMoveVelocity = new Vector(0, 0);
+ this.currentlyMoving = true;
+ this.lastMovingPosition = pos;
+ this.lastMovingPositionLastTick = null;
+ this.numTicksStandingStill = 0;
+ this.didMoveSinceTouchStart = false;
+ }
+
+ /**
+ * Internal touch move handler
+ * @param {number} x
+ * @param {number} y
+ */
+ combinedSingleTouchMoveHandler(x, y) {
+ const pos = new Vector(x, y);
+ if (this.movePreHandler.dispatch(pos) === STOP_PROPAGATION) {
+ // Somebody else captured it
+ return;
+ }
+
+ if (!this.currentlyMoving) {
+ return false;
+ }
+
+ let delta = this.lastMovingPosition.sub(pos).divideScalar(this.zoomLevel);
+ if (G_IS_DEV && globalConfig.debug.testCulling) {
+ // When testing culling, we see everything from the same distance
+ delta = delta.multiplyScalar(this.zoomLevel * -2);
+ }
+
+ this.didMoveSinceTouchStart = this.didMoveSinceTouchStart || delta.length() > 0;
+ this.center = this.center.add(delta);
+
+ this.touchPostMoveVelocity = this.touchPostMoveVelocity
+ .multiplyScalar(velocitySmoothing)
+ .add(delta.multiplyScalar(1 - velocitySmoothing));
+
+ this.lastMovingPosition = pos;
+ this.userInteraction.dispatch(USER_INTERACT_MOVE);
+
+ // Since we moved, abort any programmed moving
+ if (this.desiredCenter) {
+ this.desiredCenter = null;
+ }
+ }
+
+ /**
+ * Internal touch stop handler
+ */
+ combinedSingleTouchStopHandler(x, y) {
+ if (this.currentlyMoving || this.currentlyPinching) {
+ this.currentlyMoving = false;
+ this.currentlyPinching = false;
+ this.lastMovingPosition = null;
+ this.lastMovingPositionLastTick = null;
+ this.numTicksStandingStill = 0;
+ this.lastPinchPositions = null;
+ this.userInteraction.dispatch(USER_INTERACT_TOUCHEND);
+ this.didMoveSinceTouchStart = false;
+ }
+ this.upPostHandler.dispatch(new Vector(x, y));
+ }
+
+ /**
+ * Clamps the camera zoom level within the allowed range
+ */
+ clampZoomLevel() {
+ if (G_IS_DEV && globalConfig.debug.disableZoomLimits) {
+ return;
+ }
+ const wrapper = this.root.app.platformWrapper;
+
+ assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *before* clamp: " + this.zoomLevel);
+ this.zoomLevel = clamp(this.zoomLevel, wrapper.getMinimumZoom(), wrapper.getMaximumZoom());
+ assert(Number.isFinite(this.zoomLevel), "Invalid zoom level *after* clamp: " + this.zoomLevel);
+
+ if (this.desiredZoom) {
+ this.desiredZoom = clamp(this.desiredZoom, wrapper.getMinimumZoom(), wrapper.getMaximumZoom());
+ }
+ }
+
+ /**
+ * Updates the camera
+ * @param {number} dt Delta time in milliseconds
+ */
+ update(dt) {
+ dt = Math.min(dt, 33);
+ this.cameraUpdateTimeBucket += dt;
+
+ // Simulate movement of N FPS
+ const updatesPerFrame = 4;
+ const physicsStepSizeMs = 1000.0 / (60.0 * updatesPerFrame);
+
+ let now = this.root.time.systemNow() - 3 * physicsStepSizeMs;
+
+ while (this.cameraUpdateTimeBucket > physicsStepSizeMs) {
+ now += physicsStepSizeMs;
+ this.cameraUpdateTimeBucket -= physicsStepSizeMs;
+
+ this.internalUpdatePanning(now, physicsStepSizeMs);
+ this.internalUpdateMousePanning(now, physicsStepSizeMs);
+ this.internalUpdateZooming(now, physicsStepSizeMs);
+ this.internalUpdateCentering(now, physicsStepSizeMs);
+ this.internalUpdateShake(now, physicsStepSizeMs);
+ this.internalUpdateKeyboardForce(now, physicsStepSizeMs);
+ }
+ this.clampZoomLevel();
+ }
+
+ /**
+ * Prepares a context to transform it
+ * @param {CanvasRenderingContext2D} context
+ */
+ transform(context) {
+ if (G_IS_DEV && globalConfig.debug.testCulling) {
+ context.transform(1, 0, 0, 1, 100, 100);
+ return;
+ }
+
+ this.clampZoomLevel();
+ const zoom = this.zoomLevel;
+
+ context.transform(
+ // Scale, skew, rotate
+ zoom,
+ 0,
+ 0,
+ zoom,
+
+ // Translate
+ -zoom * this.getViewportLeft(),
+ -zoom * this.getViewportTop()
+ );
+ }
+
+ /**
+ * Internal shake handler
+ * @param {number} now Time now in seconds
+ * @param {number} dt Delta time
+ */
+ internalUpdateShake(now, dt) {
+ this.currentShake = this.currentShake.multiplyScalar(0.92);
+ }
+
+ /**
+ * Internal pan handler
+ * @param {number} now Time now in seconds
+ * @param {number} dt Delta time
+ */
+ internalUpdatePanning(now, dt) {
+ const baseStrength = velocityStrength * this.root.app.platformWrapper.getTouchPanStrength();
+
+ this.touchPostMoveVelocity = this.touchPostMoveVelocity.multiplyScalar(velocityFade);
+
+ // Check if the camera is being dragged but standing still: if not, zero out `touchPostMoveVelocity`.
+ if (this.currentlyMoving && this.desiredCenter === null) {
+ if (
+ this.lastMovingPositionLastTick !== null &&
+ this.lastMovingPositionLastTick.equalsEpsilon(this.lastMovingPosition)
+ ) {
+ this.numTicksStandingStill++;
+ } else {
+ this.numTicksStandingStill = 0;
+ }
+ this.lastMovingPositionLastTick = this.lastMovingPosition.copy();
+
+ if (this.numTicksStandingStill >= ticksBeforeErasingVelocity) {
+ this.touchPostMoveVelocity.x = 0;
+ this.touchPostMoveVelocity.y = 0;
+ }
+ }
+ // Check influence of past points
+ if (!this.currentlyMoving && !this.currentlyPinching) {
+ const len = this.touchPostMoveVelocity.length();
+ if (len >= velocityMax) {
+ this.touchPostMoveVelocity.x = (this.touchPostMoveVelocity.x * velocityMax) / len;
+ this.touchPostMoveVelocity.y = (this.touchPostMoveVelocity.y * velocityMax) / len;
+ }
+
+ this.center = this.center.add(this.touchPostMoveVelocity.multiplyScalar(baseStrength));
+
+ // Panning
+ this.currentPan = mixVector(this.currentPan, this.desiredPan, 0.06);
+ this.center = this.center.add(this.currentPan.multiplyScalar((0.5 * dt) / this.zoomLevel));
+ }
+ }
+
+ /**
+ * Internal screen panning handler
+ * @param {number} now
+ * @param {number} dt
+ */
+ internalUpdateMousePanning(now, dt) {
+ if (!this.root.app.focused) {
+ return;
+ }
+
+ if (!this.root.app.settings.getAllSettings().enableMousePan) {
+ // Not enabled
+ return;
+ }
+
+ const mousePos = this.root.app.mousePosition;
+ if (!mousePos) {
+ return;
+ }
+
+ if (this.root.hud.shouldPauseGame() || this.root.hud.hasBlockingOverlayOpen()) {
+ return;
+ }
+
+ if (this.desiredCenter || this.desiredZoom || this.currentlyMoving || this.currentlyPinching) {
+ // Performing another method of movement right now
+ return;
+ }
+
+ if (
+ mousePos.x < 0 ||
+ mousePos.y < 0 ||
+ mousePos.x > this.root.gameWidth ||
+ mousePos.y > this.root.gameHeight
+ ) {
+ // Out of screen
+ return;
+ }
+
+ const panAreaPixels = 2;
+
+ const panVelocity = new Vector();
+ if (mousePos.x < panAreaPixels) {
+ panVelocity.x -= 1;
+ }
+ if (mousePos.x > this.root.gameWidth - panAreaPixels) {
+ panVelocity.x += 1;
+ }
+
+ if (mousePos.y < panAreaPixels) {
+ panVelocity.y -= 1;
+ }
+ if (mousePos.y > this.root.gameHeight - panAreaPixels) {
+ panVelocity.y += 1;
+ }
+
+ this.center = this.center.add(
+ panVelocity.multiplyScalar(
+ ((0.5 * dt) / this.zoomLevel) * this.root.app.settings.getMovementSpeed()
+ )
+ );
+ }
+
+ /**
+ * Updates the non user interaction zooming
+ * @param {number} now Time now in seconds
+ * @param {number} dt Delta time
+ */
+ internalUpdateZooming(now, dt) {
+ if (!this.currentlyPinching && this.desiredZoom !== null) {
+ const diff = this.zoomLevel - this.desiredZoom;
+ if (Math.abs(diff) > 0.0001) {
+ let fade = 0.94;
+ if (diff > 0) {
+ // Zoom out faster than in
+ fade = 0.9;
+ }
+
+ assert(Number.isFinite(this.desiredZoom), "Desired zoom is NaN: " + this.desiredZoom);
+ assert(Number.isFinite(fade), "Zoom fade is NaN: " + fade);
+ this.zoomLevel = this.zoomLevel * fade + this.desiredZoom * (1 - fade);
+ assert(Number.isFinite(this.zoomLevel), "Zoom level is NaN after fade: " + this.zoomLevel);
+ } else {
+ this.zoomLevel = this.desiredZoom;
+ this.desiredZoom = null;
+ }
+ }
+ }
+
+ /**
+ * Updates the non user interaction centering
+ * @param {number} now Time now in seconds
+ * @param {number} dt Delta time
+ */
+ internalUpdateCentering(now, dt) {
+ if (!this.currentlyMoving && this.desiredCenter !== null) {
+ const diff = this.center.direction(this.desiredCenter);
+ const length = diff.length();
+ const tolerance = 1 / this.zoomLevel;
+ if (length > tolerance) {
+ const movement = diff.multiplyScalar(Math.min(1, dt * 0.008));
+ this.center.x += movement.x;
+ this.center.y += movement.y;
+ } else {
+ this.desiredCenter = null;
+ }
+ }
+ }
+
+ /**
+ * Updates the keyboard forces
+ * @param {number} now
+ * @param {number} dt Delta time
+ */
+ internalUpdateKeyboardForce(now, dt) {
+ if (!this.currentlyMoving && this.desiredCenter == null) {
+ const limitingDimension = Math.min(this.root.gameWidth, this.root.gameHeight);
+
+ const moveAmount = ((limitingDimension / 2048) * dt) / this.zoomLevel;
+
+ let forceX = 0;
+ let forceY = 0;
+
+ const actionMapper = this.root.keyMapper;
+ if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveUp).pressed) {
+ forceY -= 1;
+ }
+
+ if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveDown).pressed) {
+ forceY += 1;
+ }
+
+ if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveLeft).pressed) {
+ forceX -= 1;
+ }
+
+ if (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveRight).pressed) {
+ forceX += 1;
+ }
+
+ let movementSpeed =
+ this.root.app.settings.getMovementSpeed() *
+ (actionMapper.getBinding(KEYMAPPINGS.navigation.mapMoveFaster).pressed ? 4 : 1);
+
+ this.center.x += moveAmount * forceX * movementSpeed;
+ this.center.y += moveAmount * forceY * movementSpeed;
+ }
+ }
+}
diff --git a/src/js/game/component.js b/src/js/game/component.js
index 7d30faff..46b1b545 100644
--- a/src/js/game/component.js
+++ b/src/js/game/component.js
@@ -18,12 +18,10 @@ export class Component extends BasicSerializableObject {
}
/**
- * Should duplicate the component but without its contents
- * @returns {object}
+ * Copy the current state to another component
+ * @param {Component} otherComponent
*/
- duplicateWithoutContents() {
- abstract;
- }
+ copyAdditionalStateTo(otherComponent) {}
/* dev:start */
diff --git a/src/js/game/component_registry.js b/src/js/game/component_registry.js
index b03c164f..f094e60d 100644
--- a/src/js/game/component_registry.js
+++ b/src/js/game/component_registry.js
@@ -17,6 +17,8 @@ import { LeverComponent } from "./components/lever";
import { WireTunnelComponent } from "./components/wire_tunnel";
import { DisplayComponent } from "./components/display";
import { BeltReaderComponent } from "./components/belt_reader";
+import { FilterComponent } from "./components/filter";
+import { ItemProducerComponent } from "./components/item_producer";
export function initComponentRegistry() {
gComponentRegistry.register(StaticMapEntityComponent);
@@ -37,6 +39,8 @@ export function initComponentRegistry() {
gComponentRegistry.register(WireTunnelComponent);
gComponentRegistry.register(DisplayComponent);
gComponentRegistry.register(BeltReaderComponent);
+ gComponentRegistry.register(FilterComponent);
+ gComponentRegistry.register(ItemProducerComponent);
// IMPORTANT ^^^^^ UPDATE ENTITY COMPONENT STORAGE AFTERWARDS
diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js
index 02197822..138c4775 100644
--- a/src/js/game/components/belt.js
+++ b/src/js/game/components/belt.js
@@ -40,10 +40,6 @@ export class BeltComponent extends Component {
return "Belt";
}
- duplicateWithoutContents() {
- return new BeltComponent({ direction: this.direction });
- }
-
/**
*
* @param {object} param0
diff --git a/src/js/game/components/belt_reader.js b/src/js/game/components/belt_reader.js
index d59feb9c..d451bab5 100644
--- a/src/js/game/components/belt_reader.js
+++ b/src/js/game/components/belt_reader.js
@@ -8,10 +8,6 @@ export class BeltReaderComponent extends Component {
return "BeltReader";
}
- duplicateWithoutContents() {
- return new BeltReaderComponent();
- }
-
static getSchema() {
return {
lastItem: types.nullable(typeItemSingleton),
diff --git a/src/js/game/components/belt_underlays.js b/src/js/game/components/belt_underlays.js
index cb516b1a..63b265d0 100644
--- a/src/js/game/components/belt_underlays.js
+++ b/src/js/game/components/belt_underlays.js
@@ -1,33 +1,41 @@
-import { Component } from "../component";
-import { types } from "../../savegame/serialization";
-import { enumDirection, Vector } from "../../core/vector";
-
-export class BeltUnderlaysComponent extends Component {
- static getId() {
- return "BeltUnderlays";
- }
-
- duplicateWithoutContents() {
- const beltUnderlaysCopy = [];
- for (let i = 0; i < this.underlays.length; ++i) {
- const underlay = this.underlays[i];
- beltUnderlaysCopy.push({
- pos: underlay.pos.copy(),
- direction: underlay.direction,
- });
- }
-
- return new BeltUnderlaysComponent({
- underlays: beltUnderlaysCopy,
- });
- }
-
- /**
- * @param {object} param0
- * @param {Array<{pos: Vector, direction: enumDirection}>=} param0.underlays Where to render belt underlays
- */
- constructor({ underlays }) {
- super();
- this.underlays = underlays;
- }
-}
+import { enumDirection, Vector } from "../../core/vector";
+import { Component } from "../component";
+
+/**
+ * Store which type an underlay is, this is cached so we can easily
+ * render it.
+ *
+ * Full: Render underlay at top and bottom of tile
+ * Bottom Only: Only render underlay at the bottom half
+ * Top Only:
+ * @enum {string}
+ */
+export const enumClippedBeltUnderlayType = {
+ full: "full",
+ bottomOnly: "bottomOnly",
+ topOnly: "topOnly",
+ none: "none",
+};
+
+/**
+ * @typedef {{
+ * pos: Vector,
+ * direction: enumDirection,
+ * cachedType?: enumClippedBeltUnderlayType
+ * }} BeltUnderlayTile
+ */
+
+export class BeltUnderlaysComponent extends Component {
+ static getId() {
+ return "BeltUnderlays";
+ }
+
+ /**
+ * @param {object} param0
+ * @param {Array=} param0.underlays Where to render belt underlays
+ */
+ constructor({ underlays = [] }) {
+ super();
+ this.underlays = underlays;
+ }
+}
diff --git a/src/js/game/components/constant_signal.js b/src/js/game/components/constant_signal.js
index b51277a1..286108be 100644
--- a/src/js/game/components/constant_signal.js
+++ b/src/js/game/components/constant_signal.js
@@ -15,8 +15,12 @@ export class ConstantSignalComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new ConstantSignalComponent({ signal: this.signal });
+ /**
+ * Copy the current state to another component
+ * @param {ConstantSignalComponent} otherComponent
+ */
+ copyAdditionalStateTo(otherComponent) {
+ otherComponent.signal = this.signal;
}
/**
diff --git a/src/js/game/components/display.js b/src/js/game/components/display.js
index 720bf8c7..5a5b1b3b 100644
--- a/src/js/game/components/display.js
+++ b/src/js/game/components/display.js
@@ -4,8 +4,4 @@ export class DisplayComponent extends Component {
static getId() {
return "Display";
}
-
- duplicateWithoutContents() {
- return new DisplayComponent();
- }
}
diff --git a/src/js/game/components/filter.js b/src/js/game/components/filter.js
new file mode 100644
index 00000000..cffee969
--- /dev/null
+++ b/src/js/game/components/filter.js
@@ -0,0 +1,55 @@
+import { types } from "../../savegame/serialization";
+import { BaseItem } from "../base_item";
+import { Component } from "../component";
+import { typeItemSingleton } from "../item_resolver";
+
+/**
+ * @typedef {{
+ * item: BaseItem,
+ * progress: number
+ * }} PendingFilterItem
+ */
+
+export class FilterComponent extends Component {
+ static getId() {
+ return "Filter";
+ }
+
+ duplicateWithoutContents() {
+ return new FilterComponent();
+ }
+
+ static getSchema() {
+ return {
+ pendingItemsToLeaveThrough: types.array(
+ types.structured({
+ item: typeItemSingleton,
+ progress: types.ufloat,
+ })
+ ),
+
+ pendingItemsToReject: types.array(
+ types.structured({
+ item: typeItemSingleton,
+ progress: types.ufloat,
+ })
+ ),
+ };
+ }
+
+ constructor() {
+ super();
+
+ /**
+ * Items in queue to leave through
+ * @type {Array}
+ */
+ this.pendingItemsToLeaveThrough = [];
+
+ /**
+ * Items in queue to reject
+ * @type {Array}
+ */
+ this.pendingItemsToReject = [];
+ }
+}
diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js
index 3885eb1f..7dbd9677 100644
--- a/src/js/game/components/item_acceptor.js
+++ b/src/js/game/components/item_acceptor.js
@@ -28,22 +28,6 @@ export class ItemAcceptorComponent extends Component {
return "ItemAcceptor";
}
- duplicateWithoutContents() {
- const slotsCopy = [];
- for (let i = 0; i < this.slots.length; ++i) {
- const slot = this.slots[i];
- slotsCopy.push({
- pos: slot.pos.copy(),
- directions: slot.directions.slice(),
- filter: slot.filter,
- });
- }
-
- return new ItemAcceptorComponent({
- slots: slotsCopy,
- });
- }
-
/**
*
* @param {object} param0
diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js
index b9a23c38..47253b4b 100644
--- a/src/js/game/components/item_ejector.js
+++ b/src/js/game/components/item_ejector.js
@@ -1,161 +1,143 @@
-import { enumDirection, enumDirectionToVector, Vector } from "../../core/vector";
-import { types } from "../../savegame/serialization";
-import { BaseItem } from "../base_item";
-import { BeltPath } from "../belt_path";
-import { Component } from "../component";
-import { Entity } from "../entity";
-import { typeItemSingleton } from "../item_resolver";
-
-/**
- * @typedef {{
- * pos: Vector,
- * direction: enumDirection,
- * item: BaseItem,
- * progress: number?,
- * cachedDestSlot?: import("./item_acceptor").ItemAcceptorLocatedSlot,
- * cachedBeltPath?: BeltPath,
- * cachedTargetEntity?: Entity
- * }} ItemEjectorSlot
- */
-
-export class ItemEjectorComponent extends Component {
- static getId() {
- return "ItemEjector";
- }
-
- static getSchema() {
- // The cachedDestSlot, cachedTargetEntity fields are not serialized.
- return {
- slots: types.array(
- types.structured({
- item: types.nullable(typeItemSingleton),
- progress: types.float,
- })
- ),
- };
- }
-
- duplicateWithoutContents() {
- const slotsCopy = [];
- for (let i = 0; i < this.slots.length; ++i) {
- const slot = this.slots[i];
- slotsCopy.push({
- pos: slot.pos.copy(),
- direction: slot.direction,
- });
- }
-
- return new ItemEjectorComponent({
- slots: slotsCopy,
- });
- }
-
- /**
- *
- * @param {object} param0
- * @param {Array<{pos: Vector, direction: enumDirection }>=} param0.slots The slots to eject on
- */
- constructor({ slots = [] }) {
- super();
-
- this.setSlots(slots);
-
- /**
- * Whether this ejector slot is enabled
- */
- this.enabled = true;
- }
-
- /**
- * @param {Array<{pos: Vector, direction: enumDirection }>} slots The slots to eject on
- */
- setSlots(slots) {
- /** @type {Array} */
- this.slots = [];
- for (let i = 0; i < slots.length; ++i) {
- const slot = slots[i];
- this.slots.push({
- pos: slot.pos,
- direction: slot.direction,
- item: null,
- progress: 0,
- cachedDestSlot: null,
- cachedTargetEntity: null,
- });
- }
- }
-
- /**
- * Returns where this slot ejects to
- * @param {ItemEjectorSlot} slot
- * @returns {Vector}
- */
- getSlotTargetLocalTile(slot) {
- const directionVector = enumDirectionToVector[slot.direction];
- return slot.pos.add(directionVector);
- }
-
- /**
- * Returns whether any slot ejects to the given local tile
- * @param {Vector} tile
- */
- anySlotEjectsToLocalTile(tile) {
- for (let i = 0; i < this.slots.length; ++i) {
- if (this.getSlotTargetLocalTile(this.slots[i]).equals(tile)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns if we can eject on a given slot
- * @param {number} slotIndex
- * @returns {boolean}
- */
- canEjectOnSlot(slotIndex) {
- assert(slotIndex >= 0 && slotIndex < this.slots.length, "Invalid ejector slot: " + slotIndex);
- return !this.slots[slotIndex].item;
- }
-
- /**
- * Returns the first free slot on this ejector or null if there is none
- * @returns {number?}
- */
- getFirstFreeSlot() {
- for (let i = 0; i < this.slots.length; ++i) {
- if (this.canEjectOnSlot(i)) {
- return i;
- }
- }
- return null;
- }
-
- /**
- * Tries to eject a given item
- * @param {number} slotIndex
- * @param {BaseItem} item
- * @returns {boolean}
- */
- tryEject(slotIndex, item) {
- if (!this.canEjectOnSlot(slotIndex)) {
- return false;
- }
- this.slots[slotIndex].item = item;
- this.slots[slotIndex].progress = 0;
- return true;
- }
-
- /**
- * Clears the given slot and returns the item it had
- * @param {number} slotIndex
- * @returns {BaseItem|null}
- */
- takeSlotItem(slotIndex) {
- const slot = this.slots[slotIndex];
- const item = slot.item;
- slot.item = null;
- slot.progress = 0.0;
- return item;
- }
-}
+import { enumDirection, enumDirectionToVector, Vector } from "../../core/vector";
+import { types } from "../../savegame/serialization";
+import { BaseItem } from "../base_item";
+import { BeltPath } from "../belt_path";
+import { Component } from "../component";
+import { Entity } from "../entity";
+import { typeItemSingleton } from "../item_resolver";
+
+/**
+ * @typedef {{
+ * pos: Vector,
+ * direction: enumDirection,
+ * item: BaseItem,
+ * progress: number?,
+ * cachedDestSlot?: import("./item_acceptor").ItemAcceptorLocatedSlot,
+ * cachedBeltPath?: BeltPath,
+ * cachedTargetEntity?: Entity
+ * }} ItemEjectorSlot
+ */
+
+export class ItemEjectorComponent extends Component {
+ static getId() {
+ return "ItemEjector";
+ }
+
+ static getSchema() {
+ // The cachedDestSlot, cachedTargetEntity fields are not serialized.
+ return {
+ slots: types.fixedSizeArray(
+ types.structured({
+ item: types.nullable(typeItemSingleton),
+ progress: types.float,
+ })
+ ),
+ };
+ }
+
+ /**
+ *
+ * @param {object} param0
+ * @param {Array<{pos: Vector, direction: enumDirection }>=} param0.slots The slots to eject on
+ * @param {boolean=} param0.renderFloatingItems Whether to render items even if they are not connected
+ */
+ constructor({ slots = [], renderFloatingItems = true }) {
+ super();
+
+ this.setSlots(slots);
+ this.renderFloatingItems = renderFloatingItems;
+ }
+
+ /**
+ * @param {Array<{pos: Vector, direction: enumDirection }>} slots The slots to eject on
+ */
+ setSlots(slots) {
+ /** @type {Array} */
+ this.slots = [];
+ for (let i = 0; i < slots.length; ++i) {
+ const slot = slots[i];
+ this.slots.push({
+ pos: slot.pos,
+ direction: slot.direction,
+ item: null,
+ progress: 0,
+ cachedDestSlot: null,
+ cachedTargetEntity: null,
+ });
+ }
+ }
+
+ /**
+ * Returns where this slot ejects to
+ * @param {ItemEjectorSlot} slot
+ * @returns {Vector}
+ */
+ getSlotTargetLocalTile(slot) {
+ const directionVector = enumDirectionToVector[slot.direction];
+ return slot.pos.add(directionVector);
+ }
+
+ /**
+ * Returns whether any slot ejects to the given local tile
+ * @param {Vector} tile
+ */
+ anySlotEjectsToLocalTile(tile) {
+ for (let i = 0; i < this.slots.length; ++i) {
+ if (this.getSlotTargetLocalTile(this.slots[i]).equals(tile)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns if we can eject on a given slot
+ * @param {number} slotIndex
+ * @returns {boolean}
+ */
+ canEjectOnSlot(slotIndex) {
+ assert(slotIndex >= 0 && slotIndex < this.slots.length, "Invalid ejector slot: " + slotIndex);
+ return !this.slots[slotIndex].item;
+ }
+
+ /**
+ * Returns the first free slot on this ejector or null if there is none
+ * @returns {number?}
+ */
+ getFirstFreeSlot() {
+ for (let i = 0; i < this.slots.length; ++i) {
+ if (this.canEjectOnSlot(i)) {
+ return i;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Tries to eject a given item
+ * @param {number} slotIndex
+ * @param {BaseItem} item
+ * @returns {boolean}
+ */
+ tryEject(slotIndex, item) {
+ if (!this.canEjectOnSlot(slotIndex)) {
+ return false;
+ }
+ this.slots[slotIndex].item = item;
+ this.slots[slotIndex].progress = 0;
+ return true;
+ }
+
+ /**
+ * Clears the given slot and returns the item it had
+ * @param {number} slotIndex
+ * @returns {BaseItem|null}
+ */
+ takeSlotItem(slotIndex) {
+ const slot = this.slots[slotIndex];
+ const item = slot.item;
+ slot.item = null;
+ slot.progress = 0.0;
+ return item;
+ }
+}
diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js
index 5d51b4a3..fd466662 100644
--- a/src/js/game/components/item_processor.js
+++ b/src/js/game/components/item_processor.js
@@ -1,17 +1,15 @@
import { types } from "../../savegame/serialization";
import { BaseItem } from "../base_item";
import { Component } from "../component";
-import { typeItemSingleton } from "../item_resolver";
/** @enum {string} */
export const enumItemProcessorTypes = {
- splitter: "splitter",
- splitterWires: "splitterWires",
+ balancer: "balancer",
cutter: "cutter",
cutterQuad: "cutterQuad",
rotater: "rotater",
rotaterCCW: "rotaterCCW",
- rotaterFL: "rotaterFL",
+ rotater180: "rotater180",
stacker: "stacker",
trash: "trash",
mixer: "mixer",
@@ -26,7 +24,6 @@ export const enumItemProcessorTypes = {
/** @enum {string} */
export const enumItemProcessorRequirements = {
painterQuad: "painterQuad",
- filter: "filter",
};
/** @typedef {{
@@ -51,14 +48,6 @@ export class ItemProcessorComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new ItemProcessorComponent({
- processorType: this.type,
- processingRequirement: this.processingRequirement,
- inputsPerCharge: this.inputsPerCharge,
- });
- }
-
/**
*
* @param {object} param0
@@ -68,14 +57,14 @@ export class ItemProcessorComponent extends Component {
*
*/
constructor({
- processorType = enumItemProcessorTypes.splitter,
+ processorType = enumItemProcessorTypes.balancer,
processingRequirement = null,
inputsPerCharge = 1,
}) {
super();
// Which slot to emit next, this is only a preference and if it can't emit
- // it will take the other one. Some machines ignore this (e.g. the splitter) to make
+ // it will take the other one. Some machines ignore this (e.g. the balancer) to make
// sure the outputs always match
this.nextOutputSlot = 0;
diff --git a/src/js/game/components/item_producer.js b/src/js/game/components/item_producer.js
new file mode 100644
index 00000000..ef3571e2
--- /dev/null
+++ b/src/js/game/components/item_producer.js
@@ -0,0 +1,7 @@
+import { Component } from "../component";
+
+export class ItemProducerComponent extends Component {
+ static getId() {
+ return "ItemProducer";
+ }
+}
diff --git a/src/js/game/components/lever.js b/src/js/game/components/lever.js
index e17df1e8..106cbbdd 100644
--- a/src/js/game/components/lever.js
+++ b/src/js/game/components/lever.js
@@ -12,8 +12,12 @@ export class LeverComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new LeverComponent({ toggled: this.toggled });
+ /**
+ * Copy the current state to another component
+ * @param {LeverComponent} otherComponent
+ */
+ copyAdditionalStateTo(otherComponent) {
+ otherComponent.toggled = this.toggled;
}
/**
diff --git a/src/js/game/components/logic_gate.js b/src/js/game/components/logic_gate.js
index fe151184..62cd3365 100644
--- a/src/js/game/components/logic_gate.js
+++ b/src/js/game/components/logic_gate.js
@@ -12,7 +12,9 @@ export const enumLogicGateType = {
rotater: "rotater",
unstacker: "unstacker",
cutter: "cutter",
- shapecompare: "shapecompare",
+ compare: "compare",
+ stacker: "stacker",
+ painter: "painter",
};
export class LogicGateComponent extends Component {
@@ -20,10 +22,6 @@ export class LogicGateComponent extends Component {
return "LogicGate";
}
- duplicateWithoutContents() {
- return new LogicGateComponent({ type: this.type });
- }
-
/**
*
* @param {object} param0
diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js
index 5b818afb..ab87760f 100644
--- a/src/js/game/components/miner.js
+++ b/src/js/game/components/miner.js
@@ -19,12 +19,6 @@ export class MinerComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new MinerComponent({
- chainable: this.chainable,
- });
- }
-
constructor({ chainable = false }) {
super();
this.lastMiningTime = 0;
diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js
index 3d138e42..7e2f5314 100644
--- a/src/js/game/components/static_map_entity.js
+++ b/src/js/game/components/static_map_entity.js
@@ -63,7 +63,19 @@ export class StaticMapEntityComponent extends Component {
return getBuildingDataFromCode(this.code).metaInstance;
}
- duplicateWithoutContents() {
+ /**
+ * Returns the buildings variant
+ * @returns {string}
+ */
+ getVariant() {
+ return getBuildingDataFromCode(this.code).variant;
+ }
+
+ /**
+ * Copy the current state to another component
+ * @param {Component} otherComponent
+ */
+ copyAdditionalStateTo(otherComponent) {
return new StaticMapEntityComponent({
origin: this.origin.copy(),
rotation: this.rotation,
diff --git a/src/js/game/components/storage.js b/src/js/game/components/storage.js
index 3b32f6a3..be243a44 100644
--- a/src/js/game/components/storage.js
+++ b/src/js/game/components/storage.js
@@ -17,10 +17,6 @@ export class StorageComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new StorageComponent({ maximumStorage: this.maximumStorage });
- }
-
/**
* @param {object} param0
* @param {number=} param0.maximumStorage How much this storage can hold
diff --git a/src/js/game/components/underground_belt.js b/src/js/game/components/underground_belt.js
index 74351aac..a3e883ec 100644
--- a/src/js/game/components/underground_belt.js
+++ b/src/js/game/components/underground_belt.js
@@ -29,13 +29,6 @@ export class UndergroundBeltComponent extends Component {
};
}
- duplicateWithoutContents() {
- return new UndergroundBeltComponent({
- mode: this.mode,
- tier: this.tier,
- });
- }
-
/**
*
* @param {object} param0
@@ -55,7 +48,7 @@ export class UndergroundBeltComponent extends Component {
* Used on both receiver and sender.
* Reciever: Used to store the next item to transfer, and to block input while doing this
* Sender: Used to store which items are currently "travelling"
- * @type {Array<[BaseItem, number]>} Format is [Item, remaining seconds until transfer/ejection]
+ * @type {Array<[BaseItem, number]>} Format is [Item, ingame time to eject the item]
*/
this.pendingItems = [];
@@ -92,8 +85,9 @@ export class UndergroundBeltComponent extends Component {
* @param {BaseItem} item
* @param {number} travelDistance How many tiles this item has to travel
* @param {number} beltSpeed How fast this item travels
+ * @param {number} now Current ingame time
*/
- tryAcceptTunneledItem(item, travelDistance, beltSpeed) {
+ tryAcceptTunneledItem(item, travelDistance, beltSpeed, now) {
if (this.mode !== enumUndergroundBeltMode.receiver) {
// Only receivers can accept tunneled items
return false;
@@ -112,11 +106,7 @@ export class UndergroundBeltComponent extends Component {
// Additionally it takes 1 tile for the acceptor which we just add on top.
const travelDuration = (travelDistance + 1.5) / beltSpeed / globalConfig.itemSpacingOnBelts;
- this.pendingItems.push([item, travelDuration]);
-
- // Sort so we can only look at the first ones
- this.pendingItems.sort((a, b) => a[1] - b[1]);
-
+ this.pendingItems.push([item, now + travelDuration]);
return true;
}
}
diff --git a/src/js/game/components/wire.js b/src/js/game/components/wire.js
index 88c56249..d0e354e2 100644
--- a/src/js/game/components/wire.js
+++ b/src/js/game/components/wire.js
@@ -2,72 +2,41 @@ import { Component } from "../component";
/** @enum {string} */
export const enumWireType = {
- regular: "regular",
+ forward: "forward",
turn: "turn",
split: "split",
cross: "cross",
};
+/** @enum {string} */
+export const enumWireVariant = {
+ first: "first",
+ second: "second",
+};
+
export class WireComponent extends Component {
static getId() {
return "Wire";
}
- duplicateWithoutContents() {
- return new WireComponent({ type: this.type });
- }
-
/**
* @param {object} param0
* @param {enumWireType=} param0.type
+ * @param {enumWireVariant=} param0.variant
*/
- constructor({ type = enumWireType.regular }) {
+ constructor({ type = enumWireType.forward, variant = enumWireVariant.first }) {
super();
this.type = type;
+ /**
+ * The variant of the wire, different variants do not connect
+ * @type {enumWireVariant}
+ */
+ this.variant = variant;
+
/**
* @type {import("../systems/wire").WireNetwork}
*/
this.linkedNetwork = null;
}
-
- /**
- * Returns the local connections
- * @returns {import("../../core/utils").DirectionalObject}
- */
- getLocalConnections() {
- return {
- top: true,
- right: false,
- bottom: true,
- left: false,
- };
-
- // switch (this.type) {
- // case enumWireType.regular:
- // return {
- // top: true,
- // right: false,
- // bottom: true,
- // left: false,
- // };
- // case enumWireType.turn:
- // return {
- // top: false,
- // right: true,
- // bottom: true,
- // left: false,
- // };
- // case enumWireType.split:
- // return {
- // top: false,
- // right: true,
- // bottom: true,
- // left: true,
- // };
-
- // default:
- // assertAlways(false, "Invalid wire type: " + this.type);
- // }
- }
}
diff --git a/src/js/game/components/wire_tunnel.js b/src/js/game/components/wire_tunnel.js
index dfb38f1f..1c170484 100644
--- a/src/js/game/components/wire_tunnel.js
+++ b/src/js/game/components/wire_tunnel.js
@@ -5,17 +5,8 @@ export class WireTunnelComponent extends Component {
return "WireTunnel";
}
- duplicateWithoutContents() {
- return new WireTunnelComponent({ multipleDirections: this.multipleDirections });
- }
-
- /**
- * @param {object} param0
- * @param {boolean=} param0.multipleDirections
- */
- constructor({ multipleDirections = true }) {
+ constructor() {
super();
- this.multipleDirections = multipleDirections;
/**
* Linked network, only if its not multiple directions
diff --git a/src/js/game/components/wired_pins.js b/src/js/game/components/wired_pins.js
index 9a19c2b0..81a6ec62 100644
--- a/src/js/game/components/wired_pins.js
+++ b/src/js/game/components/wired_pins.js
@@ -31,7 +31,7 @@ export class WiredPinsComponent extends Component {
static getSchema() {
return {
- slots: types.array(
+ slots: types.fixedSizeArray(
types.structured({
value: types.nullable(typeItemSingleton),
})
@@ -49,20 +49,6 @@ export class WiredPinsComponent extends Component {
this.setSlots(slots);
}
- duplicateWithoutContents() {
- const slots = [];
- for (let i = 0; i < this.slots.length; ++i) {
- const slot = this.slots[i];
- slots.push({
- pos: slot.pos.copy(),
- type: slot.type,
- direction: slot.direction,
- });
- }
-
- return new WiredPinsComponent({ slots });
- }
-
/**
* Sets the slots of this building
* @param {Array} slots
diff --git a/src/js/game/core.js b/src/js/game/core.js
index 642d8d9d..2df8989f 100644
--- a/src/js/game/core.js
+++ b/src/js/game/core.js
@@ -2,7 +2,12 @@
import { Application } from "../application";
/* typehints:end */
import { BufferMaintainer } from "../core/buffer_maintainer";
-import { disableImageSmoothing, enableImageSmoothing, registerCanvas } from "../core/buffer_utils";
+import {
+ disableImageSmoothing,
+ enableImageSmoothing,
+ getBufferStats,
+ registerCanvas,
+} from "../core/buffer_utils";
import { globalConfig } from "../core/config";
import { getDeviceDPI, resizeHighDPICanvas } from "../core/dpi_manager";
import { DrawParameters } from "../core/draw_parameters";
@@ -26,6 +31,7 @@ import { KeyActionMapper } from "./key_action_mapper";
import { GameLogic } from "./logic";
import { MapView } from "./map_view";
import { defaultBuildingVariant } from "./meta_building";
+import { RegularGameMode } from "./modes/regular";
import { ProductionAnalytics } from "./production_analytics";
import { GameRoot } from "./root";
import { ShapeDefinitionManager } from "./shape_definition_manager";
@@ -96,6 +102,9 @@ export class GameCore {
// Needs to come first
root.dynamicTickrate = new DynamicTickrate(root);
+ // Init game mode
+ root.gameMode = new RegularGameMode(root);
+
// Init classes
root.camera = new Camera(root);
root.map = new MapView(root);
@@ -219,9 +228,6 @@ export class GameCore {
lastContext.clearRect(0, 0, lastCanvas.width, lastCanvas.height);
}
- // globalConfig.smoothing.smoothMainCanvas = getDeviceDPI() < 1.5;
- // globalConfig.smoothing.smoothMainCanvas = true;
-
canvas.classList.toggle("smoothed", globalConfig.smoothing.smoothMainCanvas);
// Oof, use :not() instead
@@ -374,9 +380,9 @@ export class GameCore {
(zoomLevel / globalConfig.assetsDpi) * getDeviceDPI() * globalConfig.assetsSharpness;
let desiredAtlasScale = "0.25";
- if (effectiveZoomLevel > 0.8 && !lowQuality) {
+ if (effectiveZoomLevel > 0.5 && !lowQuality) {
desiredAtlasScale = ORIGINAL_SPRITE_SCALE;
- } else if (effectiveZoomLevel > 0.4 && !lowQuality) {
+ } else if (effectiveZoomLevel > 0.35 && !lowQuality) {
desiredAtlasScale = "0.5";
}
@@ -414,6 +420,11 @@ export class GameCore {
const desiredOverlayAlpha = this.root.camera.getIsMapOverlayActive() ? 1 : 0;
this.overlayAlpha = lerp(this.overlayAlpha, desiredOverlayAlpha, 0.25);
+ // On low performance, skip the fade
+ if (this.root.entityMgr.entities.length > 5000 || this.root.dynamicTickrate.averageFps < 50) {
+ this.overlayAlpha = desiredOverlayAlpha;
+ }
+
if (this.overlayAlpha < 0.99) {
// Background (grid, resources, etc)
root.map.drawBackground(params);
@@ -500,18 +511,37 @@ export class GameCore {
);
const stats = this.root.buffers.getStats();
+
context.fillText(
- "Buffers: " +
+ "Maintained Buffers: " +
stats.rootKeys +
- " root keys, " +
+ " root keys / " +
stats.subKeys +
- " sub keys / buffers / VRAM: " +
+ " buffers / VRAM: " +
round2Digits(stats.vramBytes / (1024 * 1024)) +
" MB",
-
20,
620
);
+ const internalStats = getBufferStats();
+ context.fillText(
+ "Total Buffers: " +
+ internalStats.bufferCount +
+ " buffers / " +
+ internalStats.backlogSize +
+ " backlog / " +
+ internalStats.backlogKeys +
+ " keys in backlog / VRAM " +
+ round2Digits(internalStats.vramUsage / (1024 * 1024)) +
+ " MB / Backlog " +
+ round2Digits(internalStats.backlogVramUsage / (1024 * 1024)) +
+ " MB / Created " +
+ internalStats.numCreated +
+ " / Reused " +
+ internalStats.numReused,
+ 20,
+ 640
+ );
}
if (G_IS_DEV && globalConfig.debug.testClipping) {
diff --git a/src/js/game/entity.js b/src/js/game/entity.js
index ca21a16d..d7dd715e 100644
--- a/src/js/game/entity.js
+++ b/src/js/game/entity.js
@@ -1,229 +1,233 @@
-/* typehints:start */
-import { DrawParameters } from "../core/draw_parameters";
-import { Component } from "./component";
-/* typehints:end */
-
-import { GameRoot } from "./root";
-import { globalConfig } from "../core/config";
-import { enumDirectionToVector, enumDirectionToAngle } from "../core/vector";
-import { BasicSerializableObject, types } from "../savegame/serialization";
-import { EntityComponentStorage } from "./entity_components";
-import { Loader } from "../core/loader";
-import { drawRotatedSprite } from "../core/draw_utils";
-import { gComponentRegistry } from "../core/global_registries";
-
-export class Entity extends BasicSerializableObject {
- /**
- * @param {GameRoot} root
- */
- constructor(root) {
- super();
-
- /**
- * Handle to the global game root
- */
- this.root = root;
-
- /**
- * The components of the entity
- */
- this.components = new EntityComponentStorage();
-
- /**
- * Whether this entity was registered on the @see EntityManager so far
- */
- this.registered = false;
-
- /**
- * On which layer this entity is
- * @type {Layer}
- */
- this.layer = "regular";
-
- /**
- * Internal entity unique id, set by the @see EntityManager
- */
- this.uid = 0;
-
- /* typehints:start */
-
- /**
- * Stores if this entity is destroyed, set by the @see EntityManager
- * @type {boolean} */
- this.destroyed;
-
- /**
- * Stores if this entity is queued to get destroyed in the next tick
- * of the @see EntityManager
- * @type {boolean} */
- this.queuedForDestroy;
-
- /**
- * Stores the reason why this entity was destroyed
- * @type {string} */
- this.destroyReason;
-
- /* typehints:end */
- }
-
- static getId() {
- return "Entity";
- }
-
- /**
- * @see BasicSerializableObject.getSchema
- * @returns {import("../savegame/serialization").Schema}
- */
- static getSchema() {
- return {
- uid: types.uint,
- components: types.keyValueMap(types.objData(gComponentRegistry), false),
- };
- }
-
- /**
- * Returns a clone of this entity without contents
- */
- duplicateWithoutContents() {
- const clone = new Entity(this.root);
- for (const key in this.components) {
- clone.components[key] = this.components[key].duplicateWithoutContents();
- }
- clone.layer = this.layer;
- return clone;
- }
-
- /**
- * Internal destroy callback
- */
- internalDestroyCallback() {
- assert(!this.destroyed, "Can not destroy entity twice");
- this.destroyed = true;
- }
-
- /**
- * Adds a new component, only possible until the entity is registered on the entity manager,
- * after that use @see EntityManager.addDynamicComponent
- * @param {Component} componentInstance
- * @param {boolean} force Used by the entity manager. Internal parameter, do not change
- */
- addComponent(componentInstance, force = false) {
- if (!force && this.registered) {
- this.root.entityMgr.attachDynamicComponent(this, componentInstance);
- return;
- }
- assert(force || !this.registered, "Entity already registered, use EntityManager.addDynamicComponent");
- const id = /** @type {typeof Component} */ (componentInstance.constructor).getId();
- assert(!this.components[id], "Component already present");
- this.components[id] = componentInstance;
- }
-
- /**
- * Removes a given component, only possible until the entity is registered on the entity manager,
- * after that use @see EntityManager.removeDynamicComponent
- * @param {typeof Component} componentClass
- * @param {boolean} force
- */
- removeComponent(componentClass, force = false) {
- if (!force && this.registered) {
- this.root.entityMgr.removeDynamicComponent(this, componentClass);
- return;
- }
- assert(
- force || !this.registered,
- "Entity already registered, use EntityManager.removeDynamicComponent"
- );
- const id = componentClass.getId();
- assert(this.components[id], "Component does not exist on entity");
- delete this.components[id];
- }
-
- /**
- * Draws the entity, to override use @see Entity.drawImpl
- * @param {DrawParameters} parameters
- */
- drawDebugOverlays(parameters) {
- const context = parameters.context;
- const staticComp = this.components.StaticMapEntity;
-
- if (G_IS_DEV && staticComp && globalConfig.debug.showEntityBounds) {
- if (staticComp) {
- const transformed = staticComp.getTileSpaceBounds();
- context.strokeStyle = "rgba(255, 0, 0, 0.5)";
- context.lineWidth = 2;
- // const boundsSize = 20;
- context.beginPath();
- context.rect(
- transformed.x * globalConfig.tileSize,
- transformed.y * globalConfig.tileSize,
- transformed.w * globalConfig.tileSize,
- transformed.h * globalConfig.tileSize
- );
- context.stroke();
- }
- }
-
- if (G_IS_DEV && staticComp && globalConfig.debug.showAcceptorEjectors) {
- const ejectorComp = this.components.ItemEjector;
-
- if (ejectorComp) {
- const ejectorSprite = Loader.getSprite("sprites/debug/ejector_slot.png");
- for (let i = 0; i < ejectorComp.slots.length; ++i) {
- const slot = ejectorComp.slots[i];
- const slotTile = staticComp.localTileToWorld(slot.pos);
- const direction = staticComp.localDirectionToWorld(slot.direction);
- const directionVector = enumDirectionToVector[direction];
- const angle = Math.radians(enumDirectionToAngle[direction]);
-
- context.globalAlpha = slot.item ? 1 : 0.2;
- drawRotatedSprite({
- parameters,
- sprite: ejectorSprite,
- x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize,
- y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize,
- angle,
- size: globalConfig.tileSize * 0.25,
- });
- }
- }
- const acceptorComp = this.components.ItemAcceptor;
-
- if (acceptorComp) {
- const acceptorSprite = Loader.getSprite("sprites/misc/acceptor_slot.png");
- for (let i = 0; i < acceptorComp.slots.length; ++i) {
- const slot = acceptorComp.slots[i];
- const slotTile = staticComp.localTileToWorld(slot.pos);
- for (let k = 0; k < slot.directions.length; ++k) {
- const direction = staticComp.localDirectionToWorld(slot.directions[k]);
- const directionVector = enumDirectionToVector[direction];
- const angle = Math.radians(enumDirectionToAngle[direction] + 180);
- context.globalAlpha = 0.4;
- drawRotatedSprite({
- parameters,
- sprite: acceptorSprite,
- x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize,
- y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize,
- angle,
- size: globalConfig.tileSize * 0.25,
- });
- }
- }
- }
-
- context.globalAlpha = 1;
- }
- // this.drawImpl(parameters);
- }
-
- ///// Helper interfaces
-
- ///// Interface to override by subclasses
-
- /**
- * override, should draw the entity
- * @param {DrawParameters} parameters
- */
- drawImpl(parameters) {
- abstract;
- }
-}
+/* typehints:start */
+import { DrawParameters } from "../core/draw_parameters";
+import { Component } from "./component";
+/* typehints:end */
+
+import { GameRoot } from "./root";
+import { globalConfig } from "../core/config";
+import { enumDirectionToVector, enumDirectionToAngle } from "../core/vector";
+import { BasicSerializableObject, types } from "../savegame/serialization";
+import { EntityComponentStorage } from "./entity_components";
+import { Loader } from "../core/loader";
+import { drawRotatedSprite } from "../core/draw_utils";
+import { gComponentRegistry } from "../core/global_registries";
+import { getBuildingDataFromCode } from "./building_codes";
+
+export class Entity extends BasicSerializableObject {
+ /**
+ * @param {GameRoot} root
+ */
+ constructor(root) {
+ super();
+
+ /**
+ * Handle to the global game root
+ */
+ this.root = root;
+
+ /**
+ * The components of the entity
+ */
+ this.components = new EntityComponentStorage();
+
+ /**
+ * Whether this entity was registered on the @see EntityManager so far
+ */
+ this.registered = false;
+
+ /**
+ * On which layer this entity is
+ * @type {Layer}
+ */
+ this.layer = "regular";
+
+ /**
+ * Internal entity unique id, set by the @see EntityManager
+ */
+ this.uid = 0;
+
+ /* typehints:start */
+
+ /**
+ * Stores if this entity is destroyed, set by the @see EntityManager
+ * @type {boolean} */
+ this.destroyed;
+
+ /**
+ * Stores if this entity is queued to get destroyed in the next tick
+ * of the @see EntityManager
+ * @type {boolean} */
+ this.queuedForDestroy;
+
+ /**
+ * Stores the reason why this entity was destroyed
+ * @type {string} */
+ this.destroyReason;
+
+ /* typehints:end */
+ }
+
+ static getId() {
+ return "Entity";
+ }
+
+ /**
+ * @see BasicSerializableObject.getSchema
+ * @returns {import("../savegame/serialization").Schema}
+ */
+ static getSchema() {
+ return {
+ uid: types.uint,
+ components: types.keyValueMap(types.objData(gComponentRegistry), false),
+ };
+ }
+
+ /**
+ * Returns a clone of this entity
+ */
+ clone() {
+ const staticComp = this.components.StaticMapEntity;
+ const buildingData = getBuildingDataFromCode(staticComp.code);
+
+ const clone = buildingData.metaInstance.createEntity({
+ root: this.root,
+ origin: staticComp.origin,
+ originalRotation: staticComp.originalRotation,
+ rotation: staticComp.rotation,
+ rotationVariant: buildingData.rotationVariant,
+ variant: buildingData.variant,
+ });
+
+ for (const key in this.components) {
+ /** @type {Component} */ (this.components[key]).copyAdditionalStateTo(clone.components[key]);
+ }
+
+ return clone;
+ }
+
+ /**
+ * Adds a new component, only possible until the entity is registered on the entity manager,
+ * after that use @see EntityManager.addDynamicComponent
+ * @param {Component} componentInstance
+ * @param {boolean} force Used by the entity manager. Internal parameter, do not change
+ */
+ addComponent(componentInstance, force = false) {
+ if (!force && this.registered) {
+ this.root.entityMgr.attachDynamicComponent(this, componentInstance);
+ return;
+ }
+ assert(force || !this.registered, "Entity already registered, use EntityManager.addDynamicComponent");
+ const id = /** @type {typeof Component} */ (componentInstance.constructor).getId();
+ assert(!this.components[id], "Component already present");
+ this.components[id] = componentInstance;
+ }
+
+ /**
+ * Removes a given component, only possible until the entity is registered on the entity manager,
+ * after that use @see EntityManager.removeDynamicComponent
+ * @param {typeof Component} componentClass
+ * @param {boolean} force
+ */
+ removeComponent(componentClass, force = false) {
+ if (!force && this.registered) {
+ this.root.entityMgr.removeDynamicComponent(this, componentClass);
+ return;
+ }
+ assert(
+ force || !this.registered,
+ "Entity already registered, use EntityManager.removeDynamicComponent"
+ );
+ const id = componentClass.getId();
+ assert(this.components[id], "Component does not exist on entity");
+ delete this.components[id];
+ }
+
+ /**
+ * Draws the entity, to override use @see Entity.drawImpl
+ * @param {DrawParameters} parameters
+ */
+ drawDebugOverlays(parameters) {
+ const context = parameters.context;
+ const staticComp = this.components.StaticMapEntity;
+
+ if (G_IS_DEV && staticComp && globalConfig.debug.showEntityBounds) {
+ if (staticComp) {
+ const transformed = staticComp.getTileSpaceBounds();
+ context.strokeStyle = "rgba(255, 0, 0, 0.5)";
+ context.lineWidth = 2;
+ // const boundsSize = 20;
+ context.beginPath();
+ context.rect(
+ transformed.x * globalConfig.tileSize,
+ transformed.y * globalConfig.tileSize,
+ transformed.w * globalConfig.tileSize,
+ transformed.h * globalConfig.tileSize
+ );
+ context.stroke();
+ }
+ }
+
+ if (G_IS_DEV && staticComp && globalConfig.debug.showAcceptorEjectors) {
+ const ejectorComp = this.components.ItemEjector;
+
+ if (ejectorComp) {
+ const ejectorSprite = Loader.getSprite("sprites/debug/ejector_slot.png");
+ for (let i = 0; i < ejectorComp.slots.length; ++i) {
+ const slot = ejectorComp.slots[i];
+ const slotTile = staticComp.localTileToWorld(slot.pos);
+ const direction = staticComp.localDirectionToWorld(slot.direction);
+ const directionVector = enumDirectionToVector[direction];
+ const angle = Math.radians(enumDirectionToAngle[direction]);
+
+ context.globalAlpha = slot.item ? 1 : 0.2;
+ drawRotatedSprite({
+ parameters,
+ sprite: ejectorSprite,
+ x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize,
+ y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize,
+ angle,
+ size: globalConfig.tileSize * 0.25,
+ });
+ }
+ }
+ const acceptorComp = this.components.ItemAcceptor;
+
+ if (acceptorComp) {
+ const acceptorSprite = Loader.getSprite("sprites/misc/acceptor_slot.png");
+ for (let i = 0; i < acceptorComp.slots.length; ++i) {
+ const slot = acceptorComp.slots[i];
+ const slotTile = staticComp.localTileToWorld(slot.pos);
+ for (let k = 0; k < slot.directions.length; ++k) {
+ const direction = staticComp.localDirectionToWorld(slot.directions[k]);
+ const directionVector = enumDirectionToVector[direction];
+ const angle = Math.radians(enumDirectionToAngle[direction] + 180);
+ context.globalAlpha = 0.4;
+ drawRotatedSprite({
+ parameters,
+ sprite: acceptorSprite,
+ x: (slotTile.x + 0.5 + directionVector.x * 0.37) * globalConfig.tileSize,
+ y: (slotTile.y + 0.5 + directionVector.y * 0.37) * globalConfig.tileSize,
+ angle,
+ size: globalConfig.tileSize * 0.25,
+ });
+ }
+ }
+ }
+
+ context.globalAlpha = 1;
+ }
+ // this.drawImpl(parameters);
+ }
+
+ ///// Helper interfaces
+
+ ///// Interface to override by subclasses
+
+ /**
+ * override, should draw the entity
+ * @param {DrawParameters} parameters
+ */
+ drawImpl(parameters) {
+ abstract;
+ }
+}
diff --git a/src/js/game/entity_components.js b/src/js/game/entity_components.js
index 4a2241e3..7dee590a 100644
--- a/src/js/game/entity_components.js
+++ b/src/js/game/entity_components.js
@@ -17,6 +17,8 @@ import { LeverComponent } from "./components/lever";
import { WireTunnelComponent } from "./components/wire_tunnel";
import { DisplayComponent } from "./components/display";
import { BeltReaderComponent } from "./components/belt_reader";
+import { FilterComponent } from "./components/filter";
+import { ItemProducerComponent } from "./components/item_producer";
/* typehints:end */
/**
@@ -81,6 +83,12 @@ export class EntityComponentStorage {
/** @type {BeltReaderComponent} */
this.BeltReader;
+ /** @type {FilterComponent} */
+ this.Filter;
+
+ /** @type {ItemProducerComponent} */
+ this.ItemProducer;
+
/* typehints:end */
}
}
diff --git a/src/js/game/entity_manager.js b/src/js/game/entity_manager.js
index 11bc709c..b4101fc8 100644
--- a/src/js/game/entity_manager.js
+++ b/src/js/game/entity_manager.js
@@ -1,252 +1,241 @@
-import { arrayDeleteValue, newEmptyMap, fastArrayDeleteValue } from "../core/utils";
-import { Component } from "./component";
-import { GameRoot } from "./root";
-import { Entity } from "./entity";
-import { BasicSerializableObject, types } from "../savegame/serialization";
-import { createLogger } from "../core/logging";
-
-const logger = createLogger("entity_manager");
-
-// Manages all entities
-
-// NOTICE: We use arrayDeleteValue instead of fastArrayDeleteValue since that does not preserve the order
-// This is slower but we need it for the street path generation
-
-export class EntityManager extends BasicSerializableObject {
- constructor(root) {
- super();
-
- /** @type {GameRoot} */
- this.root = root;
-
- /** @type {Array} */
- this.entities = [];
-
- // We store a seperate list with entities to destroy, since we don't destroy
- // them instantly
- /** @type {Array} */
- this.destroyList = [];
-
- // Store a map from componentid to entities - This is used by the game system
- // for faster processing
- /** @type {Object.>} */
- this.componentToEntity = newEmptyMap();
-
- // Store the next uid to use
- this.nextUid = 10000;
- }
-
- static getId() {
- return "EntityManager";
- }
-
- static getSchema() {
- return {
- nextUid: types.uint,
- };
- }
-
- getStatsText() {
- return this.entities.length + " entities [" + this.destroyList.length + " to kill]";
- }
-
- // Main update
- update() {
- this.processDestroyList();
- }
-
- /**
- * Registers a new entity
- * @param {Entity} entity
- * @param {number=} uid Optional predefined uid
- */
- registerEntity(entity, uid = null) {
- assert(this.entities.indexOf(entity) < 0, `RegisterEntity() called twice for entity ${entity}`);
- assert(!entity.destroyed, `Attempting to register destroyed entity ${entity}`);
-
- if (G_IS_DEV && uid !== null) {
- assert(!this.findByUid(uid, false), "Entity uid already taken: " + uid);
- }
-
- if (uid !== null) {
- assert(uid >= 0 && uid < Number.MAX_SAFE_INTEGER, "Invalid uid passed: " + uid);
- }
-
- this.entities.push(entity);
-
- // Register into the componentToEntity map
- for (const componentId in entity.components) {
- if (entity.components[componentId]) {
- if (this.componentToEntity[componentId]) {
- this.componentToEntity[componentId].push(entity);
- } else {
- this.componentToEntity[componentId] = [entity];
- }
- }
- }
-
- // Give each entity a unique id
- entity.uid = uid ? uid : this.generateUid();
- entity.registered = true;
-
- this.root.signals.entityAdded.dispatch(entity);
- }
-
- /**
- * Sorts all entitiy lists after a resync
- */
- sortEntityLists() {
- this.entities.sort((a, b) => a.uid - b.uid);
- this.destroyList.sort((a, b) => a.uid - b.uid);
-
- for (const key in this.componentToEntity) {
- this.componentToEntity[key].sort((a, b) => a.uid - b.uid);
- }
- }
-
- /**
- * Generates a new uid
- * @returns {number}
- */
- generateUid() {
- return this.nextUid++;
- }
-
- /**
- * Call to attach a new component after the creation of the entity
- * @param {Entity} entity
- * @param {Component} component
- */
- attachDynamicComponent(entity, component) {
- entity.addComponent(component, true);
- const componentId = /** @type {typeof Component} */ (component.constructor).getId();
- if (this.componentToEntity[componentId]) {
- this.componentToEntity[componentId].push(entity);
- } else {
- this.componentToEntity[componentId] = [entity];
- }
- this.root.signals.entityGotNewComponent.dispatch(entity);
- }
-
- /**
- * Call to remove a component after the creation of the entity
- * @param {Entity} entity
- * @param {typeof Component} component
- */
- removeDynamicComponent(entity, component) {
- entity.removeComponent(component, true);
- const componentId = /** @type {typeof Component} */ (component.constructor).getId();
-
- fastArrayDeleteValue(this.componentToEntity[componentId], entity);
- this.root.signals.entityComponentRemoved.dispatch(entity);
- }
-
- /**
- * Finds an entity buy its uid, kinda slow since it loops over all entities
- * @param {number} uid
- * @param {boolean=} errorWhenNotFound
- * @returns {Entity}
- */
- findByUid(uid, errorWhenNotFound = true) {
- const arr = this.entities;
- for (let i = 0, len = arr.length; i < len; ++i) {
- const entity = arr[i];
- if (entity.uid === uid) {
- if (entity.queuedForDestroy || entity.destroyed) {
- if (errorWhenNotFound) {
- logger.warn("Entity with UID", uid, "not found (destroyed)");
- }
- return null;
- }
- return entity;
- }
- }
- if (errorWhenNotFound) {
- logger.warn("Entity with UID", uid, "not found");
- }
- return null;
- }
-
- /**
- * Returns all entities having the given component
- * @param {typeof Component} componentHandle
- * @returns {Array} entities
- */
- getAllWithComponent(componentHandle) {
- return this.componentToEntity[componentHandle.getId()] || [];
- }
-
- /**
- * Return all of a given class. This is SLOW!
- * @param {object} entityClass
- * @returns {Array} entities
- */
- getAllOfClass(entityClass) {
- // FIXME: Slow
- const result = [];
- for (let i = 0; i < this.entities.length; ++i) {
- const entity = this.entities[i];
- if (entity instanceof entityClass) {
- result.push(entity);
- }
- }
- return result;
- }
-
- /**
- * Unregisters all components of an entity from the component to entity mapping
- * @param {Entity} entity
- */
- unregisterEntityComponents(entity) {
- for (const componentId in entity.components) {
- if (entity.components[componentId]) {
- arrayDeleteValue(this.componentToEntity[componentId], entity);
- }
- }
- }
-
- // Processes the entities to destroy and actually destroys them
- /* eslint-disable max-statements */
- processDestroyList() {
- for (let i = 0; i < this.destroyList.length; ++i) {
- const entity = this.destroyList[i];
-
- // Remove from entities list
- arrayDeleteValue(this.entities, entity);
-
- // Remove from componentToEntity list
- this.unregisterEntityComponents(entity);
-
- entity.registered = false;
- entity.internalDestroyCallback();
-
- this.root.signals.entityDestroyed.dispatch(entity);
- }
-
- this.destroyList = [];
- }
-
- /**
- * Queues an entity for destruction
- * @param {Entity} entity
- */
- destroyEntity(entity) {
- if (entity.destroyed) {
- logger.error("Tried to destroy already destroyed entity:", entity.uid);
- return;
- }
-
- if (entity.queuedForDestroy) {
- logger.error("Trying to destroy entity which is already queued for destroy!", entity.uid);
- return;
- }
-
- if (this.destroyList.indexOf(entity) < 0) {
- this.destroyList.push(entity);
- entity.queuedForDestroy = true;
- this.root.signals.entityQueuedForDestroy.dispatch(entity);
- } else {
- assert(false, "Trying to destroy entity twice");
- }
- }
-}
+import { arrayDeleteValue, newEmptyMap, fastArrayDeleteValue } from "../core/utils";
+import { Component } from "./component";
+import { GameRoot } from "./root";
+import { Entity } from "./entity";
+import { BasicSerializableObject, types } from "../savegame/serialization";
+import { createLogger } from "../core/logging";
+import { globalConfig } from "../core/config";
+
+const logger = createLogger("entity_manager");
+
+// Manages all entities
+
+// NOTICE: We use arrayDeleteValue instead of fastArrayDeleteValue since that does not preserve the order
+// This is slower but we need it for the street path generation
+
+export class EntityManager extends BasicSerializableObject {
+ constructor(root) {
+ super();
+
+ /** @type {GameRoot} */
+ this.root = root;
+
+ /** @type {Array} */
+ this.entities = [];
+
+ // We store a separate list with entities to destroy, since we don't destroy
+ // them instantly
+ /** @type {Array} */
+ this.destroyList = [];
+
+ // Store a map from componentid to entities - This is used by the game system
+ // for faster processing
+ /** @type {Object.>} */
+ this.componentToEntity = newEmptyMap();
+
+ // Store the next uid to use
+ this.nextUid = 10000;
+ }
+
+ static getId() {
+ return "EntityManager";
+ }
+
+ static getSchema() {
+ return {
+ nextUid: types.uint,
+ };
+ }
+
+ getStatsText() {
+ return this.entities.length + " entities [" + this.destroyList.length + " to kill]";
+ }
+
+ // Main update
+ update() {
+ this.processDestroyList();
+ }
+
+ /**
+ * Registers a new entity
+ * @param {Entity} entity
+ * @param {number=} uid Optional predefined uid
+ */
+ registerEntity(entity, uid = null) {
+ if (G_IS_DEV && !globalConfig.debug.disableSlowAsserts) {
+ assert(this.entities.indexOf(entity) < 0, `RegisterEntity() called twice for entity ${entity}`);
+ }
+ assert(!entity.destroyed, `Attempting to register destroyed entity ${entity}`);
+
+ if (G_IS_DEV && !globalConfig.debug.disableSlowAsserts && uid !== null) {
+ assert(!this.findByUid(uid, false), "Entity uid already taken: " + uid);
+ assert(uid >= 0 && uid < Number.MAX_SAFE_INTEGER, "Invalid uid passed: " + uid);
+ }
+
+ this.entities.push(entity);
+
+ // Register into the componentToEntity map
+ for (const componentId in entity.components) {
+ if (entity.components[componentId]) {
+ if (this.componentToEntity[componentId]) {
+ this.componentToEntity[componentId].push(entity);
+ } else {
+ this.componentToEntity[componentId] = [entity];
+ }
+ }
+ }
+
+ // Give each entity a unique id
+ entity.uid = uid ? uid : this.generateUid();
+ entity.registered = true;
+
+ this.root.signals.entityAdded.dispatch(entity);
+ }
+
+ /**
+ * Generates a new uid
+ * @returns {number}
+ */
+ generateUid() {
+ return this.nextUid++;
+ }
+
+ /**
+ * Call to attach a new component after the creation of the entity
+ * @param {Entity} entity
+ * @param {Component} component
+ */
+ attachDynamicComponent(entity, component) {
+ entity.addComponent(component, true);
+ const componentId = /** @type {typeof Component} */ (component.constructor).getId();
+ if (this.componentToEntity[componentId]) {
+ this.componentToEntity[componentId].push(entity);
+ } else {
+ this.componentToEntity[componentId] = [entity];
+ }
+ this.root.signals.entityGotNewComponent.dispatch(entity);
+ }
+
+ /**
+ * Call to remove a component after the creation of the entity
+ * @param {Entity} entity
+ * @param {typeof Component} component
+ */
+ removeDynamicComponent(entity, component) {
+ entity.removeComponent(component, true);
+ const componentId = /** @type {typeof Component} */ (component.constructor).getId();
+
+ fastArrayDeleteValue(this.componentToEntity[componentId], entity);
+ this.root.signals.entityComponentRemoved.dispatch(entity);
+ }
+
+ /**
+ * Finds an entity buy its uid, kinda slow since it loops over all entities
+ * @param {number} uid
+ * @param {boolean=} errorWhenNotFound
+ * @returns {Entity}
+ */
+ findByUid(uid, errorWhenNotFound = true) {
+ const arr = this.entities;
+ for (let i = 0, len = arr.length; i < len; ++i) {
+ const entity = arr[i];
+ if (entity.uid === uid) {
+ if (entity.queuedForDestroy || entity.destroyed) {
+ if (errorWhenNotFound) {
+ logger.warn("Entity with UID", uid, "not found (destroyed)");
+ }
+ return null;
+ }
+ return entity;
+ }
+ }
+ if (errorWhenNotFound) {
+ logger.warn("Entity with UID", uid, "not found");
+ }
+ return null;
+ }
+
+ /**
+ * Returns a map which gives a mapping from UID to Entity.
+ * This map is not updated.
+ *
+ * @returns {Map}
+ */
+ getFrozenUidSearchMap() {
+ const result = new Map();
+ const array = this.entities;
+ for (let i = 0, len = array.length; i < len; ++i) {
+ const entity = array[i];
+ if (!entity.queuedForDestroy && !entity.destroyed) {
+ result.set(entity.uid, entity);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns all entities having the given component
+ * @param {typeof Component} componentHandle
+ * @returns {Array} entities
+ */
+ getAllWithComponent(componentHandle) {
+ return this.componentToEntity[componentHandle.getId()] || [];
+ }
+
+ /**
+ * Unregisters all components of an entity from the component to entity mapping
+ * @param {Entity} entity
+ */
+ unregisterEntityComponents(entity) {
+ for (const componentId in entity.components) {
+ if (entity.components[componentId]) {
+ arrayDeleteValue(this.componentToEntity[componentId], entity);
+ }
+ }
+ }
+
+ // Processes the entities to destroy and actually destroys them
+ /* eslint-disable max-statements */
+ processDestroyList() {
+ for (let i = 0; i < this.destroyList.length; ++i) {
+ const entity = this.destroyList[i];
+
+ // Remove from entities list
+ arrayDeleteValue(this.entities, entity);
+
+ // Remove from componentToEntity list
+ this.unregisterEntityComponents(entity);
+
+ entity.registered = false;
+ entity.destroyed = true;
+
+ this.root.signals.entityDestroyed.dispatch(entity);
+ }
+
+ this.destroyList = [];
+ }
+
+ /**
+ * Queues an entity for destruction
+ * @param {Entity} entity
+ */
+ destroyEntity(entity) {
+ if (entity.destroyed) {
+ logger.error("Tried to destroy already destroyed entity:", entity.uid);
+ return;
+ }
+
+ if (entity.queuedForDestroy) {
+ logger.error("Trying to destroy entity which is already queued for destroy!", entity.uid);
+ return;
+ }
+
+ if (this.destroyList.indexOf(entity) < 0) {
+ this.destroyList.push(entity);
+ entity.queuedForDestroy = true;
+ this.root.signals.entityQueuedForDestroy.dispatch(entity);
+ } else {
+ assert(false, "Trying to destroy entity twice");
+ }
+ }
+}
diff --git a/src/js/game/game_loading_overlay.js b/src/js/game/game_loading_overlay.js
index f1e9d6ce..d6bb79f0 100644
--- a/src/js/game/game_loading_overlay.js
+++ b/src/js/game/game_loading_overlay.js
@@ -1,6 +1,8 @@
/* typehints:start */
import { Application } from "../application";
/* typehints:end */
+
+import { randomChoice } from "../core/utils";
import { T } from "../translations";
export class GameLoadingOverlay {
@@ -43,6 +45,7 @@ export class GameLoadingOverlay {
this.element.classList.add("gameLoadingOverlay");
this.parent.appendChild(this.element);
this.internalAddSpinnerAndText(this.element);
+ this.internalAddHint(this.element);
}
/**
@@ -52,7 +55,17 @@ export class GameLoadingOverlay {
internalAddSpinnerAndText(element) {
const inner = document.createElement("span");
inner.classList.add("prefab_LoadingTextWithAnim");
- inner.innerText = T.global.loading;
element.appendChild(inner);
}
+
+ /**
+ * Adds a random hint
+ * @param {HTMLElement} element
+ */
+ internalAddHint(element) {
+ const hint = document.createElement("span");
+ hint.innerHTML = randomChoice(T.tips);
+ hint.classList.add("prefab_GameHint");
+ element.appendChild(hint);
+ }
}
diff --git a/src/js/game/game_mode.js b/src/js/game/game_mode.js
new file mode 100644
index 00000000..15403eb5
--- /dev/null
+++ b/src/js/game/game_mode.js
@@ -0,0 +1,71 @@
+/* typehints:start */
+import { enumHubGoalRewards } from "./tutorial_goals";
+/* typehints:end */
+
+import { GameRoot } from "./root";
+
+/** @typedef {{
+ * shape: string,
+ * amount: number
+ * }} UpgradeRequirement */
+
+/** @typedef {{
+ * required: Array
+ * improvement?: number,
+ * excludePrevious?: boolean
+ * }} TierRequirement */
+
+/** @typedef {Array} UpgradeTiers */
+
+/** @typedef {{
+ * shape: string,
+ * required: number,
+ * reward: enumHubGoalRewards,
+ * throughputOnly?: boolean
+ * }} LevelDefinition */
+
+export class GameMode {
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ constructor(root) {
+ this.root = root;
+ }
+
+ /**
+ * Should return all available upgrades
+ * @returns {Object}
+ */
+ getUpgrades() {
+ abstract;
+ return null;
+ }
+
+ /**
+ * Returns the blueprint shape key
+ * @returns {string}
+ */
+ getBlueprintShapeKey() {
+ abstract;
+ return null;
+ }
+
+ /**
+ * Returns the goals for all levels including their reward
+ * @returns {Array}
+ */
+ getLevelDefinitions() {
+ abstract;
+ return null;
+ }
+
+ /**
+ * Should return whether free play is available or if the game stops
+ * after the predefined levels
+ * @returns {boolean}
+ */
+ getIsFreeplayAvailable() {
+ return true;
+ }
+}
diff --git a/src/js/game/game_system_manager.js b/src/js/game/game_system_manager.js
index b0ae46f2..74ba798f 100644
--- a/src/js/game/game_system_manager.js
+++ b/src/js/game/game_system_manager.js
@@ -22,6 +22,8 @@ import { LeverSystem } from "./systems/lever";
import { DisplaySystem } from "./systems/display";
import { ItemProcessorOverlaysSystem } from "./systems/item_processor_overlays";
import { BeltReaderSystem } from "./systems/belt_reader";
+import { FilterSystem } from "./systems/filter";
+import { ItemProducerSystem } from "./systems/item_producer";
const logger = createLogger("game_system_manager");
@@ -92,6 +94,12 @@ export class GameSystemManager {
/** @type {BeltReaderSystem} */
beltReader: null,
+ /** @type {FilterSystem} */
+ filter: null,
+
+ /** @type {ItemProducerSystem} */
+ itemProducer: null,
+
/* typehints:end */
};
this.systemUpdateOrder = [];
@@ -124,6 +132,10 @@ export class GameSystemManager {
add("itemProcessor", ItemProcessorSystem);
+ add("filter", FilterSystem);
+
+ add("itemProducer", ItemProducerSystem);
+
add("itemEjector", ItemEjectorSystem);
add("mapResources", MapResourcesSystem);
diff --git a/src/js/game/game_system_with_filter.js b/src/js/game/game_system_with_filter.js
index 7b1ffbf0..a6efeffd 100644
--- a/src/js/game/game_system_with_filter.js
+++ b/src/js/game/game_system_with_filter.js
@@ -1,131 +1,137 @@
-/* typehints:start */
-import { Component } from "./component";
-import { Entity } from "./entity";
-/* typehints:end */
-
-import { GameRoot } from "./root";
-import { GameSystem } from "./game_system";
-import { arrayDelete, arrayDeleteValue } from "../core/utils";
-
-export class GameSystemWithFilter extends GameSystem {
- /**
- * Constructs a new game system with the given component filter. It will process
- * all entities which have *all* of the passed components
- * @param {GameRoot} root
- * @param {Array} requiredComponents
- */
- constructor(root, requiredComponents) {
- super(root);
- this.requiredComponents = requiredComponents;
- this.requiredComponentIds = requiredComponents.map(component => component.getId());
-
- /**
- * All entities which match the current components
- * @type {Array}
- */
- this.allEntities = [];
-
- this.root.signals.entityAdded.add(this.internalPushEntityIfMatching, this);
- this.root.signals.entityGotNewComponent.add(this.internalReconsiderEntityToAdd, this);
- this.root.signals.entityComponentRemoved.add(this.internalCheckEntityAfterComponentRemoval, this);
- this.root.signals.entityQueuedForDestroy.add(this.internalPopEntityIfMatching, this);
-
- this.root.signals.postLoadHook.add(this.internalPostLoadHook, this);
- this.root.signals.bulkOperationFinished.add(this.refreshCaches, this);
- }
-
- /**
- * @param {Entity} entity
- */
- internalPushEntityIfMatching(entity) {
- for (let i = 0; i < this.requiredComponentIds.length; ++i) {
- if (!entity.components[this.requiredComponentIds[i]]) {
- return;
- }
- }
-
- assert(this.allEntities.indexOf(entity) < 0, "entity already in list: " + entity);
- this.internalRegisterEntity(entity);
- }
-
- /**
- *
- * @param {Entity} entity
- */
- internalCheckEntityAfterComponentRemoval(entity) {
- if (this.allEntities.indexOf(entity) < 0) {
- // Entity wasn't interesting anyways
- return;
- }
-
- for (let i = 0; i < this.requiredComponentIds.length; ++i) {
- if (!entity.components[this.requiredComponentIds[i]]) {
- // Entity is not interesting anymore
- arrayDeleteValue(this.allEntities, entity);
- }
- }
- }
-
- /**
- *
- * @param {Entity} entity
- */
- internalReconsiderEntityToAdd(entity) {
- for (let i = 0; i < this.requiredComponentIds.length; ++i) {
- if (!entity.components[this.requiredComponentIds[i]]) {
- return;
- }
- }
- if (this.allEntities.indexOf(entity) >= 0) {
- return;
- }
- this.internalRegisterEntity(entity);
- }
-
- refreshCaches() {
- this.allEntities.sort((a, b) => a.uid - b.uid);
-
- // Remove all entities which are queued for destroy
- for (let i = 0; i < this.allEntities.length; ++i) {
- const entity = this.allEntities[i];
- if (entity.queuedForDestroy || entity.destroyed) {
- this.allEntities.splice(i, 1);
- }
- }
- }
-
- /**
- * Recomputes all target entities after the game has loaded
- */
- internalPostLoadHook() {
- this.refreshCaches();
- }
-
- /**
- *
- * @param {Entity} entity
- */
- internalRegisterEntity(entity) {
- this.allEntities.push(entity);
-
- if (this.root.gameInitialized && !this.root.bulkOperationRunning) {
- // Sort entities by uid so behaviour is predictable
- this.allEntities.sort((a, b) => a.uid - b.uid);
- }
- }
-
- /**
- *
- * @param {Entity} entity
- */
- internalPopEntityIfMatching(entity) {
- if (this.root.bulkOperationRunning) {
- // We do this in refreshCaches afterwards
- return;
- }
- const index = this.allEntities.indexOf(entity);
- if (index >= 0) {
- arrayDelete(this.allEntities, index);
- }
- }
-}
+/* typehints:start */
+import { Component } from "./component";
+import { Entity } from "./entity";
+/* typehints:end */
+
+import { GameRoot } from "./root";
+import { GameSystem } from "./game_system";
+import { arrayDelete, arrayDeleteValue } from "../core/utils";
+import { globalConfig } from "../core/config";
+
+export class GameSystemWithFilter extends GameSystem {
+ /**
+ * Constructs a new game system with the given component filter. It will process
+ * all entities which have *all* of the passed components
+ * @param {GameRoot} root
+ * @param {Array} requiredComponents
+ */
+ constructor(root, requiredComponents) {
+ super(root);
+ this.requiredComponents = requiredComponents;
+ this.requiredComponentIds = requiredComponents.map(component => component.getId());
+
+ /**
+ * All entities which match the current components
+ * @type {Array}
+ */
+ this.allEntities = [];
+
+ this.root.signals.entityAdded.add(this.internalPushEntityIfMatching, this);
+ this.root.signals.entityGotNewComponent.add(this.internalReconsiderEntityToAdd, this);
+ this.root.signals.entityComponentRemoved.add(this.internalCheckEntityAfterComponentRemoval, this);
+ this.root.signals.entityQueuedForDestroy.add(this.internalPopEntityIfMatching, this);
+
+ this.root.signals.postLoadHook.add(this.internalPostLoadHook, this);
+ this.root.signals.bulkOperationFinished.add(this.refreshCaches, this);
+ }
+
+ /**
+ * @param {Entity} entity
+ */
+ internalPushEntityIfMatching(entity) {
+ for (let i = 0; i < this.requiredComponentIds.length; ++i) {
+ if (!entity.components[this.requiredComponentIds[i]]) {
+ return;
+ }
+ }
+
+ // This is slow!
+ if (G_IS_DEV && !globalConfig.debug.disableSlowAsserts) {
+ assert(this.allEntities.indexOf(entity) < 0, "entity already in list: " + entity);
+ }
+
+ this.internalRegisterEntity(entity);
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ internalCheckEntityAfterComponentRemoval(entity) {
+ if (this.allEntities.indexOf(entity) < 0) {
+ // Entity wasn't interesting anyways
+ return;
+ }
+
+ for (let i = 0; i < this.requiredComponentIds.length; ++i) {
+ if (!entity.components[this.requiredComponentIds[i]]) {
+ // Entity is not interesting anymore
+ arrayDeleteValue(this.allEntities, entity);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ internalReconsiderEntityToAdd(entity) {
+ for (let i = 0; i < this.requiredComponentIds.length; ++i) {
+ if (!entity.components[this.requiredComponentIds[i]]) {
+ return;
+ }
+ }
+ if (this.allEntities.indexOf(entity) >= 0) {
+ return;
+ }
+ this.internalRegisterEntity(entity);
+ }
+
+ refreshCaches() {
+ // Remove all entities which are queued for destroy
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ if (entity.queuedForDestroy || entity.destroyed) {
+ this.allEntities.splice(i, 1);
+ i -= 1;
+ }
+ }
+
+ this.allEntities.sort((a, b) => a.uid - b.uid);
+ }
+
+ /**
+ * Recomputes all target entities after the game has loaded
+ */
+ internalPostLoadHook() {
+ this.refreshCaches();
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ internalRegisterEntity(entity) {
+ this.allEntities.push(entity);
+
+ if (this.root.gameInitialized && !this.root.bulkOperationRunning) {
+ // Sort entities by uid so behaviour is predictable
+ this.allEntities.sort((a, b) => a.uid - b.uid);
+ }
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ internalPopEntityIfMatching(entity) {
+ if (this.root.bulkOperationRunning) {
+ // We do this in refreshCaches afterwards
+ return;
+ }
+ const index = this.allEntities.indexOf(entity);
+ if (index >= 0) {
+ arrayDelete(this.allEntities, index);
+ }
+ }
+}
diff --git a/src/js/game/hints.js b/src/js/game/hints.js
new file mode 100644
index 00000000..c2e7e4e5
--- /dev/null
+++ b/src/js/game/hints.js
@@ -0,0 +1,22 @@
+import { randomChoice } from "../core/utils";
+import { T } from "../translations";
+
+const hintsShown = [];
+
+/**
+ * Finds a new hint to show about the game which the user hasn't seen within this session
+ */
+export function getRandomHint() {
+ let maxTries = 100 * T.tips.length;
+
+ while (maxTries-- > 0) {
+ const hint = randomChoice(T.tips);
+ if (!hintsShown.includes(hint)) {
+ hintsShown.push(hint);
+ return hint;
+ }
+ }
+
+ // All tips shown so far
+ return randomChoice(T.tips);
+}
diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js
index 71817ebd..9a945128 100644
--- a/src/js/game/hub_goals.js
+++ b/src/js/game/hub_goals.js
@@ -1,12 +1,13 @@
import { globalConfig } from "../core/config";
-import { clamp, findNiceIntegerValue, randomChoice, randomInt } from "../core/utils";
+import { RandomNumberGenerator } from "../core/rng";
+import { clamp } from "../core/utils";
import { BasicSerializableObject, types } from "../savegame/serialization";
import { enumColors } from "./colors";
import { enumItemProcessorTypes } from "./components/item_processor";
+import { enumAnalyticsDataSource } from "./production_analytics";
import { GameRoot } from "./root";
import { enumSubShape, ShapeDefinition } from "./shape_definition";
-import { enumHubGoalRewards, tutorialGoals } from "./tutorial_goals";
-import { UPGRADES } from "./upgrades";
+import { enumHubGoalRewards } from "./tutorial_goals";
export class HubGoals extends BasicSerializableObject {
static getId() {
@@ -18,50 +19,49 @@ export class HubGoals extends BasicSerializableObject {
level: types.uint,
storedShapes: types.keyValueMap(types.uint),
upgradeLevels: types.keyValueMap(types.uint),
-
- currentGoal: types.structured({
- definition: types.knownType(ShapeDefinition),
- required: types.uint,
- reward: types.nullable(types.enum(enumHubGoalRewards)),
- }),
};
}
- deserialize(data) {
+ /**
+ *
+ * @param {*} data
+ * @param {GameRoot} root
+ */
+ deserialize(data, root) {
const errorCode = super.deserialize(data);
if (errorCode) {
return errorCode;
}
+ const levels = root.gameMode.getLevelDefinitions();
+
+ // If freeplay is not available, clamp the level
+ if (!root.gameMode.getIsFreeplayAvailable()) {
+ this.level = Math.min(this.level, levels.length);
+ }
+
// Compute gained rewards
for (let i = 0; i < this.level - 1; ++i) {
- if (i < tutorialGoals.length) {
- const reward = tutorialGoals[i].reward;
+ if (i < levels.length) {
+ const reward = levels[i].reward;
this.gainedRewards[reward] = (this.gainedRewards[reward] || 0) + 1;
}
}
// Compute upgrade improvements
- for (const upgradeId in UPGRADES) {
- const upgradeHandle = UPGRADES[upgradeId];
+ const upgrades = this.root.gameMode.getUpgrades();
+ for (const upgradeId in upgrades) {
+ const tiers = upgrades[upgradeId];
const level = this.upgradeLevels[upgradeId] || 0;
- let totalImprovement = upgradeHandle.baseValue || 1;
+ let totalImprovement = 1;
for (let i = 0; i < level; ++i) {
- totalImprovement += upgradeHandle.tiers[i].improvement;
+ totalImprovement += tiers[i].improvement;
}
this.upgradeImprovements[upgradeId] = totalImprovement;
}
// Compute current goal
- const goal = tutorialGoals[this.level - 1];
- if (goal) {
- this.currentGoal = {
- /** @type {ShapeDefinition} */
- definition: this.root.shapeDefinitionMgr.getShapeFromShortKey(goal.shape),
- required: goal.required,
- reward: goal.reward,
- };
- }
+ this.computeNextGoal();
}
/**
@@ -97,11 +97,15 @@ export class HubGoals extends BasicSerializableObject {
* @type {Object}
*/
this.upgradeImprovements = {};
- for (const key in UPGRADES) {
- this.upgradeImprovements[key] = UPGRADES[key].baseValue || 1;
+
+ // Reset levels first
+ const upgrades = this.root.gameMode.getUpgrades();
+ for (const key in upgrades) {
+ this.upgradeLevels[key] = 0;
+ this.upgradeImprovements[key] = 1;
}
- this.createNextGoal();
+ this.computeNextGoal();
// Allow quickly switching goals in dev mode
if (G_IS_DEV) {
@@ -109,13 +113,26 @@ export class HubGoals extends BasicSerializableObject {
if (ev.key === "b") {
// root is not guaranteed to exist within ~0.5s after loading in
if (this.root && this.root.app && this.root.app.gameAnalytics) {
- this.onGoalCompleted();
+ if (!this.isEndOfDemoReached()) {
+ this.onGoalCompleted();
+ }
}
}
});
}
}
+ /**
+ * Returns whether the end of the demo is reached
+ * @returns {boolean}
+ */
+ isEndOfDemoReached() {
+ return (
+ !this.root.gameMode.getIsFreeplayAvailable() &&
+ this.level >= this.root.gameMode.getLevelDefinitions().length
+ );
+ }
+
/**
* Returns how much of the current shape is stored
* @param {ShapeDefinition} definition
@@ -150,6 +167,15 @@ export class HubGoals extends BasicSerializableObject {
* Returns how much of the current goal was already delivered
*/
getCurrentGoalDelivered() {
+ if (this.currentGoal.throughputOnly) {
+ return (
+ this.root.productionAnalytics.getCurrentShapeRate(
+ enumAnalyticsDataSource.delivered,
+ this.currentGoal.definition
+ ) / globalConfig.analyticsSliceDurationSeconds
+ );
+ }
+
return this.getShapesStored(this.currentGoal.definition);
}
@@ -184,36 +210,41 @@ export class HubGoals extends BasicSerializableObject {
this.root.signals.shapeDelivered.dispatch(definition);
// Check if we have enough for the next level
- const targetHash = this.currentGoal.definition.getHash();
if (
- this.storedShapes[targetHash] >= this.currentGoal.required ||
+ this.getCurrentGoalDelivered() >= this.currentGoal.required ||
(G_IS_DEV && globalConfig.debug.rewardsInstant)
) {
- this.onGoalCompleted();
+ if (!this.isEndOfDemoReached()) {
+ this.onGoalCompleted();
+ }
}
}
/**
* Creates the next goal
*/
- createNextGoal() {
+ computeNextGoal() {
const storyIndex = this.level - 1;
- if (storyIndex < tutorialGoals.length) {
- const { shape, required, reward } = tutorialGoals[storyIndex];
+ const levels = this.root.gameMode.getLevelDefinitions();
+ if (storyIndex < levels.length) {
+ const { shape, required, reward, throughputOnly } = levels[storyIndex];
this.currentGoal = {
/** @type {ShapeDefinition} */
definition: this.root.shapeDefinitionMgr.getShapeFromShortKey(shape),
required,
reward,
+ throughputOnly,
};
return;
}
+ //Floor Required amount to remove confusion
+ const required = Math.min(200, Math.floor(4 + (this.level - 27) * 0.25));
this.currentGoal = {
- /** @type {ShapeDefinition} */
- definition: this.createRandomShape(),
- required: 10000 + findNiceIntegerValue(this.level * 2000),
+ definition: this.computeFreeplayShape(this.level),
+ required,
reward: enumHubGoalRewards.no_reward_freeplay,
+ throughputOnly: true,
};
}
@@ -226,7 +257,7 @@ export class HubGoals extends BasicSerializableObject {
this.root.app.gameAnalytics.handleLevelCompleted(this.level);
++this.level;
- this.createNextGoal();
+ this.computeNextGoal();
this.root.signals.storyGoalCompleted.dispatch(this.level - 1, reward);
}
@@ -235,7 +266,7 @@ export class HubGoals extends BasicSerializableObject {
* Returns whether we are playing in free-play
*/
isFreePlay() {
- return this.level >= tutorialGoals.length;
+ return this.level >= this.root.gameMode.getLevelDefinitions().length;
}
/**
@@ -243,10 +274,10 @@ export class HubGoals extends BasicSerializableObject {
* @param {string} upgradeId
*/
canUnlockUpgrade(upgradeId) {
- const handle = UPGRADES[upgradeId];
+ const tiers = this.root.gameMode.getUpgrades()[upgradeId];
const currentLevel = this.getUpgradeLevel(upgradeId);
- if (currentLevel >= handle.tiers.length) {
+ if (currentLevel >= tiers.length) {
// Max level
return false;
}
@@ -255,7 +286,7 @@ export class HubGoals extends BasicSerializableObject {
return true;
}
- const tierData = handle.tiers[currentLevel];
+ const tierData = tiers[currentLevel];
for (let i = 0; i < tierData.required.length; ++i) {
const requirement = tierData.required[i];
@@ -272,7 +303,7 @@ export class HubGoals extends BasicSerializableObject {
*/
getAvailableUpgradeCount() {
let count = 0;
- for (const upgradeId in UPGRADES) {
+ for (const upgradeId in this.root.gameMode.getUpgrades()) {
if (this.canUnlockUpgrade(upgradeId)) {
++count;
}
@@ -290,10 +321,10 @@ export class HubGoals extends BasicSerializableObject {
return false;
}
- const handle = UPGRADES[upgradeId];
+ const upgradeTiers = this.root.gameMode.getUpgrades()[upgradeId];
const currentLevel = this.getUpgradeLevel(upgradeId);
- const tierData = handle.tiers[currentLevel];
+ const tierData = upgradeTiers[currentLevel];
if (!tierData) {
return false;
}
@@ -320,15 +351,85 @@ export class HubGoals extends BasicSerializableObject {
}
/**
+ * Picks random colors which are close to each other
+ * @param {RandomNumberGenerator} rng
+ */
+ generateRandomColorSet(rng, allowUncolored = false) {
+ const colorWheel = [
+ enumColors.red,
+ enumColors.yellow,
+ enumColors.green,
+ enumColors.cyan,
+ enumColors.blue,
+ enumColors.purple,
+ enumColors.red,
+ enumColors.yellow,
+ ];
+
+ const universalColors = [enumColors.white];
+ if (allowUncolored) {
+ universalColors.push(enumColors.uncolored);
+ }
+ const index = rng.nextIntRange(0, colorWheel.length - 2);
+ const pickedColors = colorWheel.slice(index, index + 3);
+ pickedColors.push(rng.choice(universalColors));
+ return pickedColors;
+ }
+
+ /**
+ * Creates a (seeded) random shape
+ * @param {number} level
* @returns {ShapeDefinition}
*/
- createRandomShape() {
+ computeFreeplayShape(level) {
const layerCount = clamp(this.level / 25, 2, 4);
+
/** @type {Array} */
let layers = [];
- const randomColor = () => randomChoice(Object.values(enumColors));
- const randomShape = () => randomChoice(Object.values(enumSubShape));
+ const rng = new RandomNumberGenerator(this.root.map.seed + "/" + level);
+
+ const colors = this.generateRandomColorSet(rng, level > 35);
+
+ let pickedSymmetry = null; // pairs of quadrants that must be the same
+ let availableShapes = [enumSubShape.rect, enumSubShape.circle, enumSubShape.star];
+ if (rng.next() < 0.5) {
+ pickedSymmetry = [
+ // radial symmetry
+ [0, 2],
+ [1, 3],
+ ];
+ availableShapes.push(enumSubShape.windmill); // windmill looks good only in radial symmetry
+ } else {
+ const symmetries = [
+ [
+ // horizontal axis
+ [0, 3],
+ [1, 2],
+ ],
+ [
+ // vertical axis
+ [0, 1],
+ [2, 3],
+ ],
+ [
+ // diagonal axis
+ [0, 2],
+ [1],
+ [3],
+ ],
+ [
+ // other diagonal axis
+ [1, 3],
+ [0],
+ [2],
+ ],
+ ];
+ pickedSymmetry = rng.choice(symmetries);
+ }
+
+ const randomColor = () => rng.choice(colors);
+ const randomShape = () => rng.choice(Object.values(enumSubShape));
let anyIsMissingTwo = false;
@@ -336,23 +437,24 @@ export class HubGoals extends BasicSerializableObject {
/** @type {import("./shape_definition").ShapeLayer} */
const layer = [null, null, null, null];
- for (let quad = 0; quad < 4; ++quad) {
- layer[quad] = {
- subShape: randomShape(),
- color: randomColor(),
- };
- }
-
- // Sometimes shapes are missing
- if (Math.random() > 0.85) {
- layer[randomInt(0, 3)] = null;
+ for (let j = 0; j < pickedSymmetry.length; ++j) {
+ const group = pickedSymmetry[j];
+ const shape = randomShape();
+ const color = randomColor();
+ for (let k = 0; k < group.length; ++k) {
+ const quad = group[k];
+ layer[quad] = {
+ subShape: shape,
+ color,
+ };
+ }
}
// Sometimes they actually are missing *two* ones!
// Make sure at max only one layer is missing it though, otherwise we could
// create an uncreateable shape
- if (Math.random() > 0.95 && !anyIsMissingTwo) {
- layer[randomInt(0, 3)] = null;
+ if (level > 75 && rng.next() > 0.95 && !anyIsMissingTwo) {
+ layer[rng.nextIntRange(0, 4)] = null;
anyIsMissingTwo = true;
}
@@ -396,15 +498,11 @@ export class HubGoals extends BasicSerializableObject {
*/
getProcessorBaseSpeed(processorType) {
switch (processorType) {
- case enumItemProcessorTypes.splitterWires:
- return globalConfig.wiresSpeedItemsPerSecond * 2;
-
case enumItemProcessorTypes.trash:
case enumItemProcessorTypes.hub:
return 1e30;
- case enumItemProcessorTypes.splitter:
+ case enumItemProcessorTypes.balancer:
return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt * 2;
- case enumItemProcessorTypes.filter:
case enumItemProcessorTypes.reader:
return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt;
@@ -427,7 +525,7 @@ export class HubGoals extends BasicSerializableObject {
case enumItemProcessorTypes.cutterQuad:
case enumItemProcessorTypes.rotater:
case enumItemProcessorTypes.rotaterCCW:
- case enumItemProcessorTypes.rotaterFL:
+ case enumItemProcessorTypes.rotater180:
case enumItemProcessorTypes.stacker: {
assert(
globalConfig.buildingSpeeds[processorType],
diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js
index 3edc4e17..5f1bd226 100644
--- a/src/js/game/hud/hud.js
+++ b/src/js/game/hud/hud.js
@@ -15,7 +15,7 @@ import { HUDKeybindingOverlay } from "./parts/keybinding_overlay";
import { HUDUnlockNotification } from "./parts/unlock_notification";
import { HUDGameMenu } from "./parts/game_menu";
import { HUDShop } from "./parts/shop";
-import { IS_MOBILE, globalConfig, IS_DEMO } from "../../core/config";
+import { IS_MOBILE, globalConfig } from "../../core/config";
import { HUDMassSelector } from "./parts/mass_selector";
import { HUDVignetteOverlay } from "./parts/vignette_overlay";
import { HUDStatistics } from "./parts/statistics";
@@ -44,6 +44,10 @@ import { HUDWireInfo } from "./parts/wire_info";
import { HUDLeverToggle } from "./parts/lever_toggle";
import { HUDLayerPreview } from "./parts/layer_preview";
import { HUDMinerHighlight } from "./parts/miner_highlight";
+import { HUDBetaOverlay } from "./parts/beta_overlay";
+import { HUDStandaloneAdvantages } from "./parts/standalone_advantages";
+import { HUDCatMemes } from "./parts/cat_memes";
+import { HUDTutorialVideoOffer } from "./parts/tutorial_video_offer";
export class GameHUD {
/**
@@ -57,6 +61,18 @@ export class GameHUD {
* Initializes the hud parts
*/
initialize() {
+ this.signals = {
+ buildingSelectedForPlacement: /** @type {TypedSignal<[MetaBuilding|null]>} */ (new Signal()),
+ selectedPlacementBuildingChanged: /** @type {TypedSignal<[MetaBuilding|null]>} */ (new Signal()),
+ shapePinRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
+ shapeUnpinRequested: /** @type {TypedSignal<[string]>} */ (new Signal()),
+ notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()),
+ buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()),
+ pasteBlueprintRequested: /** @type {TypedSignal<[]>} */ (new Signal()),
+ viewShapeDetailsRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
+ unlockNotificationFinished: /** @type {TypedSignal<[]>} */ (new Signal()),
+ };
+
this.parts = {
buildingsToolbar: new HUDBuildingsToolbar(this.root),
wiresToolbar: new HUDWiresToolbar(this.root),
@@ -75,7 +91,6 @@ export class GameHUD {
pinnedShapes: new HUDPinnedShapes(this.root),
notifications: new HUDNotifications(this.root),
settingsMenu: new HUDSettingsMenu(this.root),
- // betaOverlay: new HUDBetaOverlay(this.root),
debugInfo: new HUDDebugInfo(this.root),
dialogs: new HUDModalDialogs(this.root),
screenshotExporter: new HUDScreenshotExporter(this.root),
@@ -85,6 +100,7 @@ export class GameHUD {
layerPreview: new HUDLayerPreview(this.root),
minerHighlight: new HUDMinerHighlight(this.root),
+ tutorialVideoOffer: new HUDTutorialVideoOffer(this.root),
// Typing hints
/* typehints:start */
@@ -93,17 +109,6 @@ export class GameHUD {
/* typehints:end */
};
- this.signals = {
- buildingSelectedForPlacement: /** @type {TypedSignal<[MetaBuilding|null]>} */ (new Signal()),
- selectedPlacementBuildingChanged: /** @type {TypedSignal<[MetaBuilding|null]>} */ (new Signal()),
- shapePinRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
- shapeUnpinRequested: /** @type {TypedSignal<[string]>} */ (new Signal()),
- notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()),
- buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()),
- pasteBlueprintRequested: /** @type {TypedSignal<[]>} */ (new Signal()),
- viewShapeDetailsRequested: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
- };
-
if (!IS_MOBILE) {
this.parts.keybindingOverlay = new HUDKeybindingOverlay(this.root);
}
@@ -112,8 +117,10 @@ export class GameHUD {
this.parts.entityDebugger = new HUDEntityDebugger(this.root);
}
- if (IS_DEMO) {
+ if (this.root.app.restrictionMgr.getIsStandaloneMarketingActive()) {
this.parts.watermark = new HUDWatermark(this.root);
+ this.parts.standaloneAdvantages = new HUDStandaloneAdvantages(this.root);
+ this.parts.catMemes = new HUDCatMemes(this.root);
}
if (G_IS_DEV && globalConfig.debug.renderChanges) {
@@ -137,6 +144,10 @@ export class GameHUD {
this.parts.sandboxController = new HUDSandboxController(this.root);
}
+ if (!G_IS_RELEASE && !G_IS_DEV) {
+ this.parts.betaOverlay = new HUDBetaOverlay(this.root);
+ }
+
const frag = document.createDocumentFragment();
for (const key in this.parts) {
this.parts[key].createElements(frag);
@@ -194,9 +205,6 @@ export class GameHUD {
* Returns true if the rendering can be paused
*/
hasBlockingOverlayOpen() {
- if (this.root.camera.getIsMapOverlayActive()) {
- return true;
- }
for (const key in this.parts) {
if (this.parts[key].isBlockingOverlay()) {
return true;
diff --git a/src/js/game/hud/parts/base_toolbar.js b/src/js/game/hud/parts/base_toolbar.js
index f5ec24c6..a0e2a49f 100644
--- a/src/js/game/hud/parts/base_toolbar.js
+++ b/src/js/game/hud/parts/base_toolbar.js
@@ -1,177 +1,228 @@
-import { gMetaBuildingRegistry } from "../../../core/global_registries";
-import { Signal, STOP_PROPAGATION } from "../../../core/signal";
-import { makeDiv } from "../../../core/utils";
-import { KEYMAPPINGS } from "../../key_action_mapper";
-import { MetaBuilding } from "../../meta_building";
-import { GameRoot } from "../../root";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-
-export class HUDBaseToolbar extends BaseHUDPart {
- /**
- * @param {GameRoot} root
- * @param {object} param0
- * @param {Array} param0.supportedBuildings
- * @param {function} param0.visibilityCondition
- * @param {string} param0.htmlElementId
- */
- constructor(root, { supportedBuildings, visibilityCondition, htmlElementId }) {
- super(root);
-
- this.supportedBuildings = supportedBuildings;
- this.visibilityCondition = visibilityCondition;
- this.htmlElementId = htmlElementId;
-
- /** @type {Object.} */
- this.buildingHandles = {};
- }
-
- /**
- * Should create all require elements
- * @param {HTMLElement} parent
- */
- createElements(parent) {
- this.element = makeDiv(parent, this.htmlElementId, ["ingame_buildingsToolbar"], "");
- }
-
- initialize() {
- const actionMapper = this.root.keyMapper;
-
- const items = makeDiv(this.element, null, ["buildings"]);
-
- for (let i = 0; i < this.supportedBuildings.length; ++i) {
- const metaBuilding = gMetaBuildingRegistry.findByClass(this.supportedBuildings[i]);
- const binding = actionMapper.getBinding(KEYMAPPINGS.buildings[metaBuilding.getId()]);
-
- const itemContainer = makeDiv(items, null, ["building"]);
- itemContainer.setAttribute("data-icon", "building_icons/" + metaBuilding.getId() + ".png");
-
- binding.add(() => this.selectBuildingForPlacement(metaBuilding));
-
- this.trackClicks(itemContainer, () => this.selectBuildingForPlacement(metaBuilding), {
- clickSound: null,
- });
-
- this.buildingHandles[metaBuilding.id] = {
- metaBuilding,
- element: itemContainer,
- unlocked: false,
- selected: false,
- index: i,
- };
- }
-
- this.root.hud.signals.selectedPlacementBuildingChanged.add(
- this.onSelectedPlacementBuildingChanged,
- this
- );
-
- this.domAttach = new DynamicDomAttach(this.root, this.element, {
- timeToKeepSeconds: 0.12,
- attachClass: "visible",
- });
- this.lastSelectedIndex = 0;
- actionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildings).add(this.cycleBuildings, this);
- }
-
- /**
- * Updates the toolbar
- */
- update() {
- const visible = this.visibilityCondition();
- this.domAttach.update(visible);
-
- if (visible) {
- for (const buildingId in this.buildingHandles) {
- const handle = this.buildingHandles[buildingId];
- const newStatus = handle.metaBuilding.getIsUnlocked(this.root);
- if (handle.unlocked !== newStatus) {
- handle.unlocked = newStatus;
- handle.element.classList.toggle("unlocked", newStatus);
- }
- }
- }
- }
-
- /**
- * Cycles through all buildings
- */
- cycleBuildings() {
- const visible = this.visibilityCondition();
- if (!visible) {
- return;
- }
-
- let newBuildingFound = false;
- let newIndex = this.lastSelectedIndex;
- for (let i = 0; i < this.supportedBuildings.length; ++i, ++newIndex) {
- newIndex %= this.supportedBuildings.length;
- const metaBuilding = gMetaBuildingRegistry.findByClass(this.supportedBuildings[newIndex]);
- const handle = this.buildingHandles[metaBuilding.id];
- if (!handle.selected && handle.unlocked) {
- newBuildingFound = true;
- break;
- }
- }
- if (!newBuildingFound) {
- return;
- }
- const metaBuildingClass = this.supportedBuildings[newIndex];
- const metaBuilding = gMetaBuildingRegistry.findByClass(metaBuildingClass);
- this.selectBuildingForPlacement(metaBuilding);
- }
-
- /**
- * Called when the selected building got changed
- * @param {MetaBuilding} metaBuilding
- */
- onSelectedPlacementBuildingChanged(metaBuilding) {
- for (const buildingId in this.buildingHandles) {
- const handle = this.buildingHandles[buildingId];
- const newStatus = handle.metaBuilding === metaBuilding;
- if (handle.selected !== newStatus) {
- handle.selected = newStatus;
- handle.element.classList.toggle("selected", newStatus);
- }
- if (handle.selected) {
- this.lastSelectedIndex = handle.index;
- }
- }
-
- this.element.classList.toggle("buildingSelected", !!metaBuilding);
- }
-
- /**
- * @param {MetaBuilding} metaBuilding
- */
- selectBuildingForPlacement(metaBuilding) {
- if (!this.visibilityCondition()) {
- // Not active
- return;
- }
-
- if (!metaBuilding.getIsUnlocked(this.root)) {
- this.root.soundProxy.playUiError();
- return STOP_PROPAGATION;
- }
-
- // Allow clicking an item again to deselect it
- for (const buildingId in this.buildingHandles) {
- const handle = this.buildingHandles[buildingId];
- if (handle.selected && handle.metaBuilding === metaBuilding) {
- metaBuilding = null;
- break;
- }
- }
-
- this.root.soundProxy.playUiClick();
- this.root.hud.signals.buildingSelectedForPlacement.dispatch(metaBuilding);
- this.onSelectedPlacementBuildingChanged(metaBuilding);
- }
-}
+import { gMetaBuildingRegistry } from "../../../core/global_registries";
+import { Signal, STOP_PROPAGATION } from "../../../core/signal";
+import { makeDiv } from "../../../core/utils";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { MetaBuilding } from "../../meta_building";
+import { GameRoot } from "../../root";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+export class HUDBaseToolbar extends BaseHUDPart {
+ /**
+ * @param {GameRoot} root
+ * @param {object} param0
+ * @param {Array} param0.primaryBuildings
+ * @param {Array=} param0.secondaryBuildings
+ * @param {function} param0.visibilityCondition
+ * @param {string} param0.htmlElementId
+ * @param {Layer=} param0.layer
+ */
+ constructor(
+ root,
+ { primaryBuildings, secondaryBuildings = [], visibilityCondition, htmlElementId, layer = "regular" }
+ ) {
+ super(root);
+
+ this.primaryBuildings = primaryBuildings;
+ this.secondaryBuildings = secondaryBuildings;
+ this.visibilityCondition = visibilityCondition;
+ this.htmlElementId = htmlElementId;
+ this.layer = layer;
+
+ /** @type {Object.} */
+ this.buildingHandles = {};
+ }
+
+ /**
+ * Should create all require elements
+ * @param {HTMLElement} parent
+ */
+ createElements(parent) {
+ this.element = makeDiv(parent, this.htmlElementId, ["ingame_buildingsToolbar"], "");
+ }
+
+ /**
+ * Returns all buildings
+ * @returns {Array}
+ */
+ get allBuildings() {
+ return [...this.primaryBuildings, ...this.secondaryBuildings];
+ }
+
+ initialize() {
+ const actionMapper = this.root.keyMapper;
+ let rowSecondary;
+ if (this.secondaryBuildings.length > 0) {
+ rowSecondary = makeDiv(this.element, null, ["buildings", "secondary"]);
+
+ this.secondaryDomAttach = new DynamicDomAttach(this.root, rowSecondary, {
+ attachClass: "visible",
+ });
+ }
+
+ const rowPrimary = makeDiv(this.element, null, ["buildings", "primary"]);
+
+ const allBuildings = this.allBuildings;
+
+ for (let i = 0; i < allBuildings.length; ++i) {
+ const metaBuilding = gMetaBuildingRegistry.findByClass(allBuildings[i]);
+
+ let rawBinding = KEYMAPPINGS.buildings[metaBuilding.getId() + "_" + this.layer];
+ if (!rawBinding) {
+ rawBinding = KEYMAPPINGS.buildings[metaBuilding.getId()];
+ }
+
+ const binding = actionMapper.getBinding(rawBinding);
+
+ const itemContainer = makeDiv(
+ this.primaryBuildings.includes(allBuildings[i]) ? rowPrimary : rowSecondary,
+ null,
+ ["building"]
+ );
+ itemContainer.setAttribute("data-icon", "building_icons/" + metaBuilding.getId() + ".png");
+ itemContainer.setAttribute("data-id", metaBuilding.getId());
+
+ binding.add(() => this.selectBuildingForPlacement(metaBuilding));
+
+ this.trackClicks(itemContainer, () => this.selectBuildingForPlacement(metaBuilding), {
+ clickSound: null,
+ });
+
+ this.buildingHandles[metaBuilding.id] = {
+ metaBuilding,
+ element: itemContainer,
+ unlocked: false,
+ selected: false,
+ index: i,
+ };
+ }
+
+ this.root.hud.signals.selectedPlacementBuildingChanged.add(
+ this.onSelectedPlacementBuildingChanged,
+ this
+ );
+
+ this.domAttach = new DynamicDomAttach(this.root, this.element, {
+ timeToKeepSeconds: 0.12,
+ attachClass: "visible",
+ });
+ this.lastSelectedIndex = 0;
+ actionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildings).add(this.cycleBuildings, this);
+ }
+
+ /**
+ * Updates the toolbar
+ */
+ update() {
+ const visible = this.visibilityCondition();
+ this.domAttach.update(visible);
+
+ if (visible) {
+ let recomputeSecondaryToolbarVisibility = false;
+ for (const buildingId in this.buildingHandles) {
+ const handle = this.buildingHandles[buildingId];
+ const newStatus = handle.metaBuilding.getIsUnlocked(this.root);
+ if (handle.unlocked !== newStatus) {
+ handle.unlocked = newStatus;
+ handle.element.classList.toggle("unlocked", newStatus);
+ recomputeSecondaryToolbarVisibility = true;
+ }
+ }
+
+ if (recomputeSecondaryToolbarVisibility && this.secondaryDomAttach) {
+ let anyUnlocked = false;
+ for (let i = 0; i < this.secondaryBuildings.length; ++i) {
+ const metaClass = gMetaBuildingRegistry.findByClass(this.secondaryBuildings[i]);
+ if (metaClass.getIsUnlocked(this.root)) {
+ anyUnlocked = true;
+ break;
+ }
+ }
+
+ this.secondaryDomAttach.update(anyUnlocked);
+ }
+ }
+ }
+
+ /**
+ * Cycles through all buildings
+ */
+ cycleBuildings() {
+ const visible = this.visibilityCondition();
+ if (!visible) {
+ return;
+ }
+
+ let newBuildingFound = false;
+ let newIndex = this.lastSelectedIndex;
+ for (let i = 0; i < this.primaryBuildings.length; ++i, ++newIndex) {
+ newIndex %= this.primaryBuildings.length;
+ const metaBuilding = gMetaBuildingRegistry.findByClass(this.primaryBuildings[newIndex]);
+ const handle = this.buildingHandles[metaBuilding.id];
+ if (!handle.selected && handle.unlocked) {
+ newBuildingFound = true;
+ break;
+ }
+ }
+ if (!newBuildingFound) {
+ return;
+ }
+ const metaBuildingClass = this.primaryBuildings[newIndex];
+ const metaBuilding = gMetaBuildingRegistry.findByClass(metaBuildingClass);
+ this.selectBuildingForPlacement(metaBuilding);
+ }
+
+ /**
+ * Called when the selected building got changed
+ * @param {MetaBuilding} metaBuilding
+ */
+ onSelectedPlacementBuildingChanged(metaBuilding) {
+ for (const buildingId in this.buildingHandles) {
+ const handle = this.buildingHandles[buildingId];
+ const newStatus = handle.metaBuilding === metaBuilding;
+ if (handle.selected !== newStatus) {
+ handle.selected = newStatus;
+ handle.element.classList.toggle("selected", newStatus);
+ }
+ if (handle.selected) {
+ this.lastSelectedIndex = handle.index;
+ }
+ }
+
+ this.element.classList.toggle("buildingSelected", !!metaBuilding);
+ }
+
+ /**
+ * @param {MetaBuilding} metaBuilding
+ */
+ selectBuildingForPlacement(metaBuilding) {
+ if (!this.visibilityCondition()) {
+ // Not active
+ return;
+ }
+
+ if (!metaBuilding.getIsUnlocked(this.root)) {
+ this.root.soundProxy.playUiError();
+ return STOP_PROPAGATION;
+ }
+
+ // Allow clicking an item again to deselect it
+ for (const buildingId in this.buildingHandles) {
+ const handle = this.buildingHandles[buildingId];
+ if (handle.selected && handle.metaBuilding === metaBuilding) {
+ metaBuilding = null;
+ break;
+ }
+ }
+
+ this.root.soundProxy.playUiClick();
+ this.root.hud.signals.buildingSelectedForPlacement.dispatch(metaBuilding);
+ this.onSelectedPlacementBuildingChanged(metaBuilding);
+ }
+}
diff --git a/src/js/game/hud/parts/beta_overlay.js b/src/js/game/hud/parts/beta_overlay.js
index 517a15b7..3a515d29 100644
--- a/src/js/game/hud/parts/beta_overlay.js
+++ b/src/js/game/hud/parts/beta_overlay.js
@@ -3,7 +3,12 @@ import { makeDiv } from "../../../core/utils";
export class HUDBetaOverlay extends BaseHUDPart {
createElements(parent) {
- this.element = makeDiv(parent, "ingame_HUD_BetaOverlay", [], "CLOSED BETA");
+ this.element = makeDiv(
+ parent,
+ "ingame_HUD_BetaOverlay",
+ [],
+ "UNSTABLE BETA VERSION Unfinalized & potential buggy content! "
+ );
}
initialize() {}
diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js
index 47bf1363..e1040c3b 100644
--- a/src/js/game/hud/parts/blueprint_placer.js
+++ b/src/js/game/hud/parts/blueprint_placer.js
@@ -1,202 +1,203 @@
-import { DrawParameters } from "../../../core/draw_parameters";
-import { STOP_PROPAGATION } from "../../../core/signal";
-import { TrackedState } from "../../../core/tracked_state";
-import { makeDiv } from "../../../core/utils";
-import { Vector } from "../../../core/vector";
-import { T } from "../../../translations";
-import { enumMouseButton } from "../../camera";
-import { KEYMAPPINGS } from "../../key_action_mapper";
-import { blueprintShape } from "../../upgrades";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { Blueprint } from "../../blueprint";
-import { SOUNDS } from "../../../platform/sound";
-
-export class HUDBlueprintPlacer extends BaseHUDPart {
- createElements(parent) {
- const blueprintCostShape = this.root.shapeDefinitionMgr.getShapeFromShortKey(blueprintShape);
- const blueprintCostShapeCanvas = blueprintCostShape.generateAsCanvas(80);
-
- this.costDisplayParent = makeDiv(parent, "ingame_HUD_BlueprintPlacer", [], ``);
-
- makeDiv(this.costDisplayParent, null, ["label"], T.ingame.blueprintPlacer.cost);
- const costContainer = makeDiv(this.costDisplayParent, null, ["costContainer"], "");
- this.costDisplayText = makeDiv(costContainer, null, ["costText"], "");
- costContainer.appendChild(blueprintCostShapeCanvas);
- }
-
- initialize() {
- this.root.hud.signals.buildingsSelectedForCopy.add(this.createBlueprintFromBuildings, this);
-
- /** @type {TypedTrackedState} */
- this.currentBlueprint = new TrackedState(this.onBlueprintChanged, this);
- /** @type {Blueprint?} */
- this.lastBlueprintUsed = null;
-
- const keyActionMapper = this.root.keyMapper;
- keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this);
- keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.abortPlacement, this);
- keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.rotateBlueprint, this);
- keyActionMapper.getBinding(KEYMAPPINGS.massSelect.pasteLastBlueprint).add(this.pasteBlueprint, this);
-
- this.root.camera.downPreHandler.add(this.onMouseDown, this);
- this.root.camera.movePreHandler.add(this.onMouseMove, this);
-
- this.root.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this);
- this.root.signals.editModeChanged.add(this.onEditModeChanged, this);
-
- this.domAttach = new DynamicDomAttach(this.root, this.costDisplayParent);
- this.trackedCanAfford = new TrackedState(this.onCanAffordChanged, this);
- }
-
- abortPlacement() {
- if (this.currentBlueprint.get()) {
- this.currentBlueprint.set(null);
-
- return STOP_PROPAGATION;
- }
- }
-
- /**
- * Called when the layer was changed
- * @param {Layer} layer
- */
- onEditModeChanged(layer) {
- // Check if the layer of the blueprint differs and thus we have to deselect it
- const blueprint = this.currentBlueprint.get();
- if (blueprint) {
- if (blueprint.layer !== layer) {
- this.currentBlueprint.set(null);
- }
- }
- }
-
- /**
- * Called when the blueprint is now affordable or not
- * @param {boolean} canAfford
- */
- onCanAffordChanged(canAfford) {
- this.costDisplayParent.classList.toggle("canAfford", canAfford);
- }
-
- update() {
- const currentBlueprint = this.currentBlueprint.get();
- this.domAttach.update(currentBlueprint && currentBlueprint.getCost() > 0);
- this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root));
- }
-
- /**
- * Called when the blueprint was changed
- * @param {Blueprint} blueprint
- */
- onBlueprintChanged(blueprint) {
- if (blueprint) {
- this.lastBlueprintUsed = blueprint;
- this.costDisplayText.innerText = "" + blueprint.getCost();
- }
- }
-
- /**
- * mouse down pre handler
- * @param {Vector} pos
- * @param {enumMouseButton} button
- */
- onMouseDown(pos, button) {
- if (button === enumMouseButton.right) {
- if (this.currentBlueprint.get()) {
- this.abortPlacement();
- return STOP_PROPAGATION;
- }
- }
-
- const blueprint = this.currentBlueprint.get();
- if (!blueprint) {
- return;
- }
-
- if (!blueprint.canAfford(this.root)) {
- this.root.soundProxy.playUiError();
- return;
- }
-
- const worldPos = this.root.camera.screenToWorld(pos);
- const tile = worldPos.toTileSpace();
- if (blueprint.tryPlace(this.root, tile)) {
- const cost = blueprint.getCost();
- this.root.hubGoals.takeShapeByKey(blueprintShape, cost);
- this.root.soundProxy.playUi(SOUNDS.placeBuilding);
- }
- }
-
- /**
- * Mose move handler
- */
- onMouseMove() {
- // Prevent movement while blueprint is selected
- if (this.currentBlueprint.get()) {
- return STOP_PROPAGATION;
- }
- }
-
- /**
- * Called when an array of bulidings was selected
- * @param {Array} uids
- */
- createBlueprintFromBuildings(uids) {
- if (uids.length === 0) {
- return;
- }
- this.currentBlueprint.set(Blueprint.fromUids(this.root, uids));
- }
-
- /**
- * Attempts to rotate the current blueprint
- */
- rotateBlueprint() {
- if (this.currentBlueprint.get()) {
- if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) {
- this.currentBlueprint.get().rotateCcw();
- } else {
- this.currentBlueprint.get().rotateCw();
- }
- }
- }
-
- /**
- * Attempts to paste the last blueprint
- */
- pasteBlueprint() {
- if (this.lastBlueprintUsed !== null) {
- if (this.lastBlueprintUsed.layer !== this.root.currentLayer) {
- // Not compatible
- this.root.soundProxy.playUiError();
- return;
- }
-
- this.root.hud.signals.pasteBlueprintRequested.dispatch();
- this.currentBlueprint.set(this.lastBlueprintUsed);
- } else {
- this.root.soundProxy.playUiError();
- }
- }
-
- /**
- *
- * @param {DrawParameters} parameters
- */
- draw(parameters) {
- const blueprint = this.currentBlueprint.get();
- if (!blueprint) {
- return;
- }
- const mousePosition = this.root.app.mousePosition;
- if (!mousePosition) {
- // Not on screen
- return;
- }
-
- const worldPos = this.root.camera.screenToWorld(mousePosition);
- const tile = worldPos.toTileSpace();
- blueprint.draw(parameters, tile);
- }
-}
+import { DrawParameters } from "../../../core/draw_parameters";
+import { STOP_PROPAGATION } from "../../../core/signal";
+import { TrackedState } from "../../../core/tracked_state";
+import { makeDiv } from "../../../core/utils";
+import { Vector } from "../../../core/vector";
+import { SOUNDS } from "../../../platform/sound";
+import { T } from "../../../translations";
+import { Blueprint } from "../../blueprint";
+import { enumMouseButton } from "../../camera";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+export class HUDBlueprintPlacer extends BaseHUDPart {
+ createElements(parent) {
+ const blueprintCostShape = this.root.shapeDefinitionMgr.getShapeFromShortKey(
+ this.root.gameMode.getBlueprintShapeKey()
+ );
+ const blueprintCostShapeCanvas = blueprintCostShape.generateAsCanvas(80);
+
+ this.costDisplayParent = makeDiv(parent, "ingame_HUD_BlueprintPlacer", [], ``);
+
+ makeDiv(this.costDisplayParent, null, ["label"], T.ingame.blueprintPlacer.cost);
+ const costContainer = makeDiv(this.costDisplayParent, null, ["costContainer"], "");
+ this.costDisplayText = makeDiv(costContainer, null, ["costText"], "");
+ costContainer.appendChild(blueprintCostShapeCanvas);
+ }
+
+ initialize() {
+ this.root.hud.signals.buildingsSelectedForCopy.add(this.createBlueprintFromBuildings, this);
+
+ /** @type {TypedTrackedState} */
+ this.currentBlueprint = new TrackedState(this.onBlueprintChanged, this);
+ /** @type {Blueprint?} */
+ this.lastBlueprintUsed = null;
+
+ const keyActionMapper = this.root.keyMapper;
+ keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this);
+ keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.abortPlacement, this);
+ keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.rotateBlueprint, this);
+ keyActionMapper.getBinding(KEYMAPPINGS.massSelect.pasteLastBlueprint).add(this.pasteBlueprint, this);
+
+ this.root.camera.downPreHandler.add(this.onMouseDown, this);
+ this.root.camera.movePreHandler.add(this.onMouseMove, this);
+
+ this.root.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this);
+ this.root.signals.editModeChanged.add(this.onEditModeChanged, this);
+
+ this.domAttach = new DynamicDomAttach(this.root, this.costDisplayParent);
+ this.trackedCanAfford = new TrackedState(this.onCanAffordChanged, this);
+ }
+
+ abortPlacement() {
+ if (this.currentBlueprint.get()) {
+ this.currentBlueprint.set(null);
+
+ return STOP_PROPAGATION;
+ }
+ }
+
+ /**
+ * Called when the layer was changed
+ * @param {Layer} layer
+ */
+ onEditModeChanged(layer) {
+ // Check if the layer of the blueprint differs and thus we have to deselect it
+ const blueprint = this.currentBlueprint.get();
+ if (blueprint) {
+ if (blueprint.layer !== layer) {
+ this.currentBlueprint.set(null);
+ }
+ }
+ }
+
+ /**
+ * Called when the blueprint is now affordable or not
+ * @param {boolean} canAfford
+ */
+ onCanAffordChanged(canAfford) {
+ this.costDisplayParent.classList.toggle("canAfford", canAfford);
+ }
+
+ update() {
+ const currentBlueprint = this.currentBlueprint.get();
+ this.domAttach.update(currentBlueprint && currentBlueprint.getCost() > 0);
+ this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root));
+ }
+
+ /**
+ * Called when the blueprint was changed
+ * @param {Blueprint} blueprint
+ */
+ onBlueprintChanged(blueprint) {
+ if (blueprint) {
+ this.lastBlueprintUsed = blueprint;
+ this.costDisplayText.innerText = "" + blueprint.getCost();
+ }
+ }
+
+ /**
+ * mouse down pre handler
+ * @param {Vector} pos
+ * @param {enumMouseButton} button
+ */
+ onMouseDown(pos, button) {
+ if (button === enumMouseButton.right) {
+ if (this.currentBlueprint.get()) {
+ this.abortPlacement();
+ return STOP_PROPAGATION;
+ }
+ }
+
+ const blueprint = this.currentBlueprint.get();
+ if (!blueprint) {
+ return;
+ }
+
+ if (!blueprint.canAfford(this.root)) {
+ this.root.soundProxy.playUiError();
+ return;
+ }
+
+ const worldPos = this.root.camera.screenToWorld(pos);
+ const tile = worldPos.toTileSpace();
+ if (blueprint.tryPlace(this.root, tile)) {
+ const cost = blueprint.getCost();
+ this.root.hubGoals.takeShapeByKey(this.root.gameMode.getBlueprintShapeKey(), cost);
+ this.root.soundProxy.playUi(SOUNDS.placeBuilding);
+ }
+ }
+
+ /**
+ * Mose move handler
+ */
+ onMouseMove() {
+ // Prevent movement while blueprint is selected
+ if (this.currentBlueprint.get()) {
+ return STOP_PROPAGATION;
+ }
+ }
+
+ /**
+ * Called when an array of bulidings was selected
+ * @param {Array} uids
+ */
+ createBlueprintFromBuildings(uids) {
+ if (uids.length === 0) {
+ return;
+ }
+ this.currentBlueprint.set(Blueprint.fromUids(this.root, uids));
+ }
+
+ /**
+ * Attempts to rotate the current blueprint
+ */
+ rotateBlueprint() {
+ if (this.currentBlueprint.get()) {
+ if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) {
+ this.currentBlueprint.get().rotateCcw();
+ } else {
+ this.currentBlueprint.get().rotateCw();
+ }
+ }
+ }
+
+ /**
+ * Attempts to paste the last blueprint
+ */
+ pasteBlueprint() {
+ if (this.lastBlueprintUsed !== null) {
+ if (this.lastBlueprintUsed.layer !== this.root.currentLayer) {
+ // Not compatible
+ this.root.soundProxy.playUiError();
+ return;
+ }
+
+ this.root.hud.signals.pasteBlueprintRequested.dispatch();
+ this.currentBlueprint.set(this.lastBlueprintUsed);
+ } else {
+ this.root.soundProxy.playUiError();
+ }
+ }
+
+ /**
+ *
+ * @param {DrawParameters} parameters
+ */
+ draw(parameters) {
+ const blueprint = this.currentBlueprint.get();
+ if (!blueprint) {
+ return;
+ }
+ const mousePosition = this.root.app.mousePosition;
+ if (!mousePosition) {
+ // Not on screen
+ return;
+ }
+
+ const worldPos = this.root.camera.screenToWorld(mousePosition);
+ const tile = worldPos.toTileSpace();
+ blueprint.draw(parameters, tile);
+ }
+}
diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js
index fcce54b2..7dccb7a4 100644
--- a/src/js/game/hud/parts/building_placer.js
+++ b/src/js/game/hud/parts/building_placer.js
@@ -119,7 +119,15 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
this.buildingInfoElements.label.innerHTML = T.buildings[metaBuilding.id][variant].name;
this.buildingInfoElements.descText.innerHTML = T.buildings[metaBuilding.id][variant].description;
- const binding = this.root.keyMapper.getBinding(KEYMAPPINGS.buildings[metaBuilding.getId()]);
+ const layer = this.root.currentLayer;
+
+ let rawBinding = KEYMAPPINGS.buildings[metaBuilding.getId() + "_" + layer];
+ if (!rawBinding) {
+ rawBinding = KEYMAPPINGS.buildings[metaBuilding.getId()];
+ }
+
+ const binding = this.root.keyMapper.getBinding(rawBinding);
+
this.buildingInfoElements.hotkey.innerHTML = T.ingame.buildingPlacement.hotkeyLabel.replace(
"",
"" + binding.getKeyCodeString() + ""
diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js
index 6031e555..4f3a0570 100644
--- a/src/js/game/hud/parts/building_placer_logic.js
+++ b/src/js/game/hud/parts/building_placer_logic.js
@@ -121,6 +121,7 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
this.root.hud.signals.buildingsSelectedForCopy.add(this.abortPlacement, this);
this.root.hud.signals.pasteBlueprintRequested.add(this.abortPlacement, this);
this.root.signals.storyGoalCompleted.add(() => this.signals.variantChanged.dispatch());
+ this.root.signals.storyGoalCompleted.add(() => this.currentMetaBuilding.set(null));
this.root.signals.upgradePurchased.add(() => this.signals.variantChanged.dispatch());
this.root.signals.editModeChanged.add(this.onEditModeChanged, this);
@@ -253,6 +254,12 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
* @see BaseHUDPart.update
*/
update() {
+ // Abort placement if a dialog was shown in the meantime
+ if (this.root.hud.hasBlockingOverlayOpen()) {
+ this.abortPlacement();
+ return;
+ }
+
// Always update since the camera might have moved
const mousePos = this.root.app.mousePosition;
if (mousePos) {
@@ -327,10 +334,14 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
const tileBelow = this.root.map.getLowerLayerContentXY(tile.x, tile.y);
// Check if there's a shape or color item below, if so select the miner
- if (tileBelow && this.root.app.settings.getAllSettings().pickMinerOnPatch) {
+ if (
+ tileBelow &&
+ this.root.app.settings.getAllSettings().pickMinerOnPatch &&
+ this.root.currentLayer === "regular"
+ ) {
this.currentMetaBuilding.set(gMetaBuildingRegistry.findByClass(MetaMinerBuilding));
- // Select chained miner if available, since thats always desired once unlocked
+ // Select chained miner if available, since that's always desired once unlocked
if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) {
this.currentVariant.set(enumMinerVariants.chainable);
}
@@ -451,11 +462,11 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
this.currentVariant.set(defaultBuildingVariant);
} else {
const availableVariants = metaBuilding.getAvailableVariants(this.root);
- const index = availableVariants.indexOf(this.currentVariant.get());
- assert(
- index >= 0,
- "Current variant was invalid: " + this.currentVariant.get() + " out of " + availableVariants
- );
+ let index = availableVariants.indexOf(this.currentVariant.get());
+ if (index < 0) {
+ index = 0;
+ console.warn("Invalid variant selected:", this.currentVariant.get());
+ }
const newIndex = (index + 1) % availableVariants.length;
const newVariant = availableVariants[newIndex];
this.setVariant(newVariant);
@@ -589,7 +600,17 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
this.abortDragging();
this.root.hud.signals.selectedPlacementBuildingChanged.dispatch(metaBuilding);
if (metaBuilding) {
- const variant = this.preferredVariants[metaBuilding.getId()] || defaultBuildingVariant;
+ const availableVariants = metaBuilding.getAvailableVariants(this.root);
+ const preferredVariant = this.preferredVariants[metaBuilding.getId()];
+
+ // Choose last stored variant if possible, otherwise the default one
+ let variant;
+ if (!preferredVariant || !availableVariants.includes(preferredVariant)) {
+ variant = availableVariants[0];
+ } else {
+ variant = preferredVariant;
+ }
+
this.currentVariant.set(variant);
this.fakeEntity = new Entity(null);
diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js
index f8953204..05ffc795 100644
--- a/src/js/game/hud/parts/buildings_toolbar.js
+++ b/src/js/game/hud/parts/buildings_toolbar.js
@@ -1,43 +1,48 @@
-import { MetaBeltBaseBuilding } from "../../buildings/belt_base";
+import { MetaBeltBuilding } from "../../buildings/belt";
import { MetaCutterBuilding } from "../../buildings/cutter";
+import { MetaDisplayBuilding } from "../../buildings/display";
+import { MetaFilterBuilding } from "../../buildings/filter";
+import { MetaLeverBuilding } from "../../buildings/lever";
import { MetaMinerBuilding } from "../../buildings/miner";
import { MetaMixerBuilding } from "../../buildings/mixer";
import { MetaPainterBuilding } from "../../buildings/painter";
+import { MetaReaderBuilding } from "../../buildings/reader";
import { MetaRotaterBuilding } from "../../buildings/rotater";
-import { MetaSplitterBuilding } from "../../buildings/splitter";
+import { MetaBalancerBuilding } from "../../buildings/balancer";
import { MetaStackerBuilding } from "../../buildings/stacker";
import { MetaTrashBuilding } from "../../buildings/trash";
import { MetaUndergroundBeltBuilding } from "../../buildings/underground_belt";
import { HUDBaseToolbar } from "./base_toolbar";
-import { MetaLeverBuilding } from "../../buildings/lever";
-import { MetaFilterBuilding } from "../../buildings/filter";
-import { MetaDisplayBuilding } from "../../buildings/display";
-import { MetaReaderBuilding } from "../../buildings/reader";
-
-const supportedBuildings = [
- MetaBeltBaseBuilding,
- MetaSplitterBuilding,
- MetaUndergroundBeltBuilding,
- MetaMinerBuilding,
- MetaCutterBuilding,
- MetaRotaterBuilding,
- MetaStackerBuilding,
- MetaMixerBuilding,
- MetaPainterBuilding,
- MetaTrashBuilding,
- MetaLeverBuilding,
- MetaFilterBuilding,
- MetaDisplayBuilding,
- MetaReaderBuilding,
-];
+import { MetaStorageBuilding } from "../../buildings/storage";
+import { MetaItemProducerBuilding } from "../../buildings/item_producer";
+import { queryParamOptions } from "../../../core/query_parameters";
export class HUDBuildingsToolbar extends HUDBaseToolbar {
constructor(root) {
super(root, {
- supportedBuildings,
+ primaryBuildings: [
+ MetaBeltBuilding,
+ MetaBalancerBuilding,
+ MetaUndergroundBeltBuilding,
+ MetaMinerBuilding,
+ MetaCutterBuilding,
+ MetaRotaterBuilding,
+ MetaStackerBuilding,
+ MetaMixerBuilding,
+ MetaPainterBuilding,
+ MetaTrashBuilding,
+ ...(queryParamOptions.sandboxMode || G_IS_DEV ? [MetaItemProducerBuilding] : []),
+ ],
+ secondaryBuildings: [
+ MetaStorageBuilding,
+ MetaReaderBuilding,
+ MetaLeverBuilding,
+ MetaFilterBuilding,
+ MetaDisplayBuilding,
+ ],
visibilityCondition: () =>
!this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "regular",
- htmlElementId: "ingame_HUD_buildings_toolbar",
+ htmlElementId: "ingame_HUD_BuildingsToolbar",
});
}
}
diff --git a/src/js/game/hud/parts/cat_memes.js b/src/js/game/hud/parts/cat_memes.js
new file mode 100644
index 00000000..f3af2be4
--- /dev/null
+++ b/src/js/game/hud/parts/cat_memes.js
@@ -0,0 +1,21 @@
+import { makeDiv } from "../../../core/utils";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+const memeShowIntervalSeconds = 70 * 60;
+const memeShowDuration = 5;
+
+export class HUDCatMemes extends BaseHUDPart {
+ createElements(parent) {
+ this.element = makeDiv(parent, "ingame_HUD_CatMemes");
+ }
+
+ initialize() {
+ this.domAttach = new DynamicDomAttach(this.root, this.element);
+ }
+
+ update() {
+ const now = this.root.time.realtimeNow();
+ this.domAttach.update(now % memeShowIntervalSeconds > memeShowIntervalSeconds - memeShowDuration);
+ }
+}
diff --git a/src/js/game/hud/parts/entity_debugger.js b/src/js/game/hud/parts/entity_debugger.js
index 80f15eea..640ad4d6 100644
--- a/src/js/game/hud/parts/entity_debugger.js
+++ b/src/js/game/hud/parts/entity_debugger.js
@@ -1,7 +1,13 @@
-import { BaseHUDPart } from "../base_hud_part";
+/* dev:start */
import { makeDiv, removeAllChildren } from "../../../core/utils";
-import { globalConfig } from "../../../core/config";
+import { Vector } from "../../../core/vector";
+import { Entity } from "../../entity";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+/**
+ * Allows to inspect entities by pressing F8 while hovering them
+ */
export class HUDEntityDebugger extends BaseHUDPart {
createElements(parent) {
this.element = makeDiv(
@@ -9,65 +15,147 @@ export class HUDEntityDebugger extends BaseHUDPart {
"ingame_HUD_EntityDebugger",
[],
`
- Tile below cursor:
- Chunk below cursor:
-
+ Entity Debugger
+ Use F8 to toggle this overlay
+
+
`
);
-
- /** @type {HTMLElement} */
- this.mousePosElem = this.element.querySelector(".mousePos");
- /** @type {HTMLElement} */
- this.chunkPosElem = this.element.querySelector(".chunkPos");
- this.entityInfoElem = this.element.querySelector(".entityInfo");
+ this.componentsElem = this.element.querySelector(".entityComponents");
}
initialize() {
- this.root.camera.downPreHandler.add(this.onMouseDown, this);
+ this.root.gameState.inputReciever.keydown.add(key => {
+ if (key.keyCode === 119) {
+ // F8
+ this.pickEntity();
+ }
+ });
+
+ /**
+ * The currently selected entity
+ * @type {Entity}
+ */
+ this.selectedEntity = null;
+
+ this.lastUpdate = 0;
+
+ this.domAttach = new DynamicDomAttach(this.root, this.element);
}
- update() {
+ pickEntity() {
const mousePos = this.root.app.mousePosition;
if (!mousePos) {
return;
}
const worldPos = this.root.camera.screenToWorld(mousePos);
const worldTile = worldPos.toTileSpace();
-
- const chunk = worldTile.divideScalar(globalConfig.mapChunkSize).floor();
- this.mousePosElem.innerText = worldTile.x + " / " + worldTile.y;
- this.chunkPosElem.innerText = chunk.x + " / " + chunk.y;
-
const entity = this.root.map.getTileContent(worldTile, this.root.currentLayer);
+
+ this.selectedEntity = entity;
if (entity) {
- removeAllChildren(this.entityInfoElem);
- let html = "Entity";
-
- const flag = (name, val) =>
- `${name} ${val} `;
-
- html += "";
- html += flag("registered", entity.registered);
- html += flag("uid", entity.uid);
- html += flag("destroyed", entity.destroyed);
- html += "
";
-
- html += "";
-
- for (const componentId in entity.components) {
- const data = entity.components[componentId];
- html += "
";
- html += "" + componentId + " ";
- html += "";
-
- html += "
";
- }
-
- html += "
";
-
- this.entityInfoElem.innerHTML = html;
+ this.rerenderFull(entity);
}
}
- onMouseDown() {}
+ /**
+ *
+ * @param {string} name
+ * @param {any} val
+ * @param {number} indent
+ * @param {Array} recursion
+ */
+ propertyToHTML(name, val, indent = 0, recursion = []) {
+ if (indent > 20) {
+ return;
+ }
+
+ if (val !== null && typeof val === "object") {
+ // Array is displayed like object, with indexes
+ recursion.push(val);
+
+ // Get type class name (like Array, Object, Vector...)
+ let typeName = `(${val.constructor ? val.constructor.name : "unknown"})`;
+
+ if (Array.isArray(val)) {
+ typeName = `(Array[${val.length}])`;
+ }
+
+ if (val instanceof Vector) {
+ typeName = `(Vector[${val.x}, ${val.y}])`;
+ }
+
+ const colorStyle = `color: hsl(${30 * indent}, 100%, 80%)`;
+
+ let html = `
+ ${name} ${typeName}
+ `;
+
+ for (const property in val) {
+ const isRoot = val[property] == this.root;
+ const isRecursive = recursion.includes(val[property]);
+
+ let hiddenValue = isRoot ? "" : null;
+ if (isRecursive) {
+ // Avoid recursion by not "expanding" object more than once
+ hiddenValue = "";
+ }
+
+ html += this.propertyToHTML(
+ property,
+ hiddenValue ? hiddenValue : val[property],
+ indent + 1,
+ [...recursion] // still expand same value in other "branches"
+ );
+ }
+
+ html += "
";
+
+ return html;
+ }
+
+ const displayValue = (val + "")
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">");
+ return `${name} ${displayValue} `;
+ }
+
+ /**
+ * Rerenders the whole container
+ * @param {Entity} entity
+ */
+ rerenderFull(entity) {
+ removeAllChildren(this.componentsElem);
+ let html = "";
+
+ const property = (strings, val) => `${strings[0]} ${val} `;
+
+ html += property`registered ${!!entity.registered}`;
+ html += property`uid ${entity.uid}`;
+ html += property`destroyed ${!!entity.destroyed}`;
+
+ for (const componentId in entity.components) {
+ const data = entity.components[componentId];
+ html += "";
+ html += "" + componentId + " ";
+
+ for (const property in data) {
+ // Put entity into recursion list, so it won't get "expanded"
+ html += this.propertyToHTML(property, data[property], 0, [entity]);
+ }
+
+ html += "
";
+ }
+
+ this.componentsElem.innerHTML = html;
+ }
+
+ update() {
+ this.domAttach.update(!!this.selectedEntity);
+ }
}
+
+/* dev:end */
diff --git a/src/js/game/hud/parts/game_menu.js b/src/js/game/hud/parts/game_menu.js
index 59ba0232..2a172ab2 100644
--- a/src/js/game/hud/parts/game_menu.js
+++ b/src/js/game/hud/parts/game_menu.js
@@ -5,6 +5,7 @@ import { enumNotificationType } from "./notifications";
import { T } from "../../../translations";
import { KEYMAPPINGS } from "../../key_action_mapper";
import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { TrackedState } from "../../../core/tracked_state";
export class HUDGameMenu extends BaseHUDPart {
createElements(parent) {
@@ -51,18 +52,15 @@ export class HUDGameMenu extends BaseHUDPart {
* }>} */
this.visibilityToUpdate = [];
- this.buttonsElement = makeDiv(this.element, null, ["buttonContainer"]);
-
buttons.forEach(({ id, label, handler, keybinding, badge, notification, visible }) => {
const button = document.createElement("button");
- button.setAttribute("data-button-id", id);
- this.buttonsElement.appendChild(button);
+ button.classList.add(id);
+ this.element.appendChild(button);
this.trackClicks(button, handler);
if (keybinding) {
const binding = this.root.keyMapper.getBinding(keybinding);
binding.add(handler);
- binding.appendLabelToElement(button);
}
if (visible) {
@@ -86,10 +84,8 @@ export class HUDGameMenu extends BaseHUDPart {
}
});
- const menuButtons = makeDiv(this.element, null, ["menuButtons"]);
-
- this.saveButton = makeDiv(menuButtons, null, ["button", "save", "animEven"]);
- this.settingsButton = makeDiv(menuButtons, null, ["button", "settings"]);
+ this.saveButton = makeDiv(this.element, null, ["button", "save", "animEven"]);
+ this.settingsButton = makeDiv(this.element, null, ["button", "settings"]);
this.trackClicks(this.saveButton, this.startSave);
this.trackClicks(this.settingsButton, this.openSettings);
@@ -97,12 +93,17 @@ export class HUDGameMenu extends BaseHUDPart {
initialize() {
this.root.signals.gameSaved.add(this.onGameSaved, this);
+
+ this.trackedIsSaving = new TrackedState(this.onIsSavingChanged, this);
}
update() {
let playSound = false;
let notifications = new Set();
+ // Check whether we are saving
+ this.trackedIsSaving.set(!!this.root.gameState.currentSavePromise);
+
// Update visibility of buttons
for (let i = 0; i < this.visibilityToUpdate.length; ++i) {
const { condition, domAttach } = this.visibilityToUpdate[i];
@@ -154,6 +155,10 @@ export class HUDGameMenu extends BaseHUDPart {
});
}
+ onIsSavingChanged(isSaving) {
+ this.saveButton.classList.toggle("saving", isSaving);
+ }
+
onGameSaved() {
this.saveButton.classList.toggle("animEven");
this.saveButton.classList.toggle("animOdd");
diff --git a/src/js/game/hud/parts/interactive_tutorial.js b/src/js/game/hud/parts/interactive_tutorial.js
index ffebc639..e48a77fb 100644
--- a/src/js/game/hud/parts/interactive_tutorial.js
+++ b/src/js/game/hud/parts/interactive_tutorial.js
@@ -6,23 +6,25 @@ import { DynamicDomAttach } from "../dynamic_dom_attach";
import { TrackedState } from "../../../core/tracked_state";
import { cachebust } from "../../../core/cachebust";
import { T } from "../../../translations";
+import { enumItemProcessorTypes, ItemProcessorComponent } from "../../components/item_processor";
+import { ShapeItem } from "../../items/shape_item";
+import { WireComponent } from "../../components/wire";
+import { LeverComponent } from "../../components/lever";
+// @todo: Make dictionary
const tutorialsByLevel = [
// Level 1
[
// 1.1. place an extractor
{
id: "1_1_extractor",
- condition: /** @param {GameRoot} root */ root => {
- return root.entityMgr.getAllWithComponent(MinerComponent).length === 0;
- },
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr.getAllWithComponent(MinerComponent).length === 0,
},
// 1.2. connect to hub
{
id: "1_2_conveyor",
- condition: /** @param {GameRoot} root */ root => {
- return root.hubGoals.getCurrentGoalDelivered() === 0;
- },
+ condition: /** @param {GameRoot} root */ root => root.hubGoals.getCurrentGoalDelivered() === 0,
},
// 1.3 wait for completion
{
@@ -30,6 +32,108 @@ const tutorialsByLevel = [
condition: () => true,
},
],
+ // Level 2
+ [
+ // 2.1 place a cutter
+ {
+ id: "2_1_place_cutter",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr
+ .getAllWithComponent(ItemProcessorComponent)
+ .filter(e => e.components.ItemProcessor.type === enumItemProcessorTypes.cutter).length ===
+ 0,
+ },
+ // 2.2 place trash
+ {
+ id: "2_2_place_trash",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr
+ .getAllWithComponent(ItemProcessorComponent)
+ .filter(e => e.components.ItemProcessor.type === enumItemProcessorTypes.trash).length ===
+ 0,
+ },
+ // 2.3 place more cutters
+ {
+ id: "2_3_more_cutters",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr
+ .getAllWithComponent(ItemProcessorComponent)
+ .filter(e => e.components.ItemProcessor.type === enumItemProcessorTypes.cutter).length <
+ 3,
+ },
+ ],
+
+ // Level 3
+ [
+ // 3.1. rectangles
+ {
+ id: "3_1_rectangles",
+ condition: /** @param {GameRoot} root */ root =>
+ // 4 miners placed above rectangles and 10 delivered
+ root.hubGoals.getCurrentGoalDelivered() < 10 ||
+ root.entityMgr.getAllWithComponent(MinerComponent).filter(entity => {
+ const tile = entity.components.StaticMapEntity.origin;
+ const below = root.map.getLowerLayerContentXY(tile.x, tile.y);
+ if (below && below.getItemType() === "shape") {
+ const shape = /** @type {ShapeItem} */ (below).definition.getHash();
+ return shape === "RuRuRuRu";
+ }
+ return false;
+ }).length < 4,
+ },
+ ],
+
+ [], // Level 4
+ [], // Level 5
+ [], // Level 6
+ [], // Level 7
+ [], // Level 8
+ [], // Level 9
+ [], // Level 10
+ [], // Level 11
+ [], // Level 12
+ [], // Level 13
+ [], // Level 14
+ [], // Level 15
+ [], // Level 16
+ [], // Level 17
+ [], // Level 18
+ [], // Level 19
+ [], // Level 20
+
+ // Level 21
+ [
+ // 21.1 place quad painter
+ {
+ id: "21_1_place_quad_painter",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr
+ .getAllWithComponent(ItemProcessorComponent)
+ .filter(e => e.components.ItemProcessor.type === enumItemProcessorTypes.painterQuad)
+ .length === 0,
+ },
+
+ // 21.2 switch to wires layer
+ {
+ id: "21_2_switch_to_wires",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr.getAllWithComponent(WireComponent).length < 5,
+ },
+
+ // 21.3 place button
+ {
+ id: "21_3_place_button",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr.getAllWithComponent(LeverComponent).length === 0,
+ },
+
+ // 21.4 activate button
+ {
+ id: "21_4_press_button",
+ condition: /** @param {GameRoot} root */ root =>
+ root.entityMgr.getAllWithComponent(LeverComponent).some(e => !e.components.Lever.toggled),
+ },
+ ],
];
export class HUDInteractiveTutorial extends BaseHUDPart {
diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js
index d31ee746..65919d3c 100644
--- a/src/js/game/hud/parts/keybinding_overlay.js
+++ b/src/js/game/hud/parts/keybinding_overlay.js
@@ -7,6 +7,7 @@ import {
KEYCODE_RMB,
KEYMAPPINGS,
} from "../../key_action_mapper";
+import { enumHubGoalRewards } from "../../tutorial_goals";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
@@ -162,13 +163,6 @@ export class HUDKeybindingOverlay extends BaseHUDPart {
condition: () => this.mapOverviewActive && !this.blueprintPlacementActive,
},
- {
- // Pipette
- label: T.ingame.keybindingsOverlay.pipette,
- keys: [k.placement.pipette],
- condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive,
- },
-
{
// Cancel placement
label: T.ingame.keybindingsOverlay.stopPlacement,
@@ -184,6 +178,13 @@ export class HUDKeybindingOverlay extends BaseHUDPart {
!this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap,
},
+ {
+ // Pipette
+ label: T.ingame.keybindingsOverlay.pipette,
+ keys: [k.placement.pipette],
+ condition: () => !this.mapOverviewActive && !this.blueprintPlacementActive,
+ },
+
{
// Area select
label: T.ingame.keybindingsOverlay.selectBuildings,
@@ -257,7 +258,8 @@ export class HUDKeybindingOverlay extends BaseHUDPart {
// Switch layers
label: T.ingame.keybindingsOverlay.switchLayers,
keys: [k.ingame.switchLayers],
- condition: () => true,
+ condition: () =>
+ this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers),
},
];
diff --git a/src/js/game/hud/parts/mass_selector.js b/src/js/game/hud/parts/mass_selector.js
index a8972434..08a11769 100644
--- a/src/js/game/hud/parts/mass_selector.js
+++ b/src/js/game/hud/parts/mass_selector.js
@@ -48,6 +48,9 @@ export class HUDMassSelector extends BaseHUDPart {
* @param {Entity} entity
*/
onEntityDestroyed(entity) {
+ if (this.root.bulkOperationRunning) {
+ return;
+ }
this.selectedUids.delete(entity.uid);
}
@@ -90,14 +93,30 @@ export class HUDMassSelector extends BaseHUDPart {
doDelete() {
const entityUids = Array.from(this.selectedUids);
- for (let i = 0; i < entityUids.length; ++i) {
- const uid = entityUids[i];
- const entity = this.root.entityMgr.findByUid(uid);
- if (!this.root.logic.tryDeleteBuilding(entity)) {
- logger.error("Error in mass delete, could not remove building");
- this.selectedUids.delete(uid);
+
+ // Build mapping from uid to entity
+ /**
+ * @type {Map}
+ */
+ const mapUidToEntity = this.root.entityMgr.getFrozenUidSearchMap();
+
+ this.root.logic.performBulkOperation(() => {
+ for (let i = 0; i < entityUids.length; ++i) {
+ const uid = entityUids[i];
+ const entity = mapUidToEntity.get(uid);
+ if (!entity) {
+ logger.error("Entity not found by uid:", uid);
+ continue;
+ }
+
+ if (!this.root.logic.tryDeleteBuilding(entity)) {
+ logger.error("Error in mass delete, could not remove building");
+ }
}
- }
+ });
+
+ // Clear uids later
+ this.selectedUids = new Set();
}
startCopy() {
diff --git a/src/js/game/hud/parts/miner_highlight.js b/src/js/game/hud/parts/miner_highlight.js
index c2b23583..a0c6919d 100644
--- a/src/js/game/hud/parts/miner_highlight.js
+++ b/src/js/game/hud/parts/miner_highlight.js
@@ -45,6 +45,12 @@ export class HUDMinerHighlight extends BaseHUDPart {
return;
}
+ const lowerContents = this.root.map.getLowerLayerContentXY(hoveredTile.x, hoveredTile.y);
+ if (!lowerContents) {
+ // Not connected
+ return;
+ }
+
parameters.context.fillStyle = THEME.map.connectedMiners.overlay;
const connectedEntities = this.findConnectedMiners(contents);
@@ -67,7 +73,7 @@ export class HUDMinerHighlight extends BaseHUDPart {
const maxThroughput = this.root.hubGoals.getBeltBaseSpeed();
- const screenPos = this.root.camera.screenToWorld(mousePos);
+ const tooltipLocation = this.root.camera.screenToWorld(mousePos);
const scale = (1 / this.root.camera.zoomLevel) * this.root.app.getEffectiveUiScale();
@@ -76,8 +82,8 @@ export class HUDMinerHighlight extends BaseHUDPart {
// Background
parameters.context.fillStyle = THEME.map.connectedMiners.background;
parameters.context.beginRoundedRect(
- screenPos.x + 5 * scale,
- screenPos.y - 3 * scale,
+ tooltipLocation.x + 5 * scale,
+ tooltipLocation.y - 3 * scale,
(isCapped ? 100 : 65) * scale,
(isCapped ? 45 : 30) * scale,
2
@@ -89,8 +95,8 @@ export class HUDMinerHighlight extends BaseHUDPart {
parameters.context.font = "bold " + scale * 10 + "px GameFont";
parameters.context.fillText(
formatItemsPerSecond(throughput),
- screenPos.x + 10 * scale,
- screenPos.y + 10 * scale
+ tooltipLocation.x + 10 * scale,
+ tooltipLocation.y + 10 * scale
);
// Amount of miners
@@ -100,8 +106,8 @@ export class HUDMinerHighlight extends BaseHUDPart {
connectedEntities.length === 1
? T.ingame.connectedMiners.one_miner
: T.ingame.connectedMiners.n_miners.replace("", String(connectedEntities.length)),
- screenPos.x + 10 * scale,
- screenPos.y + 22 * scale
+ tooltipLocation.x + 10 * scale,
+ tooltipLocation.y + 22 * scale
);
parameters.context.globalAlpha = 1;
@@ -113,8 +119,8 @@ export class HUDMinerHighlight extends BaseHUDPart {
"",
formatItemsPerSecond(maxThroughput)
),
- screenPos.x + 10 * scale,
- screenPos.y + 34 * scale
+ tooltipLocation.x + 10 * scale,
+ tooltipLocation.y + 34 * scale
);
}
}
diff --git a/src/js/game/hud/parts/modal_dialogs.js b/src/js/game/hud/parts/modal_dialogs.js
index 95428691..263b23dd 100644
--- a/src/js/game/hud/parts/modal_dialogs.js
+++ b/src/js/game/hud/parts/modal_dialogs.js
@@ -1,211 +1,215 @@
-/* typehints:start */
-import { Application } from "../../../application";
-/* typehints:end */
-
-import { SOUNDS } from "../../../platform/sound";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { BaseHUDPart } from "../base_hud_part";
-import { Dialog, DialogLoading, DialogOptionChooser } from "../../../core/modal_dialog_elements";
-import { makeDiv } from "../../../core/utils";
-import { T } from "../../../translations";
-import { THIRDPARTY_URLS } from "../../../core/config";
-
-export class HUDModalDialogs extends BaseHUDPart {
- constructor(root, app) {
- // Important: Root is not always available here! Its also used in the main menu
- super(root);
-
- /** @type {Application} */
- this.app = root ? root.app : app;
-
- this.dialogParent = null;
- this.dialogStack = [];
- }
-
- // For use inside of the game, implementation of base hud part
- initialize() {
- this.dialogParent = document.getElementById("ingame_HUD_ModalDialogs");
- this.domWatcher = new DynamicDomAttach(this.root, this.dialogParent);
- }
-
- shouldPauseRendering() {
- return this.dialogStack.length > 0;
- }
-
- shouldPauseGame() {
- return this.shouldPauseRendering();
- }
-
- createElements(parent) {
- return makeDiv(parent, "ingame_HUD_ModalDialogs");
- }
-
- // For use outside of the game
- initializeToElement(element) {
- assert(element, "No element for dialogs given");
- this.dialogParent = element;
- }
-
- // Methods
-
- /**
- * @param {string} title
- * @param {string} text
- * @param {Array} buttons
- */
- showInfo(title, text, buttons = ["ok:good"]) {
- const dialog = new Dialog({
- app: this.app,
- title: title,
- contentHTML: text,
- buttons: buttons,
- type: "info",
- });
- this.internalShowDialog(dialog);
-
- if (this.app) {
- this.app.sound.playUiSound(SOUNDS.dialogOk);
- }
-
- return dialog.buttonSignals;
- }
-
- /**
- * @param {string} title
- * @param {string} text
- * @param {Array} buttons
- */
- showWarning(title, text, buttons = ["ok:good"]) {
- const dialog = new Dialog({
- app: this.app,
- title: title,
- contentHTML: text,
- buttons: buttons,
- type: "warning",
- });
- this.internalShowDialog(dialog);
-
- if (this.app) {
- this.app.sound.playUiSound(SOUNDS.dialogError);
- }
-
- return dialog.buttonSignals;
- }
-
- /**
- * @param {string} feature
- * @param {string} textPrefab
- */
- showFeatureRestrictionInfo(feature, textPrefab = T.dialogs.featureRestriction.desc) {
- const dialog = new Dialog({
- app: this.app,
- title: T.dialogs.featureRestriction.title,
- contentHTML: textPrefab.replace("", feature),
- buttons: ["cancel:bad", "getStandalone:good"],
- type: "warning",
- });
- this.internalShowDialog(dialog);
-
- if (this.app) {
- this.app.sound.playUiSound(SOUNDS.dialogOk);
- }
-
- this.app.analytics.trackUiClick("demo_dialog_show");
-
- dialog.buttonSignals.cancel.add(() => {
- this.app.analytics.trackUiClick("demo_dialog_cancel");
- });
-
- dialog.buttonSignals.getStandalone.add(() => {
- this.app.analytics.trackUiClick("demo_dialog_click");
- window.open(THIRDPARTY_URLS.standaloneStorePage);
- });
-
- return dialog.buttonSignals;
- }
-
- showOptionChooser(title, options) {
- const dialog = new DialogOptionChooser({
- app: this.app,
- title,
- options,
- });
- this.internalShowDialog(dialog);
- return dialog.buttonSignals;
- }
-
- // Returns method to be called when laoding finishd
- showLoadingDialog() {
- const dialog = new DialogLoading(this.app);
- this.internalShowDialog(dialog);
- return this.closeDialog.bind(this, dialog);
- }
-
- internalShowDialog(dialog) {
- const elem = dialog.createElement();
- dialog.setIndex(this.dialogStack.length);
-
- // Hide last dialog in queue
- if (this.dialogStack.length > 0) {
- this.dialogStack[this.dialogStack.length - 1].hide();
- }
-
- this.dialogStack.push(dialog);
-
- // Append dialog
- dialog.show();
- dialog.closeRequested.add(this.closeDialog.bind(this, dialog));
-
- // Append to HTML
- this.dialogParent.appendChild(elem);
-
- document.body.classList.toggle("modalDialogActive", this.dialogStack.length > 0);
-
- // IMPORTANT: Attach element directly, otherwise double submit is possible
- this.update();
- }
-
- update() {
- if (this.domWatcher) {
- this.domWatcher.update(this.dialogStack.length > 0);
- }
- }
-
- closeDialog(dialog) {
- dialog.destroy();
-
- let index = -1;
- for (let i = 0; i < this.dialogStack.length; ++i) {
- if (this.dialogStack[i] === dialog) {
- index = i;
- break;
- }
- }
- assert(index >= 0, "Dialog not in dialog stack");
- this.dialogStack.splice(index, 1);
-
- if (this.dialogStack.length > 0) {
- // Show the dialog which was previously open
- this.dialogStack[this.dialogStack.length - 1].show();
- }
-
- document.body.classList.toggle("modalDialogActive", this.dialogStack.length > 0);
- }
-
- close() {
- for (let i = 0; i < this.dialogStack.length; ++i) {
- const dialog = this.dialogStack[i];
- dialog.destroy();
- }
- this.dialogStack = [];
- }
-
- cleanup() {
- super.cleanup();
- for (let i = 0; i < this.dialogStack.length; ++i) {
- this.dialogStack[i].destroy();
- }
- this.dialogStack = [];
- this.dialogParent = null;
- }
-}
+/* typehints:start */
+import { Application } from "../../../application";
+/* typehints:end */
+
+import { SOUNDS } from "../../../platform/sound";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { BaseHUDPart } from "../base_hud_part";
+import { Dialog, DialogLoading, DialogOptionChooser } from "../../../core/modal_dialog_elements";
+import { makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { THIRDPARTY_URLS } from "../../../core/config";
+
+export class HUDModalDialogs extends BaseHUDPart {
+ constructor(root, app) {
+ // Important: Root is not always available here! Its also used in the main menu
+ super(root);
+
+ /** @type {Application} */
+ this.app = root ? root.app : app;
+
+ this.dialogParent = null;
+ this.dialogStack = [];
+ }
+
+ // For use inside of the game, implementation of base hud part
+ initialize() {
+ this.dialogParent = document.getElementById("ingame_HUD_ModalDialogs");
+ this.domWatcher = new DynamicDomAttach(this.root, this.dialogParent);
+ }
+
+ shouldPauseRendering() {
+ return this.dialogStack.length > 0;
+ }
+
+ shouldPauseGame() {
+ return this.shouldPauseRendering();
+ }
+
+ createElements(parent) {
+ return makeDiv(parent, "ingame_HUD_ModalDialogs");
+ }
+
+ // For use outside of the game
+ initializeToElement(element) {
+ assert(element, "No element for dialogs given");
+ this.dialogParent = element;
+ }
+
+ isBlockingOverlay() {
+ return this.dialogStack.length > 0;
+ }
+
+ // Methods
+
+ /**
+ * @param {string} title
+ * @param {string} text
+ * @param {Array} buttons
+ */
+ showInfo(title, text, buttons = ["ok:good"]) {
+ const dialog = new Dialog({
+ app: this.app,
+ title: title,
+ contentHTML: text,
+ buttons: buttons,
+ type: "info",
+ });
+ this.internalShowDialog(dialog);
+
+ if (this.app) {
+ this.app.sound.playUiSound(SOUNDS.dialogOk);
+ }
+
+ return dialog.buttonSignals;
+ }
+
+ /**
+ * @param {string} title
+ * @param {string} text
+ * @param {Array} buttons
+ */
+ showWarning(title, text, buttons = ["ok:good"]) {
+ const dialog = new Dialog({
+ app: this.app,
+ title: title,
+ contentHTML: text,
+ buttons: buttons,
+ type: "warning",
+ });
+ this.internalShowDialog(dialog);
+
+ if (this.app) {
+ this.app.sound.playUiSound(SOUNDS.dialogError);
+ }
+
+ return dialog.buttonSignals;
+ }
+
+ /**
+ * @param {string} feature
+ * @param {string} textPrefab
+ */
+ showFeatureRestrictionInfo(feature, textPrefab = T.dialogs.featureRestriction.desc) {
+ const dialog = new Dialog({
+ app: this.app,
+ title: T.dialogs.featureRestriction.title,
+ contentHTML: textPrefab.replace("", feature),
+ buttons: ["cancel:bad", "getStandalone:good"],
+ type: "warning",
+ });
+ this.internalShowDialog(dialog);
+
+ if (this.app) {
+ this.app.sound.playUiSound(SOUNDS.dialogOk);
+ }
+
+ this.app.analytics.trackUiClick("demo_dialog_show");
+
+ dialog.buttonSignals.cancel.add(() => {
+ this.app.analytics.trackUiClick("demo_dialog_cancel");
+ });
+
+ dialog.buttonSignals.getStandalone.add(() => {
+ this.app.analytics.trackUiClick("demo_dialog_click");
+ window.open(THIRDPARTY_URLS.standaloneStorePage + "?ref=ddc");
+ });
+
+ return dialog.buttonSignals;
+ }
+
+ showOptionChooser(title, options) {
+ const dialog = new DialogOptionChooser({
+ app: this.app,
+ title,
+ options,
+ });
+ this.internalShowDialog(dialog);
+ return dialog.buttonSignals;
+ }
+
+ // Returns method to be called when laoding finishd
+ showLoadingDialog() {
+ const dialog = new DialogLoading(this.app);
+ this.internalShowDialog(dialog);
+ return this.closeDialog.bind(this, dialog);
+ }
+
+ internalShowDialog(dialog) {
+ const elem = dialog.createElement();
+ dialog.setIndex(this.dialogStack.length);
+
+ // Hide last dialog in queue
+ if (this.dialogStack.length > 0) {
+ this.dialogStack[this.dialogStack.length - 1].hide();
+ }
+
+ this.dialogStack.push(dialog);
+
+ // Append dialog
+ dialog.show();
+ dialog.closeRequested.add(this.closeDialog.bind(this, dialog));
+
+ // Append to HTML
+ this.dialogParent.appendChild(elem);
+
+ document.body.classList.toggle("modalDialogActive", this.dialogStack.length > 0);
+
+ // IMPORTANT: Attach element directly, otherwise double submit is possible
+ this.update();
+ }
+
+ update() {
+ if (this.domWatcher) {
+ this.domWatcher.update(this.dialogStack.length > 0);
+ }
+ }
+
+ closeDialog(dialog) {
+ dialog.destroy();
+
+ let index = -1;
+ for (let i = 0; i < this.dialogStack.length; ++i) {
+ if (this.dialogStack[i] === dialog) {
+ index = i;
+ break;
+ }
+ }
+ assert(index >= 0, "Dialog not in dialog stack");
+ this.dialogStack.splice(index, 1);
+
+ if (this.dialogStack.length > 0) {
+ // Show the dialog which was previously open
+ this.dialogStack[this.dialogStack.length - 1].show();
+ }
+
+ document.body.classList.toggle("modalDialogActive", this.dialogStack.length > 0);
+ }
+
+ close() {
+ for (let i = 0; i < this.dialogStack.length; ++i) {
+ const dialog = this.dialogStack[i];
+ dialog.destroy();
+ }
+ this.dialogStack = [];
+ }
+
+ cleanup() {
+ super.cleanup();
+ for (let i = 0; i < this.dialogStack.length; ++i) {
+ this.dialogStack[i].destroy();
+ }
+ this.dialogStack = [];
+ this.dialogParent = null;
+ }
+}
diff --git a/src/js/game/hud/parts/notifications.js b/src/js/game/hud/parts/notifications.js
index aef0cc75..bef8dd0f 100644
--- a/src/js/game/hud/parts/notifications.js
+++ b/src/js/game/hud/parts/notifications.js
@@ -1,56 +1,55 @@
-import { BaseHUDPart } from "../base_hud_part";
-import { makeDiv } from "../../../core/utils";
-import { T } from "../../../translations";
-import { IS_DEMO } from "../../../core/config";
-
-/** @enum {string} */
-export const enumNotificationType = {
- saved: "saved",
- upgrade: "upgrade",
- success: "success",
-};
-
-const notificationDuration = 3;
-
-export class HUDNotifications extends BaseHUDPart {
- createElements(parent) {
- this.element = makeDiv(parent, "ingame_HUD_Notifications", [], ``);
- }
-
- initialize() {
- this.root.hud.signals.notification.add(this.onNotification, this);
-
- /** @type {Array<{ element: HTMLElement, expireAt: number}>} */
- this.notificationElements = [];
-
- // Automatic notifications
- this.root.signals.gameSaved.add(() =>
- this.onNotification(T.ingame.notifications.gameSaved, enumNotificationType.saved)
- );
- }
-
- /**
- * @param {string} message
- * @param {enumNotificationType} type
- */
- onNotification(message, type) {
- const element = makeDiv(this.element, null, ["notification", "type-" + type], message);
- element.setAttribute("data-icon", "icons/notification_" + type + ".png");
-
- this.notificationElements.push({
- element,
- expireAt: this.root.time.realtimeNow() + notificationDuration,
- });
- }
-
- update() {
- const now = this.root.time.realtimeNow();
- for (let i = 0; i < this.notificationElements.length; ++i) {
- const handle = this.notificationElements[i];
- if (handle.expireAt <= now) {
- handle.element.remove();
- this.notificationElements.splice(i, 1);
- }
- }
- }
-}
+import { makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { BaseHUDPart } from "../base_hud_part";
+
+/** @enum {string} */
+export const enumNotificationType = {
+ saved: "saved",
+ upgrade: "upgrade",
+ success: "success",
+};
+
+const notificationDuration = 3;
+
+export class HUDNotifications extends BaseHUDPart {
+ createElements(parent) {
+ this.element = makeDiv(parent, "ingame_HUD_Notifications", [], ``);
+ }
+
+ initialize() {
+ this.root.hud.signals.notification.add(this.onNotification, this);
+
+ /** @type {Array<{ element: HTMLElement, expireAt: number}>} */
+ this.notificationElements = [];
+
+ // Automatic notifications
+ this.root.signals.gameSaved.add(() =>
+ this.onNotification(T.ingame.notifications.gameSaved, enumNotificationType.saved)
+ );
+ }
+
+ /**
+ * @param {string} message
+ * @param {enumNotificationType} type
+ */
+ onNotification(message, type) {
+ const element = makeDiv(this.element, null, ["notification", "type-" + type], message);
+ element.setAttribute("data-icon", "icons/notification_" + type + ".png");
+
+ this.notificationElements.push({
+ element,
+ expireAt: this.root.time.realtimeNow() + notificationDuration,
+ });
+ }
+
+ update() {
+ const now = this.root.time.realtimeNow();
+ for (let i = 0; i < this.notificationElements.length; ++i) {
+ const handle = this.notificationElements[i];
+ if (handle.expireAt <= now) {
+ handle.element.remove();
+ this.notificationElements.splice(i, 1);
+ }
+ }
+ }
+}
diff --git a/src/js/game/hud/parts/pinned_shapes.js b/src/js/game/hud/parts/pinned_shapes.js
index 2f7dd11e..542a38b2 100644
--- a/src/js/game/hud/parts/pinned_shapes.js
+++ b/src/js/game/hud/parts/pinned_shapes.js
@@ -1,291 +1,326 @@
-import { ClickDetector } from "../../../core/click_detector";
-import { formatBigNumber, makeDiv, arrayDeleteValue } from "../../../core/utils";
-import { ShapeDefinition } from "../../shape_definition";
-import { BaseHUDPart } from "../base_hud_part";
-import { blueprintShape, UPGRADES } from "../../upgrades";
-import { enumHubGoalRewards } from "../../tutorial_goals";
-
-/**
- * Manages the pinned shapes on the left side of the screen
- */
-export class HUDPinnedShapes extends BaseHUDPart {
- constructor(root) {
- super(root);
- /**
- * Store a list of pinned shapes
- * @type {Array}
- */
- this.pinnedShapes = [];
-
- /**
- * Store handles to the currently rendered elements, so we can update them more
- * convenient. Also allows for cleaning up handles.
- * @type {Array<{
- * key: string,
- * amountLabel: HTMLElement,
- * lastRenderedValue: string,
- * element: HTMLElement,
- * detector?: ClickDetector,
- * infoDetector?: ClickDetector
- * }>}
- */
- this.handles = [];
- }
-
- createElements(parent) {
- this.element = makeDiv(parent, "ingame_HUD_PinnedShapes", []);
- }
-
- /**
- * Serializes the pinned shapes
- */
- serialize() {
- return {
- shapes: this.pinnedShapes,
- };
- }
-
- /**
- * Deserializes the pinned shapes
- * @param {{ shapes: Array}} data
- */
- deserialize(data) {
- if (!data || !data.shapes || !Array.isArray(data.shapes)) {
- return "Invalid pinned shapes data";
- }
- this.pinnedShapes = data.shapes;
- }
-
- /**
- * Initializes the hud component
- */
- initialize() {
- // Connect to any relevant signals
- this.root.signals.storyGoalCompleted.add(this.rerenderFull, this);
- this.root.signals.upgradePurchased.add(this.updateShapesAfterUpgrade, this);
- this.root.signals.postLoadHook.add(this.rerenderFull, this);
- this.root.hud.signals.shapePinRequested.add(this.pinNewShape, this);
- this.root.hud.signals.shapeUnpinRequested.add(this.unpinShape, this);
-
- // Perform initial render
- this.updateShapesAfterUpgrade();
- }
-
- /**
- * Updates all shapes after an upgrade has been purchased and removes the unused ones
- */
- updateShapesAfterUpgrade() {
- for (let i = 0; i < this.pinnedShapes.length; ++i) {
- const key = this.pinnedShapes[i];
- if (key === blueprintShape) {
- // Ignore blueprint shapes
- continue;
- }
- let goal = this.findGoalValueForShape(key);
- if (!goal) {
- // Seems no longer relevant
- this.pinnedShapes.splice(i, 1);
- i -= 1;
- }
- }
-
- this.rerenderFull();
- }
-
- /**
- * Finds the current goal for the given key. If the key is the story goal, returns
- * the story goal. If its the blueprint shape, no goal is returned. Otherwise
- * it's searched for upgrades.
- * @param {string} key
- */
- findGoalValueForShape(key) {
- if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
- return this.root.hubGoals.currentGoal.required;
- }
- if (key === blueprintShape) {
- return null;
- }
-
- // Check if this shape is required for any upgrade
- for (const upgradeId in UPGRADES) {
- const { tiers } = UPGRADES[upgradeId];
- const currentTier = this.root.hubGoals.getUpgradeLevel(upgradeId);
- const tierHandle = tiers[currentTier];
-
- if (!tierHandle) {
- // Max level
- continue;
- }
-
- for (let i = 0; i < tierHandle.required.length; ++i) {
- const { shape, amount } = tierHandle.required[i];
- if (shape === key) {
- return amount;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Returns whether a given shape is currently pinned
- * @param {string} key
- */
- isShapePinned(key) {
- if (key === this.root.hubGoals.currentGoal.definition.getHash() || key === blueprintShape) {
- // This is a "special" shape which is always pinned
- return true;
- }
-
- return this.pinnedShapes.indexOf(key) >= 0;
- }
-
- /**
- * Rerenders the whole component
- */
- rerenderFull() {
- const currentGoal = this.root.hubGoals.currentGoal;
- const currentKey = currentGoal.definition.getHash();
-
- // First, remove all old shapes
- for (let i = 0; i < this.handles.length; ++i) {
- this.handles[i].element.remove();
- const detector = this.handles[i].detector;
- if (detector) {
- detector.cleanup();
- }
- const infoDetector = this.handles[i].infoDetector;
- if (infoDetector) {
- infoDetector.cleanup();
- }
- }
- this.handles = [];
-
- // Pin story goal
- this.internalPinShape(currentKey, false, "goal");
-
- // Pin blueprint shape as well
- if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_blueprints)) {
- this.internalPinShape(blueprintShape, false, "blueprint");
- }
-
- // Pin manually pinned shapes
- for (let i = 0; i < this.pinnedShapes.length; ++i) {
- const key = this.pinnedShapes[i];
- if (key !== currentKey) {
- this.internalPinShape(key);
- }
- }
- }
-
- /**
- * Pins a new shape
- * @param {string} key
- * @param {boolean} canUnpin
- * @param {string=} className
- */
- internalPinShape(key, canUnpin = true, className = null) {
- const definition = this.root.shapeDefinitionMgr.getShapeFromShortKey(key);
-
- const element = makeDiv(this.element, null, ["shape"]);
- const canvas = definition.generateAsCanvas(120);
- element.appendChild(canvas);
-
- if (className) {
- element.classList.add(className);
- }
-
- let detector = null;
- if (canUnpin) {
- element.classList.add("unpinable");
- detector = new ClickDetector(element, {
- consumeEvents: true,
- preventDefault: true,
- targetOnly: true,
- });
- detector.click.add(() => this.unpinShape(key));
- } else {
- element.classList.add("marked");
- }
-
- // Show small info icon
- const infoButton = document.createElement("button");
- infoButton.classList.add("infoButton");
- element.appendChild(infoButton);
- const infoDetector = new ClickDetector(infoButton, {
- consumeEvents: true,
- preventDefault: true,
- targetOnly: true,
- });
- infoDetector.click.add(() => this.root.hud.signals.viewShapeDetailsRequested.dispatch(definition));
-
- const amountLabel = makeDiv(element, null, ["amountLabel"], "");
-
- const goal = this.findGoalValueForShape(key);
- if (goal) {
- makeDiv(element, null, ["goalLabel"], "/" + formatBigNumber(goal));
- }
-
- this.handles.push({
- key,
- element,
- amountLabel,
- lastRenderedValue: "",
- detector,
- infoDetector,
- });
- }
-
- /**
- * Updates all amount labels
- */
- update() {
- for (let i = 0; i < this.handles.length; ++i) {
- const handle = this.handles[i];
-
- const currentValue = this.root.hubGoals.getShapesStoredByKey(handle.key);
- const currentValueFormatted = formatBigNumber(currentValue);
- if (currentValueFormatted !== handle.lastRenderedValue) {
- handle.lastRenderedValue = currentValueFormatted;
- handle.amountLabel.innerText = currentValueFormatted;
- const goal = this.findGoalValueForShape(handle.key);
- handle.element.classList.toggle("completed", goal && currentValue > goal);
- }
- }
- }
-
- /**
- * Unpins a shape
- * @param {string} key
- */
- unpinShape(key) {
- arrayDeleteValue(this.pinnedShapes, key);
- this.rerenderFull();
- }
-
- /**
- * Requests to pin a new shape
- * @param {ShapeDefinition} definition
- */
- pinNewShape(definition) {
- const key = definition.getHash();
- if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
- // Can not pin current goal
- return;
- }
-
- if (key === blueprintShape) {
- // Can not pin the blueprint shape
- return;
- }
-
- // Check if its already pinned
- if (this.pinnedShapes.indexOf(key) >= 0) {
- return;
- }
-
- this.pinnedShapes.push(key);
- this.rerenderFull();
- }
-}
+import { ClickDetector } from "../../../core/click_detector";
+import { globalConfig } from "../../../core/config";
+import { arrayDeleteValue, formatBigNumber, makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { enumAnalyticsDataSource } from "../../production_analytics";
+import { ShapeDefinition } from "../../shape_definition";
+import { enumHubGoalRewards } from "../../tutorial_goals";
+import { BaseHUDPart } from "../base_hud_part";
+
+/**
+ * Manages the pinned shapes on the left side of the screen
+ */
+export class HUDPinnedShapes extends BaseHUDPart {
+ constructor(root) {
+ super(root);
+ /**
+ * Store a list of pinned shapes
+ * @type {Array}
+ */
+ this.pinnedShapes = [];
+
+ /**
+ * Store handles to the currently rendered elements, so we can update them more
+ * convenient. Also allows for cleaning up handles.
+ * @type {Array<{
+ * key: string,
+ * definition: ShapeDefinition,
+ * amountLabel: HTMLElement,
+ * lastRenderedValue: string,
+ * element: HTMLElement,
+ * detector?: ClickDetector,
+ * infoDetector?: ClickDetector,
+ * throughputOnly?: boolean
+ * }>}
+ */
+ this.handles = [];
+ }
+
+ createElements(parent) {
+ this.element = makeDiv(parent, "ingame_HUD_PinnedShapes", []);
+ }
+
+ /**
+ * Serializes the pinned shapes
+ */
+ serialize() {
+ return {
+ shapes: this.pinnedShapes,
+ };
+ }
+
+ /**
+ * Deserializes the pinned shapes
+ * @param {{ shapes: Array}} data
+ */
+ deserialize(data) {
+ if (!data || !data.shapes || !Array.isArray(data.shapes)) {
+ return "Invalid pinned shapes data";
+ }
+ this.pinnedShapes = data.shapes;
+ }
+
+ /**
+ * Initializes the hud component
+ */
+ initialize() {
+ // Connect to any relevant signals
+ this.root.signals.storyGoalCompleted.add(this.rerenderFull, this);
+ this.root.signals.upgradePurchased.add(this.updateShapesAfterUpgrade, this);
+ this.root.signals.postLoadHook.add(this.rerenderFull, this);
+ this.root.hud.signals.shapePinRequested.add(this.pinNewShape, this);
+ this.root.hud.signals.shapeUnpinRequested.add(this.unpinShape, this);
+
+ // Perform initial render
+ this.updateShapesAfterUpgrade();
+ }
+
+ /**
+ * Updates all shapes after an upgrade has been purchased and removes the unused ones
+ */
+ updateShapesAfterUpgrade() {
+ for (let i = 0; i < this.pinnedShapes.length; ++i) {
+ const key = this.pinnedShapes[i];
+ if (key === this.root.gameMode.getBlueprintShapeKey()) {
+ // Ignore blueprint shapes
+ continue;
+ }
+ let goal = this.findGoalValueForShape(key);
+ if (!goal) {
+ // Seems no longer relevant
+ this.pinnedShapes.splice(i, 1);
+ i -= 1;
+ }
+ }
+
+ this.rerenderFull();
+ }
+
+ /**
+ * Finds the current goal for the given key. If the key is the story goal, returns
+ * the story goal. If its the blueprint shape, no goal is returned. Otherwise
+ * it's searched for upgrades.
+ * @param {string} key
+ */
+ findGoalValueForShape(key) {
+ if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
+ return this.root.hubGoals.currentGoal.required;
+ }
+ if (key === this.root.gameMode.getBlueprintShapeKey()) {
+ return null;
+ }
+
+ // Check if this shape is required for any upgrade
+ const upgrades = this.root.gameMode.getUpgrades();
+ for (const upgradeId in upgrades) {
+ const upgradeTiers = upgrades[upgradeId];
+ const currentTier = this.root.hubGoals.getUpgradeLevel(upgradeId);
+ const tierHandle = upgradeTiers[currentTier];
+
+ if (!tierHandle) {
+ // Max level
+ continue;
+ }
+
+ for (let i = 0; i < tierHandle.required.length; ++i) {
+ const { shape, amount } = tierHandle.required[i];
+ if (shape === key) {
+ return amount;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns whether a given shape is currently pinned
+ * @param {string} key
+ */
+ isShapePinned(key) {
+ if (
+ key === this.root.hubGoals.currentGoal.definition.getHash() ||
+ key === this.root.gameMode.getBlueprintShapeKey()
+ ) {
+ // This is a "special" shape which is always pinned
+ return true;
+ }
+
+ return this.pinnedShapes.indexOf(key) >= 0;
+ }
+
+ /**
+ * Rerenders the whole component
+ */
+ rerenderFull() {
+ const currentGoal = this.root.hubGoals.currentGoal;
+ const currentKey = currentGoal.definition.getHash();
+
+ // First, remove all old shapes
+ for (let i = 0; i < this.handles.length; ++i) {
+ this.handles[i].element.remove();
+ const detector = this.handles[i].detector;
+ if (detector) {
+ detector.cleanup();
+ }
+ const infoDetector = this.handles[i].infoDetector;
+ if (infoDetector) {
+ infoDetector.cleanup();
+ }
+ }
+ this.handles = [];
+
+ // Pin story goal
+ this.internalPinShape({
+ key: currentKey,
+ canUnpin: false,
+ className: "goal",
+ throughputOnly: currentGoal.throughputOnly,
+ });
+
+ // Pin blueprint shape as well
+ if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_blueprints)) {
+ this.internalPinShape({
+ key: this.root.gameMode.getBlueprintShapeKey(),
+ canUnpin: false,
+ className: "blueprint",
+ });
+ }
+
+ // Pin manually pinned shapes
+ for (let i = 0; i < this.pinnedShapes.length; ++i) {
+ const key = this.pinnedShapes[i];
+ if (key !== currentKey) {
+ this.internalPinShape({ key });
+ }
+ }
+ }
+
+ /**
+ * Pins a new shape
+ * @param {object} param0
+ * @param {string} param0.key
+ * @param {boolean=} param0.canUnpin
+ * @param {string=} param0.className
+ * @param {boolean=} param0.throughputOnly
+ */
+ internalPinShape({ key, canUnpin = true, className = null, throughputOnly = false }) {
+ const definition = this.root.shapeDefinitionMgr.getShapeFromShortKey(key);
+
+ const element = makeDiv(this.element, null, ["shape"]);
+ const canvas = definition.generateAsCanvas(120);
+ element.appendChild(canvas);
+
+ if (className) {
+ element.classList.add(className);
+ }
+
+ let detector = null;
+ if (canUnpin) {
+ element.classList.add("removable");
+ detector = new ClickDetector(element, {
+ consumeEvents: true,
+ preventDefault: true,
+ targetOnly: false,
+ });
+ detector.click.add(() => this.unpinShape(key));
+ } else {
+ element.classList.add("marked");
+ }
+
+ // Show small info icon
+ const infoButton = document.createElement("button");
+ infoButton.classList.add("infoButton");
+ element.appendChild(infoButton);
+ const infoDetector = new ClickDetector(infoButton, {
+ consumeEvents: true,
+ preventDefault: true,
+ targetOnly: true,
+ });
+ infoDetector.click.add(() => this.root.hud.signals.viewShapeDetailsRequested.dispatch(definition));
+
+ const amountLabel = makeDiv(element, null, ["amountLabel"], "");
+
+ const goal = this.findGoalValueForShape(key);
+ if (goal) {
+ makeDiv(element, null, ["goalLabel"], "/" + formatBigNumber(goal));
+ }
+
+ this.handles.push({
+ key,
+ definition,
+ element,
+ amountLabel,
+ lastRenderedValue: "",
+ detector,
+ infoDetector,
+ throughputOnly,
+ });
+ }
+
+ /**
+ * Updates all amount labels
+ */
+ update() {
+ for (let i = 0; i < this.handles.length; ++i) {
+ const handle = this.handles[i];
+
+ let currentValue = this.root.hubGoals.getShapesStoredByKey(handle.key);
+ let currentValueFormatted = formatBigNumber(currentValue);
+
+ if (handle.throughputOnly) {
+ currentValue =
+ this.root.productionAnalytics.getCurrentShapeRate(
+ enumAnalyticsDataSource.delivered,
+ handle.definition
+ ) / globalConfig.analyticsSliceDurationSeconds;
+ currentValueFormatted = T.ingame.statistics.shapesDisplayUnits.second.replace(
+ "",
+ String(currentValue)
+ );
+ }
+
+ if (currentValueFormatted !== handle.lastRenderedValue) {
+ handle.lastRenderedValue = currentValueFormatted;
+ handle.amountLabel.innerText = currentValueFormatted;
+ const goal = this.findGoalValueForShape(handle.key);
+ handle.element.classList.toggle("completed", goal && currentValue > goal);
+ }
+ }
+ }
+
+ /**
+ * Unpins a shape
+ * @param {string} key
+ */
+ unpinShape(key) {
+ console.log("unpin", key);
+ arrayDeleteValue(this.pinnedShapes, key);
+ this.rerenderFull();
+ }
+
+ /**
+ * Requests to pin a new shape
+ * @param {ShapeDefinition} definition
+ */
+ pinNewShape(definition) {
+ const key = definition.getHash();
+ if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
+ // Can not pin current goal
+ return;
+ }
+
+ if (key === this.root.gameMode.getBlueprintShapeKey()) {
+ // Can not pin the blueprint shape
+ return;
+ }
+
+ // Check if its already pinned
+ if (this.pinnedShapes.indexOf(key) >= 0) {
+ return;
+ }
+
+ this.pinnedShapes.push(key);
+ this.rerenderFull();
+ }
+}
diff --git a/src/js/game/hud/parts/sandbox_controller.js b/src/js/game/hud/parts/sandbox_controller.js
index dd521655..592487ee 100644
--- a/src/js/game/hud/parts/sandbox_controller.js
+++ b/src/js/game/hud/parts/sandbox_controller.js
@@ -1,158 +1,158 @@
-import { BaseHUDPart } from "../base_hud_part";
-import { makeDiv } from "../../../core/utils";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { blueprintShape, UPGRADES } from "../../upgrades";
-import { enumNotificationType } from "./notifications";
-import { tutorialGoals } from "../../tutorial_goals";
-
-export class HUDSandboxController extends BaseHUDPart {
- createElements(parent) {
- this.element = makeDiv(
- parent,
- "ingame_HUD_SandboxController",
- [],
- `
- Sandbox Options
- Use F6 to toggle this overlay
-
-
- `
- );
-
- const bind = (selector, handler) => this.trackClicks(this.element.querySelector(selector), handler);
-
- bind(".giveBlueprints", this.giveBlueprints);
- bind(".maxOutAll", this.maxOutAll);
- bind(".levelToggle .minus", () => this.modifyLevel(-1));
- bind(".levelToggle .plus", () => this.modifyLevel(1));
-
- bind(".upgradesBelt .minus", () => this.modifyUpgrade("belt", -1));
- bind(".upgradesBelt .plus", () => this.modifyUpgrade("belt", 1));
-
- bind(".upgradesExtraction .minus", () => this.modifyUpgrade("miner", -1));
- bind(".upgradesExtraction .plus", () => this.modifyUpgrade("miner", 1));
-
- bind(".upgradesProcessing .minus", () => this.modifyUpgrade("processors", -1));
- bind(".upgradesProcessing .plus", () => this.modifyUpgrade("processors", 1));
-
- bind(".upgradesPainting .minus", () => this.modifyUpgrade("painting", -1));
- bind(".upgradesPainting .plus", () => this.modifyUpgrade("painting", 1));
- }
-
- giveBlueprints() {
- if (!this.root.hubGoals.storedShapes[blueprintShape]) {
- this.root.hubGoals.storedShapes[blueprintShape] = 0;
- }
- this.root.hubGoals.storedShapes[blueprintShape] += 1e9;
- }
-
- maxOutAll() {
- this.modifyUpgrade("belt", 100);
- this.modifyUpgrade("miner", 100);
- this.modifyUpgrade("processors", 100);
- this.modifyUpgrade("painting", 100);
- }
-
- modifyUpgrade(id, amount) {
- const handle = UPGRADES[id];
- const maxLevel = handle.tiers.length;
-
- this.root.hubGoals.upgradeLevels[id] = Math.max(
- 0,
- Math.min(maxLevel, (this.root.hubGoals.upgradeLevels[id] || 0) + amount)
- );
-
- // Compute improvement
- let improvement = 1;
- for (let i = 0; i < this.root.hubGoals.upgradeLevels[id]; ++i) {
- improvement += handle.tiers[i].improvement;
- }
- this.root.hubGoals.upgradeImprovements[id] = improvement;
- this.root.signals.upgradePurchased.dispatch(id);
- this.root.hud.signals.notification.dispatch(
- "Upgrade '" + id + "' is now at tier " + (this.root.hubGoals.upgradeLevels[id] + 1),
- enumNotificationType.upgrade
- );
- }
-
- modifyLevel(amount) {
- const hubGoals = this.root.hubGoals;
- hubGoals.level = Math.max(1, hubGoals.level + amount);
- hubGoals.createNextGoal();
-
- // Clear all shapes of this level
- hubGoals.storedShapes[hubGoals.currentGoal.definition.getHash()] = 0;
-
- this.root.hud.parts.pinnedShapes.rerenderFull();
-
- // Compute gained rewards
- hubGoals.gainedRewards = {};
- for (let i = 0; i < hubGoals.level - 1; ++i) {
- if (i < tutorialGoals.length) {
- const reward = tutorialGoals[i].reward;
- hubGoals.gainedRewards[reward] = (hubGoals.gainedRewards[reward] || 0) + 1;
- }
- }
-
- this.root.hud.signals.notification.dispatch(
- "Changed level to " + hubGoals.level,
- enumNotificationType.upgrade
- );
- }
-
- initialize() {
- // Allow toggling the controller overlay
- this.root.gameState.inputReciever.keydown.add(key => {
- if (key.keyCode === 117) {
- // F6
- this.toggle();
- }
- });
-
- this.visible = !G_IS_DEV;
- this.domAttach = new DynamicDomAttach(this.root, this.element);
- }
-
- toggle() {
- this.visible = !this.visible;
- }
-
- update() {
- this.domAttach.update(this.visible);
- }
-}
+import { makeDiv } from "../../../core/utils";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { enumNotificationType } from "./notifications";
+
+export class HUDSandboxController extends BaseHUDPart {
+ createElements(parent) {
+ this.element = makeDiv(
+ parent,
+ "ingame_HUD_SandboxController",
+ [],
+ `
+ Sandbox Options
+ Use F6 to toggle this overlay
+
+
+ `
+ );
+
+ const bind = (selector, handler) => this.trackClicks(this.element.querySelector(selector), handler);
+
+ bind(".giveBlueprints", this.giveBlueprints);
+ bind(".maxOutAll", this.maxOutAll);
+ bind(".levelToggle .minus", () => this.modifyLevel(-1));
+ bind(".levelToggle .plus", () => this.modifyLevel(1));
+
+ bind(".upgradesBelt .minus", () => this.modifyUpgrade("belt", -1));
+ bind(".upgradesBelt .plus", () => this.modifyUpgrade("belt", 1));
+
+ bind(".upgradesExtraction .minus", () => this.modifyUpgrade("miner", -1));
+ bind(".upgradesExtraction .plus", () => this.modifyUpgrade("miner", 1));
+
+ bind(".upgradesProcessing .minus", () => this.modifyUpgrade("processors", -1));
+ bind(".upgradesProcessing .plus", () => this.modifyUpgrade("processors", 1));
+
+ bind(".upgradesPainting .minus", () => this.modifyUpgrade("painting", -1));
+ bind(".upgradesPainting .plus", () => this.modifyUpgrade("painting", 1));
+ }
+
+ giveBlueprints() {
+ const shape = this.root.gameMode.getBlueprintShapeKey();
+ if (!this.root.hubGoals.storedShapes[shape]) {
+ this.root.hubGoals.storedShapes[shape] = 0;
+ }
+ this.root.hubGoals.storedShapes[shape] += 1e9;
+ }
+
+ maxOutAll() {
+ this.modifyUpgrade("belt", 100);
+ this.modifyUpgrade("miner", 100);
+ this.modifyUpgrade("processors", 100);
+ this.modifyUpgrade("painting", 100);
+ }
+
+ modifyUpgrade(id, amount) {
+ const upgradeTiers = this.root.gameMode.getUpgrades()[id];
+ const maxLevel = upgradeTiers.length;
+
+ this.root.hubGoals.upgradeLevels[id] = Math.max(
+ 0,
+ Math.min(maxLevel, (this.root.hubGoals.upgradeLevels[id] || 0) + amount)
+ );
+
+ // Compute improvement
+ let improvement = 1;
+ for (let i = 0; i < this.root.hubGoals.upgradeLevels[id]; ++i) {
+ improvement += upgradeTiers[i].improvement;
+ }
+ this.root.hubGoals.upgradeImprovements[id] = improvement;
+ this.root.signals.upgradePurchased.dispatch(id);
+ this.root.hud.signals.notification.dispatch(
+ "Upgrade '" + id + "' is now at tier " + (this.root.hubGoals.upgradeLevels[id] + 1),
+ enumNotificationType.upgrade
+ );
+ }
+
+ modifyLevel(amount) {
+ const hubGoals = this.root.hubGoals;
+ hubGoals.level = Math.max(1, hubGoals.level + amount);
+ hubGoals.computeNextGoal();
+
+ // Clear all shapes of this level
+ hubGoals.storedShapes[hubGoals.currentGoal.definition.getHash()] = 0;
+
+ this.root.hud.parts.pinnedShapes.rerenderFull();
+
+ // Compute gained rewards
+ hubGoals.gainedRewards = {};
+ const levels = this.root.gameMode.getLevelDefinitions();
+ for (let i = 0; i < hubGoals.level - 1; ++i) {
+ if (i < levels.length) {
+ const reward = levels[i].reward;
+ hubGoals.gainedRewards[reward] = (hubGoals.gainedRewards[reward] || 0) + 1;
+ }
+ }
+
+ this.root.hud.signals.notification.dispatch(
+ "Changed level to " + hubGoals.level,
+ enumNotificationType.upgrade
+ );
+ }
+
+ initialize() {
+ // Allow toggling the controller overlay
+ this.root.gameState.inputReciever.keydown.add(key => {
+ if (key.keyCode === 117) {
+ // F6
+ this.toggle();
+ }
+ });
+
+ this.visible = !G_IS_DEV;
+ this.domAttach = new DynamicDomAttach(this.root, this.element);
+ }
+
+ toggle() {
+ this.visible = !this.visible;
+ }
+
+ update() {
+ this.domAttach.update(this.visible);
+ }
+}
diff --git a/src/js/game/hud/parts/screenshot_exporter.js b/src/js/game/hud/parts/screenshot_exporter.js
index a3310204..dd81f8b6 100644
--- a/src/js/game/hud/parts/screenshot_exporter.js
+++ b/src/js/game/hud/parts/screenshot_exporter.js
@@ -1,13 +1,13 @@
-import { BaseHUDPart } from "../base_hud_part";
-import { KEYMAPPINGS } from "../../key_action_mapper";
-import { IS_DEMO, globalConfig } from "../../../core/config";
-import { T } from "../../../translations";
-import { createLogger } from "../../../core/logging";
-import { StaticMapEntityComponent } from "../../components/static_map_entity";
-import { Vector } from "../../../core/vector";
import { makeOffscreenBuffer } from "../../../core/buffer_utils";
+import { globalConfig } from "../../../core/config";
import { DrawParameters } from "../../../core/draw_parameters";
+import { createLogger } from "../../../core/logging";
import { Rectangle } from "../../../core/rectangle";
+import { Vector } from "../../../core/vector";
+import { T } from "../../../translations";
+import { StaticMapEntityComponent } from "../../components/static_map_entity";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { BaseHUDPart } from "../base_hud_part";
const logger = createLogger("screenshot_exporter");
@@ -19,7 +19,7 @@ export class HUDScreenshotExporter extends BaseHUDPart {
}
startExport() {
- if (IS_DEMO) {
+ if (!this.root.app.restrictionMgr.getIsExportingScreenshotsPossible()) {
this.root.hud.parts.dialogs.showFeatureRestrictionInfo(T.demo.features.exportingBase);
return;
}
@@ -87,7 +87,7 @@ export class HUDScreenshotExporter extends BaseHUDPart {
const parameters = new DrawParameters({
context,
visibleRect,
- desiredAtlasScale: "1",
+ desiredAtlasScale: 0.25,
root: this.root,
zoomLevel: chunkScale,
});
diff --git a/src/js/game/hud/parts/settings_menu.js b/src/js/game/hud/parts/settings_menu.js
index 391fde01..eb902934 100644
--- a/src/js/game/hud/parts/settings_menu.js
+++ b/src/js/game/hud/parts/settings_menu.js
@@ -1,127 +1,125 @@
-import { BaseHUDPart } from "../base_hud_part";
-import { makeDiv, formatBigNumberFull } from "../../../core/utils";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { InputReceiver } from "../../../core/input_receiver";
-import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
-import { T } from "../../../translations";
-import { StaticMapEntityComponent } from "../../components/static_map_entity";
-import { BeltComponent } from "../../components/belt";
-
-export class HUDSettingsMenu extends BaseHUDPart {
- createElements(parent) {
- this.background = makeDiv(parent, "ingame_HUD_SettingsMenu", ["ingameDialog"]);
-
- this.menuElement = makeDiv(this.background, null, ["menuElement"]);
-
- this.statsElement = makeDiv(
- this.background,
- null,
- ["statsElement"],
- `
- ${T.ingame.settingsMenu.beltsPlaced}
- ${T.ingame.settingsMenu.buildingsPlaced}
- ${T.ingame.settingsMenu.playtime}
-
- `
- );
-
- this.buttonContainer = makeDiv(this.menuElement, null, ["buttons"]);
-
- const buttons = [
- {
- title: T.ingame.settingsMenu.buttons.continue,
- action: () => this.close(),
- },
- {
- title: T.ingame.settingsMenu.buttons.settings,
- action: () => this.goToSettings(),
- },
- {
- title: T.ingame.settingsMenu.buttons.menu,
- action: () => this.returnToMenu(),
- },
- ];
-
- for (let i = 0; i < buttons.length; ++i) {
- const { title, action } = buttons[i];
-
- const element = document.createElement("button");
- element.classList.add("styledButton");
- element.innerText = title;
- this.buttonContainer.appendChild(element);
-
- this.trackClicks(element, action);
- }
- }
-
- returnToMenu() {
- this.root.gameState.goBackToMenu();
- }
-
- goToSettings() {
- this.root.gameState.goToSettings();
- }
-
- shouldPauseGame() {
- return this.visible;
- }
-
- shouldPauseRendering() {
- return this.visible;
- }
-
- initialize() {
- this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).add(this.show, this);
-
- this.domAttach = new DynamicDomAttach(this.root, this.background, {
- attachClass: "visible",
- });
-
- this.inputReciever = new InputReceiver("settingsmenu");
- this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
- this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
-
- this.close();
- }
-
- cleanup() {
- document.body.classList.remove("ingameDialogOpen");
- }
-
- show() {
- this.visible = true;
- document.body.classList.add("ingameDialogOpen");
- this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
-
- const totalMinutesPlayed = Math.ceil(this.root.time.now() / 60);
-
- /** @type {HTMLElement} */
- const playtimeElement = this.statsElement.querySelector(".playtime");
- /** @type {HTMLElement} */
- const buildingsPlacedElement = this.statsElement.querySelector(".buildingsPlaced");
- /** @type {HTMLElement} */
- const beltsPlacedElement = this.statsElement.querySelector(".beltsPlaced");
-
- playtimeElement.innerText = T.global.time.xMinutes.replace("", `${totalMinutesPlayed}`);
-
- buildingsPlacedElement.innerText = formatBigNumberFull(
- this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
- this.root.entityMgr.getAllWithComponent(BeltComponent).length
- );
-
- beltsPlacedElement.innerText = formatBigNumberFull(
- this.root.entityMgr.getAllWithComponent(BeltComponent).length
- );
- }
-
- close() {
- this.visible = false;
- document.body.classList.remove("ingameDialogOpen");
- this.root.app.inputMgr.makeSureDetached(this.inputReciever);
- this.update();
- }
-
- update() {
- this.domAttach.update(this.visible);
- }
-}
+import { BaseHUDPart } from "../base_hud_part";
+import { makeDiv, formatBigNumberFull } from "../../../core/utils";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { InputReceiver } from "../../../core/input_receiver";
+import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
+import { T } from "../../../translations";
+import { StaticMapEntityComponent } from "../../components/static_map_entity";
+import { BeltComponent } from "../../components/belt";
+
+export class HUDSettingsMenu extends BaseHUDPart {
+ createElements(parent) {
+ this.background = makeDiv(parent, "ingame_HUD_SettingsMenu", ["ingameDialog"]);
+
+ this.menuElement = makeDiv(this.background, null, ["menuElement"]);
+
+ this.statsElement = makeDiv(
+ this.background,
+ null,
+ ["statsElement"],
+ `
+ ${T.ingame.settingsMenu.beltsPlaced}
+ ${T.ingame.settingsMenu.buildingsPlaced}
+ ${T.ingame.settingsMenu.playtime}
+
+ `
+ );
+
+ this.buttonContainer = makeDiv(this.menuElement, null, ["buttons"]);
+
+ const buttons = [
+ {
+ id: "continue",
+ action: () => this.close(),
+ },
+ {
+ id: "settings",
+ action: () => this.goToSettings(),
+ },
+ {
+ id: "menu",
+ action: () => this.returnToMenu(),
+ },
+ ];
+
+ for (let i = 0; i < buttons.length; ++i) {
+ const { action, id } = buttons[i];
+
+ const element = document.createElement("button");
+ element.classList.add("styledButton");
+ element.classList.add(id);
+ this.buttonContainer.appendChild(element);
+
+ this.trackClicks(element, action);
+ }
+ }
+
+ isBlockingOverlay() {
+ return this.visible;
+ }
+
+ returnToMenu() {
+ this.root.gameState.goBackToMenu();
+ }
+
+ goToSettings() {
+ this.root.gameState.goToSettings();
+ }
+
+ shouldPauseGame() {
+ return this.visible;
+ }
+
+ shouldPauseRendering() {
+ return this.visible;
+ }
+
+ initialize() {
+ this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).add(this.show, this);
+
+ this.domAttach = new DynamicDomAttach(this.root, this.background, {
+ attachClass: "visible",
+ });
+
+ this.inputReciever = new InputReceiver("settingsmenu");
+ this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
+ this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
+
+ this.close();
+ }
+
+ show() {
+ this.visible = true;
+ this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
+
+ const totalMinutesPlayed = Math.ceil(this.root.time.now() / 60);
+
+ /** @type {HTMLElement} */
+ const playtimeElement = this.statsElement.querySelector(".playtime");
+ /** @type {HTMLElement} */
+ const buildingsPlacedElement = this.statsElement.querySelector(".buildingsPlaced");
+ /** @type {HTMLElement} */
+ const beltsPlacedElement = this.statsElement.querySelector(".beltsPlaced");
+
+ playtimeElement.innerText = T.global.time.xMinutes.replace("", `${totalMinutesPlayed}`);
+
+ buildingsPlacedElement.innerText = formatBigNumberFull(
+ this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
+ this.root.entityMgr.getAllWithComponent(BeltComponent).length
+ );
+
+ beltsPlacedElement.innerText = formatBigNumberFull(
+ this.root.entityMgr.getAllWithComponent(BeltComponent).length
+ );
+ }
+
+ close() {
+ this.visible = false;
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ this.update();
+ }
+
+ update() {
+ this.domAttach.update(this.visible);
+ }
+}
diff --git a/src/js/game/hud/parts/shape_viewer.js b/src/js/game/hud/parts/shape_viewer.js
index ea4273aa..a7f5d206 100644
--- a/src/js/game/hud/parts/shape_viewer.js
+++ b/src/js/game/hud/parts/shape_viewer.js
@@ -48,6 +48,10 @@ export class HUDShapeViewer extends BaseHUDPart {
this.close();
}
+ isBlockingOverlay() {
+ return this.visible;
+ }
+
/**
* Called when the copying of a key was requested
*/
@@ -63,7 +67,6 @@ export class HUDShapeViewer extends BaseHUDPart {
*/
close() {
this.visible = false;
- document.body.classList.remove("ingameDialogOpen");
this.root.app.inputMgr.makeSureDetached(this.inputReciever);
this.update();
}
@@ -74,7 +77,6 @@ export class HUDShapeViewer extends BaseHUDPart {
*/
renderForShape(definition) {
this.visible = true;
- document.body.classList.add("ingameDialogOpen");
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
removeAllChildren(this.renderArea);
@@ -120,13 +122,6 @@ export class HUDShapeViewer extends BaseHUDPart {
}
}
- /**
- * Cleans up everything
- */
- cleanup() {
- document.body.classList.remove("ingameDialogOpen");
- }
-
update() {
this.domAttach.update(this.visible);
}
diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js
index e2b8837b..96521898 100644
--- a/src/js/game/hud/parts/shop.js
+++ b/src/js/game/hud/parts/shop.js
@@ -1,251 +1,247 @@
-import { ClickDetector } from "../../../core/click_detector";
-import { InputReceiver } from "../../../core/input_receiver";
-import { formatBigNumber, makeDiv } from "../../../core/utils";
-import { T } from "../../../translations";
-import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
-import { UPGRADES } from "../../upgrades";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-
-export class HUDShop extends BaseHUDPart {
- createElements(parent) {
- this.background = makeDiv(parent, "ingame_HUD_Shop", ["ingameDialog"]);
-
- // DIALOG Inner / Wrapper
- this.dialogInner = makeDiv(this.background, null, ["dialogInner"]);
- this.title = makeDiv(this.dialogInner, null, ["title"], T.ingame.shop.title);
- this.closeButton = makeDiv(this.title, null, ["closeButton"]);
- this.trackClicks(this.closeButton, this.close);
- this.contentDiv = makeDiv(this.dialogInner, null, ["content"]);
-
- this.upgradeToElements = {};
-
- // Upgrades
- for (const upgradeId in UPGRADES) {
- const handle = {};
- handle.requireIndexToElement = [];
-
- // Wrapper
- handle.elem = makeDiv(this.contentDiv, null, ["upgrade"]);
- handle.elem.setAttribute("data-upgrade-id", upgradeId);
-
- // Title
- const title = makeDiv(handle.elem, null, ["title"], T.shopUpgrades[upgradeId].name);
-
- // Title > Tier
- handle.elemTierLabel = makeDiv(title, null, ["tier"]);
-
- // Icon
- handle.icon = makeDiv(handle.elem, null, ["icon"]);
- handle.icon.setAttribute("data-icon", "upgrades/" + upgradeId + ".png");
-
- // Description
- handle.elemDescription = makeDiv(handle.elem, null, ["description"], "??");
- handle.elemRequirements = makeDiv(handle.elem, null, ["requirements"]);
-
- // Buy button
- handle.buyButton = document.createElement("button");
- handle.buyButton.classList.add("buy", "styledButton");
- handle.buyButton.innerText = T.ingame.shop.buttonUnlock;
- handle.elem.appendChild(handle.buyButton);
-
- this.trackClicks(handle.buyButton, () => this.tryUnlockNextTier(upgradeId));
-
- // Assign handle
- this.upgradeToElements[upgradeId] = handle;
- }
- }
-
- rerenderFull() {
- for (const upgradeId in this.upgradeToElements) {
- const handle = this.upgradeToElements[upgradeId];
- const { tiers } = UPGRADES[upgradeId];
-
- const currentTier = this.root.hubGoals.getUpgradeLevel(upgradeId);
- const currentTierMultiplier = this.root.hubGoals.upgradeImprovements[upgradeId];
- const tierHandle = tiers[currentTier];
-
- // Set tier
- handle.elemTierLabel.innerText = T.ingame.shop.tier.replace(
- "",
- "" + T.ingame.shop.tierLabels[currentTier]
- );
-
- handle.elemTierLabel.setAttribute("data-tier", currentTier);
-
- // Cleanup detectors
- for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
- const requiredHandle = handle.requireIndexToElement[i];
- requiredHandle.container.remove();
- requiredHandle.pinDetector.cleanup();
- requiredHandle.infoDetector.cleanup();
- }
-
- // Cleanup
- handle.requireIndexToElement = [];
-
- handle.elem.classList.toggle("maxLevel", !tierHandle);
-
- if (!tierHandle) {
- // Max level
- handle.elemDescription.innerText = T.ingame.shop.maximumLevel.replace(
- "",
- currentTierMultiplier.toString()
- );
- continue;
- }
-
- // Set description
- handle.elemDescription.innerText = T.shopUpgrades[upgradeId].description
- .replace("", currentTierMultiplier.toString())
- .replace("", (currentTierMultiplier + tierHandle.improvement).toString())
- // Backwards compatibility
- .replace("", (tierHandle.improvement * 100.0).toString());
-
- tierHandle.required.forEach(({ shape, amount }) => {
- const container = makeDiv(handle.elemRequirements, null, ["requirement"]);
-
- const shapeDef = this.root.shapeDefinitionMgr.getShapeFromShortKey(shape);
- const shapeCanvas = shapeDef.generateAsCanvas(120);
- shapeCanvas.classList.add();
- container.appendChild(shapeCanvas);
-
- const progressContainer = makeDiv(container, null, ["amount"]);
- const progressBar = document.createElement("label");
- progressBar.classList.add("progressBar");
- progressContainer.appendChild(progressBar);
-
- const progressLabel = document.createElement("label");
- progressContainer.appendChild(progressLabel);
-
- const pinButton = document.createElement("button");
- pinButton.classList.add("pin");
- container.appendChild(pinButton);
-
- const viewInfoButton = document.createElement("button");
- viewInfoButton.classList.add("showInfo");
- container.appendChild(viewInfoButton);
-
- const currentGoalShape = this.root.hubGoals.currentGoal.definition.getHash();
- if (shape === currentGoalShape) {
- pinButton.classList.add("isGoal");
- } else if (this.root.hud.parts.pinnedShapes.isShapePinned(shape)) {
- pinButton.classList.add("alreadyPinned");
- }
-
- const pinDetector = new ClickDetector(pinButton, {
- consumeEvents: true,
- preventDefault: true,
- });
- pinDetector.click.add(() => {
- if (this.root.hud.parts.pinnedShapes.isShapePinned(shape)) {
- this.root.hud.signals.shapeUnpinRequested.dispatch(shape);
- pinButton.classList.add("unpinned");
- pinButton.classList.remove("pinned", "alreadyPinned");
- } else {
- this.root.hud.signals.shapePinRequested.dispatch(shapeDef);
- pinButton.classList.add("pinned");
- pinButton.classList.remove("unpinned");
- }
- });
-
- const infoDetector = new ClickDetector(viewInfoButton, {
- consumeEvents: true,
- preventDefault: true,
- });
- infoDetector.click.add(() =>
- this.root.hud.signals.viewShapeDetailsRequested.dispatch(shapeDef)
- );
-
- handle.requireIndexToElement.push({
- container,
- progressLabel,
- progressBar,
- definition: shapeDef,
- required: amount,
- pinDetector,
- infoDetector,
- });
- });
- }
- }
-
- renderCountsAndStatus() {
- for (const upgradeId in this.upgradeToElements) {
- const handle = this.upgradeToElements[upgradeId];
- for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
- const { progressLabel, progressBar, definition, required } = handle.requireIndexToElement[i];
-
- const haveAmount = this.root.hubGoals.getShapesStored(definition);
- const progress = Math.min(haveAmount / required, 1.0);
-
- progressLabel.innerText = formatBigNumber(haveAmount) + " / " + formatBigNumber(required);
- progressBar.style.width = progress * 100.0 + "%";
- progressBar.classList.toggle("complete", progress >= 1.0);
- }
-
- handle.buyButton.classList.toggle("buyable", this.root.hubGoals.canUnlockUpgrade(upgradeId));
- }
- }
-
- initialize() {
- this.domAttach = new DynamicDomAttach(this.root, this.background, {
- attachClass: "visible",
- });
-
- this.inputReciever = new InputReceiver("shop");
- this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
-
- this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
- this.keyActionMapper.getBinding(KEYMAPPINGS.ingame.menuClose).add(this.close, this);
- this.keyActionMapper.getBinding(KEYMAPPINGS.ingame.menuOpenShop).add(this.close, this);
-
- this.close();
-
- this.rerenderFull();
- this.root.signals.upgradePurchased.add(this.rerenderFull, this);
- }
-
- cleanup() {
- document.body.classList.remove("ingameDialogOpen");
-
- // Cleanup detectors
- for (const upgradeId in this.upgradeToElements) {
- const handle = this.upgradeToElements[upgradeId];
- for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
- const requiredHandle = handle.requireIndexToElement[i];
- requiredHandle.container.remove();
- requiredHandle.pinDetector.cleanup();
- requiredHandle.infoDetector.cleanup();
- }
- handle.requireIndexToElement = [];
- }
- }
-
- show() {
- this.visible = true;
- document.body.classList.add("ingameDialogOpen");
- // this.background.classList.add("visible");
- this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
- this.rerenderFull();
- }
-
- close() {
- this.visible = false;
- document.body.classList.remove("ingameDialogOpen");
- this.root.app.inputMgr.makeSureDetached(this.inputReciever);
- this.update();
- }
-
- update() {
- this.domAttach.update(this.visible);
- if (this.visible) {
- this.renderCountsAndStatus();
- }
- }
-
- tryUnlockNextTier(upgradeId) {
- // Nothing
- this.root.hubGoals.tryUnlockUpgrade(upgradeId);
- }
-}
+import { ClickDetector } from "../../../core/click_detector";
+import { InputReceiver } from "../../../core/input_receiver";
+import { formatBigNumber, getRomanNumber, makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+export class HUDShop extends BaseHUDPart {
+ createElements(parent) {
+ this.background = makeDiv(parent, "ingame_HUD_Shop", ["ingameDialog"]);
+
+ // DIALOG Inner / Wrapper
+ this.dialogInner = makeDiv(this.background, null, ["dialogInner"]);
+ this.title = makeDiv(this.dialogInner, null, ["title"], T.ingame.shop.title);
+ this.closeButton = makeDiv(this.title, null, ["closeButton"]);
+ this.trackClicks(this.closeButton, this.close);
+ this.contentDiv = makeDiv(this.dialogInner, null, ["content"]);
+
+ this.upgradeToElements = {};
+
+ // Upgrades
+ for (const upgradeId in this.root.gameMode.getUpgrades()) {
+ const handle = {};
+ handle.requireIndexToElement = [];
+
+ // Wrapper
+ handle.elem = makeDiv(this.contentDiv, null, ["upgrade"]);
+ handle.elem.setAttribute("data-upgrade-id", upgradeId);
+
+ // Title
+ const title = makeDiv(handle.elem, null, ["title"], T.shopUpgrades[upgradeId].name);
+
+ // Title > Tier
+ handle.elemTierLabel = makeDiv(title, null, ["tier"]);
+
+ // Icon
+ handle.icon = makeDiv(handle.elem, null, ["icon"]);
+ handle.icon.setAttribute("data-icon", "upgrades/" + upgradeId + ".png");
+
+ // Description
+ handle.elemDescription = makeDiv(handle.elem, null, ["description"], "??");
+ handle.elemRequirements = makeDiv(handle.elem, null, ["requirements"]);
+
+ // Buy button
+ handle.buyButton = document.createElement("button");
+ handle.buyButton.classList.add("buy", "styledButton");
+ handle.buyButton.innerText = T.ingame.shop.buttonUnlock;
+ handle.elem.appendChild(handle.buyButton);
+
+ this.trackClicks(handle.buyButton, () => this.tryUnlockNextTier(upgradeId));
+
+ // Assign handle
+ this.upgradeToElements[upgradeId] = handle;
+ }
+ }
+
+ rerenderFull() {
+ for (const upgradeId in this.upgradeToElements) {
+ const handle = this.upgradeToElements[upgradeId];
+ const upgradeTiers = this.root.gameMode.getUpgrades()[upgradeId];
+
+ const currentTier = this.root.hubGoals.getUpgradeLevel(upgradeId);
+ const currentTierMultiplier = this.root.hubGoals.upgradeImprovements[upgradeId];
+ const tierHandle = upgradeTiers[currentTier];
+
+ // Set tier
+ handle.elemTierLabel.innerText = T.ingame.shop.tier.replace(
+ "",
+ getRomanNumber(currentTier + 1)
+ );
+
+ handle.elemTierLabel.setAttribute("data-tier", currentTier);
+
+ // Cleanup detectors
+ for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
+ const requiredHandle = handle.requireIndexToElement[i];
+ requiredHandle.container.remove();
+ requiredHandle.pinDetector.cleanup();
+ requiredHandle.infoDetector.cleanup();
+ }
+
+ // Cleanup
+ handle.requireIndexToElement = [];
+
+ handle.elem.classList.toggle("maxLevel", !tierHandle);
+
+ if (!tierHandle) {
+ // Max level
+ handle.elemDescription.innerText = T.ingame.shop.maximumLevel.replace(
+ "",
+ formatBigNumber(currentTierMultiplier)
+ );
+ continue;
+ }
+
+ // Set description
+ handle.elemDescription.innerText = T.shopUpgrades[upgradeId].description
+ .replace("", formatBigNumber(currentTierMultiplier))
+ .replace("", formatBigNumber(currentTierMultiplier + tierHandle.improvement));
+
+ tierHandle.required.forEach(({ shape, amount }) => {
+ const container = makeDiv(handle.elemRequirements, null, ["requirement"]);
+
+ const shapeDef = this.root.shapeDefinitionMgr.getShapeFromShortKey(shape);
+ const shapeCanvas = shapeDef.generateAsCanvas(120);
+ shapeCanvas.classList.add();
+ container.appendChild(shapeCanvas);
+
+ const progressContainer = makeDiv(container, null, ["amount"]);
+ const progressBar = document.createElement("label");
+ progressBar.classList.add("progressBar");
+ progressContainer.appendChild(progressBar);
+
+ const progressLabel = document.createElement("label");
+ progressContainer.appendChild(progressLabel);
+
+ const pinButton = document.createElement("button");
+ pinButton.classList.add("pin");
+ container.appendChild(pinButton);
+
+ const viewInfoButton = document.createElement("button");
+ viewInfoButton.classList.add("showInfo");
+ container.appendChild(viewInfoButton);
+
+ const currentGoalShape = this.root.hubGoals.currentGoal.definition.getHash();
+ if (shape === currentGoalShape) {
+ pinButton.classList.add("isGoal");
+ } else if (this.root.hud.parts.pinnedShapes.isShapePinned(shape)) {
+ pinButton.classList.add("alreadyPinned");
+ }
+
+ const pinDetector = new ClickDetector(pinButton, {
+ consumeEvents: true,
+ preventDefault: true,
+ });
+ pinDetector.click.add(() => {
+ if (this.root.hud.parts.pinnedShapes.isShapePinned(shape)) {
+ this.root.hud.signals.shapeUnpinRequested.dispatch(shape);
+ pinButton.classList.add("unpinned");
+ pinButton.classList.remove("pinned", "alreadyPinned");
+ } else {
+ this.root.hud.signals.shapePinRequested.dispatch(shapeDef);
+ pinButton.classList.add("pinned");
+ pinButton.classList.remove("unpinned");
+ }
+ });
+
+ const infoDetector = new ClickDetector(viewInfoButton, {
+ consumeEvents: true,
+ preventDefault: true,
+ });
+ infoDetector.click.add(() =>
+ this.root.hud.signals.viewShapeDetailsRequested.dispatch(shapeDef)
+ );
+
+ handle.requireIndexToElement.push({
+ container,
+ progressLabel,
+ progressBar,
+ definition: shapeDef,
+ required: amount,
+ pinDetector,
+ infoDetector,
+ });
+ });
+ }
+ }
+
+ renderCountsAndStatus() {
+ for (const upgradeId in this.upgradeToElements) {
+ const handle = this.upgradeToElements[upgradeId];
+ for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
+ const { progressLabel, progressBar, definition, required } = handle.requireIndexToElement[i];
+
+ const haveAmount = this.root.hubGoals.getShapesStored(definition);
+ const progress = Math.min(haveAmount / required, 1.0);
+
+ progressLabel.innerText = formatBigNumber(haveAmount) + " / " + formatBigNumber(required);
+ progressBar.style.width = progress * 100.0 + "%";
+ progressBar.classList.toggle("complete", progress >= 1.0);
+ }
+
+ handle.buyButton.classList.toggle("buyable", this.root.hubGoals.canUnlockUpgrade(upgradeId));
+ }
+ }
+
+ initialize() {
+ this.domAttach = new DynamicDomAttach(this.root, this.background, {
+ attachClass: "visible",
+ });
+
+ this.inputReciever = new InputReceiver("shop");
+ this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
+
+ this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
+ this.keyActionMapper.getBinding(KEYMAPPINGS.ingame.menuClose).add(this.close, this);
+ this.keyActionMapper.getBinding(KEYMAPPINGS.ingame.menuOpenShop).add(this.close, this);
+
+ this.close();
+
+ this.rerenderFull();
+ this.root.signals.upgradePurchased.add(this.rerenderFull, this);
+ }
+
+ cleanup() {
+ // Cleanup detectors
+ for (const upgradeId in this.upgradeToElements) {
+ const handle = this.upgradeToElements[upgradeId];
+ for (let i = 0; i < handle.requireIndexToElement.length; ++i) {
+ const requiredHandle = handle.requireIndexToElement[i];
+ requiredHandle.container.remove();
+ requiredHandle.pinDetector.cleanup();
+ requiredHandle.infoDetector.cleanup();
+ }
+ handle.requireIndexToElement = [];
+ }
+ }
+
+ show() {
+ this.visible = true;
+ this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
+ this.rerenderFull();
+ }
+
+ close() {
+ this.visible = false;
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ this.update();
+ }
+
+ update() {
+ this.domAttach.update(this.visible);
+ if (this.visible) {
+ this.renderCountsAndStatus();
+ }
+ }
+
+ tryUnlockNextTier(upgradeId) {
+ // Nothing
+ this.root.hubGoals.tryUnlockUpgrade(upgradeId);
+ }
+
+ isBlockingOverlay() {
+ return this.visible;
+ }
+}
diff --git a/src/js/game/hud/parts/standalone_advantages.js b/src/js/game/hud/parts/standalone_advantages.js
new file mode 100644
index 00000000..4e39e005
--- /dev/null
+++ b/src/js/game/hud/parts/standalone_advantages.js
@@ -0,0 +1,85 @@
+import { A_B_TESTING_LINK_TYPE, THIRDPARTY_URLS } from "../../../core/config";
+import { InputReceiver } from "../../../core/input_receiver";
+import { makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+const showIntervalSeconds = 30 * 60;
+
+export class HUDStandaloneAdvantages extends BaseHUDPart {
+ createElements(parent) {
+ this.background = makeDiv(parent, "ingame_HUD_StandaloneAdvantages", ["ingameDialog"]);
+
+ // DIALOG Inner / Wrapper
+ this.dialogInner = makeDiv(this.background, null, ["dialogInner"]);
+ this.title = makeDiv(this.dialogInner, null, ["title"], T.ingame.standaloneAdvantages.title);
+ this.contentDiv = makeDiv(
+ this.dialogInner,
+ null,
+ ["content"],
+ `
+
+ ${Object.entries(T.ingame.standaloneAdvantages.points)
+ .map(
+ ([key, trans]) => `
+
+
${trans.title}
+
${trans.desc}
+
`
+ )
+ .join("")}
+
+
+
+
+
+ ${T.ingame.standaloneAdvantages.no_thanks}
+
+ `
+ );
+
+ this.trackClicks(this.contentDiv.querySelector("button.steamLinkButton"), () => {
+ this.root.app.analytics.trackUiClick("standalone_advantage_visit_steam");
+ this.root.app.platformWrapper.openExternalLink(
+ THIRDPARTY_URLS.standaloneStorePage + "?ref=savs&prc=" + A_B_TESTING_LINK_TYPE
+ );
+ this.close();
+ });
+ this.trackClicks(this.contentDiv.querySelector("button.otherCloseButton"), () => {
+ this.root.app.analytics.trackUiClick("standalone_advantage_no_thanks");
+ this.close();
+ });
+ }
+
+ initialize() {
+ this.domAttach = new DynamicDomAttach(this.root, this.background, {
+ attachClass: "visible",
+ });
+
+ this.inputReciever = new InputReceiver("standalone-advantages");
+ this.close();
+
+ this.lastShown = this.root.gameIsFresh ? this.root.time.now() : 0;
+ }
+
+ show() {
+ this.lastShown = this.root.time.now();
+ this.visible = true;
+ this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
+ }
+
+ close() {
+ this.visible = false;
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ this.update();
+ }
+
+ update() {
+ if (!this.visible && this.root.time.now() - this.lastShown > showIntervalSeconds) {
+ this.show();
+ }
+
+ this.domAttach.update(this.visible);
+ }
+}
diff --git a/src/js/game/hud/parts/statistics.js b/src/js/game/hud/parts/statistics.js
index c5136312..a28ed288 100644
--- a/src/js/game/hud/parts/statistics.js
+++ b/src/js/game/hud/parts/statistics.js
@@ -4,7 +4,7 @@ import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
import { enumAnalyticsDataSource } from "../../production_analytics";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { enumDisplayMode, HUDShapeStatisticsHandle } from "./statistics_handle";
+import { enumDisplayMode, HUDShapeStatisticsHandle, statisticsUnitsSeconds } from "./statistics_handle";
import { T } from "../../../translations";
/**
@@ -47,10 +47,12 @@ export class HUDStatistics extends BaseHUDPart {
this.trackClicks(button, () => this.setDataSource(dataSource));
}
+ const buttonIterateUnit = makeButton(this.filtersDisplayMode, ["displayIterateUnit"]);
const buttonDisplaySorted = makeButton(this.filtersDisplayMode, ["displaySorted"]);
const buttonDisplayDetailed = makeButton(this.filtersDisplayMode, ["displayDetailed"]);
const buttonDisplayIcons = makeButton(this.filtersDisplayMode, ["displayIcons"]);
+ this.trackClicks(buttonIterateUnit, () => this.iterateUnit());
this.trackClicks(buttonDisplaySorted, () => this.toggleSorted());
this.trackClicks(buttonDisplayIcons, () => this.setDisplayMode(enumDisplayMode.icons));
this.trackClicks(buttonDisplayDetailed, () => this.setDisplayMode(enumDisplayMode.detailed));
@@ -97,6 +99,17 @@ export class HUDStatistics extends BaseHUDPart {
this.setSorted(!this.sorted);
}
+ /**
+ * Chooses the next unit
+ */
+ iterateUnit() {
+ const units = Array.from(Object.keys(statisticsUnitsSeconds));
+ const newIndex = (units.indexOf(this.currentUnit) + 1) % units.length;
+ this.currentUnit = units[newIndex];
+
+ this.rerenderPartial();
+ }
+
initialize() {
this.domAttach = new DynamicDomAttach(this.root, this.background, {
attachClass: "visible",
@@ -112,6 +125,8 @@ export class HUDStatistics extends BaseHUDPart {
/** @type {Object.} */
this.activeHandles = {};
+ this.currentUnit = "second";
+
this.setSorted(true);
this.setDataSource(enumAnalyticsDataSource.produced);
this.setDisplayMode(enumDisplayMode.detailed);
@@ -136,13 +151,12 @@ export class HUDStatistics extends BaseHUDPart {
}
}
- cleanup() {
- document.body.classList.remove("ingameDialogOpen");
+ isBlockingOverlay() {
+ return this.visible;
}
show() {
this.visible = true;
- document.body.classList.add("ingameDialogOpen");
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
this.rerenderFull();
this.update();
@@ -150,7 +164,6 @@ export class HUDStatistics extends BaseHUDPart {
close() {
this.visible = false;
- document.body.classList.remove("ingameDialogOpen");
this.root.app.inputMgr.makeSureDetached(this.inputReciever);
this.update();
}
@@ -173,7 +186,7 @@ export class HUDStatistics extends BaseHUDPart {
rerenderPartial() {
for (const key in this.activeHandles) {
const handle = this.activeHandles[key];
- handle.update(this.displayMode, this.dataSource);
+ handle.update(this.displayMode, this.dataSource, this.currentUnit);
}
}
diff --git a/src/js/game/hud/parts/statistics_handle.js b/src/js/game/hud/parts/statistics_handle.js
index 6f49f8d3..a64a5f5b 100644
--- a/src/js/game/hud/parts/statistics_handle.js
+++ b/src/js/game/hud/parts/statistics_handle.js
@@ -12,6 +12,16 @@ export const enumDisplayMode = {
detailed: "detailed",
};
+/**
+ * Stores how many seconds one unit is
+ * @type {Object}
+ */
+export const statisticsUnitsSeconds = {
+ second: 1,
+ minute: 60,
+ hour: 3600,
+};
+
/**
* Simple wrapper for a shape definition within the shape statistics
*/
@@ -64,9 +74,10 @@ export class HUDShapeStatisticsHandle {
*
* @param {enumDisplayMode} displayMode
* @param {enumAnalyticsDataSource} dataSource
+ * @param {string} unit
* @param {boolean=} forced
*/
- update(displayMode, dataSource, forced = false) {
+ update(displayMode, dataSource, unit, forced = false) {
if (!this.element) {
return;
}
@@ -89,12 +100,12 @@ export class HUDShapeStatisticsHandle {
case enumAnalyticsDataSource.delivered:
case enumAnalyticsDataSource.produced: {
let rate =
- (this.root.productionAnalytics.getCurrentShapeRate(dataSource, this.definition) /
- globalConfig.analyticsSliceDurationSeconds) *
- 60;
- this.counter.innerText = T.ingame.statistics.shapesPerSecond.replace(
+ this.root.productionAnalytics.getCurrentShapeRate(dataSource, this.definition) /
+ globalConfig.analyticsSliceDurationSeconds;
+
+ this.counter.innerText = T.ingame.statistics.shapesDisplayUnits[unit].replace(
"",
- formatBigNumber(rate / 60)
+ formatBigNumber(rate * statisticsUnitsSeconds[unit])
);
break;
}
diff --git a/src/js/game/hud/parts/tutorial_hints.js b/src/js/game/hud/parts/tutorial_hints.js
index 428923d0..c9499f85 100644
--- a/src/js/game/hud/parts/tutorial_hints.js
+++ b/src/js/game/hud/parts/tutorial_hints.js
@@ -1,109 +1,106 @@
-import { InputReceiver } from "../../../core/input_receiver";
-import { TrackedState } from "../../../core/tracked_state";
-import { makeDiv } from "../../../core/utils";
-import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { T } from "../../../translations";
-
-const tutorialVideos = [2, 3, 4, 5, 6, 7, 9, 10, 11];
-
-export class HUDPartTutorialHints extends BaseHUDPart {
- createElements(parent) {
- this.element = makeDiv(
- parent,
- "ingame_HUD_TutorialHints",
- [],
- `
-
-
-
-
-
- `
- );
-
- this.videoElement = this.element.querySelector("video");
- }
-
- shouldPauseGame() {
- return this.enlarged;
- }
-
- initialize() {
- this.trackClicks(this.element.querySelector(".toggleHint"), this.toggleHintEnlarged);
-
- this.videoAttach = new DynamicDomAttach(this.root, this.videoElement, {
- timeToKeepSeconds: 0.3,
- });
-
- this.videoAttach.update(false);
- this.enlarged = false;
-
- this.inputReciever = new InputReceiver("tutorial_hints");
- this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
- this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
-
- this.domAttach = new DynamicDomAttach(this.root, this.element);
-
- this.currentShownLevel = new TrackedState(this.updateVideoUrl, this);
- }
-
- updateVideoUrl(level) {
- if (tutorialVideos.indexOf(level) < 0) {
- this.videoElement.querySelector("source").setAttribute("src", "");
- this.videoElement.pause();
- } else {
- this.videoElement
- .querySelector("source")
- .setAttribute("src", "https://static.shapez.io/tutorial_videos/level_" + level + ".webm");
- this.videoElement.currentTime = 0;
- this.videoElement.load();
- }
- }
-
- close() {
- this.enlarged = false;
- document.body.classList.remove("ingameDialogOpen");
- this.element.classList.remove("enlarged", "noBlur");
- this.root.app.inputMgr.makeSureDetached(this.inputReciever);
- this.update();
- }
-
- show() {
- this.root.app.analytics.trackUiClick("tutorial_hint_show");
- this.root.app.analytics.trackUiClick("tutorial_hint_show_lvl_" + this.root.hubGoals.level);
-
- document.body.classList.add("ingameDialogOpen");
- this.element.classList.add("enlarged", "noBlur");
- this.enlarged = true;
- this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
- this.update();
-
- this.videoElement.currentTime = 0;
- this.videoElement.play();
- }
-
- update() {
- this.videoAttach.update(this.enlarged);
-
- this.currentShownLevel.set(this.root.hubGoals.level);
-
- const tutorialVisible = tutorialVideos.indexOf(this.root.hubGoals.level) >= 0;
- this.domAttach.update(tutorialVisible);
- }
-
- toggleHintEnlarged() {
- if (this.enlarged) {
- this.close();
- } else {
- this.show();
- }
- }
-}
+import { InputReceiver } from "../../../core/input_receiver";
+import { TrackedState } from "../../../core/tracked_state";
+import { makeDiv } from "../../../core/utils";
+import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { T } from "../../../translations";
+
+const tutorialVideos = [2, 3, 4, 5, 6, 7, 9, 10, 11];
+
+export class HUDPartTutorialHints extends BaseHUDPart {
+ createElements(parent) {
+ this.element = makeDiv(
+ parent,
+ "ingame_HUD_TutorialHints",
+ [],
+ `
+
+
+
+
+
+ `
+ );
+
+ this.videoElement = this.element.querySelector("video");
+ }
+
+ shouldPauseGame() {
+ return this.enlarged;
+ }
+
+ initialize() {
+ this.trackClicks(this.element.querySelector(".toggleHint"), this.toggleHintEnlarged);
+
+ this.videoAttach = new DynamicDomAttach(this.root, this.videoElement, {
+ timeToKeepSeconds: 0.3,
+ });
+
+ this.videoAttach.update(false);
+ this.enlarged = false;
+
+ this.inputReciever = new InputReceiver("tutorial_hints");
+ this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
+ this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
+
+ this.domAttach = new DynamicDomAttach(this.root, this.element);
+
+ this.currentShownLevel = new TrackedState(this.updateVideoUrl, this);
+ }
+
+ updateVideoUrl(level) {
+ if (tutorialVideos.indexOf(level) < 0) {
+ this.videoElement.querySelector("source").setAttribute("src", "");
+ this.videoElement.pause();
+ } else {
+ this.videoElement
+ .querySelector("source")
+ .setAttribute("src", "https://static.shapez.io/tutorial_videos/level_" + level + ".webm");
+ this.videoElement.currentTime = 0;
+ this.videoElement.load();
+ }
+ }
+
+ close() {
+ this.enlarged = false;
+ this.element.classList.remove("enlarged", "noBlur");
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ this.update();
+ }
+
+ show() {
+ this.root.app.analytics.trackUiClick("tutorial_hint_show");
+ this.root.app.analytics.trackUiClick("tutorial_hint_show_lvl_" + this.root.hubGoals.level);
+ this.element.classList.add("enlarged", "noBlur");
+ this.enlarged = true;
+ this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
+ this.update();
+
+ this.videoElement.currentTime = 0;
+ this.videoElement.play();
+ }
+
+ update() {
+ this.videoAttach.update(this.enlarged);
+
+ this.currentShownLevel.set(this.root.hubGoals.level);
+
+ const tutorialVisible = tutorialVideos.indexOf(this.root.hubGoals.level) >= 0;
+ this.domAttach.update(tutorialVisible);
+ }
+
+ toggleHintEnlarged() {
+ if (this.enlarged) {
+ this.close();
+ } else {
+ this.show();
+ }
+ }
+}
diff --git a/src/js/game/hud/parts/tutorial_video_offer.js b/src/js/game/hud/parts/tutorial_video_offer.js
new file mode 100644
index 00000000..3cd2cb90
--- /dev/null
+++ b/src/js/game/hud/parts/tutorial_video_offer.js
@@ -0,0 +1,34 @@
+import { THIRDPARTY_URLS } from "../../../core/config";
+import { T } from "../../../translations";
+import { BaseHUDPart } from "../base_hud_part";
+
+/**
+ * Offers to open the tutorial video after completing a level
+ */
+export class HUDTutorialVideoOffer extends BaseHUDPart {
+ createElements() {}
+
+ initialize() {
+ this.root.hud.signals.unlockNotificationFinished.add(() => {
+ const level = this.root.hubGoals.level;
+ const tutorialVideoLink = THIRDPARTY_URLS.levelTutorialVideos[level];
+ if (tutorialVideoLink) {
+ const isForeign = this.root.app.settings.getLanguage() !== "en";
+ const dialogData = isForeign
+ ? T.dialogs.tutorialVideoAvailableForeignLanguage
+ : T.dialogs.tutorialVideoAvailable;
+
+ const { ok } = this.root.hud.parts.dialogs.showInfo(dialogData.title, dialogData.desc, [
+ "cancel:bad",
+ "ok:good",
+ ]);
+
+ this.root.app.analytics.trackUiClick("ingame_video_link_show_" + level);
+ ok.add(() => {
+ this.root.app.platformWrapper.openExternalLink(tutorialVideoLink);
+ this.root.app.analytics.trackUiClick("ingame_video_link_open_" + level);
+ });
+ }
+ });
+ }
+}
diff --git a/src/js/game/hud/parts/unlock_notification.js b/src/js/game/hud/parts/unlock_notification.js
index 7a5c923b..98549784 100644
--- a/src/js/game/hud/parts/unlock_notification.js
+++ b/src/js/game/hud/parts/unlock_notification.js
@@ -1,156 +1,174 @@
-import { globalConfig } from "../../../core/config";
-import { gMetaBuildingRegistry } from "../../../core/global_registries";
-import { makeDiv } from "../../../core/utils";
-import { SOUNDS } from "../../../platform/sound";
-import { T } from "../../../translations";
-import { defaultBuildingVariant } from "../../meta_building";
-import { enumHubGoalRewards } from "../../tutorial_goals";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { enumHubGoalRewardsToContentUnlocked } from "../../tutorial_goals_mappings";
-import { InputReceiver } from "../../../core/input_receiver";
-
-export class HUDUnlockNotification extends BaseHUDPart {
- initialize() {
- this.visible = false;
-
- this.domAttach = new DynamicDomAttach(this.root, this.element, {
- timeToKeepSeconds: 0,
- });
-
- if (!(G_IS_DEV && globalConfig.debug.disableUnlockDialog)) {
- this.root.signals.storyGoalCompleted.add(this.showForLevel, this);
- }
-
- this.buttonShowTimeout = null;
- }
-
- createElements(parent) {
- this.inputReciever = new InputReceiver("unlock-notification");
-
- this.element = makeDiv(parent, "ingame_HUD_UnlockNotification", ["noBlur"]);
-
- const dialog = makeDiv(this.element, null, ["dialog"]);
-
- this.elemTitle = makeDiv(dialog, null, ["title"]);
- this.elemSubTitle = makeDiv(dialog, null, ["subTitle"], T.ingame.levelCompleteNotification.completed);
-
- this.elemContents = makeDiv(dialog, null, ["contents"]);
-
- this.btnClose = document.createElement("button");
- this.btnClose.classList.add("close", "styledButton");
- this.btnClose.innerText = T.ingame.levelCompleteNotification.buttonNextLevel;
- dialog.appendChild(this.btnClose);
-
- this.trackClicks(this.btnClose, this.requestClose);
- }
-
- /**
- * @param {number} level
- * @param {enumHubGoalRewards} reward
- */
- showForLevel(level, reward) {
- this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
- this.elemTitle.innerText = T.ingame.levelCompleteNotification.levelTitle.replace(
- "",
- ("" + level).padStart(2, "0")
- );
-
- const rewardName = T.storyRewards[reward].title;
-
- let html = `
-
- ${T.ingame.levelCompleteNotification.unlockText.replace("", rewardName)}
-
-
-
- ${T.storyRewards[reward].desc}
-
-
- `;
-
- html += "";
- const gained = enumHubGoalRewardsToContentUnlocked[reward];
- if (gained) {
- gained.forEach(([metaBuildingClass, variant]) => {
- const metaBuilding = gMetaBuildingRegistry.findByClass(metaBuildingClass);
- html += `
`;
- });
- }
- html += "
";
-
- this.elemContents.innerHTML = html;
- this.visible = true;
- this.root.soundProxy.playUi(SOUNDS.levelComplete);
-
- if (this.buttonShowTimeout) {
- clearTimeout(this.buttonShowTimeout);
- }
-
- this.element.querySelector("button.close").classList.remove("unlocked");
-
- if (this.root.app.settings.getAllSettings().offerHints) {
- this.buttonShowTimeout = setTimeout(
- () => this.element.querySelector("button.close").classList.add("unlocked"),
- G_IS_DEV ? 100 : 5000
- );
- } else {
- this.element.querySelector("button.close").classList.add("unlocked");
- }
- }
-
- cleanup() {
- this.root.app.inputMgr.makeSureDetached(this.inputReciever);
- if (this.buttonShowTimeout) {
- clearTimeout(this.buttonShowTimeout);
- this.buttonShowTimeout = null;
- }
- }
-
- requestClose() {
- this.root.app.adProvider.showVideoAd().then(() => {
- this.close();
-
- if (!this.root.app.settings.getAllSettings().offerHints) {
- return;
- }
-
- if (this.root.hubGoals.level === 3) {
- const { showUpgrades } = this.root.hud.parts.dialogs.showInfo(
- T.dialogs.upgradesIntroduction.title,
- T.dialogs.upgradesIntroduction.desc,
- ["showUpgrades:good:timeout"]
- );
- showUpgrades.add(() => this.root.hud.parts.shop.show());
- }
-
- if (this.root.hubGoals.level === 5) {
- const { showKeybindings } = this.root.hud.parts.dialogs.showInfo(
- T.dialogs.keybindingsIntroduction.title,
- T.dialogs.keybindingsIntroduction.desc,
- ["showKeybindings:misc", "ok:good:timeout"]
- );
- showKeybindings.add(() => this.root.gameState.goToKeybindings());
- }
- });
- }
-
- close() {
- this.root.app.inputMgr.makeSureDetached(this.inputReciever);
- if (this.buttonShowTimeout) {
- clearTimeout(this.buttonShowTimeout);
- this.buttonShowTimeout = null;
- }
- this.visible = false;
- }
-
- update() {
- this.domAttach.update(this.visible);
- if (!this.visible && this.buttonShowTimeout) {
- clearTimeout(this.buttonShowTimeout);
- this.buttonShowTimeout = null;
- }
- }
-}
+import { globalConfig } from "../../../core/config";
+import { gMetaBuildingRegistry } from "../../../core/global_registries";
+import { InputReceiver } from "../../../core/input_receiver";
+import { makeDiv } from "../../../core/utils";
+import { SOUNDS } from "../../../platform/sound";
+import { T } from "../../../translations";
+import { defaultBuildingVariant } from "../../meta_building";
+import { enumHubGoalRewards } from "../../tutorial_goals";
+import { enumHubGoalRewardsToContentUnlocked } from "../../tutorial_goals_mappings";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { enumNotificationType } from "./notifications";
+
+export class HUDUnlockNotification extends BaseHUDPart {
+ initialize() {
+ this.visible = false;
+
+ this.domAttach = new DynamicDomAttach(this.root, this.element, {
+ timeToKeepSeconds: 0,
+ });
+
+ if (!(G_IS_DEV && globalConfig.debug.disableUnlockDialog)) {
+ this.root.signals.storyGoalCompleted.add(this.showForLevel, this);
+ }
+
+ this.buttonShowTimeout = null;
+ }
+
+ createElements(parent) {
+ this.inputReciever = new InputReceiver("unlock-notification");
+
+ this.element = makeDiv(parent, "ingame_HUD_UnlockNotification", ["noBlur"]);
+
+ const dialog = makeDiv(this.element, null, ["dialog"]);
+
+ this.elemTitle = makeDiv(dialog, null, ["title"]);
+ this.elemSubTitle = makeDiv(dialog, null, ["subTitle"], T.ingame.levelCompleteNotification.completed);
+
+ this.elemContents = makeDiv(dialog, null, ["contents"]);
+
+ this.btnClose = document.createElement("button");
+ this.btnClose.classList.add("close", "styledButton");
+ this.btnClose.innerText = T.ingame.levelCompleteNotification.buttonNextLevel;
+ dialog.appendChild(this.btnClose);
+
+ this.trackClicks(this.btnClose, this.requestClose);
+ }
+
+ /**
+ * @param {number} level
+ * @param {enumHubGoalRewards} reward
+ */
+ showForLevel(level, reward) {
+ this.root.soundProxy.playUi(SOUNDS.levelComplete);
+
+ const levels = this.root.gameMode.getLevelDefinitions();
+ // Don't use getIsFreeplay() because we want the freeplay level up to show
+ if (level > levels.length) {
+ this.root.hud.signals.notification.dispatch(
+ T.ingame.notifications.freeplayLevelComplete.replace("", String(level)),
+ enumNotificationType.success
+ );
+ return;
+ }
+
+ this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
+ this.elemTitle.innerText = T.ingame.levelCompleteNotification.levelTitle.replace(
+ "",
+ ("" + level).padStart(2, "0")
+ );
+
+ const rewardName = T.storyRewards[reward].title;
+
+ let html = `
+
+ ${T.ingame.levelCompleteNotification.unlockText.replace("", rewardName)}
+
+
+
+ ${T.storyRewards[reward].desc}
+
+
+ `;
+
+ html += "";
+ const gained = enumHubGoalRewardsToContentUnlocked[reward];
+ if (gained) {
+ gained.forEach(([metaBuildingClass, variant]) => {
+ const metaBuilding = gMetaBuildingRegistry.findByClass(metaBuildingClass);
+ html += `
`;
+ });
+ }
+ html += "
";
+
+ this.elemContents.innerHTML = html;
+ this.visible = true;
+
+ if (this.buttonShowTimeout) {
+ clearTimeout(this.buttonShowTimeout);
+ }
+
+ this.element.querySelector("button.close").classList.remove("unlocked");
+
+ if (this.root.app.settings.getAllSettings().offerHints) {
+ this.buttonShowTimeout = setTimeout(
+ () => this.element.querySelector("button.close").classList.add("unlocked"),
+ G_IS_DEV ? 100 : 5000
+ );
+ } else {
+ this.element.querySelector("button.close").classList.add("unlocked");
+ }
+ }
+
+ cleanup() {
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ if (this.buttonShowTimeout) {
+ clearTimeout(this.buttonShowTimeout);
+ this.buttonShowTimeout = null;
+ }
+ }
+
+ isBlockingOverlay() {
+ return this.visible;
+ }
+
+ requestClose() {
+ this.root.app.adProvider.showVideoAd().then(() => {
+ this.close();
+
+ this.root.hud.signals.unlockNotificationFinished.dispatch();
+
+ if (!this.root.app.settings.getAllSettings().offerHints) {
+ return;
+ }
+
+ if (this.root.hubGoals.level === 3) {
+ const { showUpgrades } = this.root.hud.parts.dialogs.showInfo(
+ T.dialogs.upgradesIntroduction.title,
+ T.dialogs.upgradesIntroduction.desc,
+ ["showUpgrades:good:timeout"]
+ );
+ showUpgrades.add(() => this.root.hud.parts.shop.show());
+ }
+
+ if (this.root.hubGoals.level === 5) {
+ const { showKeybindings } = this.root.hud.parts.dialogs.showInfo(
+ T.dialogs.keybindingsIntroduction.title,
+ T.dialogs.keybindingsIntroduction.desc,
+ ["showKeybindings:misc", "ok:good:timeout"]
+ );
+ showKeybindings.add(() => this.root.gameState.goToKeybindings());
+ }
+ });
+ }
+
+ close() {
+ this.root.app.inputMgr.makeSureDetached(this.inputReciever);
+ if (this.buttonShowTimeout) {
+ clearTimeout(this.buttonShowTimeout);
+ this.buttonShowTimeout = null;
+ }
+ this.visible = false;
+ }
+
+ update() {
+ this.domAttach.update(this.visible);
+ if (!this.visible && this.buttonShowTimeout) {
+ clearTimeout(this.buttonShowTimeout);
+ this.buttonShowTimeout = null;
+ }
+ }
+}
diff --git a/src/js/game/hud/parts/watermark.js b/src/js/game/hud/parts/watermark.js
index d10bc07c..4a75ea76 100644
--- a/src/js/game/hud/parts/watermark.js
+++ b/src/js/game/hud/parts/watermark.js
@@ -1,44 +1,72 @@
-import { BaseHUDPart } from "../base_hud_part";
-import { DrawParameters } from "../../../core/draw_parameters";
-import { makeDiv } from "../../../core/utils";
-import { THIRDPARTY_URLS } from "../../../core/config";
-import { T } from "../../../translations";
-
-export class HUDWatermark extends BaseHUDPart {
- createElements(parent) {
- this.element = makeDiv(parent, "ingame_HUD_Watermark");
- }
-
- initialize() {
- this.trackClicks(this.element, this.onWatermarkClick);
- }
-
- onWatermarkClick() {
- this.root.app.analytics.trackUiClick("watermark_click_2");
- this.root.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.standaloneStorePage);
- }
-
- /**
- *
- * @param {DrawParameters} parameters
- */
- drawOverlays(parameters) {
- const w = this.root.gameWidth;
- const x = 280 * this.root.app.getEffectiveUiScale();
-
- parameters.context.fillStyle = "#f77";
- parameters.context.font = "bold " + this.root.app.getEffectiveUiScale() * 17 + "px GameFont";
- // parameters.context.textAlign = "center";
- parameters.context.fillText(
- T.demoBanners.title.toUpperCase(),
- x,
- this.root.app.getEffectiveUiScale() * 27
- );
-
- parameters.context.font = "bold " + this.root.app.getEffectiveUiScale() * 12 + "px GameFont";
- // parameters.context.textAlign = "center";
- parameters.context.fillText(T.demoBanners.intro, x, this.root.app.getEffectiveUiScale() * 45);
-
- // parameters.context.textAlign = "left";
- }
-}
+import { THIRDPARTY_URLS } from "../../../core/config";
+import { makeDiv } from "../../../core/utils";
+import { T } from "../../../translations";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+
+const watermarkShowIntervalSeconds = G_IS_DEV ? 120 : 7 * 60;
+const watermarkShowDuration = 5;
+
+export class HUDWatermark extends BaseHUDPart {
+ createElements(parent) {
+ this.element = makeDiv(
+ parent,
+ "ingame_HUD_Watermark",
+ [],
+ `
+ ${T.ingame.watermark.title}
+ ${T.ingame.watermark.desc}
+ `
+ );
+
+ this.linkElement = makeDiv(
+ parent,
+ "ingame_HUD_WatermarkClicker",
+ [],
+ T.ingame.watermark.get_on_steam
+ );
+ this.trackClicks(this.linkElement, () => {
+ this.root.app.analytics.trackUiClick("watermark_click_2_direct");
+ this.root.app.platformWrapper.openExternalLink(THIRDPARTY_URLS.standaloneStorePage + "?ref=wtmd");
+ });
+ }
+
+ initialize() {
+ this.trackClicks(this.element, this.onWatermarkClick);
+
+ this.domAttach = new DynamicDomAttach(this.root, this.element, {
+ attachClass: "visible",
+ timeToKeepSeconds: 0.5,
+ });
+ }
+
+ update() {
+ this.domAttach.update(
+ this.root.time.realtimeNow() % watermarkShowIntervalSeconds < watermarkShowDuration
+ );
+ }
+
+ onWatermarkClick() {
+ this.root.app.analytics.trackUiClick("watermark_click_2_new");
+ this.root.hud.parts.standaloneAdvantages.show();
+ }
+
+ /**
+ *
+ * @param {import("../../../core/draw_utils").DrawParameters} parameters
+ */
+ drawOverlays(parameters) {
+ const w = this.root.gameWidth;
+
+ parameters.context.fillStyle = "rgba(230, 230, 230, 0.9)";
+ parameters.context.font = "bold " + this.root.app.getEffectiveUiScale() * 40 + "px GameFont";
+ parameters.context.textAlign = "center";
+ parameters.context.fillText(
+ T.demoBanners.title.toUpperCase(),
+ w / 2,
+ this.root.app.getEffectiveUiScale() * 50
+ );
+
+ parameters.context.textAlign = "left";
+ }
+}
diff --git a/src/js/game/hud/parts/waypoints.js b/src/js/game/hud/parts/waypoints.js
index abf05b1f..a6f37b93 100644
--- a/src/js/game/hud/parts/waypoints.js
+++ b/src/js/game/hud/parts/waypoints.js
@@ -1,627 +1,630 @@
-import { makeOffscreenBuffer } from "../../../core/buffer_utils";
-import { globalConfig, IS_DEMO } from "../../../core/config";
-import { DrawParameters } from "../../../core/draw_parameters";
-import { Loader } from "../../../core/loader";
-import { DialogWithForm } from "../../../core/modal_dialog_elements";
-import { FormElementInput } from "../../../core/modal_dialog_forms";
-import { Rectangle } from "../../../core/rectangle";
-import { STOP_PROPAGATION } from "../../../core/signal";
-import { arrayDeleteValue, lerp, makeDiv, removeAllChildren, clamp } from "../../../core/utils";
-import { Vector } from "../../../core/vector";
-import { T } from "../../../translations";
-import { enumMouseButton } from "../../camera";
-import { KEYMAPPINGS } from "../../key_action_mapper";
-import { BaseHUDPart } from "../base_hud_part";
-import { DynamicDomAttach } from "../dynamic_dom_attach";
-import { enumNotificationType } from "./notifications";
-import { ShapeDefinition } from "../../shape_definition";
-import { BaseItem } from "../../base_item";
-import { ShapeItem } from "../../items/shape_item";
-
-/** @typedef {{
- * label: string | null,
- * center: { x: number, y: number },
- * zoomLevel: number
- * }} Waypoint */
-
-/**
- * Used when a shape icon is rendered instead
- */
-const MAX_LABEL_LENGTH = 71;
-
-export class HUDWaypoints extends BaseHUDPart {
- /**
- * Creates the overview of waypoints
- * @param {HTMLElement} parent
- */
- createElements(parent) {
- // Create the helper box on the lower right when zooming out
- if (this.root.app.settings.getAllSettings().offerHints) {
- this.hintElement = makeDiv(
- parent,
- "ingame_HUD_Waypoints_Hint",
- [],
- `
- ${T.ingame.waypoints.waypoints}
- ${T.ingame.waypoints.description.replace(
- "",
- `${this.root.keyMapper
- .getBinding(KEYMAPPINGS.navigation.createMarker)
- .getKeyCodeString()}`
- )}
- `
- );
- }
-
- // Create the waypoint list on the upper right
- this.waypointsListElement = makeDiv(parent, "ingame_HUD_Waypoints", [], "Waypoints");
- }
-
- /**
- * Serializes the waypoints
- */
- serialize() {
- return {
- waypoints: this.waypoints,
- };
- }
-
- /**
- * Deserializes the waypoints
- * @param {{waypoints: Array}} data
- */
- deserialize(data) {
- if (!data || !data.waypoints || !Array.isArray(data.waypoints)) {
- return "Invalid waypoints data";
- }
- this.waypoints = data.waypoints;
- this.rerenderWaypointList();
- }
-
- /**
- * Initializes everything
- */
- initialize() {
- // Cache the sprite for the waypoints
- this.waypointSprite = Loader.getSprite("sprites/misc/waypoint.png");
- this.directionIndicatorSprite = Loader.getSprite("sprites/misc/hub_direction_indicator.png");
-
- /** @type {Array}
- */
- this.waypoints = [
- {
- label: null,
- center: { x: 0, y: 0 },
- zoomLevel: 3,
- },
- ];
-
- // Create a buffer we can use to measure text
- this.dummyBuffer = makeOffscreenBuffer(1, 1, {
- reusable: false,
- label: "waypoints-measure-canvas",
- })[1];
-
- // Dynamically attach/detach the lower right hint in the map overview
- if (this.hintElement) {
- this.domAttach = new DynamicDomAttach(this.root, this.hintElement);
- }
-
- // Catch mouse and key events
- this.root.camera.downPreHandler.add(this.onMouseDown, this);
- this.root.keyMapper
- .getBinding(KEYMAPPINGS.navigation.createMarker)
- .add(() => this.requestSaveMarker({}));
-
- /**
- * Stores at how much opacity the markers should be rendered on the map.
- * This is interpolated over multiple frames so we have some sort of fade effect
- */
- this.currentMarkerOpacity = 1;
- this.currentCompassOpacity = 0;
-
- // Create buffer which is used to indicate the hub direction
- const [canvas, context] = makeOffscreenBuffer(48, 48, {
- smooth: true,
- reusable: false,
- label: "waypoints-compass",
- });
- this.compassBuffer = { canvas, context };
-
- /**
- * Stores a cache from a shape short key to its canvas representation
- */
- this.cachedKeyToCanvas = {};
-
- /**
- * Store cached text widths
- * @type {Object}
- */
- this.cachedTextWidths = {};
-
- // Initial render
- this.rerenderWaypointList();
- }
-
- /**
- * Returns how long a text will be rendered
- * @param {string} text
- * @returns {number}
- */
- getTextWidth(text) {
- if (this.cachedTextWidths[text]) {
- return this.cachedTextWidths[text];
- }
-
- this.dummyBuffer.font = "bold " + this.getTextScale() + "px GameFont";
- return (this.cachedTextWidths[text] = this.dummyBuffer.measureText(text).width);
- }
-
- /**
- * Returns how big the text should be rendered
- */
- getTextScale() {
- return this.getWaypointUiScale() * 12;
- }
-
- /**
- * Returns the scale for rendering waypoints
- */
- getWaypointUiScale() {
- return this.root.app.getEffectiveUiScale();
- }
-
- /**
- * Re-renders the waypoint list to account for changes
- */
- rerenderWaypointList() {
- removeAllChildren(this.waypointsListElement);
- this.cleanupClickDetectors();
-
- for (let i = 0; i < this.waypoints.length; ++i) {
- const waypoint = this.waypoints[i];
- const label = this.getWaypointLabel(waypoint);
-
- const element = makeDiv(this.waypointsListElement, null, ["waypoint"]);
-
- if (ShapeDefinition.isValidShortKey(label)) {
- const canvas = this.getWaypointCanvas(waypoint);
- /**
- * Create a clone of the cached canvas, as calling appendElement when a canvas is
- * already in the document will move the existing canvas to the new position.
- */
- const [newCanvas, context] = makeOffscreenBuffer(48, 48, {
- smooth: true,
- label: label + "-waypoint-" + i,
- });
- context.drawImage(canvas, 0, 0);
- element.appendChild(newCanvas);
- element.classList.add("shapeIcon");
- } else {
- element.innerText = label;
- }
-
- if (this.isWaypointDeletable(waypoint)) {
- const editButton = makeDiv(element, null, ["editButton"]);
- this.trackClicks(editButton, () => this.requestSaveMarker({ waypoint }));
- }
-
- if (!waypoint.label) {
- // This must be the hub label
- element.classList.add("hub");
- element.insertBefore(this.compassBuffer.canvas, element.childNodes[0]);
- }
-
- this.trackClicks(element, () => this.moveToWaypoint(waypoint), {
- targetOnly: true,
- });
- }
- }
-
- /**
- * Moves the camera to a given waypoint
- * @param {Waypoint} waypoint
- */
- moveToWaypoint(waypoint) {
- this.root.camera.setDesiredCenter(new Vector(waypoint.center.x, waypoint.center.y));
- this.root.camera.setDesiredZoom(waypoint.zoomLevel);
- }
-
- /**
- * Deletes a waypoint from the list
- * @param {Waypoint} waypoint
- */
- deleteWaypoint(waypoint) {
- arrayDeleteValue(this.waypoints, waypoint);
- this.rerenderWaypointList();
- }
-
- /**
- * Gets the canvas for a given waypoint
- * @param {Waypoint} waypoint
- * @returns {HTMLCanvasElement}
- */
- getWaypointCanvas(waypoint) {
- const key = waypoint.label;
- if (this.cachedKeyToCanvas[key]) {
- return this.cachedKeyToCanvas[key];
- }
-
- assert(ShapeDefinition.isValidShortKey(key), "Invalid short key: " + key);
- const definition = this.root.shapeDefinitionMgr.getShapeFromShortKey(key);
- const preRendered = definition.generateAsCanvas(48);
- return (this.cachedKeyToCanvas[key] = preRendered);
- }
-
- /**
- * Requests to save a marker at the current camera position. If worldPos is set,
- * uses that position instead.
- * @param {object} param0
- * @param {Vector=} param0.worldPos Override the world pos, otherwise it is the camera position
- * @param {Waypoint=} param0.waypoint Waypoint to be edited. If omitted, create new
- */
- requestSaveMarker({ worldPos = null, waypoint = null }) {
- // Construct dialog with input field
- const markerNameInput = new FormElementInput({
- id: "markerName",
- label: null,
- placeholder: "",
- defaultValue: waypoint ? waypoint.label : "",
- validator: val =>
- val.length > 0 && (val.length < MAX_LABEL_LENGTH || ShapeDefinition.isValidShortKey(val)),
- });
- const dialog = new DialogWithForm({
- app: this.root.app,
- title: waypoint ? T.dialogs.createMarker.titleEdit : T.dialogs.createMarker.title,
- desc: T.dialogs.createMarker.desc,
- formElements: [markerNameInput],
- buttons: waypoint ? ["delete:bad", "cancel", "ok:good"] : ["cancel", "ok:good"],
- });
- this.root.hud.parts.dialogs.internalShowDialog(dialog);
-
- // Edit marker
- if (waypoint) {
- dialog.buttonSignals.ok.add(() => {
- // Actually rename the waypoint
- this.renameWaypoint(waypoint, markerNameInput.getValue());
- });
- dialog.buttonSignals.delete.add(() => {
- // Actually delete the waypoint
- this.deleteWaypoint(waypoint);
- });
- } else {
- // Compute where to create the marker
- const center = worldPos || this.root.camera.center;
-
- dialog.buttonSignals.ok.add(() => {
- // Show info that you can have only N markers in the demo,
- // actually show this *after* entering the name so you want the
- // standalone even more (I'm evil :P)
- if (IS_DEMO && this.waypoints.length > 2) {
- this.root.hud.parts.dialogs.showFeatureRestrictionInfo(
- "",
- T.dialogs.markerDemoLimit.desc
- );
- return;
- }
-
- // Actually create the waypoint
- this.addWaypoint(markerNameInput.getValue(), center);
- });
- }
- }
-
- /**
- * Adds a new waypoint at the given location with the given label
- * @param {string} label
- * @param {Vector} position
- */
- addWaypoint(label, position) {
- this.waypoints.push({
- label,
- center: { x: position.x, y: position.y },
- // Make sure the zoom is *just* a bit above the zoom level where the map overview
- // starts, so you always see all buildings
- zoomLevel: Math.max(this.root.camera.zoomLevel, globalConfig.mapChunkOverviewMinZoom + 0.05),
- });
-
- this.sortWaypoints();
-
- // Show notification about creation
- this.root.hud.signals.notification.dispatch(
- T.ingame.waypoints.creationSuccessNotification,
- enumNotificationType.success
- );
-
- // Re-render the list and thus add it
- this.rerenderWaypointList();
- }
-
- /**
- * Renames a waypoint with the given label
- * @param {Waypoint} waypoint
- * @param {string} label
- */
- renameWaypoint(waypoint, label) {
- waypoint.label = label;
-
- this.sortWaypoints();
-
- // Show notification about renamed
- this.root.hud.signals.notification.dispatch(
- T.ingame.waypoints.creationSuccessNotification,
- enumNotificationType.success
- );
-
- // Re-render the list and thus add it
- this.rerenderWaypointList();
- }
-
- /**
- * Called every frame to update stuff
- */
- update() {
- if (this.domAttach) {
- this.domAttach.update(this.root.camera.getIsMapOverlayActive());
- }
- }
-
- /**
- * Sort waypoints by name
- */
- sortWaypoints() {
- this.waypoints.sort((a, b) => {
- if (!a.label) {
- return -1;
- }
- if (!b.label) {
- return 1;
- }
- return this.getWaypointLabel(a)
- .padEnd(MAX_LABEL_LENGTH, "0")
- .localeCompare(this.getWaypointLabel(b).padEnd(MAX_LABEL_LENGTH, "0"));
- });
- }
-
- /**
- * Returns the label for a given waypoint
- * @param {Waypoint} waypoint
- * @returns {string}
- */
- getWaypointLabel(waypoint) {
- return waypoint.label || T.ingame.waypoints.hub;
- }
-
- /**
- * Returns if a waypoint is deletable
- * @param {Waypoint} waypoint
- * @returns {boolean}
- */
- isWaypointDeletable(waypoint) {
- return waypoint.label !== null;
- }
-
- /**
- * Returns the screen space bounds of the given waypoint or null
- * if it couldn't be determined. Also returns wheter its a shape or not
- * @param {Waypoint} waypoint
- * @return {{
- * screenBounds: Rectangle
- * item: BaseItem|null,
- * text: string
- * }}
- */
- getWaypointScreenParams(waypoint) {
- if (!this.root.camera.getIsMapOverlayActive()) {
- return null;
- }
-
- // Find parameters
- const scale = this.getWaypointUiScale();
- const screenPos = this.root.camera.worldToScreen(new Vector(waypoint.center.x, waypoint.center.y));
-
- // Distinguish between text and item waypoints -> Figure out parameters
- const originalLabel = this.getWaypointLabel(waypoint);
- let text, item, textWidth;
-
- if (ShapeDefinition.isValidShortKey(originalLabel)) {
- // If the label is actually a key, render the shape icon
- item = this.root.shapeDefinitionMgr.getShapeItemFromShortKey(originalLabel);
- textWidth = 40;
- } else {
- // Otherwise render a regular waypoint
- text = originalLabel;
- textWidth = this.getTextWidth(text);
- }
-
- return {
- screenBounds: new Rectangle(
- screenPos.x - 7 * scale,
- screenPos.y - 12 * scale,
- 15 * scale + textWidth,
- 15 * scale
- ),
- item,
- text,
- };
- }
-
- /**
- * Finds the currently intersected waypoint on the map overview under
- * the cursor.
- *
- * @returns {Waypoint | null}
- */
- findCurrentIntersectedWaypoint() {
- const mousePos = this.root.app.mousePosition;
- if (!mousePos) {
- return;
- }
-
- for (let i = 0; i < this.waypoints.length; ++i) {
- const waypoint = this.waypoints[i];
- const params = this.getWaypointScreenParams(waypoint);
- if (params && params.screenBounds.containsPoint(mousePos.x, mousePos.y)) {
- return waypoint;
- }
- }
- }
-
- /**
- * Mouse-Down handler
- * @param {Vector} pos
- * @param {enumMouseButton} button
- */
- onMouseDown(pos, button) {
- const waypoint = this.findCurrentIntersectedWaypoint();
- if (waypoint) {
- if (button === enumMouseButton.left) {
- this.root.soundProxy.playUiClick();
- this.moveToWaypoint(waypoint);
- } else if (button === enumMouseButton.right) {
- if (this.isWaypointDeletable(waypoint)) {
- this.root.soundProxy.playUiClick();
- this.requestSaveMarker({ waypoint });
- } else {
- this.root.soundProxy.playUiError();
- }
- }
-
- return STOP_PROPAGATION;
- } else {
- // Allow right click to create a marker
- if (button === enumMouseButton.right) {
- if (this.root.camera.getIsMapOverlayActive()) {
- const worldPos = this.root.camera.screenToWorld(pos);
- this.requestSaveMarker({ worldPos });
- return STOP_PROPAGATION;
- }
- }
- }
- }
-
- /**
- * Rerenders the compass
- */
- rerenderWaypointsCompass() {
- const dims = 48;
- const indicatorSize = 30;
- const cameraPos = this.root.camera.center;
-
- const context = this.compassBuffer.context;
- context.clearRect(0, 0, dims, dims);
-
- const distanceToHub = cameraPos.length();
- const compassVisible = distanceToHub > (10 * globalConfig.tileSize) / this.root.camera.zoomLevel;
- const targetCompassAlpha = compassVisible ? 1 : 0;
-
- // Fade the compas in / out
- this.currentCompassOpacity = lerp(this.currentCompassOpacity, targetCompassAlpha, 0.08);
-
- // Render the compass
- if (this.currentCompassOpacity > 0.01) {
- context.globalAlpha = this.currentCompassOpacity;
- const angle = cameraPos.angle() + Math.radians(45) + Math.PI / 2;
- context.translate(dims / 2, dims / 2);
- context.rotate(angle);
- this.directionIndicatorSprite.drawCentered(context, 0, 0, indicatorSize);
- context.rotate(-angle);
- context.translate(-dims / 2, -dims / 2);
- context.globalAlpha = 1;
- }
-
- // Render the regualr icon
- const iconOpacity = 1 - this.currentCompassOpacity;
- if (iconOpacity > 0.01) {
- context.globalAlpha = iconOpacity;
- this.waypointSprite.drawCentered(context, dims / 2, dims / 2, dims * 0.7);
- context.globalAlpha = 1;
- }
- }
-
- /**
- * Draws the waypoints on the map
- * @param {DrawParameters} parameters
- */
- drawOverlays(parameters) {
- const mousePos = this.root.app.mousePosition;
- const desiredOpacity = this.root.camera.getIsMapOverlayActive() ? 1 : 0;
- this.currentMarkerOpacity = lerp(this.currentMarkerOpacity, desiredOpacity, 0.08);
-
- this.rerenderWaypointsCompass();
-
- // Don't render with low opacity
- if (this.currentMarkerOpacity < 0.01) {
- return;
- }
-
- // Determine rendering scale
- const scale = this.getWaypointUiScale();
-
- // Set the font size
- const textSize = this.getTextScale();
- parameters.context.font = "bold " + textSize + "px GameFont";
- parameters.context.textBaseline = "middle";
-
- // Loop over all waypoints
- for (let i = 0; i < this.waypoints.length; ++i) {
- const waypoint = this.waypoints[i];
-
- const waypointData = this.getWaypointScreenParams(waypoint);
- if (!waypointData) {
- // Not relevant
- continue;
- }
-
- if (!parameters.visibleRect.containsRect(waypointData.screenBounds)) {
- // Out of screen
- continue;
- }
-
- const bounds = waypointData.screenBounds;
- const contentPaddingX = 7 * scale;
- const isSelected = mousePos && bounds.containsPoint(mousePos.x, mousePos.y);
-
- // Render the background rectangle
- parameters.context.globalAlpha = this.currentMarkerOpacity * (isSelected ? 1 : 0.7);
- parameters.context.fillStyle = "rgba(255, 255, 255, 0.7)";
- parameters.context.fillRect(bounds.x, bounds.y, bounds.w, bounds.h);
-
- // Render the text
- if (waypointData.item) {
- const canvas = this.getWaypointCanvas(waypoint);
- const itemSize = 14 * scale;
- parameters.context.drawImage(
- canvas,
- bounds.x + contentPaddingX + 6 * scale,
- bounds.y + bounds.h / 2 - itemSize / 2,
- itemSize,
- itemSize
- );
- } else if (waypointData.text) {
- // Render the text
- parameters.context.fillStyle = "#000";
- parameters.context.textBaseline = "middle";
- parameters.context.fillText(
- waypointData.text,
- bounds.x + contentPaddingX + 6 * scale,
- bounds.y + bounds.h / 2
- );
- parameters.context.textBaseline = "alphabetic";
- } else {
- assertAlways(false, "Waypoint has no item and text");
- }
-
- // Render the small icon on the left
- this.waypointSprite.drawCentered(
- parameters.context,
- bounds.x + contentPaddingX,
- bounds.y + bounds.h / 2,
- bounds.h * 0.7
- );
- }
-
- parameters.context.textBaseline = "alphabetic";
- parameters.context.globalAlpha = 1;
- }
-}
+import { makeOffscreenBuffer } from "../../../core/buffer_utils";
+import { globalConfig, THIRDPARTY_URLS } from "../../../core/config";
+import { DrawParameters } from "../../../core/draw_parameters";
+import { Loader } from "../../../core/loader";
+import { DialogWithForm } from "../../../core/modal_dialog_elements";
+import { FormElementInput } from "../../../core/modal_dialog_forms";
+import { Rectangle } from "../../../core/rectangle";
+import { STOP_PROPAGATION } from "../../../core/signal";
+import {
+ arrayDeleteValue,
+ fillInLinkIntoTranslation,
+ lerp,
+ makeDiv,
+ removeAllChildren,
+} from "../../../core/utils";
+import { Vector } from "../../../core/vector";
+import { T } from "../../../translations";
+import { BaseItem } from "../../base_item";
+import { enumMouseButton } from "../../camera";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { ShapeDefinition } from "../../shape_definition";
+import { BaseHUDPart } from "../base_hud_part";
+import { DynamicDomAttach } from "../dynamic_dom_attach";
+import { enumNotificationType } from "./notifications";
+
+/** @typedef {{
+ * label: string | null,
+ * center: { x: number, y: number },
+ * zoomLevel: number
+ * }} Waypoint */
+
+/**
+ * Used when a shape icon is rendered instead
+ */
+const MAX_LABEL_LENGTH = 71;
+
+export class HUDWaypoints extends BaseHUDPart {
+ /**
+ * Creates the overview of waypoints
+ * @param {HTMLElement} parent
+ */
+ createElements(parent) {
+ // Create the helper box on the lower right when zooming out
+ if (this.root.app.settings.getAllSettings().offerHints) {
+ this.hintElement = makeDiv(
+ parent,
+ "ingame_HUD_Waypoints_Hint",
+ [],
+ `
+ ${T.ingame.waypoints.waypoints}
+ ${T.ingame.waypoints.description.replace(
+ "",
+ `${this.root.keyMapper
+ .getBinding(KEYMAPPINGS.navigation.createMarker)
+ .getKeyCodeString()}`
+ )}
+ `
+ );
+ }
+
+ // Create the waypoint list on the upper right
+ this.waypointsListElement = makeDiv(parent, "ingame_HUD_Waypoints", [], "Waypoints");
+ }
+
+ /**
+ * Serializes the waypoints
+ */
+ serialize() {
+ return {
+ waypoints: this.waypoints,
+ };
+ }
+
+ /**
+ * Deserializes the waypoints
+ * @param {{waypoints: Array}} data
+ */
+ deserialize(data) {
+ if (!data || !data.waypoints || !Array.isArray(data.waypoints)) {
+ return "Invalid waypoints data";
+ }
+ this.waypoints = data.waypoints;
+ this.rerenderWaypointList();
+ }
+
+ /**
+ * Initializes everything
+ */
+ initialize() {
+ // Cache the sprite for the waypoints
+ this.waypointSprite = Loader.getSprite("sprites/misc/waypoint.png");
+ this.directionIndicatorSprite = Loader.getSprite("sprites/misc/hub_direction_indicator.png");
+
+ /** @type {Array}
+ */
+ this.waypoints = [
+ {
+ label: null,
+ center: { x: 0, y: 0 },
+ zoomLevel: 3,
+ },
+ ];
+
+ // Create a buffer we can use to measure text
+ this.dummyBuffer = makeOffscreenBuffer(1, 1, {
+ reusable: false,
+ label: "waypoints-measure-canvas",
+ })[1];
+
+ // Dynamically attach/detach the lower right hint in the map overview
+ if (this.hintElement) {
+ this.domAttach = new DynamicDomAttach(this.root, this.hintElement);
+ }
+
+ // Catch mouse and key events
+ this.root.camera.downPreHandler.add(this.onMouseDown, this);
+ this.root.keyMapper
+ .getBinding(KEYMAPPINGS.navigation.createMarker)
+ .add(() => this.requestSaveMarker({}));
+
+ /**
+ * Stores at how much opacity the markers should be rendered on the map.
+ * This is interpolated over multiple frames so we have some sort of fade effect
+ */
+ this.currentMarkerOpacity = 1;
+ this.currentCompassOpacity = 0;
+
+ // Create buffer which is used to indicate the hub direction
+ const [canvas, context] = makeOffscreenBuffer(48, 48, {
+ smooth: true,
+ reusable: false,
+ label: "waypoints-compass",
+ });
+ this.compassBuffer = { canvas, context };
+
+ /**
+ * Stores a cache from a shape short key to its canvas representation
+ */
+ this.cachedKeyToCanvas = {};
+
+ /**
+ * Store cached text widths
+ * @type {Object}
+ */
+ this.cachedTextWidths = {};
+
+ // Initial render
+ this.rerenderWaypointList();
+ }
+
+ /**
+ * Returns how long a text will be rendered
+ * @param {string} text
+ * @returns {number}
+ */
+ getTextWidth(text) {
+ if (this.cachedTextWidths[text]) {
+ return this.cachedTextWidths[text];
+ }
+
+ this.dummyBuffer.font = "bold " + this.getTextScale() + "px GameFont";
+ return (this.cachedTextWidths[text] = this.dummyBuffer.measureText(text).width);
+ }
+
+ /**
+ * Returns how big the text should be rendered
+ */
+ getTextScale() {
+ return this.getWaypointUiScale() * 12;
+ }
+
+ /**
+ * Returns the scale for rendering waypoints
+ */
+ getWaypointUiScale() {
+ return this.root.app.getEffectiveUiScale();
+ }
+
+ /**
+ * Re-renders the waypoint list to account for changes
+ */
+ rerenderWaypointList() {
+ removeAllChildren(this.waypointsListElement);
+ this.cleanupClickDetectors();
+
+ for (let i = 0; i < this.waypoints.length; ++i) {
+ const waypoint = this.waypoints[i];
+ const label = this.getWaypointLabel(waypoint);
+
+ const element = makeDiv(this.waypointsListElement, null, ["waypoint"]);
+
+ if (ShapeDefinition.isValidShortKey(label)) {
+ const canvas = this.getWaypointCanvas(waypoint);
+ /**
+ * Create a clone of the cached canvas, as calling appendElement when a canvas is
+ * already in the document will move the existing canvas to the new position.
+ */
+ const [newCanvas, context] = makeOffscreenBuffer(48, 48, {
+ smooth: true,
+ label: label + "-waypoint-" + i,
+ });
+ context.drawImage(canvas, 0, 0);
+ element.appendChild(newCanvas);
+ element.classList.add("shapeIcon");
+ } else {
+ element.innerText = label;
+ }
+
+ if (this.isWaypointDeletable(waypoint)) {
+ const editButton = makeDiv(element, null, ["editButton"]);
+ this.trackClicks(editButton, () => this.requestSaveMarker({ waypoint }));
+ }
+
+ if (!waypoint.label) {
+ // This must be the hub label
+ element.classList.add("hub");
+ element.insertBefore(this.compassBuffer.canvas, element.childNodes[0]);
+ }
+
+ this.trackClicks(element, () => this.moveToWaypoint(waypoint), {
+ targetOnly: true,
+ });
+ }
+ }
+
+ /**
+ * Moves the camera to a given waypoint
+ * @param {Waypoint} waypoint
+ */
+ moveToWaypoint(waypoint) {
+ this.root.camera.setDesiredCenter(new Vector(waypoint.center.x, waypoint.center.y));
+ this.root.camera.setDesiredZoom(waypoint.zoomLevel);
+ }
+
+ /**
+ * Deletes a waypoint from the list
+ * @param {Waypoint} waypoint
+ */
+ deleteWaypoint(waypoint) {
+ arrayDeleteValue(this.waypoints, waypoint);
+ this.rerenderWaypointList();
+ }
+
+ /**
+ * Gets the canvas for a given waypoint
+ * @param {Waypoint} waypoint
+ * @returns {HTMLCanvasElement}
+ */
+ getWaypointCanvas(waypoint) {
+ const key = waypoint.label;
+ if (this.cachedKeyToCanvas[key]) {
+ return this.cachedKeyToCanvas[key];
+ }
+
+ assert(ShapeDefinition.isValidShortKey(key), "Invalid short key: " + key);
+ const definition = this.root.shapeDefinitionMgr.getShapeFromShortKey(key);
+ const preRendered = definition.generateAsCanvas(48);
+ return (this.cachedKeyToCanvas[key] = preRendered);
+ }
+
+ /**
+ * Requests to save a marker at the current camera position. If worldPos is set,
+ * uses that position instead.
+ * @param {object} param0
+ * @param {Vector=} param0.worldPos Override the world pos, otherwise it is the camera position
+ * @param {Waypoint=} param0.waypoint Waypoint to be edited. If omitted, create new
+ */
+ requestSaveMarker({ worldPos = null, waypoint = null }) {
+ // Construct dialog with input field
+ const markerNameInput = new FormElementInput({
+ id: "markerName",
+ label: null,
+ placeholder: "",
+ defaultValue: waypoint ? waypoint.label : "",
+ validator: val =>
+ val.length > 0 && (val.length < MAX_LABEL_LENGTH || ShapeDefinition.isValidShortKey(val)),
+ });
+ const dialog = new DialogWithForm({
+ app: this.root.app,
+ title: waypoint ? T.dialogs.createMarker.titleEdit : T.dialogs.createMarker.title,
+ desc: fillInLinkIntoTranslation(T.dialogs.createMarker.desc, THIRDPARTY_URLS.shapeViewer),
+ formElements: [markerNameInput],
+ buttons: waypoint ? ["delete:bad", "cancel", "ok:good"] : ["cancel", "ok:good"],
+ });
+ this.root.hud.parts.dialogs.internalShowDialog(dialog);
+
+ // Edit marker
+ if (waypoint) {
+ dialog.buttonSignals.ok.add(() => {
+ // Actually rename the waypoint
+ this.renameWaypoint(waypoint, markerNameInput.getValue());
+ });
+ dialog.buttonSignals.delete.add(() => {
+ // Actually delete the waypoint
+ this.deleteWaypoint(waypoint);
+ });
+ } else {
+ // Compute where to create the marker
+ const center = worldPos || this.root.camera.center;
+
+ dialog.buttonSignals.ok.add(() => {
+ // Show info that you can have only N markers in the demo,
+ // actually show this *after* entering the name so you want the
+ // standalone even more (I'm evil :P)
+ if (this.waypoints.length > this.root.app.restrictionMgr.getMaximumWaypoints()) {
+ this.root.hud.parts.dialogs.showFeatureRestrictionInfo(
+ "",
+ T.dialogs.markerDemoLimit.desc
+ );
+ return;
+ }
+
+ // Actually create the waypoint
+ this.addWaypoint(markerNameInput.getValue(), center);
+ });
+ }
+ }
+
+ /**
+ * Adds a new waypoint at the given location with the given label
+ * @param {string} label
+ * @param {Vector} position
+ */
+ addWaypoint(label, position) {
+ this.waypoints.push({
+ label,
+ center: { x: position.x, y: position.y },
+ zoomLevel: this.root.camera.zoomLevel,
+ });
+
+ this.sortWaypoints();
+
+ // Show notification about creation
+ this.root.hud.signals.notification.dispatch(
+ T.ingame.waypoints.creationSuccessNotification,
+ enumNotificationType.success
+ );
+
+ // Re-render the list and thus add it
+ this.rerenderWaypointList();
+ }
+
+ /**
+ * Renames a waypoint with the given label
+ * @param {Waypoint} waypoint
+ * @param {string} label
+ */
+ renameWaypoint(waypoint, label) {
+ waypoint.label = label;
+
+ this.sortWaypoints();
+
+ // Show notification about renamed
+ this.root.hud.signals.notification.dispatch(
+ T.ingame.waypoints.creationSuccessNotification,
+ enumNotificationType.success
+ );
+
+ // Re-render the list and thus add it
+ this.rerenderWaypointList();
+ }
+
+ /**
+ * Called every frame to update stuff
+ */
+ update() {
+ if (this.domAttach) {
+ this.domAttach.update(this.root.camera.getIsMapOverlayActive());
+ }
+ }
+
+ /**
+ * Sort waypoints by name
+ */
+ sortWaypoints() {
+ this.waypoints.sort((a, b) => {
+ if (!a.label) {
+ return -1;
+ }
+ if (!b.label) {
+ return 1;
+ }
+ return this.getWaypointLabel(a)
+ .padEnd(MAX_LABEL_LENGTH, "0")
+ .localeCompare(this.getWaypointLabel(b).padEnd(MAX_LABEL_LENGTH, "0"));
+ });
+ }
+
+ /**
+ * Returns the label for a given waypoint
+ * @param {Waypoint} waypoint
+ * @returns {string}
+ */
+ getWaypointLabel(waypoint) {
+ return waypoint.label || T.ingame.waypoints.hub;
+ }
+
+ /**
+ * Returns if a waypoint is deletable
+ * @param {Waypoint} waypoint
+ * @returns {boolean}
+ */
+ isWaypointDeletable(waypoint) {
+ return waypoint.label !== null;
+ }
+
+ /**
+ * Returns the screen space bounds of the given waypoint or null
+ * if it couldn't be determined. Also returns wheter its a shape or not
+ * @param {Waypoint} waypoint
+ * @return {{
+ * screenBounds: Rectangle
+ * item: BaseItem|null,
+ * text: string
+ * }}
+ */
+ getWaypointScreenParams(waypoint) {
+ if (!this.root.camera.getIsMapOverlayActive()) {
+ return null;
+ }
+
+ // Find parameters
+ const scale = this.getWaypointUiScale();
+ const screenPos = this.root.camera.worldToScreen(new Vector(waypoint.center.x, waypoint.center.y));
+
+ // Distinguish between text and item waypoints -> Figure out parameters
+ const originalLabel = this.getWaypointLabel(waypoint);
+ let text, item, textWidth;
+
+ if (ShapeDefinition.isValidShortKey(originalLabel)) {
+ // If the label is actually a key, render the shape icon
+ item = this.root.shapeDefinitionMgr.getShapeItemFromShortKey(originalLabel);
+ textWidth = 40;
+ } else {
+ // Otherwise render a regular waypoint
+ text = originalLabel;
+ textWidth = this.getTextWidth(text);
+ }
+
+ return {
+ screenBounds: new Rectangle(
+ screenPos.x - 7 * scale,
+ screenPos.y - 12 * scale,
+ 15 * scale + textWidth,
+ 15 * scale
+ ),
+ item,
+ text,
+ };
+ }
+
+ /**
+ * Finds the currently intersected waypoint on the map overview under
+ * the cursor.
+ *
+ * @returns {Waypoint | null}
+ */
+ findCurrentIntersectedWaypoint() {
+ const mousePos = this.root.app.mousePosition;
+ if (!mousePos) {
+ return;
+ }
+
+ for (let i = 0; i < this.waypoints.length; ++i) {
+ const waypoint = this.waypoints[i];
+ const params = this.getWaypointScreenParams(waypoint);
+ if (params && params.screenBounds.containsPoint(mousePos.x, mousePos.y)) {
+ return waypoint;
+ }
+ }
+ }
+
+ /**
+ * Mouse-Down handler
+ * @param {Vector} pos
+ * @param {enumMouseButton} button
+ */
+ onMouseDown(pos, button) {
+ const waypoint = this.findCurrentIntersectedWaypoint();
+ if (waypoint) {
+ if (button === enumMouseButton.left) {
+ this.root.soundProxy.playUiClick();
+ this.moveToWaypoint(waypoint);
+ } else if (button === enumMouseButton.right) {
+ if (this.isWaypointDeletable(waypoint)) {
+ this.root.soundProxy.playUiClick();
+ this.requestSaveMarker({ waypoint });
+ } else {
+ this.root.soundProxy.playUiError();
+ }
+ }
+
+ return STOP_PROPAGATION;
+ } else {
+ // Allow right click to create a marker
+ if (button === enumMouseButton.right) {
+ if (this.root.camera.getIsMapOverlayActive()) {
+ const worldPos = this.root.camera.screenToWorld(pos);
+ this.requestSaveMarker({ worldPos });
+ return STOP_PROPAGATION;
+ }
+ }
+ }
+ }
+
+ /**
+ * Rerenders the compass
+ */
+ rerenderWaypointsCompass() {
+ const dims = 48;
+ const indicatorSize = 30;
+ const cameraPos = this.root.camera.center;
+
+ const context = this.compassBuffer.context;
+ context.clearRect(0, 0, dims, dims);
+
+ const distanceToHub = cameraPos.length();
+ const compassVisible = distanceToHub > (10 * globalConfig.tileSize) / this.root.camera.zoomLevel;
+ const targetCompassAlpha = compassVisible ? 1 : 0;
+
+ // Fade the compas in / out
+ this.currentCompassOpacity = lerp(this.currentCompassOpacity, targetCompassAlpha, 0.08);
+
+ // Render the compass
+ if (this.currentCompassOpacity > 0.01) {
+ context.globalAlpha = this.currentCompassOpacity;
+ const angle = cameraPos.angle() + Math.radians(45) + Math.PI / 2;
+ context.translate(dims / 2, dims / 2);
+ context.rotate(angle);
+ this.directionIndicatorSprite.drawCentered(context, 0, 0, indicatorSize);
+ context.rotate(-angle);
+ context.translate(-dims / 2, -dims / 2);
+ context.globalAlpha = 1;
+ }
+
+ // Render the regualr icon
+ const iconOpacity = 1 - this.currentCompassOpacity;
+ if (iconOpacity > 0.01) {
+ context.globalAlpha = iconOpacity;
+ this.waypointSprite.drawCentered(context, dims / 2, dims / 2, dims * 0.7);
+ context.globalAlpha = 1;
+ }
+ }
+
+ /**
+ * Draws the waypoints on the map
+ * @param {DrawParameters} parameters
+ */
+ drawOverlays(parameters) {
+ const mousePos = this.root.app.mousePosition;
+ const desiredOpacity = this.root.camera.getIsMapOverlayActive() ? 1 : 0;
+ this.currentMarkerOpacity = lerp(this.currentMarkerOpacity, desiredOpacity, 0.08);
+
+ this.rerenderWaypointsCompass();
+
+ // Don't render with low opacity
+ if (this.currentMarkerOpacity < 0.01) {
+ return;
+ }
+
+ // Determine rendering scale
+ const scale = this.getWaypointUiScale();
+
+ // Set the font size
+ const textSize = this.getTextScale();
+ parameters.context.font = "bold " + textSize + "px GameFont";
+ parameters.context.textBaseline = "middle";
+
+ // Loop over all waypoints
+ for (let i = 0; i < this.waypoints.length; ++i) {
+ const waypoint = this.waypoints[i];
+
+ const waypointData = this.getWaypointScreenParams(waypoint);
+ if (!waypointData) {
+ // Not relevant
+ continue;
+ }
+
+ if (!parameters.visibleRect.containsRect(waypointData.screenBounds)) {
+ // Out of screen
+ continue;
+ }
+
+ const bounds = waypointData.screenBounds;
+ const contentPaddingX = 7 * scale;
+ const isSelected = mousePos && bounds.containsPoint(mousePos.x, mousePos.y);
+
+ // Render the background rectangle
+ parameters.context.globalAlpha = this.currentMarkerOpacity * (isSelected ? 1 : 0.7);
+ parameters.context.fillStyle = "rgba(255, 255, 255, 0.7)";
+ parameters.context.fillRect(bounds.x, bounds.y, bounds.w, bounds.h);
+
+ // Render the text
+ if (waypointData.item) {
+ const canvas = this.getWaypointCanvas(waypoint);
+ const itemSize = 14 * scale;
+ parameters.context.drawImage(
+ canvas,
+ bounds.x + contentPaddingX + 6 * scale,
+ bounds.y + bounds.h / 2 - itemSize / 2,
+ itemSize,
+ itemSize
+ );
+ } else if (waypointData.text) {
+ // Render the text
+ parameters.context.fillStyle = "#000";
+ parameters.context.textBaseline = "middle";
+ parameters.context.fillText(
+ waypointData.text,
+ bounds.x + contentPaddingX + 6 * scale,
+ bounds.y + bounds.h / 2
+ );
+ parameters.context.textBaseline = "alphabetic";
+ } else {
+ assertAlways(false, "Waypoint has no item and text");
+ }
+
+ // Render the small icon on the left
+ this.waypointSprite.drawCentered(
+ parameters.context,
+ bounds.x + contentPaddingX,
+ bounds.y + bounds.h / 2,
+ bounds.h * 0.7
+ );
+ }
+
+ parameters.context.textBaseline = "alphabetic";
+ parameters.context.globalAlpha = 1;
+ }
+}
diff --git a/src/js/game/hud/parts/wires_overlay.js b/src/js/game/hud/parts/wires_overlay.js
index 8d1d213e..752d9cb3 100644
--- a/src/js/game/hud/parts/wires_overlay.js
+++ b/src/js/game/hud/parts/wires_overlay.js
@@ -1,12 +1,14 @@
import { makeOffscreenBuffer } from "../../../core/buffer_utils";
import { globalConfig } from "../../../core/config";
import { DrawParameters } from "../../../core/draw_parameters";
-import { KEYMAPPINGS } from "../../key_action_mapper";
-import { THEME } from "../../theme";
-import { BaseHUDPart } from "../base_hud_part";
import { Loader } from "../../../core/loader";
import { lerp } from "../../../core/utils";
+import { SOUNDS } from "../../../platform/sound";
+import { KEYMAPPINGS } from "../../key_action_mapper";
+import { enumHubGoalRewards } from "../../tutorial_goals";
+import { BaseHUDPart } from "../base_hud_part";
+const copy = require("clipboard-copy");
const wiresBackgroundDpi = 4;
export class HUDWiresOverlay extends BaseHUDPart {
@@ -15,6 +17,7 @@ export class HUDWiresOverlay extends BaseHUDPart {
initialize() {
// Probably not the best location, but the one which makes most sense
this.root.keyMapper.getBinding(KEYMAPPINGS.ingame.switchLayers).add(this.switchLayers, this);
+ this.root.keyMapper.getBinding(KEYMAPPINGS.placement.copyWireValue).add(this.copyWireValue, this);
this.generateTilePattern();
@@ -26,7 +29,12 @@ export class HUDWiresOverlay extends BaseHUDPart {
*/
switchLayers() {
if (this.root.currentLayer === "regular") {
- this.root.currentLayer = "wires";
+ if (
+ this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_wires_painter_and_levers) ||
+ (G_IS_DEV && globalConfig.debug.allBuildingsUnlocked)
+ ) {
+ this.root.currentLayer = "wires";
+ }
} else {
this.root.currentLayer = "regular";
}
@@ -51,7 +59,53 @@ export class HUDWiresOverlay extends BaseHUDPart {
update() {
const desiredAlpha = this.root.currentLayer === "wires" ? 1.0 : 0.0;
- this.currentAlpha = lerp(this.currentAlpha, desiredAlpha, 0.12);
+
+ // On low performance, skip the fade
+ if (this.root.entityMgr.entities.length > 5000 || this.root.dynamicTickrate.averageFps < 50) {
+ this.currentAlpha = desiredAlpha;
+ } else {
+ this.currentAlpha = lerp(this.currentAlpha, desiredAlpha, 0.12);
+ }
+ }
+
+ /**
+ * Copies the wires value below the cursor
+ */
+ copyWireValue() {
+ if (this.root.currentLayer !== "wires") {
+ return;
+ }
+
+ const mousePos = this.root.app.mousePosition;
+ if (!mousePos) {
+ return;
+ }
+
+ const tile = this.root.camera.screenToWorld(mousePos).toTileSpace();
+ const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "wires");
+ if (!contents) {
+ return;
+ }
+
+ let value = null;
+ if (contents.components.Wire) {
+ const network = contents.components.Wire.linkedNetwork;
+ if (network && network.hasValue()) {
+ value = network.currentValue;
+ }
+ }
+
+ if (contents.components.ConstantSignal) {
+ value = contents.components.ConstantSignal.signal;
+ }
+
+ if (value) {
+ copy(value.getAsCopyableKey());
+ this.root.soundProxy.playUi(SOUNDS.copy);
+ } else {
+ copy("");
+ this.root.soundProxy.playUiError();
+ }
}
/**
diff --git a/src/js/game/hud/parts/wires_toolbar.js b/src/js/game/hud/parts/wires_toolbar.js
index af5a31dd..5141bbeb 100644
--- a/src/js/game/hud/parts/wires_toolbar.js
+++ b/src/js/game/hud/parts/wires_toolbar.js
@@ -5,23 +5,38 @@ import { MetaLogicGateBuilding } from "../../buildings/logic_gate";
import { MetaLeverBuilding } from "../../buildings/lever";
import { MetaWireTunnelBuilding } from "../../buildings/wire_tunnel";
import { MetaVirtualProcessorBuilding } from "../../buildings/virtual_processor";
-
-const supportedBuildings = [
- MetaWireBuilding,
- MetaWireTunnelBuilding,
- MetaConstantSignalBuilding,
- MetaLogicGateBuilding,
- MetaLeverBuilding,
- MetaVirtualProcessorBuilding,
-];
+import { MetaTransistorBuilding } from "../../buildings/transistor";
+import { MetaAnalyzerBuilding } from "../../buildings/analyzer";
+import { MetaComparatorBuilding } from "../../buildings/comparator";
+import { MetaReaderBuilding } from "../../buildings/reader";
+import { MetaFilterBuilding } from "../../buildings/filter";
+import { MetaDisplayBuilding } from "../../buildings/display";
+import { MetaStorageBuilding } from "../../buildings/storage";
export class HUDWiresToolbar extends HUDBaseToolbar {
constructor(root) {
super(root, {
- supportedBuildings,
+ primaryBuildings: [
+ MetaWireBuilding,
+ MetaWireTunnelBuilding,
+ MetaConstantSignalBuilding,
+ MetaLogicGateBuilding,
+ MetaVirtualProcessorBuilding,
+ MetaAnalyzerBuilding,
+ MetaComparatorBuilding,
+ MetaTransistorBuilding,
+ ],
+ secondaryBuildings: [
+ MetaStorageBuilding,
+ MetaReaderBuilding,
+ MetaLeverBuilding,
+ MetaFilterBuilding,
+ MetaDisplayBuilding,
+ ],
visibilityCondition: () =>
!this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "wires",
htmlElementId: "ingame_HUD_wires_toolbar",
+ layer: "wires",
});
}
}
diff --git a/src/js/game/hud/trailer_maker.js b/src/js/game/hud/trailer_maker.js
index 8655def4..e9193a93 100644
--- a/src/js/game/hud/trailer_maker.js
+++ b/src/js/game/hud/trailer_maker.js
@@ -1,125 +1,122 @@
-import { GameRoot } from "../root";
-import { globalConfig } from "../../core/config";
-import { Vector, mixVector } from "../../core/vector";
-import { lerp } from "../../core/utils";
-
-/* dev:start */
-import trailerPoints from "./trailer_points";
-import { gMetaBuildingRegistry } from "../../core/global_registries";
-import { MetaBeltBaseBuilding } from "../buildings/belt_base";
-import { MinerComponent } from "../components/miner";
-
-const tickrate = 1 / 165;
-
-export class TrailerMaker {
- /**
- *
- * @param {GameRoot} root
- */
- constructor(root) {
- this.root = root;
-
- this.markers = [];
- this.playbackMarkers = null;
- this.currentPlaybackOrigin = new Vector();
- this.currentPlaybackZoom = 3;
-
- window.addEventListener("keydown", ev => {
- if (ev.key === "j") {
- console.log("Record");
- this.markers.push({
- pos: this.root.camera.center.copy(),
- zoom: this.root.camera.zoomLevel,
- time: 1,
- wait: 0,
- });
- } else if (ev.key === "k") {
- console.log("Export");
- const json = JSON.stringify(this.markers);
- const handle = window.open("about:blank");
- handle.document.write(json);
- } else if (ev.key === "u") {
- if (this.playbackMarkers && this.playbackMarkers.length > 0) {
- this.playbackMarkers = [];
- return;
- }
- console.log("Playback");
- this.playbackMarkers = trailerPoints.map(p => Object.assign({}, p));
- this.playbackMarkers.unshift(this.playbackMarkers[0]);
- this.currentPlaybackOrigin = Vector.fromSerializedObject(this.playbackMarkers[0].pos);
-
- this.currentPlaybackZoom = this.playbackMarkers[0].zoom;
- this.root.camera.center = this.currentPlaybackOrigin.copy();
- this.root.camera.zoomLevel = this.currentPlaybackZoom;
- console.log("STart at", this.currentPlaybackOrigin);
-
- // this.root.entityMgr.getAllWithComponent(MinerComponent).forEach(miner => {
- // miner.components.Miner.itemChainBuffer = [];
- // miner.components.Miner.lastMiningTime = this.root.time.now() + 5;
- // miner.components.ItemEjector.slots.forEach(slot => (slot.item = null));
- // });
-
- // this.root.logic.tryPlaceBuilding({
- // origin: new Vector(-428, -15),
- // building: gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding),
- // originalRotation: 0,
- // rotation: 0,
- // variant: "default",
- // rotationVariant: 0,
- // });
-
- // this.root.logic.tryPlaceBuilding({
- // origin: new Vector(-427, -15),
- // building: gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding),
- // originalRotation: 0,
- // rotation: 0,
- // variant: "default",
- // rotationVariant: 0,
- // });
- }
- });
- }
-
- update() {
- if (this.playbackMarkers && this.playbackMarkers.length > 0) {
- const nextMarker = this.playbackMarkers[0];
-
- if (!nextMarker.startTime) {
- console.log("Starting to approach", nextMarker.pos);
- nextMarker.startTime = performance.now() / 1000.0;
- }
-
- const speed =
- globalConfig.tileSize *
- globalConfig.beltSpeedItemsPerSecond *
- globalConfig.itemSpacingOnBelts;
- // let time =
- // this.currentPlaybackOrigin.distance(Vector.fromSerializedObject(nextMarker.pos)) / speed;
- const time = nextMarker.time;
-
- const progress = (performance.now() / 1000.0 - nextMarker.startTime) / time;
-
- if (progress > 1.0) {
- if (nextMarker.wait > 0) {
- nextMarker.wait -= tickrate;
- } else {
- console.log("Approached");
- this.currentPlaybackOrigin = this.root.camera.center.copy();
- this.currentPlaybackZoom = this.root.camera.zoomLevel;
- this.playbackMarkers.shift();
- }
- return;
- }
-
- const targetPos = Vector.fromSerializedObject(nextMarker.pos);
- const targetZoom = nextMarker.zoom;
-
- const pos = mixVector(this.currentPlaybackOrigin, targetPos, progress);
- const zoom = lerp(this.currentPlaybackZoom, targetZoom, progress);
- this.root.camera.zoomLevel = zoom;
- this.root.camera.center = pos;
- }
- }
-}
-
-/* dev:end */
+import { GameRoot } from "../root";
+import { globalConfig } from "../../core/config";
+import { Vector, mixVector } from "../../core/vector";
+import { lerp } from "../../core/utils";
+
+/* dev:start */
+import trailerPoints from "./trailer_points";
+
+const tickrate = 1 / 165;
+
+export class TrailerMaker {
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ constructor(root) {
+ this.root = root;
+
+ this.markers = [];
+ this.playbackMarkers = null;
+ this.currentPlaybackOrigin = new Vector();
+ this.currentPlaybackZoom = 3;
+
+ window.addEventListener("keydown", ev => {
+ if (ev.key === "j") {
+ console.log("Record");
+ this.markers.push({
+ pos: this.root.camera.center.copy(),
+ zoom: this.root.camera.zoomLevel,
+ time: 1,
+ wait: 0,
+ });
+ } else if (ev.key === "k") {
+ console.log("Export");
+ const json = JSON.stringify(this.markers);
+ const handle = window.open("about:blank");
+ handle.document.write(json);
+ } else if (ev.key === "u") {
+ if (this.playbackMarkers && this.playbackMarkers.length > 0) {
+ this.playbackMarkers = [];
+ return;
+ }
+ console.log("Playback");
+ this.playbackMarkers = trailerPoints.map(p => Object.assign({}, p));
+ this.playbackMarkers.unshift(this.playbackMarkers[0]);
+ this.currentPlaybackOrigin = Vector.fromSerializedObject(this.playbackMarkers[0].pos);
+
+ this.currentPlaybackZoom = this.playbackMarkers[0].zoom;
+ this.root.camera.center = this.currentPlaybackOrigin.copy();
+ this.root.camera.zoomLevel = this.currentPlaybackZoom;
+ console.log("STart at", this.currentPlaybackOrigin);
+
+ // this.root.entityMgr.getAllWithComponent(MinerComponent).forEach(miner => {
+ // miner.components.Miner.itemChainBuffer = [];
+ // miner.components.Miner.lastMiningTime = this.root.time.now() + 5;
+ // miner.components.ItemEjector.slots.forEach(slot => (slot.item = null));
+ // });
+
+ // this.root.logic.tryPlaceBuilding({
+ // origin: new Vector(-428, -15),
+ // building: gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding),
+ // originalRotation: 0,
+ // rotation: 0,
+ // variant: "default",
+ // rotationVariant: 0,
+ // });
+
+ // this.root.logic.tryPlaceBuilding({
+ // origin: new Vector(-427, -15),
+ // building: gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding),
+ // originalRotation: 0,
+ // rotation: 0,
+ // variant: "default",
+ // rotationVariant: 0,
+ // });
+ }
+ });
+ }
+
+ update() {
+ if (this.playbackMarkers && this.playbackMarkers.length > 0) {
+ const nextMarker = this.playbackMarkers[0];
+
+ if (!nextMarker.startTime) {
+ console.log("Starting to approach", nextMarker.pos);
+ nextMarker.startTime = performance.now() / 1000.0;
+ }
+
+ const speed =
+ globalConfig.tileSize *
+ globalConfig.beltSpeedItemsPerSecond *
+ globalConfig.itemSpacingOnBelts;
+ // let time =
+ // this.currentPlaybackOrigin.distance(Vector.fromSerializedObject(nextMarker.pos)) / speed;
+ const time = nextMarker.time;
+
+ const progress = (performance.now() / 1000.0 - nextMarker.startTime) / time;
+
+ if (progress > 1.0) {
+ if (nextMarker.wait > 0) {
+ nextMarker.wait -= tickrate;
+ } else {
+ console.log("Approached");
+ this.currentPlaybackOrigin = this.root.camera.center.copy();
+ this.currentPlaybackZoom = this.root.camera.zoomLevel;
+ this.playbackMarkers.shift();
+ }
+ return;
+ }
+
+ const targetPos = Vector.fromSerializedObject(nextMarker.pos);
+ const targetZoom = nextMarker.zoom;
+
+ const pos = mixVector(this.currentPlaybackOrigin, targetPos, progress);
+ const zoom = lerp(this.currentPlaybackZoom, targetZoom, progress);
+ this.root.camera.zoomLevel = zoom;
+ this.root.camera.center = pos;
+ }
+ }
+}
+
+/* dev:end */
diff --git a/src/js/game/items/boolean_item.js b/src/js/game/items/boolean_item.js
index 77e8bbb3..9ee3e3e5 100644
--- a/src/js/game/items/boolean_item.js
+++ b/src/js/game/items/boolean_item.js
@@ -26,6 +26,13 @@ export class BooleanItem extends BaseItem {
return "boolean";
}
+ /**
+ * @returns {string}
+ */
+ getAsCopyableKey() {
+ return this.value ? "1" : "0";
+ }
+
/**
* @param {number} value
*/
@@ -56,6 +63,21 @@ export class BooleanItem extends BaseItem {
}
sprite.drawCachedCentered(parameters, x, y, diameter);
}
+
+ /**
+ * Draws the item to a canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} size
+ */
+ drawFullSizeOnCanvas(context, size) {
+ let sprite;
+ if (this.value) {
+ sprite = Loader.getSprite("sprites/wires/boolean_true.png");
+ } else {
+ sprite = Loader.getSprite("sprites/wires/boolean_false.png");
+ }
+ sprite.drawCentered(context, size / 2, size / 2, size);
+ }
}
export const BOOL_FALSE_SINGLETON = new BooleanItem(0);
diff --git a/src/js/game/items/color_item.js b/src/js/game/items/color_item.js
index 19d26286..fb7f1701 100644
--- a/src/js/game/items/color_item.js
+++ b/src/js/game/items/color_item.js
@@ -1,122 +1,92 @@
-import { globalConfig } from "../../core/config";
-import { smoothenDpi } from "../../core/dpi_manager";
-import { DrawParameters } from "../../core/draw_parameters";
-import { types } from "../../savegame/serialization";
-import { BaseItem } from "../base_item";
-import { enumColors, enumColorsToHexCode } from "../colors";
-import { THEME } from "../theme";
-import { drawSpriteClipped } from "../../core/draw_utils";
-
-export class ColorItem extends BaseItem {
- static getId() {
- return "color";
- }
-
- static getSchema() {
- return types.enum(enumColors);
- }
-
- serialize() {
- return this.color;
- }
-
- deserialize(data) {
- this.color = data;
- }
-
- /** @returns {"color"} **/
- getItemType() {
- return "color";
- }
-
- /**
- * @param {BaseItem} other
- */
- equalsImpl(other) {
- return this.color === /** @type {ColorItem} */ (other).color;
- }
-
- /**
- * @param {enumColors} color
- */
- constructor(color) {
- super();
- this.color = color;
- this.bufferGenerator = null;
- }
-
- getBackgroundColorAsResource() {
- return THEME.map.resources[this.color];
- }
-
- /**
- * @param {number} x
- * @param {number} y
- * @param {number} diameter
- * @param {DrawParameters} parameters
- */
- drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
- if (!this.bufferGenerator) {
- this.bufferGenerator = this.internalGenerateColorBuffer.bind(this);
- }
-
- const realDiameter = diameter * 0.6;
- const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
- const key = realDiameter + "/" + dpi + "/" + this.color;
- const canvas = parameters.root.buffers.getForKey({
- key: "coloritem",
- subKey: key,
- w: realDiameter,
- h: realDiameter,
- dpi,
- redrawMethod: this.bufferGenerator,
- });
-
- drawSpriteClipped({
- parameters,
- sprite: canvas,
- x: x - realDiameter / 2,
- y: y - realDiameter / 2,
- w: realDiameter,
- h: realDiameter,
- originalW: realDiameter * dpi,
- originalH: realDiameter * dpi,
- });
- }
- /**
- *
- * @param {HTMLCanvasElement} canvas
- * @param {CanvasRenderingContext2D} context
- * @param {number} w
- * @param {number} h
- * @param {number} dpi
- */
- internalGenerateColorBuffer(canvas, context, w, h, dpi) {
- context.translate((w * dpi) / 2, (h * dpi) / 2);
- context.scale((dpi * w) / 12, (dpi * h) / 12);
-
- context.fillStyle = enumColorsToHexCode[this.color];
- context.strokeStyle = THEME.items.outline;
- context.lineWidth = 2 * THEME.items.outlineWidth;
- context.beginCircle(2, -1, 3);
- context.stroke();
- context.fill();
- context.beginCircle(-2, -1, 3);
- context.stroke();
- context.fill();
- context.beginCircle(0, 2, 3);
- context.closePath();
- context.stroke();
- context.fill();
- }
-}
-
-/**
- * Singleton instances
- * @type {Object}
- */
-export const COLOR_ITEM_SINGLETONS = {};
-
-for (const color in enumColors) {
- COLOR_ITEM_SINGLETONS[color] = new ColorItem(color);
-}
+import { globalConfig } from "../../core/config";
+import { DrawParameters } from "../../core/draw_parameters";
+import { Loader } from "../../core/loader";
+import { types } from "../../savegame/serialization";
+import { BaseItem } from "../base_item";
+import { enumColors } from "../colors";
+import { THEME } from "../theme";
+
+export class ColorItem extends BaseItem {
+ static getId() {
+ return "color";
+ }
+
+ static getSchema() {
+ return types.enum(enumColors);
+ }
+
+ serialize() {
+ return this.color;
+ }
+
+ deserialize(data) {
+ this.color = data;
+ }
+
+ /** @returns {"color"} **/
+ getItemType() {
+ return "color";
+ }
+
+ /**
+ * @returns {string}
+ */
+ getAsCopyableKey() {
+ return this.color;
+ }
+
+ /**
+ * @param {BaseItem} other
+ */
+ equalsImpl(other) {
+ return this.color === /** @type {ColorItem} */ (other).color;
+ }
+
+ /**
+ * @param {enumColors} color
+ */
+ constructor(color) {
+ super();
+ this.color = color;
+ }
+
+ getBackgroundColorAsResource() {
+ return THEME.map.resources[this.color];
+ }
+
+ /**
+ * Draws the item to a canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} size
+ */
+ drawFullSizeOnCanvas(context, size) {
+ if (!this.cachedSprite) {
+ this.cachedSprite = Loader.getSprite("sprites/colors/" + this.color + ".png");
+ }
+ this.cachedSprite.drawCentered(context, size / 2, size / 2, size);
+ }
+
+ /**
+ * @param {number} x
+ * @param {number} y
+ * @param {number} diameter
+ * @param {DrawParameters} parameters
+ */
+ drawItemCenteredClipped(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
+ const realDiameter = diameter * 0.6;
+ if (!this.cachedSprite) {
+ this.cachedSprite = Loader.getSprite("sprites/colors/" + this.color + ".png");
+ }
+ this.cachedSprite.drawCachedCentered(parameters, x, y, realDiameter);
+ }
+}
+
+/**
+ * Singleton instances
+ * @type {Object}
+ */
+export const COLOR_ITEM_SINGLETONS = {};
+
+for (const color in enumColors) {
+ COLOR_ITEM_SINGLETONS[color] = new ColorItem(color);
+}
diff --git a/src/js/game/items/shape_item.js b/src/js/game/items/shape_item.js
index d99a7251..d61b8f2e 100644
--- a/src/js/game/items/shape_item.js
+++ b/src/js/game/items/shape_item.js
@@ -1,62 +1,78 @@
-import { DrawParameters } from "../../core/draw_parameters";
-import { types } from "../../savegame/serialization";
-import { BaseItem } from "../base_item";
-import { ShapeDefinition } from "../shape_definition";
-import { THEME } from "../theme";
-import { globalConfig } from "../../core/config";
-
-export class ShapeItem extends BaseItem {
- static getId() {
- return "shape";
- }
-
- static getSchema() {
- return types.string;
- }
-
- serialize() {
- return this.definition.getHash();
- }
-
- deserialize(data) {
- this.definition = ShapeDefinition.fromShortKey(data);
- }
-
- /** @returns {"shape"} **/
- getItemType() {
- return "shape";
- }
-
- /**
- * @param {BaseItem} other
- */
- equalsImpl(other) {
- return this.definition.getHash() === /** @type {ShapeItem} */ (other).definition.getHash();
- }
-
- /**
- * @param {ShapeDefinition} definition
- */
- constructor(definition) {
- super();
-
- /**
- * This property must not be modified on runtime, you have to clone the class in order to change the definition
- */
- this.definition = definition;
- }
-
- getBackgroundColorAsResource() {
- return THEME.map.resources.shape;
- }
-
- /**
- * @param {number} x
- * @param {number} y
- * @param {DrawParameters} parameters
- * @param {number=} diameter
- */
- drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
- this.definition.drawCentered(x, y, parameters, diameter);
- }
-}
+import { DrawParameters } from "../../core/draw_parameters";
+import { types } from "../../savegame/serialization";
+import { BaseItem } from "../base_item";
+import { ShapeDefinition } from "../shape_definition";
+import { THEME } from "../theme";
+import { globalConfig } from "../../core/config";
+
+export class ShapeItem extends BaseItem {
+ static getId() {
+ return "shape";
+ }
+
+ static getSchema() {
+ return types.string;
+ }
+
+ serialize() {
+ return this.definition.getHash();
+ }
+
+ deserialize(data) {
+ this.definition = ShapeDefinition.fromShortKey(data);
+ }
+
+ /** @returns {"shape"} **/
+ getItemType() {
+ return "shape";
+ }
+
+ /**
+ * @returns {string}
+ */
+ getAsCopyableKey() {
+ return this.definition.getHash();
+ }
+
+ /**
+ * @param {BaseItem} other
+ */
+ equalsImpl(other) {
+ return this.definition.getHash() === /** @type {ShapeItem} */ (other).definition.getHash();
+ }
+
+ /**
+ * @param {ShapeDefinition} definition
+ */
+ constructor(definition) {
+ super();
+
+ /**
+ * This property must not be modified on runtime, you have to clone the class in order to change the definition
+ */
+ this.definition = definition;
+ }
+
+ getBackgroundColorAsResource() {
+ return THEME.map.resources.shape;
+ }
+
+ /**
+ * Draws the item to a canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} size
+ */
+ drawFullSizeOnCanvas(context, size) {
+ this.definition.drawFullSizeOnCanvas(context, size);
+ }
+
+ /**
+ * @param {number} x
+ * @param {number} y
+ * @param {DrawParameters} parameters
+ * @param {number=} diameter
+ */
+ drawItemCenteredImpl(x, y, parameters, diameter = globalConfig.defaultItemDiameter) {
+ this.definition.drawCentered(x, y, parameters, diameter);
+ }
+}
diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js
index d5a758a5..9fa4ffe1 100644
--- a/src/js/game/key_action_mapper.js
+++ b/src/js/game/key_action_mapper.js
@@ -26,7 +26,7 @@ export const KEYMAPPINGS = {
exportScreenshot: { keyCode: 114 }, // F3PS
toggleFPSInfo: { keyCode: 115 }, // F4
- switchLayers: { keyCode: key("Y") },
+ switchLayers: { keyCode: key("E") },
},
navigation: {
@@ -44,8 +44,9 @@ export const KEYMAPPINGS = {
},
buildings: {
+ // Primary Toolbar
belt: { keyCode: key("1") },
- splitter: { keyCode: key("2") },
+ balancer: { keyCode: key("2") },
underground_belt: { keyCode: key("3") },
miner: { keyCode: key("4") },
cutter: { keyCode: key("5") },
@@ -55,16 +56,25 @@ export const KEYMAPPINGS = {
painter: { keyCode: key("9") },
trash: { keyCode: key("0") },
- lever: { keyCode: key("L") },
- filter: { keyCode: key("B") },
- display: { keyCode: key("N") },
- reader: { keyCode: key("J") },
+ // Sandbox
+ item_producer: { keyCode: key("L") },
+ // Secondary toolbar
+ storage: { keyCode: key("Y") },
+ reader: { keyCode: key("U") },
+ lever: { keyCode: key("I") },
+ filter: { keyCode: key("O") },
+ display: { keyCode: key("P") },
+
+ // Wires toolbar
wire: { keyCode: key("1") },
wire_tunnel: { keyCode: key("2") },
constant_signal: { keyCode: key("3") },
logic_gate: { keyCode: key("4") },
virtual_processor: { keyCode: key("5") },
+ analyzer: { keyCode: key("6") },
+ comparator: { keyCode: key("7") },
+ transistor: { keyCode: key("8") },
},
placement: {
@@ -74,6 +84,8 @@ export const KEYMAPPINGS = {
cycleBuildingVariants: { keyCode: key("T") },
cycleBuildings: { keyCode: 9 }, // TAB
switchDirectionLockSide: { keyCode: key("R") },
+
+ copyWireValue: { keyCode: key("Z") },
},
massSelect: {
@@ -110,6 +122,7 @@ export const KEYCODE_RMB = 3;
* @returns {string}
*/
export function getStringForKeyCode(code) {
+ // @todo: Refactor into dictionary
switch (code) {
case KEYCODE_LMB:
return "LMB";
@@ -204,22 +217,20 @@ export function getStringForKeyCode(code) {
case 115:
return "F4";
case 116:
- return "F4";
- case 117:
return "F5";
- case 118:
+ case 117:
return "F6";
- case 119:
+ case 118:
return "F7";
- case 120:
+ case 119:
return "F8";
- case 121:
+ case 120:
return "F9";
- case 122:
+ case 121:
return "F10";
- case 123:
+ case 122:
return "F11";
- case 124:
+ case 123:
return "F12";
case 144:
@@ -238,6 +249,8 @@ export function getStringForKeyCode(code) {
return ",";
case 189:
return "-";
+ case 190:
+ return ".";
case 191:
return "/";
case 219:
@@ -250,7 +263,9 @@ export function getStringForKeyCode(code) {
return "'";
}
- return String.fromCharCode(code);
+ return (48 <= code && code <= 57) || (65 <= code && code <= 90)
+ ? String.fromCharCode(code)
+ : "[" + code + "]";
}
export class Keybinding {
@@ -354,6 +369,13 @@ export class KeyActionMapper {
}
this.keybindings[key] = new Keybinding(this, this.root.app, payload);
+
+ if (G_IS_DEV) {
+ // Sanity
+ if (!T.keybindings.mappings[key]) {
+ assertAlways(false, "Keybinding " + key + " has no translation!");
+ }
+ }
}
}
diff --git a/src/js/game/logic.js b/src/js/game/logic.js
index ce4d18a5..7ec7b8ab 100644
--- a/src/js/game/logic.js
+++ b/src/js/game/logic.js
@@ -1,23 +1,18 @@
+import { globalConfig } from "../core/config";
import { createLogger } from "../core/logging";
import { STOP_PROPAGATION } from "../core/signal";
import { round2Digits } from "../core/utils";
import { enumDirection, enumDirectionToVector, enumInvertedDirections, Vector } from "../core/vector";
import { getBuildingDataFromCode } from "./building_codes";
+import { enumWireVariant } from "./components/wire";
import { Entity } from "./entity";
+import { CHUNK_OVERLAY_RES } from "./map_chunk_view";
import { MetaBuilding } from "./meta_building";
import { GameRoot } from "./root";
import { WireNetwork } from "./systems/wire";
-import { globalConfig } from "../core/config";
-import { CHUNK_OVERLAY_RES } from "./map_chunk_view";
const logger = createLogger("ingame/logic");
-/** @enum {number} */
-export const enumWireEdgeFlag = {
- empty: 0,
- connected: 2,
-};
-
/**
* Typing helper
* @typedef {Array<{
@@ -193,28 +188,72 @@ export class GameLogic {
*
* Computes the flag for a given tile
* @param {object} param0
+ * @param {enumWireVariant} param0.wireVariant
* @param {Vector} param0.tile The tile to check at
* @param {enumDirection} param0.edge The edge to check for
- * @param {number} param0.rotation The local tiles base rotation
*/
- computeWireEdgeStatus({ tile, edge, rotation }) {
+ computeWireEdgeStatus({ wireVariant, tile, edge }) {
const offset = enumDirectionToVector[edge];
- const refTile = tile.add(offset);
- // const angle = enumDirectionToAngle[edge];
+ const targetTile = tile.add(offset);
- // // First, check if this edge can be connected from locally
- // const canConnectLocally = rotation === angle || (rotation + 180) % 360 === angle;
+ // Search for relevant pins
+ const pinEntities = this.root.map.getLayersContentsMultipleXY(targetTile.x, targetTile.y);
- const neighbourStatus = this.getWireEdgeFlag(refTile, edge);
+ // Go over all entities which could have a pin
+ for (let i = 0; i < pinEntities.length; ++i) {
+ const pinEntity = pinEntities[i];
+ const pinComp = pinEntity.components.WiredPins;
+ const staticComp = pinEntity.components.StaticMapEntity;
- if (neighbourStatus === enumWireEdgeFlag.empty) {
- // It's empty, no point in connecting
+ // Skip those who don't have pins
+ if (!pinComp) {
+ continue;
+ }
+
+ // Go over all pins
+ const pins = pinComp.slots;
+ for (let k = 0; k < pinComp.slots.length; ++k) {
+ const pinSlot = pins[k];
+ const pinLocation = staticComp.localTileToWorld(pinSlot.pos);
+ const pinDirection = staticComp.localDirectionToWorld(pinSlot.direction);
+
+ // Check if the pin has the right location
+ if (!pinLocation.equals(targetTile)) {
+ continue;
+ }
+
+ // Check if the pin has the right direction
+ if (pinDirection !== enumInvertedDirections[edge]) {
+ continue;
+ }
+
+ // Found a pin!
+ return true;
+ }
+ }
+
+ // Now check if there's a connectable entity on the wires layer
+ const targetEntity = this.root.map.getTileContent(targetTile, "wires");
+ if (!targetEntity) {
return false;
}
- if (neighbourStatus === enumWireEdgeFlag.connected) {
+ const targetStaticComp = targetEntity.components.StaticMapEntity;
+
+ // Check if its a crossing
+ const wireTunnelComp = targetEntity.components.WireTunnel;
+ if (wireTunnelComp) {
return true;
}
+
+ // Check if its a wire
+ const wiresComp = targetEntity.components.Wire;
+ if (!wiresComp) {
+ return false;
+ }
+
+ // It's connected if its the same variant
+ return wiresComp.variant === wireVariant;
}
/**
@@ -303,85 +342,7 @@ export class GameLogic {
return !!overlayMatrix[localPosition.x + localPosition.y * 3];
}
- /**
- * Gets the flag at the given tile
- * @param {Vector} tile
- * @param {enumDirection} edge
- * @returns {enumWireEdgeFlag}
- */
- getWireEdgeFlag(tile, edge) {
- // Search for relevant pins
- const pinEntities = this.root.map.getLayersContentsMultipleXY(tile.x, tile.y);
-
- // Go over all entities which could have a pin
- for (let i = 0; i < pinEntities.length; ++i) {
- const pinEntity = pinEntities[i];
- const pinComp = pinEntity.components.WiredPins;
- const staticComp = pinEntity.components.StaticMapEntity;
-
- // Skip those who don't have pins
- if (!pinComp) {
- continue;
- }
-
- // Go over all pins
- const pins = pinComp.slots;
- for (let k = 0; k < pinComp.slots.length; ++k) {
- const pinSlot = pins[k];
- const pinLocation = staticComp.localTileToWorld(pinSlot.pos);
- const pinDirection = staticComp.localDirectionToWorld(pinSlot.direction);
-
- // Check if the pin has the right location
- if (!pinLocation.equals(tile)) {
- continue;
- }
-
- // Check if the pin has the right direction
- if (pinDirection !== enumInvertedDirections[edge]) {
- continue;
- }
-
- // Found a pin!
- return enumWireEdgeFlag.connected;
- }
- }
-
- // Now check if there's a connectable wire
- const targetEntity = this.root.map.getTileContent(tile, "wires");
- if (!targetEntity) {
- return enumWireEdgeFlag.empty;
- }
-
- const targetStaticComp = targetEntity.components.StaticMapEntity;
-
- // Check if its a crossing
- const wireTunnelComp = targetEntity.components.WireTunnel;
- if (wireTunnelComp) {
- // Check if the crossing is connected
- if (wireTunnelComp.multipleDirections) {
- return enumWireEdgeFlag.connected;
- } else {
- // Its a coating, check if it matches the direction
- const referenceDirection = targetStaticComp.localDirectionToWorld(enumDirection.top);
- return referenceDirection === edge || enumInvertedDirections[referenceDirection] === edge
- ? enumWireEdgeFlag.connected
- : enumWireEdgeFlag.empty;
- }
- }
-
- // Check if its a wire
- const wiresComp = targetEntity.components.Wire;
- if (!wiresComp) {
- return enumWireEdgeFlag.empty;
- }
-
- // const refAngle = enumDirectionToAngle[edge];
- // const refRotation = targetEntity.components.StaticMapEntity.originalRotation;
- // const canConnectRemotely = refRotation === refAngle || (refRotation + 180) % 360 === refAngle;
-
- // Actually connected
- return enumWireEdgeFlag.connected;
- }
+ g(tile, edge) {}
/**
* Returns the acceptors and ejectors which affect the current tile
diff --git a/src/js/game/map.js b/src/js/game/map.js
index 5ff51ce8..a5ec8f21 100644
--- a/src/js/game/map.js
+++ b/src/js/game/map.js
@@ -1,236 +1,236 @@
-import { globalConfig } from "../core/config";
-import { Vector } from "../core/vector";
-import { BasicSerializableObject, types } from "../savegame/serialization";
-import { BaseItem } from "./base_item";
-import { Entity } from "./entity";
-import { MapChunkView } from "./map_chunk_view";
-import { GameRoot } from "./root";
-
-export class BaseMap extends BasicSerializableObject {
- static getId() {
- return "Map";
- }
-
- static getSchema() {
- return {
- seed: types.uint,
- };
- }
-
- /**
- *
- * @param {GameRoot} root
- */
- constructor(root) {
- super();
- this.root = root;
-
- this.seed = 0;
-
- /**
- * Mapping of 'X|Y' to chunk
- * @type {Map} */
- this.chunksById = new Map();
- }
-
- /**
- * Returns the given chunk by index
- * @param {number} chunkX
- * @param {number} chunkY
- */
- getChunk(chunkX, chunkY, createIfNotExistent = false) {
- const chunkIdentifier = chunkX + "|" + chunkY;
- let storedChunk;
-
- if ((storedChunk = this.chunksById.get(chunkIdentifier))) {
- return storedChunk;
- }
-
- if (createIfNotExistent) {
- const instance = new MapChunkView(this.root, chunkX, chunkY);
- this.chunksById.set(chunkIdentifier, instance);
- return instance;
- }
-
- return null;
- }
-
- /**
- * Gets or creates a new chunk if not existent for the given tile
- * @param {number} tileX
- * @param {number} tileY
- * @returns {MapChunkView}
- */
- getOrCreateChunkAtTile(tileX, tileY) {
- const chunkX = Math.floor(tileX / globalConfig.mapChunkSize);
- const chunkY = Math.floor(tileY / globalConfig.mapChunkSize);
- return this.getChunk(chunkX, chunkY, true);
- }
-
- /**
- * Gets a chunk if not existent for the given tile
- * @param {number} tileX
- * @param {number} tileY
- * @returns {MapChunkView?}
- */
- getChunkAtTileOrNull(tileX, tileY) {
- const chunkX = Math.floor(tileX / globalConfig.mapChunkSize);
- const chunkY = Math.floor(tileY / globalConfig.mapChunkSize);
- return this.getChunk(chunkX, chunkY, false);
- }
-
- /**
- * Checks if a given tile is within the map bounds
- * @param {Vector} tile
- * @returns {boolean}
- */
- isValidTile(tile) {
- if (G_IS_DEV) {
- assert(tile instanceof Vector, "tile is not a vector");
- }
- return Number.isInteger(tile.x) && Number.isInteger(tile.y);
- }
-
- /**
- * Returns the tile content of a given tile
- * @param {Vector} tile
- * @param {Layer} layer
- * @returns {Entity} Entity or null
- */
- getTileContent(tile, layer) {
- if (G_IS_DEV) {
- this.internalCheckTile(tile);
- }
- const chunk = this.getChunkAtTileOrNull(tile.x, tile.y);
- return chunk && chunk.getLayerContentFromWorldCoords(tile.x, tile.y, layer);
- }
-
- /**
- * Returns the lower layers content of the given tile
- * @param {number} x
- * @param {number} y
- * @returns {BaseItem=}
- */
- getLowerLayerContentXY(x, y) {
- return this.getOrCreateChunkAtTile(x, y).getLowerLayerFromWorldCoords(x, y);
- }
-
- /**
- * Returns the tile content of a given tile
- * @param {number} x
- * @param {number} y
- * @param {Layer} layer
- * @returns {Entity} Entity or null
- */
- getLayerContentXY(x, y, layer) {
- const chunk = this.getChunkAtTileOrNull(x, y);
- return chunk && chunk.getLayerContentFromWorldCoords(x, y, layer);
- }
-
- /**
- * Returns the tile contents of a given tile
- * @param {number} x
- * @param {number} y
- * @returns {Array} Entity or null
- */
- getLayersContentsMultipleXY(x, y) {
- const chunk = this.getChunkAtTileOrNull(x, y);
- if (!chunk) {
- return [];
- }
- return chunk.getLayersContentsMultipleFromWorldCoords(x, y);
- }
-
- /**
- * Checks if the tile is used
- * @param {Vector} tile
- * @param {Layer} layer
- * @returns {boolean}
- */
- isTileUsed(tile, layer) {
- if (G_IS_DEV) {
- this.internalCheckTile(tile);
- }
- const chunk = this.getChunkAtTileOrNull(tile.x, tile.y);
- return chunk && chunk.getLayerContentFromWorldCoords(tile.x, tile.y, layer) != null;
- }
-
- /**
- * Checks if the tile is used
- * @param {number} x
- * @param {number} y
- * @param {Layer} layer
- * @returns {boolean}
- */
- isTileUsedXY(x, y, layer) {
- const chunk = this.getChunkAtTileOrNull(x, y);
- return chunk && chunk.getLayerContentFromWorldCoords(x, y, layer) != null;
- }
-
- /**
- * Sets the tiles content
- * @param {Vector} tile
- * @param {Entity} entity
- */
- setTileContent(tile, entity) {
- if (G_IS_DEV) {
- this.internalCheckTile(tile);
- }
-
- this.getOrCreateChunkAtTile(tile.x, tile.y).setLayerContentFromWorldCords(
- tile.x,
- tile.y,
- entity,
- entity.layer
- );
-
- const staticComponent = entity.components.StaticMapEntity;
- assert(staticComponent, "Can only place static map entities in tiles");
- }
-
- /**
- * Places an entity with the StaticMapEntity component
- * @param {Entity} entity
- */
- placeStaticEntity(entity) {
- assert(entity.components.StaticMapEntity, "Entity is not static");
- const staticComp = entity.components.StaticMapEntity;
- const rect = staticComp.getTileSpaceBounds();
- for (let dx = 0; dx < rect.w; ++dx) {
- for (let dy = 0; dy < rect.h; ++dy) {
- const x = rect.x + dx;
- const y = rect.y + dy;
- this.getOrCreateChunkAtTile(x, y).setLayerContentFromWorldCords(x, y, entity, entity.layer);
- }
- }
- }
-
- /**
- * Removes an entity with the StaticMapEntity component
- * @param {Entity} entity
- */
- removeStaticEntity(entity) {
- assert(entity.components.StaticMapEntity, "Entity is not static");
- const staticComp = entity.components.StaticMapEntity;
- const rect = staticComp.getTileSpaceBounds();
- for (let dx = 0; dx < rect.w; ++dx) {
- for (let dy = 0; dy < rect.h; ++dy) {
- const x = rect.x + dx;
- const y = rect.y + dy;
- this.getOrCreateChunkAtTile(x, y).setLayerContentFromWorldCords(x, y, null, entity.layer);
- }
- }
- }
-
- // Internal
-
- /**
- * Checks a given tile for validty
- * @param {Vector} tile
- */
- internalCheckTile(tile) {
- assert(tile instanceof Vector, "tile is not a vector: " + tile);
- assert(tile.x % 1 === 0, "Tile X is not a valid integer: " + tile.x);
- assert(tile.y % 1 === 0, "Tile Y is not a valid integer: " + tile.y);
- }
-}
+import { globalConfig } from "../core/config";
+import { Vector } from "../core/vector";
+import { BasicSerializableObject, types } from "../savegame/serialization";
+import { BaseItem } from "./base_item";
+import { Entity } from "./entity";
+import { MapChunkView } from "./map_chunk_view";
+import { GameRoot } from "./root";
+
+export class BaseMap extends BasicSerializableObject {
+ static getId() {
+ return "Map";
+ }
+
+ static getSchema() {
+ return {
+ seed: types.uint,
+ };
+ }
+
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ constructor(root) {
+ super();
+ this.root = root;
+
+ this.seed = 0;
+
+ /**
+ * Mapping of 'X|Y' to chunk
+ * @type {Map} */
+ this.chunksById = new Map();
+ }
+
+ /**
+ * Returns the given chunk by index
+ * @param {number} chunkX
+ * @param {number} chunkY
+ */
+ getChunk(chunkX, chunkY, createIfNotExistent = false) {
+ const chunkIdentifier = chunkX + "|" + chunkY;
+ let storedChunk;
+
+ if ((storedChunk = this.chunksById.get(chunkIdentifier))) {
+ return storedChunk;
+ }
+
+ if (createIfNotExistent) {
+ const instance = new MapChunkView(this.root, chunkX, chunkY);
+ this.chunksById.set(chunkIdentifier, instance);
+ return instance;
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets or creates a new chunk if not existent for the given tile
+ * @param {number} tileX
+ * @param {number} tileY
+ * @returns {MapChunkView}
+ */
+ getOrCreateChunkAtTile(tileX, tileY) {
+ const chunkX = Math.floor(tileX / globalConfig.mapChunkSize);
+ const chunkY = Math.floor(tileY / globalConfig.mapChunkSize);
+ return this.getChunk(chunkX, chunkY, true);
+ }
+
+ /**
+ * Gets a chunk if not existent for the given tile
+ * @param {number} tileX
+ * @param {number} tileY
+ * @returns {MapChunkView?}
+ */
+ getChunkAtTileOrNull(tileX, tileY) {
+ const chunkX = Math.floor(tileX / globalConfig.mapChunkSize);
+ const chunkY = Math.floor(tileY / globalConfig.mapChunkSize);
+ return this.getChunk(chunkX, chunkY, false);
+ }
+
+ /**
+ * Checks if a given tile is within the map bounds
+ * @param {Vector} tile
+ * @returns {boolean}
+ */
+ isValidTile(tile) {
+ if (G_IS_DEV) {
+ assert(tile instanceof Vector, "tile is not a vector");
+ }
+ return Number.isInteger(tile.x) && Number.isInteger(tile.y);
+ }
+
+ /**
+ * Returns the tile content of a given tile
+ * @param {Vector} tile
+ * @param {Layer} layer
+ * @returns {Entity} Entity or null
+ */
+ getTileContent(tile, layer) {
+ if (G_IS_DEV) {
+ this.internalCheckTile(tile);
+ }
+ const chunk = this.getChunkAtTileOrNull(tile.x, tile.y);
+ return chunk && chunk.getLayerContentFromWorldCoords(tile.x, tile.y, layer);
+ }
+
+ /**
+ * Returns the lower layers content of the given tile
+ * @param {number} x
+ * @param {number} y
+ * @returns {BaseItem=}
+ */
+ getLowerLayerContentXY(x, y) {
+ return this.getOrCreateChunkAtTile(x, y).getLowerLayerFromWorldCoords(x, y);
+ }
+
+ /**
+ * Returns the tile content of a given tile
+ * @param {number} x
+ * @param {number} y
+ * @param {Layer} layer
+ * @returns {Entity} Entity or null
+ */
+ getLayerContentXY(x, y, layer) {
+ const chunk = this.getChunkAtTileOrNull(x, y);
+ return chunk && chunk.getLayerContentFromWorldCoords(x, y, layer);
+ }
+
+ /**
+ * Returns the tile contents of a given tile
+ * @param {number} x
+ * @param {number} y
+ * @returns {Array} Entity or null
+ */
+ getLayersContentsMultipleXY(x, y) {
+ const chunk = this.getChunkAtTileOrNull(x, y);
+ if (!chunk) {
+ return [];
+ }
+ return chunk.getLayersContentsMultipleFromWorldCoords(x, y);
+ }
+
+ /**
+ * Checks if the tile is used
+ * @param {Vector} tile
+ * @param {Layer} layer
+ * @returns {boolean}
+ */
+ isTileUsed(tile, layer) {
+ if (G_IS_DEV) {
+ this.internalCheckTile(tile);
+ }
+ const chunk = this.getChunkAtTileOrNull(tile.x, tile.y);
+ return chunk && chunk.getLayerContentFromWorldCoords(tile.x, tile.y, layer) != null;
+ }
+
+ /**
+ * Checks if the tile is used
+ * @param {number} x
+ * @param {number} y
+ * @param {Layer} layer
+ * @returns {boolean}
+ */
+ isTileUsedXY(x, y, layer) {
+ const chunk = this.getChunkAtTileOrNull(x, y);
+ return chunk && chunk.getLayerContentFromWorldCoords(x, y, layer) != null;
+ }
+
+ /**
+ * Sets the tiles content
+ * @param {Vector} tile
+ * @param {Entity} entity
+ */
+ setTileContent(tile, entity) {
+ if (G_IS_DEV) {
+ this.internalCheckTile(tile);
+ }
+
+ this.getOrCreateChunkAtTile(tile.x, tile.y).setLayerContentFromWorldCords(
+ tile.x,
+ tile.y,
+ entity,
+ entity.layer
+ );
+
+ const staticComponent = entity.components.StaticMapEntity;
+ assert(staticComponent, "Can only place static map entities in tiles");
+ }
+
+ /**
+ * Places an entity with the StaticMapEntity component
+ * @param {Entity} entity
+ */
+ placeStaticEntity(entity) {
+ assert(entity.components.StaticMapEntity, "Entity is not static");
+ const staticComp = entity.components.StaticMapEntity;
+ const rect = staticComp.getTileSpaceBounds();
+ for (let dx = 0; dx < rect.w; ++dx) {
+ for (let dy = 0; dy < rect.h; ++dy) {
+ const x = rect.x + dx;
+ const y = rect.y + dy;
+ this.getOrCreateChunkAtTile(x, y).setLayerContentFromWorldCords(x, y, entity, entity.layer);
+ }
+ }
+ }
+
+ /**
+ * Removes an entity with the StaticMapEntity component
+ * @param {Entity} entity
+ */
+ removeStaticEntity(entity) {
+ assert(entity.components.StaticMapEntity, "Entity is not static");
+ const staticComp = entity.components.StaticMapEntity;
+ const rect = staticComp.getTileSpaceBounds();
+ for (let dx = 0; dx < rect.w; ++dx) {
+ for (let dy = 0; dy < rect.h; ++dy) {
+ const x = rect.x + dx;
+ const y = rect.y + dy;
+ this.getOrCreateChunkAtTile(x, y).setLayerContentFromWorldCords(x, y, null, entity.layer);
+ }
+ }
+ }
+
+ // Internal
+
+ /**
+ * Checks a given tile for validty
+ * @param {Vector} tile
+ */
+ internalCheckTile(tile) {
+ assert(tile instanceof Vector, "tile is not a vector: " + tile);
+ assert(tile.x % 1 === 0, "Tile X is not a valid integer: " + tile.x);
+ assert(tile.y % 1 === 0, "Tile Y is not a valid integer: " + tile.y);
+ }
+}
diff --git a/src/js/game/map_chunk_view.js b/src/js/game/map_chunk_view.js
index 7d74e224..848afbab 100644
--- a/src/js/game/map_chunk_view.js
+++ b/src/js/game/map_chunk_view.js
@@ -88,32 +88,35 @@ export class MapChunkView extends MapChunk {
});
const dims = globalConfig.mapChunkWorldSize;
+ const extrude = 0.05;
// Draw chunk "pixel" art
parameters.context.imageSmoothingEnabled = false;
drawSpriteClipped({
parameters,
sprite,
- x: this.x * dims,
- y: this.y * dims,
- w: dims,
- h: dims,
+ x: this.x * dims - extrude,
+ y: this.y * dims - extrude,
+ w: dims + 2 * extrude,
+ h: dims + 2 * extrude,
originalW: overlaySize,
originalH: overlaySize,
});
parameters.context.imageSmoothingEnabled = true;
+ const resourcesScale = this.root.app.settings.getAllSettings().mapResourcesScale;
// Draw patch items
- if (this.root.currentLayer === "regular") {
+ if (this.root.currentLayer === "regular" && resourcesScale > 0.05) {
+ const diameter = (70 / Math.pow(parameters.zoomLevel, 0.35)) * (0.2 + 2 * resourcesScale);
+
for (let i = 0; i < this.patches.length; ++i) {
const patch = this.patches[i];
-
- const destX = this.x * dims + patch.pos.x * globalConfig.tileSize;
- const destY = this.y * dims + patch.pos.y * globalConfig.tileSize;
- const diameter = Math.min(80, 30 / parameters.zoomLevel);
-
- patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
+ if (patch.item.getItemType() === "shape") {
+ const destX = this.x * dims + patch.pos.x * globalConfig.tileSize;
+ const destY = this.y * dims + patch.pos.y * globalConfig.tileSize;
+ patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
+ }
}
}
}
@@ -169,7 +172,10 @@ export class MapChunkView extends MapChunk {
);
}
- context.fillStyle = metaBuilding.getSilhouetteColor();
+ context.fillStyle = metaBuilding.getSilhouetteColor(
+ data.variant,
+ data.rotationVariant
+ );
for (let dx = 0; dx < 3; ++dx) {
for (let dy = 0; dy < 3; ++dy) {
const isFilled = overlayMatrix[dx + dy * 3];
@@ -186,7 +192,10 @@ export class MapChunkView extends MapChunk {
continue;
} else {
- context.fillStyle = metaBuilding.getSilhouetteColor();
+ context.fillStyle = metaBuilding.getSilhouetteColor(
+ data.variant,
+ data.rotationVariant
+ );
context.fillRect(
x * CHUNK_OVERLAY_RES,
y * CHUNK_OVERLAY_RES,
@@ -255,7 +264,8 @@ export class MapChunkView extends MapChunk {
data.variant,
entity
);
- context.fillStyle = overrideColor || metaBuilding.getSilhouetteColor();
+ context.fillStyle =
+ overrideColor || metaBuilding.getSilhouetteColor(data.variant, data.rotationVariant);
if (overlayMatrix) {
for (let dx = 0; dx < 3; ++dx) {
for (let dy = 0; dy < 3; ++dy) {
diff --git a/src/js/game/map_view.js b/src/js/game/map_view.js
index 0e0f3d5b..296291e9 100644
--- a/src/js/game/map_view.js
+++ b/src/js/game/map_view.js
@@ -26,11 +26,6 @@ export class MapView extends BaseMap {
/** @type {CanvasRenderingContext2D} */
this.cachedBackgroundContext = null;
- /**
- * Cached pattern of the stripes background
- * @type {CanvasPattern} */
- this.cachedBackgroundPattern = null;
-
this.internalInitializeCachedBackgroundCanvases();
this.root.signals.aboutToDestruct.add(this.cleanup, this);
@@ -42,7 +37,6 @@ export class MapView extends BaseMap {
cleanup() {
freeCanvas(this.cachedBackgroundCanvas);
this.cachedBackgroundCanvas = null;
- this.cachedBackgroundPattern = null;
}
/**
@@ -66,32 +60,34 @@ export class MapView extends BaseMap {
* @param {DrawParameters} drawParameters
*/
drawStaticEntityDebugOverlays(drawParameters) {
- const cullRange = drawParameters.visibleRect.toTileCullRectangle();
- const top = cullRange.top();
- const right = cullRange.right();
- const bottom = cullRange.bottom();
- const left = cullRange.left();
+ if (G_IS_DEV && (globalConfig.debug.showAcceptorEjectors || globalConfig.debug.showEntityBounds)) {
+ const cullRange = drawParameters.visibleRect.toTileCullRectangle();
+ const top = cullRange.top();
+ const right = cullRange.right();
+ const bottom = cullRange.bottom();
+ const left = cullRange.left();
- const border = 1;
+ const border = 1;
- const minY = top - border;
- const maxY = bottom + border;
- const minX = left - border;
- const maxX = right + border - 1;
+ const minY = top - border;
+ const maxY = bottom + border;
+ const minX = left - border;
+ const maxX = right + border - 1;
- // Render y from top down for proper blending
- for (let y = minY; y <= maxY; ++y) {
- for (let x = minX; x <= maxX; ++x) {
- // const content = this.tiles[x][y];
- const chunk = this.getChunkAtTileOrNull(x, y);
- if (!chunk) {
- continue;
- }
- const content = chunk.getTileContentFromWorldCoords(x, y);
- if (content) {
- let isBorder = x <= left - 1 || x >= right + 1 || y <= top - 1 || y >= bottom + 1;
- if (!isBorder) {
- content.drawDebugOverlays(drawParameters);
+ // Render y from top down for proper blending
+ for (let y = minY; y <= maxY; ++y) {
+ for (let x = minX; x <= maxX; ++x) {
+ // const content = this.tiles[x][y];
+ const chunk = this.getChunkAtTileOrNull(x, y);
+ if (!chunk) {
+ continue;
+ }
+ const content = chunk.getTileContentFromWorldCoords(x, y);
+ if (content) {
+ let isBorder = x <= left - 1 || x >= right + 1 || y <= top - 1 || y >= bottom + 1;
+ if (!isBorder) {
+ content.drawDebugOverlays(drawParameters);
+ }
}
}
}
@@ -189,19 +185,15 @@ export class MapView extends BaseMap {
* @param {DrawParameters} parameters
*/
drawBackground(parameters) {
- if (!this.cachedBackgroundPattern) {
- this.cachedBackgroundPattern = parameters.context.createPattern(
- this.cachedBackgroundCanvas,
- "repeat"
- );
- }
-
// Render tile grid
if (!this.root.app.settings.getAllSettings().disableTileGrid) {
const dpi = this.backgroundCacheDPI;
parameters.context.scale(1 / dpi, 1 / dpi);
- parameters.context.fillStyle = this.cachedBackgroundPattern;
+ parameters.context.fillStyle = parameters.context.createPattern(
+ this.cachedBackgroundCanvas,
+ "repeat"
+ );
parameters.context.fillRect(
parameters.visibleRect.x * dpi,
parameters.visibleRect.y * dpi,
diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js
index b09e901e..9deee272 100644
--- a/src/js/game/meta_building.js
+++ b/src/js/game/meta_building.js
@@ -1,273 +1,275 @@
-import { Loader } from "../core/loader";
-import { AtlasSprite } from "../core/sprites";
-import { Vector } from "../core/vector";
-import { SOUNDS } from "../platform/sound";
-import { StaticMapEntityComponent } from "./components/static_map_entity";
-import { Entity } from "./entity";
-import { GameRoot } from "./root";
-import { getCodeFromBuildingData } from "./building_codes";
-
-export const defaultBuildingVariant = "default";
-
-export class MetaBuilding {
- /**
- *
- * @param {string} id Building id
- */
- constructor(id) {
- this.id = id;
- }
-
- /**
- * Returns the id of this building
- */
- getId() {
- return this.id;
- }
-
- /**
- * Returns the edit layer of the building
- * @returns {Layer}
- */
- getLayer() {
- return "regular";
- }
-
- /**
- * Should return the dimensions of the building
- */
- getDimensions(variant = defaultBuildingVariant) {
- return new Vector(1, 1);
- }
-
- /**
- * Returns whether the building has the direction lock switch available
- */
- getHasDirectionLockAvailable() {
- return false;
- }
-
- /**
- * Whether to stay in placement mode after having placed a building
- */
- getStayInPlacementMode() {
- return false;
- }
-
- /**
- * Can return a special interlaved 9 elements overlay matrix for rendering
- * @param {number} rotation
- * @param {number} rotationVariant
- * @param {string} variant
- * @param {Entity} entity
- * @returns {Array|null}
- */
- getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
- return null;
- }
-
- /**
- * Should return additional statistics about this building
- * @param {GameRoot} root
- * @param {string} variant
- * @returns {Array<[string, string]>}
- */
- getAdditionalStatistics(root, variant) {
- return [];
- }
-
- /**
- * Returns whether this building can get replaced
- */
- getIsReplaceable() {
- return false;
- }
-
- /**
- * Whether to flip the orientation after a building has been placed - useful
- * for tunnels.
- */
- getFlipOrientationAfterPlacement() {
- return false;
- }
-
- /**
- * Whether to show a preview of the wires layer when placing the building
- */
- getShowWiresLayerPreview() {
- return false;
- }
-
- /**
- * Whether to rotate automatically in the dragging direction while placing
- * @param {string} variant
- */
- getRotateAutomaticallyWhilePlacing(variant) {
- return false;
- }
-
- /**
- * Returns whether this building is removable
- * @returns {boolean}
- */
- getIsRemovable() {
- return true;
- }
-
- /**
- * Returns the placement sound
- * @returns {string}
- */
- getPlacementSound() {
- return SOUNDS.placeBuilding;
- }
-
- /**
- * @param {GameRoot} root
- */
- getAvailableVariants(root) {
- return [defaultBuildingVariant];
- }
-
- /**
- * Returns a preview sprite
- * @returns {AtlasSprite}
- */
- getPreviewSprite(rotationVariant = 0, variant = defaultBuildingVariant) {
- return Loader.getSprite(
- "sprites/buildings/" +
- this.id +
- (variant === defaultBuildingVariant ? "" : "-" + variant) +
- ".png"
- );
- }
-
- /**
- * Returns a sprite for blueprints
- * @returns {AtlasSprite}
- */
- getBlueprintSprite(rotationVariant = 0, variant = defaultBuildingVariant) {
- return Loader.getSprite(
- "sprites/blueprints/" +
- this.id +
- (variant === defaultBuildingVariant ? "" : "-" + variant) +
- ".png"
- );
- }
-
- /**
- * Returns whether this building is rotateable
- * @param {string} variant
- * @returns {boolean}
- */
- getIsRotateable(variant) {
- return true;
- }
-
- /**
- * Returns whether this building is unlocked for the given game
- * @param {GameRoot} root
- */
- getIsUnlocked(root) {
- return true;
- }
-
- /**
- * Should return a silhouette color for the map overview or null if not set
- */
- getSilhouetteColor() {
- return null;
- }
-
- /**
- * Should return false if the pins are already included in the sprite of the building
- * @returns {boolean}
- */
- getRenderPins() {
- return true;
- }
-
- /**
- * Creates the entity without placing it
- * @param {object} param0
- * @param {GameRoot} param0.root
- * @param {Vector} param0.origin Origin tile
- * @param {number=} param0.rotation Rotation
- * @param {number} param0.originalRotation Original Rotation
- * @param {number} param0.rotationVariant Rotation variant
- * @param {string} param0.variant
- */
- createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
- const entity = new Entity(root);
- entity.layer = this.getLayer();
- entity.addComponent(
- new StaticMapEntityComponent({
- origin: new Vector(origin.x, origin.y),
- rotation,
- originalRotation,
- tileSize: this.getDimensions(variant).copy(),
- code: getCodeFromBuildingData(this, variant, rotationVariant),
- })
- );
- this.setupEntityComponents(entity, root);
- this.updateVariants(entity, rotationVariant, variant);
- return entity;
- }
-
- /**
- * Returns the sprite for a given variant
- * @param {number} rotationVariant
- * @param {string} variant
- * @returns {AtlasSprite}
- */
- getSprite(rotationVariant, variant) {
- return Loader.getSprite(
- "sprites/buildings/" +
- this.id +
- (variant === defaultBuildingVariant ? "" : "-" + variant) +
- ".png"
- );
- }
-
- /**
- * Should compute the optimal rotation variant on the given tile
- * @param {object} param0
- * @param {GameRoot} param0.root
- * @param {Vector} param0.tile
- * @param {number} param0.rotation
- * @param {string} param0.variant
- * @param {Layer} param0.layer
- * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
- */
- computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
- if (!this.getIsRotateable(variant)) {
- return {
- rotation: 0,
- rotationVariant: 0,
- };
- }
- return {
- rotation,
- rotationVariant: 0,
- };
- }
-
- /**
- * Should update the entity to match the given variants
- * @param {Entity} entity
- * @param {number} rotationVariant
- * @param {string} variant
- */
- updateVariants(entity, rotationVariant, variant) {}
-
- // PRIVATE INTERFACE
-
- /**
- * Should setup the entity components
- * @param {Entity} entity
- * @param {GameRoot} root
- */
- setupEntityComponents(entity, root) {
- abstract;
- }
-}
+import { Loader } from "../core/loader";
+import { AtlasSprite } from "../core/sprites";
+import { Vector } from "../core/vector";
+import { SOUNDS } from "../platform/sound";
+import { StaticMapEntityComponent } from "./components/static_map_entity";
+import { Entity } from "./entity";
+import { GameRoot } from "./root";
+import { getCodeFromBuildingData } from "./building_codes";
+
+export const defaultBuildingVariant = "default";
+
+export class MetaBuilding {
+ /**
+ *
+ * @param {string} id Building id
+ */
+ constructor(id) {
+ this.id = id;
+ }
+
+ /**
+ * Returns the id of this building
+ */
+ getId() {
+ return this.id;
+ }
+
+ /**
+ * Returns the edit layer of the building
+ * @returns {Layer}
+ */
+ getLayer() {
+ return "regular";
+ }
+
+ /**
+ * Should return the dimensions of the building
+ */
+ getDimensions(variant = defaultBuildingVariant) {
+ return new Vector(1, 1);
+ }
+
+ /**
+ * Returns whether the building has the direction lock switch available
+ */
+ getHasDirectionLockAvailable() {
+ return false;
+ }
+
+ /**
+ * Whether to stay in placement mode after having placed a building
+ */
+ getStayInPlacementMode() {
+ return false;
+ }
+
+ /**
+ * Can return a special interlaved 9 elements overlay matrix for rendering
+ * @param {number} rotation
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @param {Entity} entity
+ * @returns {Array|null}
+ */
+ getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) {
+ return null;
+ }
+
+ /**
+ * Should return additional statistics about this building
+ * @param {GameRoot} root
+ * @param {string} variant
+ * @returns {Array<[string, string]>}
+ */
+ getAdditionalStatistics(root, variant) {
+ return [];
+ }
+
+ /**
+ * Returns whether this building can get replaced
+ */
+ getIsReplaceable() {
+ return false;
+ }
+
+ /**
+ * Whether to flip the orientation after a building has been placed - useful
+ * for tunnels.
+ */
+ getFlipOrientationAfterPlacement() {
+ return false;
+ }
+
+ /**
+ * Whether to show a preview of the wires layer when placing the building
+ */
+ getShowWiresLayerPreview() {
+ return false;
+ }
+
+ /**
+ * Whether to rotate automatically in the dragging direction while placing
+ * @param {string} variant
+ */
+ getRotateAutomaticallyWhilePlacing(variant) {
+ return false;
+ }
+
+ /**
+ * Returns whether this building is removable
+ * @returns {boolean}
+ */
+ getIsRemovable() {
+ return true;
+ }
+
+ /**
+ * Returns the placement sound
+ * @returns {string}
+ */
+ getPlacementSound() {
+ return SOUNDS.placeBuilding;
+ }
+
+ /**
+ * @param {GameRoot} root
+ */
+ getAvailableVariants(root) {
+ return [defaultBuildingVariant];
+ }
+
+ /**
+ * Returns a preview sprite
+ * @returns {AtlasSprite}
+ */
+ getPreviewSprite(rotationVariant = 0, variant = defaultBuildingVariant) {
+ return Loader.getSprite(
+ "sprites/buildings/" +
+ this.id +
+ (variant === defaultBuildingVariant ? "" : "-" + variant) +
+ ".png"
+ );
+ }
+
+ /**
+ * Returns a sprite for blueprints
+ * @returns {AtlasSprite}
+ */
+ getBlueprintSprite(rotationVariant = 0, variant = defaultBuildingVariant) {
+ return Loader.getSprite(
+ "sprites/blueprints/" +
+ this.id +
+ (variant === defaultBuildingVariant ? "" : "-" + variant) +
+ ".png"
+ );
+ }
+
+ /**
+ * Returns whether this building is rotateable
+ * @param {string} variant
+ * @returns {boolean}
+ */
+ getIsRotateable(variant) {
+ return true;
+ }
+
+ /**
+ * Returns whether this building is unlocked for the given game
+ * @param {GameRoot} root
+ */
+ getIsUnlocked(root) {
+ return true;
+ }
+
+ /**
+ * Should return a silhouette color for the map overview or null if not set
+ * @param {string} variant
+ * @param {number} rotationVariant
+ */
+ getSilhouetteColor(variant, rotationVariant) {
+ return null;
+ }
+
+ /**
+ * Should return false if the pins are already included in the sprite of the building
+ * @returns {boolean}
+ */
+ getRenderPins() {
+ return true;
+ }
+
+ /**
+ * Creates the entity without placing it
+ * @param {object} param0
+ * @param {GameRoot} param0.root
+ * @param {Vector} param0.origin Origin tile
+ * @param {number=} param0.rotation Rotation
+ * @param {number} param0.originalRotation Original Rotation
+ * @param {number} param0.rotationVariant Rotation variant
+ * @param {string} param0.variant
+ */
+ createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
+ const entity = new Entity(root);
+ entity.layer = this.getLayer();
+ entity.addComponent(
+ new StaticMapEntityComponent({
+ origin: new Vector(origin.x, origin.y),
+ rotation,
+ originalRotation,
+ tileSize: this.getDimensions(variant).copy(),
+ code: getCodeFromBuildingData(this, variant, rotationVariant),
+ })
+ );
+ this.setupEntityComponents(entity, root);
+ this.updateVariants(entity, rotationVariant, variant);
+ return entity;
+ }
+
+ /**
+ * Returns the sprite for a given variant
+ * @param {number} rotationVariant
+ * @param {string} variant
+ * @returns {AtlasSprite}
+ */
+ getSprite(rotationVariant, variant) {
+ return Loader.getSprite(
+ "sprites/buildings/" +
+ this.id +
+ (variant === defaultBuildingVariant ? "" : "-" + variant) +
+ ".png"
+ );
+ }
+
+ /**
+ * Should compute the optimal rotation variant on the given tile
+ * @param {object} param0
+ * @param {GameRoot} param0.root
+ * @param {Vector} param0.tile
+ * @param {number} param0.rotation
+ * @param {string} param0.variant
+ * @param {Layer} param0.layer
+ * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }}
+ */
+ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
+ if (!this.getIsRotateable(variant)) {
+ return {
+ rotation: 0,
+ rotationVariant: 0,
+ };
+ }
+ return {
+ rotation,
+ rotationVariant: 0,
+ };
+ }
+
+ /**
+ * Should update the entity to match the given variants
+ * @param {Entity} entity
+ * @param {number} rotationVariant
+ * @param {string} variant
+ */
+ updateVariants(entity, rotationVariant, variant) {}
+
+ // PRIVATE INTERFACE
+
+ /**
+ * Should setup the entity components
+ * @param {Entity} entity
+ * @param {GameRoot} root
+ */
+ setupEntityComponents(entity, root) {
+ abstract;
+ }
+}
diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js
index 647e55f5..0613103e 100644
--- a/src/js/game/meta_building_registry.js
+++ b/src/js/game/meta_building_registry.js
@@ -1,33 +1,40 @@
import { gMetaBuildingRegistry } from "../core/global_registries";
import { createLogger } from "../core/logging";
+import { T } from "../translations";
+import { MetaAnalyzerBuilding } from "./buildings/analyzer";
+import { enumBalancerVariants, MetaBalancerBuilding } from "./buildings/balancer";
import { MetaBeltBuilding } from "./buildings/belt";
-import { MetaBeltBaseBuilding } from "./buildings/belt_base";
+import { MetaComparatorBuilding } from "./buildings/comparator";
+import { MetaConstantSignalBuilding } from "./buildings/constant_signal";
import { enumCutterVariants, MetaCutterBuilding } from "./buildings/cutter";
+import { MetaDisplayBuilding } from "./buildings/display";
+import { MetaFilterBuilding } from "./buildings/filter";
import { MetaHubBuilding } from "./buildings/hub";
+import { MetaItemProducerBuilding } from "./buildings/item_producer";
+import { MetaLeverBuilding } from "./buildings/lever";
+import { enumLogicGateVariants, MetaLogicGateBuilding } from "./buildings/logic_gate";
import { enumMinerVariants, MetaMinerBuilding } from "./buildings/miner";
import { MetaMixerBuilding } from "./buildings/mixer";
import { enumPainterVariants, MetaPainterBuilding } from "./buildings/painter";
-import { enumRotaterVariants, MetaRotaterBuilding } from "./buildings/rotater";
-import { enumSplitterVariants, MetaSplitterBuilding } from "./buildings/splitter";
-import { MetaStackerBuilding } from "./buildings/stacker";
-import { enumTrashVariants, MetaTrashBuilding } from "./buildings/trash";
-import { enumUndergroundBeltVariants, MetaUndergroundBeltBuilding } from "./buildings/underground_belt";
-import { MetaWireBuilding } from "./buildings/wire";
-import { gBuildingVariants, registerBuildingVariant } from "./building_codes";
-import { defaultBuildingVariant } from "./meta_building";
-import { MetaConstantSignalBuilding } from "./buildings/constant_signal";
-import { MetaLogicGateBuilding, enumLogicGateVariants } from "./buildings/logic_gate";
-import { MetaLeverBuilding } from "./buildings/lever";
-import { MetaFilterBuilding } from "./buildings/filter";
-import { MetaWireTunnelBuilding, enumWireTunnelVariants } from "./buildings/wire_tunnel";
-import { MetaDisplayBuilding } from "./buildings/display";
-import { MetaVirtualProcessorBuilding, enumVirtualProcessorVariants } from "./buildings/virtual_processor";
import { MetaReaderBuilding } from "./buildings/reader";
+import { enumRotaterVariants, MetaRotaterBuilding } from "./buildings/rotater";
+import { MetaStackerBuilding } from "./buildings/stacker";
+import { MetaStorageBuilding } from "./buildings/storage";
+import { enumTransistorVariants, MetaTransistorBuilding } from "./buildings/transistor";
+import { MetaTrashBuilding } from "./buildings/trash";
+import { enumUndergroundBeltVariants, MetaUndergroundBeltBuilding } from "./buildings/underground_belt";
+import { enumVirtualProcessorVariants, MetaVirtualProcessorBuilding } from "./buildings/virtual_processor";
+import { MetaWireBuilding } from "./buildings/wire";
+import { MetaWireTunnelBuilding } from "./buildings/wire_tunnel";
+import { buildBuildingCodeCache, gBuildingVariants, registerBuildingVariant } from "./building_codes";
+import { enumWireVariant } from "./components/wire";
+import { KEYMAPPINGS } from "./key_action_mapper";
+import { defaultBuildingVariant } from "./meta_building";
const logger = createLogger("building_registry");
export function initMetaBuildingRegistry() {
- gMetaBuildingRegistry.register(MetaSplitterBuilding);
+ gMetaBuildingRegistry.register(MetaBalancerBuilding);
gMetaBuildingRegistry.register(MetaMinerBuilding);
gMetaBuildingRegistry.register(MetaCutterBuilding);
gMetaBuildingRegistry.register(MetaRotaterBuilding);
@@ -35,6 +42,7 @@ export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaMixerBuilding);
gMetaBuildingRegistry.register(MetaPainterBuilding);
gMetaBuildingRegistry.register(MetaTrashBuilding);
+ gMetaBuildingRegistry.register(MetaStorageBuilding);
gMetaBuildingRegistry.register(MetaBeltBuilding);
gMetaBuildingRegistry.register(MetaUndergroundBeltBuilding);
gMetaBuildingRegistry.register(MetaHubBuilding);
@@ -47,18 +55,22 @@ export function initMetaBuildingRegistry() {
gMetaBuildingRegistry.register(MetaDisplayBuilding);
gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding);
gMetaBuildingRegistry.register(MetaReaderBuilding);
+ gMetaBuildingRegistry.register(MetaTransistorBuilding);
+ gMetaBuildingRegistry.register(MetaAnalyzerBuilding);
+ gMetaBuildingRegistry.register(MetaComparatorBuilding);
+ gMetaBuildingRegistry.register(MetaItemProducerBuilding);
// Belt
- registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0);
- registerBuildingVariant(2, MetaBeltBaseBuilding, defaultBuildingVariant, 1);
- registerBuildingVariant(3, MetaBeltBaseBuilding, defaultBuildingVariant, 2);
+ registerBuildingVariant(1, MetaBeltBuilding, defaultBuildingVariant, 0);
+ registerBuildingVariant(2, MetaBeltBuilding, defaultBuildingVariant, 1);
+ registerBuildingVariant(3, MetaBeltBuilding, defaultBuildingVariant, 2);
- // Splitter
- registerBuildingVariant(4, MetaSplitterBuilding);
- registerBuildingVariant(5, MetaSplitterBuilding, enumSplitterVariants.compact);
- registerBuildingVariant(6, MetaSplitterBuilding, enumSplitterVariants.compactInverse);
- registerBuildingVariant(47, MetaSplitterBuilding, enumSplitterVariants.compactMerge);
- registerBuildingVariant(48, MetaSplitterBuilding, enumSplitterVariants.compactMergeInverse);
+ // Balancer
+ registerBuildingVariant(4, MetaBalancerBuilding);
+ registerBuildingVariant(5, MetaBalancerBuilding, enumBalancerVariants.merger);
+ registerBuildingVariant(6, MetaBalancerBuilding, enumBalancerVariants.mergerInverse);
+ registerBuildingVariant(47, MetaBalancerBuilding, enumBalancerVariants.splitter);
+ registerBuildingVariant(48, MetaBalancerBuilding, enumBalancerVariants.splitterInverse);
// Miner
registerBuildingVariant(7, MetaMinerBuilding);
@@ -71,7 +83,7 @@ export function initMetaBuildingRegistry() {
// Rotater
registerBuildingVariant(11, MetaRotaterBuilding);
registerBuildingVariant(12, MetaRotaterBuilding, enumRotaterVariants.ccw);
- registerBuildingVariant(13, MetaRotaterBuilding, enumRotaterVariants.fl);
+ registerBuildingVariant(13, MetaRotaterBuilding, enumRotaterVariants.rotate180);
// Stacker
registerBuildingVariant(14, MetaStackerBuilding);
@@ -87,7 +99,9 @@ export function initMetaBuildingRegistry() {
// Trash
registerBuildingVariant(20, MetaTrashBuilding);
- registerBuildingVariant(21, MetaTrashBuilding, enumTrashVariants.storage);
+
+ // Storage
+ registerBuildingVariant(21, MetaStorageBuilding);
// Underground belt
registerBuildingVariant(22, MetaUndergroundBeltBuilding, defaultBuildingVariant, 0);
@@ -104,6 +118,11 @@ export function initMetaBuildingRegistry() {
registerBuildingVariant(29, MetaWireBuilding, defaultBuildingVariant, 2);
registerBuildingVariant(30, MetaWireBuilding, defaultBuildingVariant, 3);
+ registerBuildingVariant(52, MetaWireBuilding, enumWireVariant.second, 0);
+ registerBuildingVariant(53, MetaWireBuilding, enumWireVariant.second, 1);
+ registerBuildingVariant(54, MetaWireBuilding, enumWireVariant.second, 2);
+ registerBuildingVariant(55, MetaWireBuilding, enumWireVariant.second, 3);
+
// Constant signal
registerBuildingVariant(31, MetaConstantSignalBuilding);
@@ -112,7 +131,10 @@ export function initMetaBuildingRegistry() {
registerBuildingVariant(34, MetaLogicGateBuilding, enumLogicGateVariants.not);
registerBuildingVariant(35, MetaLogicGateBuilding, enumLogicGateVariants.xor);
registerBuildingVariant(36, MetaLogicGateBuilding, enumLogicGateVariants.or);
- registerBuildingVariant(38, MetaLogicGateBuilding, enumLogicGateVariants.transistor);
+
+ // Transistor
+ registerBuildingVariant(38, MetaTransistorBuilding, defaultBuildingVariant);
+ registerBuildingVariant(60, MetaTransistorBuilding, enumTransistorVariants.mirrored);
// Lever
registerBuildingVariant(33, MetaLeverBuilding);
@@ -122,21 +144,27 @@ export function initMetaBuildingRegistry() {
// Wire tunnel
registerBuildingVariant(39, MetaWireTunnelBuilding);
- registerBuildingVariant(41, MetaWireTunnelBuilding, enumWireTunnelVariants.coating);
// Display
registerBuildingVariant(40, MetaDisplayBuilding);
// Virtual Processor
registerBuildingVariant(42, MetaVirtualProcessorBuilding);
- registerBuildingVariant(43, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.analyzer);
registerBuildingVariant(44, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.rotater);
registerBuildingVariant(45, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.unstacker);
- registerBuildingVariant(46, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.shapecompare);
+ registerBuildingVariant(50, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.stacker);
+ registerBuildingVariant(51, MetaVirtualProcessorBuilding, enumVirtualProcessorVariants.painter);
+
+ // Analyzer
+ registerBuildingVariant(46, MetaComparatorBuilding);
+ registerBuildingVariant(43, MetaAnalyzerBuilding);
// Reader
registerBuildingVariant(49, MetaReaderBuilding);
+ // Item producer
+ registerBuildingVariant(61, MetaItemProducerBuilding);
+
// Propagate instances
for (const key in gBuildingVariants) {
gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass(
@@ -156,6 +184,29 @@ export function initMetaBuildingRegistry() {
}
}
+ // Check for valid keycodes
+ if (G_IS_DEV) {
+ gMetaBuildingRegistry.entries.forEach(metaBuilding => {
+ const id = metaBuilding.getId();
+ if (!["hub"].includes(id)) {
+ if (!KEYMAPPINGS.buildings[id]) {
+ assertAlways(
+ false,
+ "Building " + id + " has no keybinding assigned! Add it to key_action_mapper.js"
+ );
+ }
+
+ if (!T.buildings[id]) {
+ assertAlways(false, "Translation for building " + id + " missing!");
+ }
+
+ if (!T.buildings[id].default) {
+ assertAlways(false, "Translation for building " + id + " missing (default variant)!");
+ }
+ }
+ });
+ }
+
logger.log("Registered", gMetaBuildingRegistry.getNumEntries(), "buildings");
logger.log("Registered", Object.keys(gBuildingVariants).length, "building codes");
}
@@ -173,6 +224,12 @@ export function initBuildingCodesAfterResourcesLoaded() {
variant.rotationVariant,
variant.variant
);
- variant.silhouetteColor = variant.metaInstance.getSilhouetteColor();
+ variant.silhouetteColor = variant.metaInstance.getSilhouetteColor(
+ variant.variant,
+ variant.rotationVariant
+ );
}
+
+ // Update caches
+ buildBuildingCodeCache();
}
diff --git a/src/js/game/modes/regular.js b/src/js/game/modes/regular.js
new file mode 100644
index 00000000..e99f4a7c
--- /dev/null
+++ b/src/js/game/modes/regular.js
@@ -0,0 +1,480 @@
+import { findNiceIntegerValue } from "../../core/utils";
+import { GameMode } from "../game_mode";
+import { ShapeDefinition } from "../shape_definition";
+import { enumHubGoalRewards } from "../tutorial_goals";
+
+const rocketShape = "CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw";
+const finalGameShape = "RuCw--Cw:----Ru--";
+const preparementShape = "CpRpCp--:SwSwSwSw";
+const blueprintShape = "CbCbCbRb:CwCwCwCw";
+
+// Tiers need % of the previous tier as requirement too
+const tierGrowth = 2.5;
+
+/**
+ * Generates all upgrades
+ * @returns {Object} */
+function generateUpgrades(limitedVersion = false) {
+ const fixedImprovements = [0.5, 0.5, 1, 1, 2, 1, 1];
+ const numEndgameUpgrades = limitedVersion ? 0 : 1000 - fixedImprovements.length - 1;
+
+ function generateInfiniteUnlocks() {
+ return new Array(numEndgameUpgrades).fill(null).map((_, i) => ({
+ required: [
+ { shape: preparementShape, amount: 30000 + i * 10000 },
+ { shape: finalGameShape, amount: 20000 + i * 5000 },
+ { shape: rocketShape, amount: 20000 + i * 5000 },
+ ],
+ excludePrevious: true,
+ }));
+ }
+
+ // Fill in endgame upgrades
+ for (let i = 0; i < numEndgameUpgrades; ++i) {
+ if (i < 20) {
+ fixedImprovements.push(0.1);
+ } else if (i < 50) {
+ fixedImprovements.push(0.05);
+ } else if (i < 100) {
+ fixedImprovements.push(0.025);
+ } else {
+ fixedImprovements.push(0.0125);
+ }
+ }
+
+ const upgrades = {
+ belt: [
+ {
+ required: [{ shape: "CuCuCuCu", amount: 30 }],
+ },
+ {
+ required: [{ shape: "--CuCu--", amount: 500 }],
+ },
+ {
+ required: [{ shape: "CpCpCpCp", amount: 1000 }],
+ },
+ {
+ required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 6000 }],
+ },
+ {
+ required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 25000 }],
+ },
+ {
+ required: [{ shape: preparementShape, amount: 25000 }],
+ excludePrevious: true,
+ },
+ {
+ required: [
+ { shape: preparementShape, amount: 25000 },
+ { shape: finalGameShape, amount: 50000 },
+ ],
+ excludePrevious: true,
+ },
+ ...generateInfiniteUnlocks(),
+ ],
+
+ miner: [
+ {
+ required: [{ shape: "RuRuRuRu", amount: 300 }],
+ },
+ {
+ required: [{ shape: "Cu------", amount: 800 }],
+ },
+ {
+ required: [{ shape: "ScScScSc", amount: 3500 }],
+ },
+ {
+ required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 23000 }],
+ },
+ {
+ required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 50000 }],
+ },
+ {
+ required: [{ shape: preparementShape, amount: 25000 }],
+ excludePrevious: true,
+ },
+ {
+ required: [
+ { shape: preparementShape, amount: 25000 },
+ { shape: finalGameShape, amount: 50000 },
+ ],
+ excludePrevious: true,
+ },
+ ...generateInfiniteUnlocks(),
+ ],
+
+ processors: [
+ {
+ required: [{ shape: "SuSuSuSu", amount: 500 }],
+ },
+ {
+ required: [{ shape: "RuRu----", amount: 600 }],
+ },
+ {
+ required: [{ shape: "CgScScCg", amount: 3500 }],
+ },
+ {
+ required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 25000 }],
+ },
+ {
+ required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 50000 }],
+ },
+ {
+ required: [{ shape: preparementShape, amount: 25000 }],
+ excludePrevious: true,
+ },
+ {
+ required: [
+ { shape: preparementShape, amount: 25000 },
+ { shape: finalGameShape, amount: 50000 },
+ ],
+ excludePrevious: true,
+ },
+ ...generateInfiniteUnlocks(),
+ ],
+
+ painting: [
+ {
+ required: [{ shape: "RbRb----", amount: 600 }],
+ },
+ {
+ required: [{ shape: "WrWrWrWr", amount: 3800 }],
+ },
+ {
+ required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 6500 }],
+ },
+ {
+ required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 25000 }],
+ },
+ {
+ required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 50000 }],
+ },
+ {
+ required: [{ shape: preparementShape, amount: 25000 }],
+ excludePrevious: true,
+ },
+ {
+ required: [
+ { shape: preparementShape, amount: 25000 },
+ { shape: finalGameShape, amount: 50000 },
+ ],
+ excludePrevious: true,
+ },
+ ...generateInfiniteUnlocks(),
+ ],
+ };
+
+ // Automatically generate tier levels
+ for (const upgradeId in upgrades) {
+ const upgradeTiers = upgrades[upgradeId];
+
+ let currentTierRequirements = [];
+ for (let i = 0; i < upgradeTiers.length; ++i) {
+ const tierHandle = upgradeTiers[i];
+ tierHandle.improvement = fixedImprovements[i];
+ const originalRequired = tierHandle.required.slice();
+
+ for (let k = currentTierRequirements.length - 1; k >= 0; --k) {
+ const oldTierRequirement = currentTierRequirements[k];
+ if (!tierHandle.excludePrevious) {
+ tierHandle.required.unshift({
+ shape: oldTierRequirement.shape,
+ amount: oldTierRequirement.amount,
+ });
+ }
+ }
+ currentTierRequirements.push(
+ ...originalRequired.map(req => ({
+ amount: req.amount,
+ shape: req.shape,
+ }))
+ );
+ currentTierRequirements.forEach(tier => {
+ tier.amount = findNiceIntegerValue(tier.amount * tierGrowth);
+ });
+ }
+ }
+
+ // VALIDATE
+ if (G_IS_DEV) {
+ for (const upgradeId in upgrades) {
+ upgrades[upgradeId].forEach(tier => {
+ tier.required.forEach(({ shape }) => {
+ try {
+ ShapeDefinition.fromShortKey(shape);
+ } catch (ex) {
+ throw new Error("Invalid upgrade goal: '" + ex + "' for shape" + shape);
+ }
+ });
+ });
+ }
+ }
+
+ return upgrades;
+}
+
+/**
+ * Generates the level definitions
+ * @param {boolean} limitedVersion
+ */
+export function generateLevelDefinitions(limitedVersion = false) {
+ const levelDefinitions = [
+ // 1
+ // Circle
+ {
+ shape: "CuCuCuCu", // belts t1
+ required: 30,
+ reward: enumHubGoalRewards.reward_cutter_and_trash,
+ },
+
+ // 2
+ // Cutter
+ {
+ shape: "----CuCu", //
+ required: 40,
+ reward: enumHubGoalRewards.no_reward,
+ },
+
+ // 3
+ // Rectangle
+ {
+ shape: "RuRuRuRu", // miners t1
+ required: 70,
+ reward: enumHubGoalRewards.reward_balancer,
+ },
+
+ // 4
+ {
+ shape: "RuRu----", // processors t2
+ required: 70,
+ reward: enumHubGoalRewards.reward_rotater,
+ },
+
+ // 5
+ // Rotater
+ {
+ shape: "Cu----Cu", // belts t2
+ required: 170,
+ reward: enumHubGoalRewards.reward_tunnel,
+ },
+
+ // 6
+ {
+ shape: "Cu------", // miners t2
+ required: 270,
+ reward: enumHubGoalRewards.reward_painter,
+ },
+
+ // 7
+ // Painter
+ {
+ shape: "CrCrCrCr", // unused
+ required: 300,
+ reward: enumHubGoalRewards.reward_rotater_ccw,
+ },
+
+ // 8
+ {
+ shape: "RbRb----", // painter t2
+ required: 480,
+ reward: enumHubGoalRewards.reward_mixer,
+ },
+
+ // 9
+ // Mixing (purple)
+ {
+ shape: "CpCpCpCp", // belts t3
+ required: 600,
+ reward: enumHubGoalRewards.reward_merger,
+ },
+
+ // 10
+ // STACKER: Star shape + cyan
+ {
+ shape: "ScScScSc", // miners t3
+ required: 800,
+ reward: enumHubGoalRewards.reward_stacker,
+ },
+
+ // 11
+ // Chainable miner
+ {
+ shape: "CgScScCg", // processors t3
+ required: 1000,
+ reward: enumHubGoalRewards.reward_miner_chainable,
+ },
+
+ // 12
+ // Blueprints
+ {
+ shape: "CbCbCbRb:CwCwCwCw",
+ required: 1000,
+ reward: enumHubGoalRewards.reward_blueprints,
+ },
+
+ // 13
+ // Tunnel Tier 2
+ {
+ shape: "RpRpRpRp:CwCwCwCw", // painting t3
+ required: 3800,
+ reward: enumHubGoalRewards.reward_underground_belt_tier_2,
+ },
+
+ // DEMO STOPS HERE
+ ...(limitedVersion
+ ? [
+ {
+ shape: "RpRpRpRp:CwCwCwCw",
+ required: 0,
+ reward: enumHubGoalRewards.reward_demo_end,
+ },
+ ]
+ : [
+ // 14
+ // Belt reader
+ {
+ shape: "--Cg----:--Cr----", // unused
+ required: 8, // Per second!
+ reward: enumHubGoalRewards.reward_belt_reader,
+ throughputOnly: true,
+ },
+
+ // 15
+ // Storage
+ {
+ shape: "SrSrSrSr:CyCyCyCy", // unused
+ required: 10000,
+ reward: enumHubGoalRewards.reward_storage,
+ },
+
+ // 16
+ // Quad Cutter
+ {
+ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
+ required: 6000,
+ reward: enumHubGoalRewards.reward_cutter_quad,
+ },
+
+ // 17
+ // Double painter
+ {
+ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
+ required: 20000,
+ reward: enumHubGoalRewards.reward_painter_double,
+ },
+
+ // 18
+ // Rotater (180deg)
+ {
+ shape: "Sg----Sg:CgCgCgCg:--CyCy--", // unused
+ required: 20000,
+ reward: enumHubGoalRewards.reward_rotater_180,
+ },
+
+ // 19
+ // Compact splitter
+ {
+ shape: "CpRpCp--:SwSwSwSw",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_splitter,
+ },
+
+ // 20
+ // WIRES
+ {
+ shape: finalGameShape,
+ required: 25000,
+ reward: enumHubGoalRewards.reward_wires_painter_and_levers,
+ },
+
+ // 21
+ // Filter
+ {
+ shape: "CrCwCrCw:CwCrCwCr:CrCwCrCw:CwCrCwCr",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_filter,
+ },
+
+ // 22
+ // Constant signal
+ {
+ shape: "Cg----Cr:Cw----Cw:Sy------:Cy----Cy",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_constant_signal,
+ },
+
+ // 23
+ // Display
+ {
+ shape: "CcSyCcSy:SyCcSyCc:CcSyCcSy",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_display,
+ },
+
+ // 24 Logic gates
+ {
+ shape: "CcRcCcRc:RwCwRwCw:Sr--Sw--:CyCyCyCy",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_logic_gates,
+ },
+
+ // 25 Virtual Processing
+ {
+ shape: "Rg--Rg--:CwRwCwRw:--Rg--Rg",
+ required: 25000,
+ reward: enumHubGoalRewards.reward_virtual_processing,
+ },
+
+ // 26 Freeplay
+ {
+ shape: "CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw",
+ required: 50000,
+ reward: enumHubGoalRewards.reward_freeplay,
+ },
+ ]),
+ ];
+
+ if (G_IS_DEV) {
+ levelDefinitions.forEach(({ shape }) => {
+ try {
+ ShapeDefinition.fromShortKey(shape);
+ } catch (ex) {
+ throw new Error("Invalid tutorial goal: '" + ex + "' for shape" + shape);
+ }
+ });
+ }
+
+ return levelDefinitions;
+}
+
+const fullVersionUpgrades = generateUpgrades(false);
+const demoVersionUpgrades = generateUpgrades(true);
+
+const fullVersionLevels = generateLevelDefinitions(false);
+const demoVersionLevels = generateLevelDefinitions(true);
+
+export class RegularGameMode extends GameMode {
+ constructor(root) {
+ super(root);
+ }
+
+ getUpgrades() {
+ return this.root.app.restrictionMgr.getHasExtendedUpgrades()
+ ? fullVersionUpgrades
+ : demoVersionUpgrades;
+ }
+
+ getIsFreeplayAvailable() {
+ return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay();
+ }
+
+ getBlueprintShapeKey() {
+ return blueprintShape;
+ }
+
+ getLevelDefinitions() {
+ return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay()
+ ? fullVersionLevels
+ : demoVersionLevels;
+ }
+}
diff --git a/src/js/game/root.js b/src/js/game/root.js
index dd224dd8..6f1e7c36 100644
--- a/src/js/game/root.js
+++ b/src/js/game/root.js
@@ -1,221 +1,225 @@
-/* eslint-disable no-unused-vars */
-import { Signal } from "../core/signal";
-import { RandomNumberGenerator } from "../core/rng";
-import { createLogger } from "../core/logging";
-
-// Type hints
-/* typehints:start */
-import { GameTime } from "./time/game_time";
-import { EntityManager } from "./entity_manager";
-import { GameSystemManager } from "./game_system_manager";
-import { GameHUD } from "./hud/hud";
-import { MapView } from "./map_view";
-import { Camera } from "./camera";
-import { InGameState } from "../states/ingame";
-import { AutomaticSave } from "./automatic_save";
-import { Application } from "../application";
-import { SoundProxy } from "./sound_proxy";
-import { Savegame } from "../savegame/savegame";
-import { GameLogic } from "./logic";
-import { ShapeDefinitionManager } from "./shape_definition_manager";
-import { HubGoals } from "./hub_goals";
-import { BufferMaintainer } from "../core/buffer_maintainer";
-import { ProductionAnalytics } from "./production_analytics";
-import { Entity } from "./entity";
-import { ShapeDefinition } from "./shape_definition";
-import { BaseItem } from "./base_item";
-import { DynamicTickrate } from "./dynamic_tickrate";
-import { KeyActionMapper } from "./key_action_mapper";
-import { Vector } from "../core/vector";
-/* typehints:end */
-
-const logger = createLogger("game/root");
-
-/** @type {Array} */
-export const layers = ["regular", "wires"];
-
-/**
- * The game root is basically the whole game state at a given point,
- * combining all important classes. We don't have globals, but this
- * class is passed to almost all game classes.
- */
-export class GameRoot {
- /**
- * Constructs a new game root
- * @param {Application} app
- */
- constructor(app) {
- this.app = app;
-
- /** @type {Savegame} */
- this.savegame = null;
-
- /** @type {InGameState} */
- this.gameState = null;
-
- /** @type {KeyActionMapper} */
- this.keyMapper = null;
-
- // Store game dimensions
- this.gameWidth = 500;
- this.gameHeight = 500;
-
- // Stores whether the current session is a fresh game (true), or was continued (false)
- /** @type {boolean} */
- this.gameIsFresh = true;
-
- // Stores whether the logic is already initialized
- /** @type {boolean} */
- this.logicInitialized = false;
-
- // Stores whether the game is already initialized, that is, all systems etc have been created
- /** @type {boolean} */
- this.gameInitialized = false;
-
- /**
- * Whether a bulk operation is running
- */
- this.bulkOperationRunning = false;
-
- //////// Other properties ///////
-
- /** @type {Camera} */
- this.camera = null;
-
- /** @type {HTMLCanvasElement} */
- this.canvas = null;
-
- /** @type {CanvasRenderingContext2D} */
- this.context = null;
-
- /** @type {MapView} */
- this.map = null;
-
- /** @type {GameLogic} */
- this.logic = null;
-
- /** @type {EntityManager} */
- this.entityMgr = null;
-
- /** @type {GameHUD} */
- this.hud = null;
-
- /** @type {GameSystemManager} */
- this.systemMgr = null;
-
- /** @type {GameTime} */
- this.time = null;
-
- /** @type {HubGoals} */
- this.hubGoals = null;
-
- /** @type {BufferMaintainer} */
- this.buffers = null;
-
- /** @type {AutomaticSave} */
- this.automaticSave = null;
-
- /** @type {SoundProxy} */
- this.soundProxy = null;
-
- /** @type {ShapeDefinitionManager} */
- this.shapeDefinitionMgr = null;
-
- /** @type {ProductionAnalytics} */
- this.productionAnalytics = null;
-
- /** @type {DynamicTickrate} */
- this.dynamicTickrate = null;
-
- /** @type {Layer} */
- this.currentLayer = "regular";
-
- this.signals = {
- // Entities
- entityManuallyPlaced: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityAdded: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityChanged: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityGotNewComponent: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityComponentRemoved: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityQueuedForDestroy: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- entityDestroyed: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
-
- // Global
- resized: /** @type {TypedSignal<[number, number]>} */ (new Signal()),
- readyToRender: /** @type {TypedSignal<[]>} */ (new Signal()),
- aboutToDestruct: /** @type {TypedSignal<[]>} */ new Signal(),
-
- // Game Hooks
- gameSaved: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got saved
- gameRestored: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got restored
-
- gameFrameStarted: /** @type {TypedSignal<[]>} */ (new Signal()), // New frame
-
- storyGoalCompleted: /** @type {TypedSignal<[number, string]>} */ (new Signal()),
- upgradePurchased: /** @type {TypedSignal<[string]>} */ (new Signal()),
-
- // Called right after game is initialized
- postLoadHook: /** @type {TypedSignal<[]>} */ (new Signal()),
-
- shapeDelivered: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
- itemProduced: /** @type {TypedSignal<[BaseItem]>} */ (new Signal()),
-
- bulkOperationFinished: /** @type {TypedSignal<[]>} */ (new Signal()),
-
- editModeChanged: /** @type {TypedSignal<[Layer]>} */ (new Signal()),
-
- // Called to check if an entity can be placed, second parameter is an additional offset.
- // Use to introduce additional placement checks
- prePlacementCheck: /** @type {TypedSignal<[Entity, Vector]>} */ (new Signal()),
-
- // Called before actually placing an entity, use to perform additional logic
- // for freeing space before actually placing.
- freeEntityAreaBeforeBuild: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
- };
-
- // RNG's
- /** @type {Object.>} */
- this.rngs = {};
-
- // Work queue
- this.queue = {
- requireRedraw: false,
- };
- }
-
- /**
- * Destructs the game root
- */
- destruct() {
- logger.log("destructing root");
- this.signals.aboutToDestruct.dispatch();
-
- this.reset();
- }
-
- /**
- * Resets the whole root and removes all properties
- */
- reset() {
- if (this.signals) {
- // Destruct all signals
- for (let i = 0; i < this.signals.length; ++i) {
- this.signals[i].removeAll();
- }
- }
-
- if (this.hud) {
- this.hud.cleanup();
- }
- if (this.camera) {
- this.camera.cleanup();
- }
-
- // Finally free all properties
- for (let prop in this) {
- if (this.hasOwnProperty(prop)) {
- delete this[prop];
- }
- }
- }
-}
+/* eslint-disable no-unused-vars */
+import { Signal } from "../core/signal";
+import { RandomNumberGenerator } from "../core/rng";
+import { createLogger } from "../core/logging";
+
+// Type hints
+/* typehints:start */
+import { GameTime } from "./time/game_time";
+import { EntityManager } from "./entity_manager";
+import { GameSystemManager } from "./game_system_manager";
+import { GameHUD } from "./hud/hud";
+import { MapView } from "./map_view";
+import { Camera } from "./camera";
+import { InGameState } from "../states/ingame";
+import { AutomaticSave } from "./automatic_save";
+import { Application } from "../application";
+import { SoundProxy } from "./sound_proxy";
+import { Savegame } from "../savegame/savegame";
+import { GameLogic } from "./logic";
+import { ShapeDefinitionManager } from "./shape_definition_manager";
+import { HubGoals } from "./hub_goals";
+import { BufferMaintainer } from "../core/buffer_maintainer";
+import { ProductionAnalytics } from "./production_analytics";
+import { Entity } from "./entity";
+import { ShapeDefinition } from "./shape_definition";
+import { BaseItem } from "./base_item";
+import { DynamicTickrate } from "./dynamic_tickrate";
+import { KeyActionMapper } from "./key_action_mapper";
+import { Vector } from "../core/vector";
+import { GameMode } from "./game_mode";
+/* typehints:end */
+
+const logger = createLogger("game/root");
+
+/** @type {Array} */
+export const layers = ["regular", "wires"];
+
+/**
+ * The game root is basically the whole game state at a given point,
+ * combining all important classes. We don't have globals, but this
+ * class is passed to almost all game classes.
+ */
+export class GameRoot {
+ /**
+ * Constructs a new game root
+ * @param {Application} app
+ */
+ constructor(app) {
+ this.app = app;
+
+ /** @type {Savegame} */
+ this.savegame = null;
+
+ /** @type {InGameState} */
+ this.gameState = null;
+
+ /** @type {KeyActionMapper} */
+ this.keyMapper = null;
+
+ // Store game dimensions
+ this.gameWidth = 500;
+ this.gameHeight = 500;
+
+ // Stores whether the current session is a fresh game (true), or was continued (false)
+ /** @type {boolean} */
+ this.gameIsFresh = true;
+
+ // Stores whether the logic is already initialized
+ /** @type {boolean} */
+ this.logicInitialized = false;
+
+ // Stores whether the game is already initialized, that is, all systems etc have been created
+ /** @type {boolean} */
+ this.gameInitialized = false;
+
+ /**
+ * Whether a bulk operation is running
+ */
+ this.bulkOperationRunning = false;
+
+ //////// Other properties ///////
+
+ /** @type {Camera} */
+ this.camera = null;
+
+ /** @type {HTMLCanvasElement} */
+ this.canvas = null;
+
+ /** @type {CanvasRenderingContext2D} */
+ this.context = null;
+
+ /** @type {MapView} */
+ this.map = null;
+
+ /** @type {GameLogic} */
+ this.logic = null;
+
+ /** @type {EntityManager} */
+ this.entityMgr = null;
+
+ /** @type {GameHUD} */
+ this.hud = null;
+
+ /** @type {GameSystemManager} */
+ this.systemMgr = null;
+
+ /** @type {GameTime} */
+ this.time = null;
+
+ /** @type {HubGoals} */
+ this.hubGoals = null;
+
+ /** @type {BufferMaintainer} */
+ this.buffers = null;
+
+ /** @type {AutomaticSave} */
+ this.automaticSave = null;
+
+ /** @type {SoundProxy} */
+ this.soundProxy = null;
+
+ /** @type {ShapeDefinitionManager} */
+ this.shapeDefinitionMgr = null;
+
+ /** @type {ProductionAnalytics} */
+ this.productionAnalytics = null;
+
+ /** @type {DynamicTickrate} */
+ this.dynamicTickrate = null;
+
+ /** @type {Layer} */
+ this.currentLayer = "regular";
+
+ /** @type {GameMode} */
+ this.gameMode = null;
+
+ this.signals = {
+ // Entities
+ entityManuallyPlaced: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityAdded: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityChanged: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityGotNewComponent: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityComponentRemoved: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityQueuedForDestroy: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ entityDestroyed: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+
+ // Global
+ resized: /** @type {TypedSignal<[number, number]>} */ (new Signal()),
+ readyToRender: /** @type {TypedSignal<[]>} */ (new Signal()),
+ aboutToDestruct: /** @type {TypedSignal<[]>} */ new Signal(),
+
+ // Game Hooks
+ gameSaved: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got saved
+ gameRestored: /** @type {TypedSignal<[]>} */ (new Signal()), // Game got restored
+
+ gameFrameStarted: /** @type {TypedSignal<[]>} */ (new Signal()), // New frame
+
+ storyGoalCompleted: /** @type {TypedSignal<[number, string]>} */ (new Signal()),
+ upgradePurchased: /** @type {TypedSignal<[string]>} */ (new Signal()),
+
+ // Called right after game is initialized
+ postLoadHook: /** @type {TypedSignal<[]>} */ (new Signal()),
+
+ shapeDelivered: /** @type {TypedSignal<[ShapeDefinition]>} */ (new Signal()),
+ itemProduced: /** @type {TypedSignal<[BaseItem]>} */ (new Signal()),
+
+ bulkOperationFinished: /** @type {TypedSignal<[]>} */ (new Signal()),
+
+ editModeChanged: /** @type {TypedSignal<[Layer]>} */ (new Signal()),
+
+ // Called to check if an entity can be placed, second parameter is an additional offset.
+ // Use to introduce additional placement checks
+ prePlacementCheck: /** @type {TypedSignal<[Entity, Vector]>} */ (new Signal()),
+
+ // Called before actually placing an entity, use to perform additional logic
+ // for freeing space before actually placing.
+ freeEntityAreaBeforeBuild: /** @type {TypedSignal<[Entity]>} */ (new Signal()),
+ };
+
+ // RNG's
+ /** @type {Object.>} */
+ this.rngs = {};
+
+ // Work queue
+ this.queue = {
+ requireRedraw: false,
+ };
+ }
+
+ /**
+ * Destructs the game root
+ */
+ destruct() {
+ logger.log("destructing root");
+ this.signals.aboutToDestruct.dispatch();
+
+ this.reset();
+ }
+
+ /**
+ * Resets the whole root and removes all properties
+ */
+ reset() {
+ if (this.signals) {
+ // Destruct all signals
+ for (let i = 0; i < this.signals.length; ++i) {
+ this.signals[i].removeAll();
+ }
+ }
+
+ if (this.hud) {
+ this.hud.cleanup();
+ }
+ if (this.camera) {
+ this.camera.cleanup();
+ }
+
+ // Finally free all properties
+ for (let prop in this) {
+ if (this.hasOwnProperty(prop)) {
+ delete this[prop];
+ }
+ }
+ }
+}
diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js
index 65b72a1a..b09d73c5 100644
--- a/src/js/game/shape_definition.js
+++ b/src/js/game/shape_definition.js
@@ -297,6 +297,15 @@ export class ShapeDefinition extends BasicSerializableObject {
parameters.context.drawImage(canvas, x - diameter / 2, y - diameter / 2, diameter, diameter);
}
+ /**
+ * Draws the item to a canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} size
+ */
+ drawFullSizeOnCanvas(context, size) {
+ this.internalGenerateShapeBuffer(null, context, size, size, 1);
+ }
+
/**
* Generates this shape as a canvas
* @param {number} size
@@ -487,10 +496,10 @@ export class ShapeDefinition extends BasicSerializableObject {
}
/**
- * Returns a definition which was rotated 180 degrees (flipped)
+ * Returns a definition which was rotated 180 degrees
* @returns {ShapeDefinition}
*/
- cloneRotateFL() {
+ cloneRotate180() {
const newLayers = this.internalCloneLayers();
for (let layerIndex = 0; layerIndex < newLayers.length; ++layerIndex) {
const quadrants = newLayers[layerIndex];
diff --git a/src/js/game/shape_definition_manager.js b/src/js/game/shape_definition_manager.js
index ef0d592f..5bcfcc4b 100644
--- a/src/js/game/shape_definition_manager.js
+++ b/src/js/game/shape_definition_manager.js
@@ -1,259 +1,259 @@
-import { createLogger } from "../core/logging";
-import { BasicSerializableObject } from "../savegame/serialization";
-import { enumColors } from "./colors";
-import { ShapeItem } from "./items/shape_item";
-import { GameRoot } from "./root";
-import { enumSubShape, ShapeDefinition } from "./shape_definition";
-
-const logger = createLogger("shape_definition_manager");
-
-export class ShapeDefinitionManager extends BasicSerializableObject {
- static getId() {
- return "ShapeDefinitionManager";
- }
-
- /**
- *
- * @param {GameRoot} root
- */
- constructor(root) {
- super();
- this.root = root;
-
- /**
- * Store a cache from key -> definition
- * @type {Object}
- */
- this.shapeKeyToDefinition = {};
-
- /**
- * Store a cache from key -> item
- */
- this.shapeKeyToItem = {};
-
- // Caches operations in the form of 'operation:def1[:def2]'
- /** @type {Object.|ShapeDefinition>} */
- this.operationCache = {};
- }
-
- /**
- * Returns a shape instance from a given short key
- * @param {string} hash
- * @returns {ShapeDefinition}
- */
- getShapeFromShortKey(hash) {
- const cached = this.shapeKeyToDefinition[hash];
- if (cached) {
- return cached;
- }
- return (this.shapeKeyToDefinition[hash] = ShapeDefinition.fromShortKey(hash));
- }
-
- /**
- * Returns a item instance from a given short key
- * @param {string} hash
- * @returns {ShapeItem}
- */
- getShapeItemFromShortKey(hash) {
- const cached = this.shapeKeyToItem[hash];
- if (cached) {
- return cached;
- }
- const definition = this.getShapeFromShortKey(hash);
- return (this.shapeKeyToItem[hash] = new ShapeItem(definition));
- }
-
- /**
- * Returns a shape item for a given definition
- * @param {ShapeDefinition} definition
- * @returns {ShapeItem}
- */
- getShapeItemFromDefinition(definition) {
- return this.getShapeItemFromShortKey(definition.getHash());
- }
-
- /**
- * Registers a new shape definition
- * @param {ShapeDefinition} definition
- */
- registerShapeDefinition(definition) {
- const id = definition.getHash();
- assert(!this.shapeKeyToDefinition[id], "Shape Definition " + id + " already exists");
- this.shapeKeyToDefinition[id] = definition;
- // logger.log("Registered shape with key", id);
- }
-
- /**
- * Generates a definition for splitting a shape definition in two halfs
- * @param {ShapeDefinition} definition
- * @returns {[ShapeDefinition, ShapeDefinition]}
- */
- shapeActionCutHalf(definition) {
- const key = "cut:" + definition.getHash();
- if (this.operationCache[key]) {
- return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key]);
- }
- const rightSide = definition.cloneFilteredByQuadrants([2, 3]);
- const leftSide = definition.cloneFilteredByQuadrants([0, 1]);
-
- return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key] = [
- this.registerOrReturnHandle(rightSide),
- this.registerOrReturnHandle(leftSide),
- ]);
- }
-
- /**
- * Generates a definition for splitting a shape definition in four quads
- * @param {ShapeDefinition} definition
- * @returns {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]}
- */
- shapeActionCutQuad(definition) {
- const key = "cut-quad:" + definition.getHash();
- if (this.operationCache[key]) {
- return /** @type {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]} */ (this
- .operationCache[key]);
- }
-
- return /** @type {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]} */ (this.operationCache[
- key
- ] = [
- this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([0])),
- this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([1])),
- this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([2])),
- this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([3])),
- ]);
- }
-
- /**
- * Generates a definition for rotating a shape clockwise
- * @param {ShapeDefinition} definition
- * @returns {ShapeDefinition}
- */
- shapeActionRotateCW(definition) {
- const key = "rotate-cw:" + definition.getHash();
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
-
- const rotated = definition.cloneRotateCW();
-
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- rotated
- ));
- }
-
- /**
- * Generates a definition for rotating a shape counter clockwise
- * @param {ShapeDefinition} definition
- * @returns {ShapeDefinition}
- */
- shapeActionRotateCCW(definition) {
- const key = "rotate-ccw:" + definition.getHash();
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
-
- const rotated = definition.cloneRotateCCW();
-
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- rotated
- ));
- }
-
- /**
- * Generates a definition for rotating a shape counter clockwise
- * @param {ShapeDefinition} definition
- * @returns {ShapeDefinition}
- */
- shapeActionRotateFL(definition) {
- const key = "rotate-fl:" + definition.getHash();
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
-
- const rotated = definition.cloneRotateFL();
-
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- rotated
- ));
- }
-
- /**
- * Generates a definition for stacking the upper definition onto the lower one
- * @param {ShapeDefinition} lowerDefinition
- * @param {ShapeDefinition} upperDefinition
- * @returns {ShapeDefinition}
- */
- shapeActionStack(lowerDefinition, upperDefinition) {
- const key = "stack:" + lowerDefinition.getHash() + ":" + upperDefinition.getHash();
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
- const stacked = lowerDefinition.cloneAndStackWith(upperDefinition);
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- stacked
- ));
- }
-
- /**
- * Generates a definition for painting it with the given color
- * @param {ShapeDefinition} definition
- * @param {enumColors} color
- * @returns {ShapeDefinition}
- */
- shapeActionPaintWith(definition, color) {
- const key = "paint:" + definition.getHash() + ":" + color;
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
- const colorized = definition.cloneAndPaintWith(color);
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- colorized
- ));
- }
-
- /**
- * Generates a definition for painting it with the 4 colors
- * @param {ShapeDefinition} definition
- * @param {[enumColors, enumColors, enumColors, enumColors]} colors
- * @returns {ShapeDefinition}
- */
- shapeActionPaintWith4Colors(definition, colors) {
- const key = "paint4:" + definition.getHash() + ":" + colors.join(",");
- if (this.operationCache[key]) {
- return /** @type {ShapeDefinition} */ (this.operationCache[key]);
- }
- const colorized = definition.cloneAndPaintWith4Colors(colors);
- return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
- colorized
- ));
- }
-
- /**
- * Checks if we already have cached this definition, and if so throws it away and returns the already
- * cached variant
- * @param {ShapeDefinition} definition
- */
- registerOrReturnHandle(definition) {
- const id = definition.getHash();
- if (this.shapeKeyToDefinition[id]) {
- return this.shapeKeyToDefinition[id];
- }
- this.shapeKeyToDefinition[id] = definition;
- // logger.log("Registered shape with key (2)", id);
- return definition;
- }
-
- /**
- *
- * @param {[enumSubShape, enumSubShape, enumSubShape, enumSubShape]} subShapes
- * @returns {ShapeDefinition}
- */
- getDefinitionFromSimpleShapes(subShapes, color = enumColors.uncolored) {
- const shapeLayer = /** @type {import("./shape_definition").ShapeLayer} */ (subShapes.map(
- subShape => ({ subShape, color })
- ));
-
- return this.registerOrReturnHandle(new ShapeDefinition({ layers: [shapeLayer] }));
- }
-}
+import { createLogger } from "../core/logging";
+import { BasicSerializableObject } from "../savegame/serialization";
+import { enumColors } from "./colors";
+import { ShapeItem } from "./items/shape_item";
+import { GameRoot } from "./root";
+import { enumSubShape, ShapeDefinition } from "./shape_definition";
+
+const logger = createLogger("shape_definition_manager");
+
+export class ShapeDefinitionManager extends BasicSerializableObject {
+ static getId() {
+ return "ShapeDefinitionManager";
+ }
+
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ constructor(root) {
+ super();
+ this.root = root;
+
+ /**
+ * Store a cache from key -> definition
+ * @type {Object}
+ */
+ this.shapeKeyToDefinition = {};
+
+ /**
+ * Store a cache from key -> item
+ */
+ this.shapeKeyToItem = {};
+
+ // Caches operations in the form of 'operation/def1[/def2]'
+ /** @type {Object.|ShapeDefinition>} */
+ this.operationCache = {};
+ }
+
+ /**
+ * Returns a shape instance from a given short key
+ * @param {string} hash
+ * @returns {ShapeDefinition}
+ */
+ getShapeFromShortKey(hash) {
+ const cached = this.shapeKeyToDefinition[hash];
+ if (cached) {
+ return cached;
+ }
+ return (this.shapeKeyToDefinition[hash] = ShapeDefinition.fromShortKey(hash));
+ }
+
+ /**
+ * Returns a item instance from a given short key
+ * @param {string} hash
+ * @returns {ShapeItem}
+ */
+ getShapeItemFromShortKey(hash) {
+ const cached = this.shapeKeyToItem[hash];
+ if (cached) {
+ return cached;
+ }
+ const definition = this.getShapeFromShortKey(hash);
+ return (this.shapeKeyToItem[hash] = new ShapeItem(definition));
+ }
+
+ /**
+ * Returns a shape item for a given definition
+ * @param {ShapeDefinition} definition
+ * @returns {ShapeItem}
+ */
+ getShapeItemFromDefinition(definition) {
+ return this.getShapeItemFromShortKey(definition.getHash());
+ }
+
+ /**
+ * Registers a new shape definition
+ * @param {ShapeDefinition} definition
+ */
+ registerShapeDefinition(definition) {
+ const id = definition.getHash();
+ assert(!this.shapeKeyToDefinition[id], "Shape Definition " + id + " already exists");
+ this.shapeKeyToDefinition[id] = definition;
+ // logger.log("Registered shape with key", id);
+ }
+
+ /**
+ * Generates a definition for splitting a shape definition in two halfs
+ * @param {ShapeDefinition} definition
+ * @returns {[ShapeDefinition, ShapeDefinition]}
+ */
+ shapeActionCutHalf(definition) {
+ const key = "cut/" + definition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key]);
+ }
+ const rightSide = definition.cloneFilteredByQuadrants([2, 3]);
+ const leftSide = definition.cloneFilteredByQuadrants([0, 1]);
+
+ return /** @type {[ShapeDefinition, ShapeDefinition]} */ (this.operationCache[key] = [
+ this.registerOrReturnHandle(rightSide),
+ this.registerOrReturnHandle(leftSide),
+ ]);
+ }
+
+ /**
+ * Generates a definition for splitting a shape definition in four quads
+ * @param {ShapeDefinition} definition
+ * @returns {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]}
+ */
+ shapeActionCutQuad(definition) {
+ const key = "cut-quad/" + definition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]} */ (this
+ .operationCache[key]);
+ }
+
+ return /** @type {[ShapeDefinition, ShapeDefinition, ShapeDefinition, ShapeDefinition]} */ (this.operationCache[
+ key
+ ] = [
+ this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([0])),
+ this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([1])),
+ this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([2])),
+ this.registerOrReturnHandle(definition.cloneFilteredByQuadrants([3])),
+ ]);
+ }
+
+ /**
+ * Generates a definition for rotating a shape clockwise
+ * @param {ShapeDefinition} definition
+ * @returns {ShapeDefinition}
+ */
+ shapeActionRotateCW(definition) {
+ const key = "rotate-cw/" + definition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+
+ const rotated = definition.cloneRotateCW();
+
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ rotated
+ ));
+ }
+
+ /**
+ * Generates a definition for rotating a shape counter clockwise
+ * @param {ShapeDefinition} definition
+ * @returns {ShapeDefinition}
+ */
+ shapeActionRotateCCW(definition) {
+ const key = "rotate-ccw/" + definition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+
+ const rotated = definition.cloneRotateCCW();
+
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ rotated
+ ));
+ }
+
+ /**
+ * Generates a definition for rotating a shape FL
+ * @param {ShapeDefinition} definition
+ * @returns {ShapeDefinition}
+ */
+ shapeActionRotate180(definition) {
+ const key = "rotate-fl/" + definition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+
+ const rotated = definition.cloneRotate180();
+
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ rotated
+ ));
+ }
+
+ /**
+ * Generates a definition for stacking the upper definition onto the lower one
+ * @param {ShapeDefinition} lowerDefinition
+ * @param {ShapeDefinition} upperDefinition
+ * @returns {ShapeDefinition}
+ */
+ shapeActionStack(lowerDefinition, upperDefinition) {
+ const key = "stack/" + lowerDefinition.getHash() + "/" + upperDefinition.getHash();
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+ const stacked = lowerDefinition.cloneAndStackWith(upperDefinition);
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ stacked
+ ));
+ }
+
+ /**
+ * Generates a definition for painting it with the given color
+ * @param {ShapeDefinition} definition
+ * @param {enumColors} color
+ * @returns {ShapeDefinition}
+ */
+ shapeActionPaintWith(definition, color) {
+ const key = "paint/" + definition.getHash() + "/" + color;
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+ const colorized = definition.cloneAndPaintWith(color);
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ colorized
+ ));
+ }
+
+ /**
+ * Generates a definition for painting it with the 4 colors
+ * @param {ShapeDefinition} definition
+ * @param {[enumColors, enumColors, enumColors, enumColors]} colors
+ * @returns {ShapeDefinition}
+ */
+ shapeActionPaintWith4Colors(definition, colors) {
+ const key = "paint4/" + definition.getHash() + "/" + colors.join(",");
+ if (this.operationCache[key]) {
+ return /** @type {ShapeDefinition} */ (this.operationCache[key]);
+ }
+ const colorized = definition.cloneAndPaintWith4Colors(colors);
+ return /** @type {ShapeDefinition} */ (this.operationCache[key] = this.registerOrReturnHandle(
+ colorized
+ ));
+ }
+
+ /**
+ * Checks if we already have cached this definition, and if so throws it away and returns the already
+ * cached variant
+ * @param {ShapeDefinition} definition
+ */
+ registerOrReturnHandle(definition) {
+ const id = definition.getHash();
+ if (this.shapeKeyToDefinition[id]) {
+ return this.shapeKeyToDefinition[id];
+ }
+ this.shapeKeyToDefinition[id] = definition;
+ // logger.log("Registered shape with key (2)", id);
+ return definition;
+ }
+
+ /**
+ *
+ * @param {[enumSubShape, enumSubShape, enumSubShape, enumSubShape]} subShapes
+ * @returns {ShapeDefinition}
+ */
+ getDefinitionFromSimpleShapes(subShapes, color = enumColors.uncolored) {
+ const shapeLayer = /** @type {import("./shape_definition").ShapeLayer} */ (subShapes.map(
+ subShape => ({ subShape, color })
+ ));
+
+ return this.registerOrReturnHandle(new ShapeDefinition({ layers: [shapeLayer] }));
+ }
+}
diff --git a/src/js/game/systems/belt.js b/src/js/game/systems/belt.js
index 4d8151f6..10543e6c 100644
--- a/src/js/game/systems/belt.js
+++ b/src/js/game/systems/belt.js
@@ -1,520 +1,554 @@
-import { globalConfig } from "../../core/config";
-import { DrawParameters } from "../../core/draw_parameters";
-import { gMetaBuildingRegistry } from "../../core/global_registries";
-import { Loader } from "../../core/loader";
-import { createLogger } from "../../core/logging";
-import { AtlasSprite } from "../../core/sprites";
-import { fastArrayDeleteValue } from "../../core/utils";
-import { enumDirection, enumDirectionToVector, enumInvertedDirections, Vector } from "../../core/vector";
-import { BeltPath } from "../belt_path";
-import { arrayBeltVariantToRotation, MetaBeltBaseBuilding } from "../buildings/belt_base";
-import { BeltComponent } from "../components/belt";
-import { Entity } from "../entity";
-import { GameSystemWithFilter } from "../game_system_with_filter";
-import { MapChunkView } from "../map_chunk_view";
-import { defaultBuildingVariant } from "../meta_building";
-import { getCodeFromBuildingData } from "../building_codes";
-
-export const BELT_ANIM_COUNT = 14;
-
-const logger = createLogger("belt");
-
-/**
- * Manages all belts
- */
-export class BeltSystem extends GameSystemWithFilter {
- constructor(root) {
- super(root, [BeltComponent]);
- /**
- * @type {Object.>}
- */
- this.beltSprites = {
- [enumDirection.top]: Loader.getSprite("sprites/belt/built/forward_0.png"),
- [enumDirection.left]: Loader.getSprite("sprites/belt/built/left_0.png"),
- [enumDirection.right]: Loader.getSprite("sprites/belt/built/right_0.png"),
- };
-
- /**
- * @type {Object.>}
- */
- this.beltAnimations = {
- [enumDirection.top]: [],
- [enumDirection.left]: [],
- [enumDirection.right]: [],
- };
-
- for (let i = 0; i < BELT_ANIM_COUNT; ++i) {
- this.beltAnimations[enumDirection.top].push(
- Loader.getSprite("sprites/belt/built/forward_" + i + ".png")
- );
- this.beltAnimations[enumDirection.left].push(
- Loader.getSprite("sprites/belt/built/left_" + i + ".png")
- );
- this.beltAnimations[enumDirection.right].push(
- Loader.getSprite("sprites/belt/built/right_" + i + ".png")
- );
- }
-
- this.root.signals.entityDestroyed.add(this.onEntityDestroyed, this);
- this.root.signals.entityDestroyed.add(this.updateSurroundingBeltPlacement, this);
-
- // Notice: These must come *after* the entity destroyed signals
- this.root.signals.entityAdded.add(this.onEntityAdded, this);
- this.root.signals.entityAdded.add(this.updateSurroundingBeltPlacement, this);
-
- /** @type {Array} */
- this.beltPaths = [];
- }
-
- /**
- * Serializes all belt paths
- * @returns {Array}
- */
- serializePaths() {
- let data = [];
- for (let i = 0; i < this.beltPaths.length; ++i) {
- data.push(this.beltPaths[i].serialize());
- }
- return data;
- }
-
- /**
- * Deserializes all belt paths
- * @param {Array} data
- */
- deserializePaths(data) {
- if (!Array.isArray(data)) {
- return "Belt paths are not an array: " + typeof data;
- }
-
- for (let i = 0; i < data.length; ++i) {
- const path = BeltPath.fromSerialized(this.root, data[i]);
- // If path is a string, that means its an error
- if (!(path instanceof BeltPath)) {
- return "Failed to create path from belt data: " + path;
- }
- this.beltPaths.push(path);
- }
-
- if (this.beltPaths.length === 0) {
- // Old savegames might not have paths yet
- logger.warn("Recomputing belt paths (most likely the savegame is old or empty)");
- this.recomputeAllBeltPaths();
- } else {
- logger.warn("Restored", this.beltPaths.length, "belt paths");
- }
-
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
- }
-
- /**
- * Updates the belt placement after an entity has been added / deleted
- * @param {Entity} entity
- */
- updateSurroundingBeltPlacement(entity) {
- if (!this.root.gameInitialized) {
- return;
- }
-
- const staticComp = entity.components.StaticMapEntity;
- if (!staticComp) {
- return;
- }
-
- const metaBelt = gMetaBuildingRegistry.findByClass(MetaBeltBaseBuilding);
- // Compute affected area
- const originalRect = staticComp.getTileSpaceBounds();
- const affectedArea = originalRect.expandedInAllDirections(1);
-
- /** @type {Set} */
- const changedPaths = new Set();
-
- for (let x = affectedArea.x; x < affectedArea.right(); ++x) {
- for (let y = affectedArea.y; y < affectedArea.bottom(); ++y) {
- if (originalRect.containsPoint(x, y)) {
- // Make sure we don't update the original entity
- continue;
- }
-
- const targetEntities = this.root.map.getLayersContentsMultipleXY(x, y);
- for (let i = 0; i < targetEntities.length; ++i) {
- const targetEntity = targetEntities[i];
-
- const targetBeltComp = targetEntity.components.Belt;
- const targetStaticComp = targetEntity.components.StaticMapEntity;
-
- if (!targetBeltComp) {
- // Not a belt
- continue;
- }
-
- const {
- rotation,
- rotationVariant,
- } = metaBelt.computeOptimalDirectionAndRotationVariantAtTile({
- root: this.root,
- tile: new Vector(x, y),
- rotation: targetStaticComp.originalRotation,
- variant: defaultBuildingVariant,
- layer: targetEntity.layer,
- });
-
- // Compute delta to see if anything changed
- const newDirection = arrayBeltVariantToRotation[rotationVariant];
-
- if (targetStaticComp.rotation !== rotation || newDirection !== targetBeltComp.direction) {
- // Ok, first remove it from its current path
- this.deleteEntityFromPath(targetBeltComp.assignedPath, targetEntity);
-
- // Change stuff
- targetStaticComp.rotation = rotation;
- metaBelt.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant);
-
- // Update code as well
- targetStaticComp.code = getCodeFromBuildingData(
- metaBelt,
- defaultBuildingVariant,
- rotationVariant
- );
-
- // Now add it again
- this.addEntityToPaths(targetEntity);
-
- // Sanity
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
-
- // Make sure the chunks know about the update
- this.root.signals.entityChanged.dispatch(targetEntity);
- }
-
- if (targetBeltComp.assignedPath) {
- changedPaths.add(targetBeltComp.assignedPath);
- }
- }
- }
- }
-
- // notify all paths *afterwards* to avoid multi-updates
- changedPaths.forEach(path => path.onSurroundingsChanged());
-
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
- }
-
- /**
- * Called when an entity got destroyed
- * @param {Entity} entity
- */
- onEntityDestroyed(entity) {
- if (!this.root.gameInitialized) {
- return;
- }
-
- if (!entity.components.Belt) {
- return;
- }
-
- const assignedPath = entity.components.Belt.assignedPath;
- assert(assignedPath, "Entity has no belt path assigned");
- this.deleteEntityFromPath(assignedPath, entity);
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
- }
-
- /**
- * Attempts to delete the belt from its current path
- * @param {BeltPath} path
- * @param {Entity} entity
- */
- deleteEntityFromPath(path, entity) {
- if (path.entityPath.length === 1) {
- // This is a single entity path, easy to do, simply erase whole path
- fastArrayDeleteValue(this.beltPaths, path);
- return;
- }
-
- // Notice: Since there might be circular references, it is important to check
- // which role the entity has
- if (path.isStartEntity(entity)) {
- // We tried to delete the start
- path.deleteEntityOnStart(entity);
- } else if (path.isEndEntity(entity)) {
- // We tried to delete the end
- path.deleteEntityOnEnd(entity);
- } else {
- // We tried to delete something inbetween
- const newPath = path.deleteEntityOnPathSplitIntoTwo(entity);
- this.beltPaths.push(newPath);
- }
-
- // Sanity
- entity.components.Belt.assignedPath = null;
- }
-
- /**
- * Adds the given entity to the appropriate paths
- * @param {Entity} entity
- */
- addEntityToPaths(entity) {
- const fromEntity = this.findSupplyingEntity(entity);
- const toEntity = this.findFollowUpEntity(entity);
-
- // Check if we can add the entity to the previous path
- if (fromEntity) {
- const fromPath = fromEntity.components.Belt.assignedPath;
- fromPath.extendOnEnd(entity);
-
- // Check if we now can extend the current path by the next path
- if (toEntity) {
- const toPath = toEntity.components.Belt.assignedPath;
-
- if (fromPath === toPath) {
- // This is a circular dependency -> Ignore
- } else {
- fromPath.extendByPath(toPath);
-
- // Delete now obsolete path
- fastArrayDeleteValue(this.beltPaths, toPath);
- }
- }
- } else {
- if (toEntity) {
- // Prepend it to the other path
- const toPath = toEntity.components.Belt.assignedPath;
- toPath.extendOnBeginning(entity);
- } else {
- // This is an empty belt path
- const path = new BeltPath(this.root, [entity]);
- this.beltPaths.push(path);
- }
- }
- }
-
- /**
- * Called when an entity got added
- * @param {Entity} entity
- */
- onEntityAdded(entity) {
- if (!this.root.gameInitialized) {
- return;
- }
-
- if (!entity.components.Belt) {
- return;
- }
-
- this.addEntityToPaths(entity);
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
- }
-
- /**
- * Draws all belt paths
- * @param {DrawParameters} parameters
- */
- drawBeltItems(parameters) {
- for (let i = 0; i < this.beltPaths.length; ++i) {
- this.beltPaths[i].draw(parameters);
- }
- }
-
- /**
- * Verifies all belt paths
- */
- debug_verifyBeltPaths() {
- for (let i = 0; i < this.beltPaths.length; ++i) {
- this.beltPaths[i].debug_checkIntegrity("general-verify");
- }
-
- const belts = this.root.entityMgr.getAllWithComponent(BeltComponent);
- for (let i = 0; i < belts.length; ++i) {
- const path = belts[i].components.Belt.assignedPath;
- if (!path) {
- throw new Error("Belt has no path: " + belts[i].uid);
- }
- if (this.beltPaths.indexOf(path) < 0) {
- throw new Error("Path of entity not contained: " + belts[i].uid);
- }
- }
- }
-
- /**
- * Finds the follow up entity for a given belt. Used for building the dependencies
- * @param {Entity} entity
- * @returns {Entity|null}
- */
- findFollowUpEntity(entity) {
- const staticComp = entity.components.StaticMapEntity;
- const beltComp = entity.components.Belt;
-
- const followUpDirection = staticComp.localDirectionToWorld(beltComp.direction);
- const followUpVector = enumDirectionToVector[followUpDirection];
-
- const followUpTile = staticComp.origin.add(followUpVector);
- const followUpEntity = this.root.map.getLayerContentXY(followUpTile.x, followUpTile.y, entity.layer);
-
- // Check if theres a belt at the tile we point to
- if (followUpEntity) {
- const followUpBeltComp = followUpEntity.components.Belt;
- if (followUpBeltComp) {
- const followUpStatic = followUpEntity.components.StaticMapEntity;
-
- const acceptedDirection = followUpStatic.localDirectionToWorld(enumDirection.top);
- if (acceptedDirection === followUpDirection) {
- return followUpEntity;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Finds the supplying belt for a given belt. Used for building the dependencies
- * @param {Entity} entity
- * @returns {Entity|null}
- */
- findSupplyingEntity(entity) {
- const staticComp = entity.components.StaticMapEntity;
-
- const supplyDirection = staticComp.localDirectionToWorld(enumDirection.bottom);
- const supplyVector = enumDirectionToVector[supplyDirection];
-
- const supplyTile = staticComp.origin.add(supplyVector);
- const supplyEntity = this.root.map.getLayerContentXY(supplyTile.x, supplyTile.y, entity.layer);
-
- // Check if theres a belt at the tile we point to
- if (supplyEntity) {
- const supplyBeltComp = supplyEntity.components.Belt;
- if (supplyBeltComp) {
- const supplyStatic = supplyEntity.components.StaticMapEntity;
- const otherDirection = supplyStatic.localDirectionToWorld(
- enumInvertedDirections[supplyBeltComp.direction]
- );
-
- if (otherDirection === supplyDirection) {
- return supplyEntity;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Recomputes the belt path network. Only required for old savegames
- */
- recomputeAllBeltPaths() {
- logger.warn("Recomputing all belt paths");
- const visitedUids = new Set();
-
- const result = [];
-
- for (let i = 0; i < this.allEntities.length; ++i) {
- const entity = this.allEntities[i];
- if (visitedUids.has(entity.uid)) {
- continue;
- }
-
- // Mark entity as visited
- visitedUids.add(entity.uid);
-
- // Compute path, start with entity and find precedors / successors
- const path = [entity];
-
- // Prevent infinite loops
- let maxIter = 99999;
-
- // Find precedors
- let prevEntity = this.findSupplyingEntity(entity);
- while (prevEntity && --maxIter > 0) {
- if (visitedUids.has(prevEntity.uid)) {
- break;
- }
- path.unshift(prevEntity);
- visitedUids.add(prevEntity.uid);
- prevEntity = this.findSupplyingEntity(prevEntity);
- }
-
- // Find succedors
- let nextEntity = this.findFollowUpEntity(entity);
- while (nextEntity && --maxIter > 0) {
- if (visitedUids.has(nextEntity.uid)) {
- break;
- }
-
- path.push(nextEntity);
- visitedUids.add(nextEntity.uid);
- nextEntity = this.findFollowUpEntity(nextEntity);
- }
-
- assert(maxIter > 1, "Ran out of iterations");
- result.push(new BeltPath(this.root, path));
- }
-
- logger.log("Found", this.beltPaths.length, "belt paths");
- this.beltPaths = result;
- }
-
- /**
- * Updates all belts
- */
- update() {
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
-
- for (let i = 0; i < this.beltPaths.length; ++i) {
- this.beltPaths[i].update();
- }
-
- if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
- this.debug_verifyBeltPaths();
- }
- }
-
- /**
- * Draws a given chunk
- * @param {DrawParameters} parameters
- * @param {MapChunkView} chunk
- */
- drawChunk(parameters, chunk) {
- // Limit speed to avoid belts going backwards
- const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10);
-
- // SYNC with systems/item_acceptor.js:drawEntityUnderlays!
- // 126 / 42 is the exact animation speed of the png animation
- const animationIndex = Math.floor(
- ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) *
- globalConfig.itemSpacingOnBelts
- );
- const contents = chunk.containedEntitiesByLayer.regular;
- for (let i = 0; i < contents.length; ++i) {
- const entity = contents[i];
- if (entity.components.Belt) {
- const direction = entity.components.Belt.direction;
- const sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT];
-
- // Culling happens within the static map entity component
- entity.components.StaticMapEntity.drawSpriteOnBoundsClipped(parameters, sprite, 0);
- }
- }
- }
-
- /**
- * Draws the belt path debug overlays
- * @param {DrawParameters} parameters
- */
- drawBeltPathDebug(parameters) {
- for (let i = 0; i < this.beltPaths.length; ++i) {
- this.beltPaths[i].drawDebug(parameters);
- }
- }
-}
+import { globalConfig } from "../../core/config";
+import { DrawParameters } from "../../core/draw_parameters";
+import { gMetaBuildingRegistry } from "../../core/global_registries";
+import { Loader } from "../../core/loader";
+import { createLogger } from "../../core/logging";
+import { AtlasSprite } from "../../core/sprites";
+import { fastArrayDeleteValue } from "../../core/utils";
+import { enumDirection, enumDirectionToVector, enumInvertedDirections, Vector } from "../../core/vector";
+import { BeltPath } from "../belt_path";
+import { arrayBeltVariantToRotation, MetaBeltBuilding } from "../buildings/belt";
+import { getCodeFromBuildingData } from "../building_codes";
+import { BeltComponent } from "../components/belt";
+import { Entity } from "../entity";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+import { MapChunkView } from "../map_chunk_view";
+import { defaultBuildingVariant } from "../meta_building";
+
+export const BELT_ANIM_COUNT = 14;
+
+const logger = createLogger("belt");
+
+/**
+ * Manages all belts
+ */
+export class BeltSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [BeltComponent]);
+ /**
+ * @type {Object.>}
+ */
+ this.beltSprites = {
+ [enumDirection.top]: Loader.getSprite("sprites/belt/built/forward_0.png"),
+ [enumDirection.left]: Loader.getSprite("sprites/belt/built/left_0.png"),
+ [enumDirection.right]: Loader.getSprite("sprites/belt/built/right_0.png"),
+ };
+
+ /**
+ * @type {Object.>}
+ */
+ this.beltAnimations = {
+ [enumDirection.top]: [],
+ [enumDirection.left]: [],
+ [enumDirection.right]: [],
+ };
+
+ for (let i = 0; i < BELT_ANIM_COUNT; ++i) {
+ this.beltAnimations[enumDirection.top].push(
+ Loader.getSprite("sprites/belt/built/forward_" + i + ".png")
+ );
+ this.beltAnimations[enumDirection.left].push(
+ Loader.getSprite("sprites/belt/built/left_" + i + ".png")
+ );
+ this.beltAnimations[enumDirection.right].push(
+ Loader.getSprite("sprites/belt/built/right_" + i + ".png")
+ );
+ }
+
+ this.root.signals.entityDestroyed.add(this.onEntityDestroyed, this);
+ this.root.signals.entityDestroyed.add(this.updateSurroundingBeltPlacement, this);
+
+ // Notice: These must come *after* the entity destroyed signals
+ this.root.signals.entityAdded.add(this.onEntityAdded, this);
+ this.root.signals.entityAdded.add(this.updateSurroundingBeltPlacement, this);
+
+ /** @type {Array} */
+ this.beltPaths = [];
+ }
+
+ /**
+ * Serializes all belt paths
+ * @returns {Array}
+ */
+ serializePaths() {
+ let data = [];
+ for (let i = 0; i < this.beltPaths.length; ++i) {
+ data.push(this.beltPaths[i].serialize());
+ }
+ return data;
+ }
+
+ /**
+ * Deserializes all belt paths
+ * @param {Array} data
+ */
+ deserializePaths(data) {
+ if (!Array.isArray(data)) {
+ return "Belt paths are not an array: " + typeof data;
+ }
+
+ for (let i = 0; i < data.length; ++i) {
+ const path = BeltPath.fromSerialized(this.root, data[i]);
+ // If path is a string, that means its an error
+ if (!(path instanceof BeltPath)) {
+ return "Failed to create path from belt data: " + path;
+ }
+ this.beltPaths.push(path);
+ }
+
+ if (this.beltPaths.length === 0) {
+ // Old savegames might not have paths yet
+ logger.warn("Recomputing belt paths (most likely the savegame is old or empty)");
+ this.recomputeAllBeltPaths();
+ } else {
+ logger.warn("Restored", this.beltPaths.length, "belt paths");
+ }
+
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+ }
+
+ /**
+ * Updates the belt placement after an entity has been added / deleted
+ * @param {Entity} entity
+ */
+ updateSurroundingBeltPlacement(entity) {
+ if (!this.root.gameInitialized) {
+ return;
+ }
+
+ const staticComp = entity.components.StaticMapEntity;
+ if (!staticComp) {
+ return;
+ }
+
+ const metaBelt = gMetaBuildingRegistry.findByClass(MetaBeltBuilding);
+ // Compute affected area
+ const originalRect = staticComp.getTileSpaceBounds();
+ const affectedArea = originalRect.expandedInAllDirections(1);
+
+ /** @type {Set} */
+ const changedPaths = new Set();
+
+ for (let x = affectedArea.x; x < affectedArea.right(); ++x) {
+ for (let y = affectedArea.y; y < affectedArea.bottom(); ++y) {
+ if (originalRect.containsPoint(x, y)) {
+ // Make sure we don't update the original entity
+ continue;
+ }
+
+ const targetEntities = this.root.map.getLayersContentsMultipleXY(x, y);
+ for (let i = 0; i < targetEntities.length; ++i) {
+ const targetEntity = targetEntities[i];
+
+ const targetBeltComp = targetEntity.components.Belt;
+ const targetStaticComp = targetEntity.components.StaticMapEntity;
+
+ if (!targetBeltComp) {
+ // Not a belt
+ continue;
+ }
+
+ const {
+ rotation,
+ rotationVariant,
+ } = metaBelt.computeOptimalDirectionAndRotationVariantAtTile({
+ root: this.root,
+ tile: new Vector(x, y),
+ rotation: targetStaticComp.originalRotation,
+ variant: defaultBuildingVariant,
+ layer: targetEntity.layer,
+ });
+
+ // Compute delta to see if anything changed
+ const newDirection = arrayBeltVariantToRotation[rotationVariant];
+
+ if (targetStaticComp.rotation !== rotation || newDirection !== targetBeltComp.direction) {
+ const originalPath = targetBeltComp.assignedPath;
+
+ // Ok, first remove it from its current path
+ this.deleteEntityFromPath(targetBeltComp.assignedPath, targetEntity);
+
+ // Change stuff
+ targetStaticComp.rotation = rotation;
+ metaBelt.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant);
+
+ // Update code as well
+ targetStaticComp.code = getCodeFromBuildingData(
+ metaBelt,
+ defaultBuildingVariant,
+ rotationVariant
+ );
+
+ // Update the original path since it might have picked up the entit1y
+ originalPath.onPathChanged();
+
+ // Now add it again
+ this.addEntityToPaths(targetEntity);
+
+ // Sanity
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+
+ // Make sure the chunks know about the update
+ this.root.signals.entityChanged.dispatch(targetEntity);
+ }
+
+ if (targetBeltComp.assignedPath) {
+ changedPaths.add(targetBeltComp.assignedPath);
+ }
+ }
+ }
+ }
+
+ // notify all paths *afterwards* to avoid multi-updates
+ changedPaths.forEach(path => path.onSurroundingsChanged());
+
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+ }
+
+ /**
+ * Called when an entity got destroyed
+ * @param {Entity} entity
+ */
+ onEntityDestroyed(entity) {
+ if (!this.root.gameInitialized) {
+ return;
+ }
+
+ if (!entity.components.Belt) {
+ return;
+ }
+
+ const assignedPath = entity.components.Belt.assignedPath;
+ assert(assignedPath, "Entity has no belt path assigned");
+ this.deleteEntityFromPath(assignedPath, entity);
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+ }
+
+ /**
+ * Attempts to delete the belt from its current path
+ * @param {BeltPath} path
+ * @param {Entity} entity
+ */
+ deleteEntityFromPath(path, entity) {
+ if (path.entityPath.length === 1) {
+ // This is a single entity path, easy to do, simply erase whole path
+ fastArrayDeleteValue(this.beltPaths, path);
+ return;
+ }
+
+ // Notice: Since there might be circular references, it is important to check
+ // which role the entity has
+ if (path.isStartEntity(entity)) {
+ // We tried to delete the start
+ path.deleteEntityOnStart(entity);
+ } else if (path.isEndEntity(entity)) {
+ // We tried to delete the end
+ path.deleteEntityOnEnd(entity);
+ } else {
+ // We tried to delete something inbetween
+ const newPath = path.deleteEntityOnPathSplitIntoTwo(entity);
+ this.beltPaths.push(newPath);
+ }
+
+ // Sanity
+ entity.components.Belt.assignedPath = null;
+ }
+
+ /**
+ * Adds the given entity to the appropriate paths
+ * @param {Entity} entity
+ */
+ addEntityToPaths(entity) {
+ const fromEntity = this.findSupplyingEntity(entity);
+ const toEntity = this.findFollowUpEntity(entity);
+
+ // Check if we can add the entity to the previous path
+ if (fromEntity) {
+ const fromPath = fromEntity.components.Belt.assignedPath;
+ fromPath.extendOnEnd(entity);
+
+ // Check if we now can extend the current path by the next path
+ if (toEntity) {
+ const toPath = toEntity.components.Belt.assignedPath;
+
+ if (fromPath === toPath) {
+ // This is a circular dependency -> Ignore
+ } else {
+ fromPath.extendByPath(toPath);
+
+ // Delete now obsolete path
+ fastArrayDeleteValue(this.beltPaths, toPath);
+ }
+ }
+ } else {
+ if (toEntity) {
+ // Prepend it to the other path
+ const toPath = toEntity.components.Belt.assignedPath;
+ toPath.extendOnBeginning(entity);
+ } else {
+ // This is an empty belt path
+ const path = new BeltPath(this.root, [entity]);
+ this.beltPaths.push(path);
+ }
+ }
+ }
+
+ /**
+ * Called when an entity got added
+ * @param {Entity} entity
+ */
+ onEntityAdded(entity) {
+ if (!this.root.gameInitialized) {
+ return;
+ }
+
+ if (!entity.components.Belt) {
+ return;
+ }
+
+ this.addEntityToPaths(entity);
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+ }
+
+ /**
+ * Draws all belt paths
+ * @param {DrawParameters} parameters
+ */
+ drawBeltItems(parameters) {
+ for (let i = 0; i < this.beltPaths.length; ++i) {
+ this.beltPaths[i].draw(parameters);
+ }
+ }
+
+ /**
+ * Verifies all belt paths
+ */
+ debug_verifyBeltPaths() {
+ for (let i = 0; i < this.beltPaths.length; ++i) {
+ this.beltPaths[i].debug_checkIntegrity("general-verify");
+ }
+
+ const belts = this.root.entityMgr.getAllWithComponent(BeltComponent);
+ for (let i = 0; i < belts.length; ++i) {
+ const path = belts[i].components.Belt.assignedPath;
+ if (!path) {
+ throw new Error("Belt has no path: " + belts[i].uid);
+ }
+ if (this.beltPaths.indexOf(path) < 0) {
+ throw new Error("Path of entity not contained: " + belts[i].uid);
+ }
+ }
+ }
+
+ /**
+ * Finds the follow up entity for a given belt. Used for building the dependencies
+ * @param {Entity} entity
+ * @returns {Entity|null}
+ */
+ findFollowUpEntity(entity) {
+ const staticComp = entity.components.StaticMapEntity;
+ const beltComp = entity.components.Belt;
+
+ const followUpDirection = staticComp.localDirectionToWorld(beltComp.direction);
+ const followUpVector = enumDirectionToVector[followUpDirection];
+
+ const followUpTile = staticComp.origin.add(followUpVector);
+ const followUpEntity = this.root.map.getLayerContentXY(followUpTile.x, followUpTile.y, entity.layer);
+
+ // Check if there's a belt at the tile we point to
+ if (followUpEntity) {
+ const followUpBeltComp = followUpEntity.components.Belt;
+ if (followUpBeltComp) {
+ const followUpStatic = followUpEntity.components.StaticMapEntity;
+
+ const acceptedDirection = followUpStatic.localDirectionToWorld(enumDirection.top);
+ if (acceptedDirection === followUpDirection) {
+ return followUpEntity;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Finds the supplying belt for a given belt. Used for building the dependencies
+ * @param {Entity} entity
+ * @returns {Entity|null}
+ */
+ findSupplyingEntity(entity) {
+ const staticComp = entity.components.StaticMapEntity;
+
+ const supplyDirection = staticComp.localDirectionToWorld(enumDirection.bottom);
+ const supplyVector = enumDirectionToVector[supplyDirection];
+
+ const supplyTile = staticComp.origin.add(supplyVector);
+ const supplyEntity = this.root.map.getLayerContentXY(supplyTile.x, supplyTile.y, entity.layer);
+
+ // Check if there's a belt at the tile we point to
+ if (supplyEntity) {
+ const supplyBeltComp = supplyEntity.components.Belt;
+ if (supplyBeltComp) {
+ const supplyStatic = supplyEntity.components.StaticMapEntity;
+ const otherDirection = supplyStatic.localDirectionToWorld(
+ enumInvertedDirections[supplyBeltComp.direction]
+ );
+
+ if (otherDirection === supplyDirection) {
+ return supplyEntity;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Recomputes the belt path network. Only required for old savegames
+ */
+ recomputeAllBeltPaths() {
+ logger.warn("Recomputing all belt paths");
+ const visitedUids = new Set();
+
+ const result = [];
+
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ if (visitedUids.has(entity.uid)) {
+ continue;
+ }
+
+ // Mark entity as visited
+ visitedUids.add(entity.uid);
+
+ // Compute path, start with entity and find precedors / successors
+ const path = [entity];
+
+ // Prevent infinite loops
+ let maxIter = 99999;
+
+ // Find precedors
+ let prevEntity = this.findSupplyingEntity(entity);
+ while (prevEntity && --maxIter > 0) {
+ if (visitedUids.has(prevEntity.uid)) {
+ break;
+ }
+ path.unshift(prevEntity);
+ visitedUids.add(prevEntity.uid);
+ prevEntity = this.findSupplyingEntity(prevEntity);
+ }
+
+ // Find succedors
+ let nextEntity = this.findFollowUpEntity(entity);
+ while (nextEntity && --maxIter > 0) {
+ if (visitedUids.has(nextEntity.uid)) {
+ break;
+ }
+
+ path.push(nextEntity);
+ visitedUids.add(nextEntity.uid);
+ nextEntity = this.findFollowUpEntity(nextEntity);
+ }
+
+ assert(maxIter > 1, "Ran out of iterations");
+ result.push(new BeltPath(this.root, path));
+ }
+
+ logger.log("Found", this.beltPaths.length, "belt paths");
+ this.beltPaths = result;
+ }
+
+ /**
+ * Updates all belts
+ */
+ update() {
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+
+ for (let i = 0; i < this.beltPaths.length; ++i) {
+ this.beltPaths[i].update();
+ }
+
+ if (G_IS_DEV && globalConfig.debug.checkBeltPaths) {
+ this.debug_verifyBeltPaths();
+ }
+ }
+
+ /**
+ * Draws a given chunk
+ * @param {DrawParameters} parameters
+ * @param {MapChunkView} chunk
+ */
+ drawChunk(parameters, chunk) {
+ // Limit speed to avoid belts going backwards
+ const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10);
+
+ // SYNC with systems/item_acceptor.js:drawEntityUnderlays!
+ // 126 / 42 is the exact animation speed of the png animation
+ const animationIndex = Math.floor(
+ ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) *
+ globalConfig.itemSpacingOnBelts
+ );
+ const contents = chunk.containedEntitiesByLayer.regular;
+
+ if (this.root.app.settings.getAllSettings().simplifiedBelts) {
+ // POTATO Mode: Only show items when belt is hovered
+ let hoveredBeltPath = null;
+ const mousePos = this.root.app.mousePosition;
+ if (mousePos && this.root.currentLayer === "regular") {
+ const tile = this.root.camera.screenToWorld(mousePos).toTileSpace();
+ const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "regular");
+ if (contents && contents.components.Belt) {
+ hoveredBeltPath = contents.components.Belt.assignedPath;
+ }
+ }
+
+ for (let i = 0; i < contents.length; ++i) {
+ const entity = contents[i];
+ if (entity.components.Belt) {
+ const direction = entity.components.Belt.direction;
+ let sprite = this.beltAnimations[direction][0];
+
+ if (entity.components.Belt.assignedPath === hoveredBeltPath) {
+ sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT];
+ }
+
+ // Culling happens within the static map entity component
+ entity.components.StaticMapEntity.drawSpriteOnBoundsClipped(parameters, sprite, 0);
+ }
+ }
+ } else {
+ for (let i = 0; i < contents.length; ++i) {
+ const entity = contents[i];
+ if (entity.components.Belt) {
+ const direction = entity.components.Belt.direction;
+ const sprite = this.beltAnimations[direction][animationIndex % BELT_ANIM_COUNT];
+
+ // Culling happens within the static map entity component
+ entity.components.StaticMapEntity.drawSpriteOnBoundsClipped(parameters, sprite, 0);
+ }
+ }
+ }
+ }
+
+ /**
+ * Draws the belt path debug overlays
+ * @param {DrawParameters} parameters
+ */
+ drawBeltPathDebug(parameters) {
+ for (let i = 0; i < this.beltPaths.length; ++i) {
+ this.beltPaths[i].drawDebug(parameters);
+ }
+ }
+}
diff --git a/src/js/game/systems/belt_reader.js b/src/js/game/systems/belt_reader.js
index abddd999..fbd00b6c 100644
--- a/src/js/game/systems/belt_reader.js
+++ b/src/js/game/systems/belt_reader.js
@@ -48,7 +48,7 @@ export class BeltReaderSystem extends GameSystemWithFilter {
throughput = 1 / (averageSpacing / averageSpacingNum);
}
- readerComp.lastThroughput = throughput;
+ readerComp.lastThroughput = Math.min(globalConfig.beltSpeedItemsPerSecond * 23.9, throughput);
}
}
}
diff --git a/src/js/game/systems/belt_underlays.js b/src/js/game/systems/belt_underlays.js
index 5bdf2331..c5c69d26 100644
--- a/src/js/game/systems/belt_underlays.js
+++ b/src/js/game/systems/belt_underlays.js
@@ -1,84 +1,300 @@
-import { globalConfig } from "../../core/config";
-import { drawRotatedSprite } from "../../core/draw_utils";
-import { Loader } from "../../core/loader";
-import { enumDirectionToAngle } from "../../core/vector";
-import { BeltUnderlaysComponent } from "../components/belt_underlays";
-import { GameSystemWithFilter } from "../game_system_with_filter";
-import { BELT_ANIM_COUNT } from "./belt";
-import { MapChunkView } from "../map_chunk_view";
-import { DrawParameters } from "../../core/draw_parameters";
-
-export class BeltUnderlaysSystem extends GameSystemWithFilter {
- constructor(root) {
- super(root, [BeltUnderlaysComponent]);
-
- this.underlayBeltSprites = [];
-
- for (let i = 0; i < BELT_ANIM_COUNT; ++i) {
- this.underlayBeltSprites.push(Loader.getSprite("sprites/belt/built/forward_" + i + ".png"));
- }
- }
-
- /**
- * Draws a given chunk
- * @param {DrawParameters} parameters
- * @param {MapChunkView} chunk
- */
- drawChunk(parameters, chunk) {
- // Limit speed to avoid belts going backwards
- const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10);
-
- const contents = chunk.containedEntitiesByLayer.regular;
- for (let i = 0; i < contents.length; ++i) {
- const entity = contents[i];
- const underlayComp = entity.components.BeltUnderlays;
- if (!underlayComp) {
- continue;
- }
-
- const staticComp = entity.components.StaticMapEntity;
- const underlays = underlayComp.underlays;
- for (let i = 0; i < underlays.length; ++i) {
- const { pos, direction } = underlays[i];
- const transformedPos = staticComp.localTileToWorld(pos);
-
- // Culling
- if (!chunk.tileSpaceRectangle.containsPoint(transformedPos.x, transformedPos.y)) {
- continue;
- }
-
- const destX = transformedPos.x * globalConfig.tileSize;
- const destY = transformedPos.y * globalConfig.tileSize;
-
- // Culling, #2
- if (
- !parameters.visibleRect.containsRect4Params(
- destX,
- destY,
- globalConfig.tileSize,
- globalConfig.tileSize
- )
- ) {
- continue;
- }
-
- const angle = enumDirectionToAngle[staticComp.localDirectionToWorld(direction)];
-
- // SYNC with systems/belt.js:drawSingleEntity!
- const animationIndex = Math.floor(
- ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) *
- globalConfig.itemSpacingOnBelts
- );
-
- drawRotatedSprite({
- parameters,
- sprite: this.underlayBeltSprites[animationIndex % this.underlayBeltSprites.length],
- x: destX + globalConfig.halfTileSize,
- y: destY + globalConfig.halfTileSize,
- angle: Math.radians(angle),
- size: globalConfig.tileSize,
- });
- }
- }
- }
-}
+import { globalConfig } from "../../core/config";
+import { DrawParameters } from "../../core/draw_parameters";
+import { Loader } from "../../core/loader";
+import { Rectangle } from "../../core/rectangle";
+import { FULL_CLIP_RECT } from "../../core/sprites";
+import { StaleAreaDetector } from "../../core/stale_area_detector";
+import {
+ enumDirection,
+ enumDirectionToAngle,
+ enumDirectionToVector,
+ enumInvertedDirections,
+ Vector,
+} from "../../core/vector";
+import { BeltComponent } from "../components/belt";
+import { BeltUnderlaysComponent, enumClippedBeltUnderlayType } from "../components/belt_underlays";
+import { ItemAcceptorComponent } from "../components/item_acceptor";
+import { ItemEjectorComponent } from "../components/item_ejector";
+import { Entity } from "../entity";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+import { MapChunkView } from "../map_chunk_view";
+import { BELT_ANIM_COUNT } from "./belt";
+
+/**
+ * Mapping from underlay type to clip rect
+ * @type {Object}
+ */
+const enumUnderlayTypeToClipRect = {
+ [enumClippedBeltUnderlayType.none]: null,
+ [enumClippedBeltUnderlayType.full]: FULL_CLIP_RECT,
+ [enumClippedBeltUnderlayType.topOnly]: new Rectangle(0, 0, 1, 0.5),
+ [enumClippedBeltUnderlayType.bottomOnly]: new Rectangle(0, 0.5, 1, 0.5),
+};
+
+export class BeltUnderlaysSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [BeltUnderlaysComponent]);
+
+ this.underlayBeltSprites = [];
+
+ for (let i = 0; i < BELT_ANIM_COUNT; ++i) {
+ this.underlayBeltSprites.push(Loader.getSprite("sprites/belt/built/forward_" + i + ".png"));
+ }
+
+ // Automatically recompute areas
+ this.staleArea = new StaleAreaDetector({
+ root,
+ name: "belt-underlay",
+ recomputeMethod: this.recomputeStaleArea.bind(this),
+ });
+
+ this.staleArea.recomputeOnComponentsChanged(
+ [BeltUnderlaysComponent, BeltComponent, ItemAcceptorComponent, ItemEjectorComponent],
+ 1
+ );
+ }
+
+ update() {
+ this.staleArea.update();
+ }
+
+ /**
+ * Called when an area changed - Resets all caches in the given area
+ * @param {Rectangle} area
+ */
+ recomputeStaleArea(area) {
+ for (let x = 0; x < area.w; ++x) {
+ for (let y = 0; y < area.h; ++y) {
+ const tileX = area.x + x;
+ const tileY = area.y + y;
+ const entity = this.root.map.getLayerContentXY(tileX, tileY, "regular");
+ if (entity) {
+ const underlayComp = entity.components.BeltUnderlays;
+ if (underlayComp) {
+ for (let i = 0; i < underlayComp.underlays.length; ++i) {
+ underlayComp.underlays[i].cachedType = null;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks if a given tile is connected and has an acceptor
+ * @param {Vector} tile
+ * @param {enumDirection} fromDirection
+ * @returns {boolean}
+ */
+ checkIsAcceptorConnected(tile, fromDirection) {
+ const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "regular");
+ if (!contents) {
+ return false;
+ }
+
+ const staticComp = contents.components.StaticMapEntity;
+
+ // Check if its a belt, since then its simple
+ const beltComp = contents.components.Belt;
+ if (beltComp) {
+ return staticComp.localDirectionToWorld(enumDirection.bottom) === fromDirection;
+ }
+
+ // Check if there's an item acceptor
+ const acceptorComp = contents.components.ItemAcceptor;
+ if (acceptorComp) {
+ // Check each slot to see if its connected
+ for (let i = 0; i < acceptorComp.slots.length; ++i) {
+ const slot = acceptorComp.slots[i];
+ const slotTile = staticComp.localTileToWorld(slot.pos);
+
+ // Step 1: Check if the tile matches
+ if (!slotTile.equals(tile)) {
+ continue;
+ }
+
+ // Step 2: Check if any of the directions matches
+ for (let j = 0; j < slot.directions.length; ++j) {
+ const slotDirection = staticComp.localDirectionToWorld(slot.directions[j]);
+ if (slotDirection === fromDirection) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks if a given tile is connected and has an ejector
+ * @param {Vector} tile
+ * @param {enumDirection} toDirection
+ * @returns {boolean}
+ */
+ checkIsEjectorConnected(tile, toDirection) {
+ const contents = this.root.map.getLayerContentXY(tile.x, tile.y, "regular");
+ if (!contents) {
+ return false;
+ }
+
+ const staticComp = contents.components.StaticMapEntity;
+
+ // Check if its a belt, since then its simple
+ const beltComp = contents.components.Belt;
+ if (beltComp) {
+ return staticComp.localDirectionToWorld(beltComp.direction) === toDirection;
+ }
+
+ // Check for an ejector
+ const ejectorComp = contents.components.ItemEjector;
+ if (ejectorComp) {
+ // Check each slot to see if its connected
+ for (let i = 0; i < ejectorComp.slots.length; ++i) {
+ const slot = ejectorComp.slots[i];
+ const slotTile = staticComp.localTileToWorld(slot.pos);
+
+ // Step 1: Check if the tile matches
+ if (!slotTile.equals(tile)) {
+ continue;
+ }
+
+ // Step 2: Check if the direction matches
+ const slotDirection = staticComp.localDirectionToWorld(slot.direction);
+ if (slotDirection === toDirection) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Computes the flag for a given tile
+ * @param {Entity} entity
+ * @param {import("../components/belt_underlays").BeltUnderlayTile} underlayTile
+ * @returns {enumClippedBeltUnderlayType} The type of the underlay
+ */
+ computeBeltUnderlayType(entity, underlayTile) {
+ if (underlayTile.cachedType) {
+ return underlayTile.cachedType;
+ }
+
+ const staticComp = entity.components.StaticMapEntity;
+
+ const transformedPos = staticComp.localTileToWorld(underlayTile.pos);
+ const destX = transformedPos.x * globalConfig.tileSize;
+ const destY = transformedPos.y * globalConfig.tileSize;
+
+ // Extract direction and angle
+ const worldDirection = staticComp.localDirectionToWorld(underlayTile.direction);
+ const worldDirectionVector = enumDirectionToVector[worldDirection];
+
+ // Figure out if there is anything connected at the top
+ const connectedTop = this.checkIsAcceptorConnected(
+ transformedPos.add(worldDirectionVector),
+ enumInvertedDirections[worldDirection]
+ );
+
+ // Figure out if there is anything connected at the bottom
+ const connectedBottom = this.checkIsEjectorConnected(
+ transformedPos.sub(worldDirectionVector),
+ worldDirection
+ );
+
+ let flag = enumClippedBeltUnderlayType.none;
+
+ if (connectedTop && connectedBottom) {
+ flag = enumClippedBeltUnderlayType.full;
+ } else if (connectedTop) {
+ flag = enumClippedBeltUnderlayType.topOnly;
+ } else if (connectedBottom) {
+ flag = enumClippedBeltUnderlayType.bottomOnly;
+ }
+
+ return (underlayTile.cachedType = flag);
+ }
+
+ /**
+ * Draws a given chunk
+ * @param {DrawParameters} parameters
+ * @param {MapChunkView} chunk
+ */
+ drawChunk(parameters, chunk) {
+ // Limit speed to avoid belts going backwards
+ const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(), 10);
+
+ const contents = chunk.containedEntitiesByLayer.regular;
+ for (let i = 0; i < contents.length; ++i) {
+ const entity = contents[i];
+ const underlayComp = entity.components.BeltUnderlays;
+ if (!underlayComp) {
+ continue;
+ }
+
+ const staticComp = entity.components.StaticMapEntity;
+ const underlays = underlayComp.underlays;
+ for (let i = 0; i < underlays.length; ++i) {
+ // Extract underlay parameters
+ const { pos, direction } = underlays[i];
+ const transformedPos = staticComp.localTileToWorld(pos);
+ const destX = transformedPos.x * globalConfig.tileSize;
+ const destY = transformedPos.y * globalConfig.tileSize;
+
+ // Culling, Part 1: Check if the chunk contains the tile
+ if (!chunk.tileSpaceRectangle.containsPoint(transformedPos.x, transformedPos.y)) {
+ continue;
+ }
+
+ // Culling, Part 2: Check if the overlay is visible
+ if (
+ !parameters.visibleRect.containsRect4Params(
+ destX,
+ destY,
+ globalConfig.tileSize,
+ globalConfig.tileSize
+ )
+ ) {
+ continue;
+ }
+
+ // Extract direction and angle
+ const worldDirection = staticComp.localDirectionToWorld(direction);
+ const angle = enumDirectionToAngle[worldDirection];
+
+ const underlayType = this.computeBeltUnderlayType(entity, underlays[i]);
+ const clipRect = enumUnderlayTypeToClipRect[underlayType];
+ if (!clipRect) {
+ // Empty
+ continue;
+ }
+
+ // Actually draw the sprite
+ const x = destX + globalConfig.halfTileSize;
+ const y = destY + globalConfig.halfTileSize;
+ const angleRadians = Math.radians(angle);
+
+ // SYNC with systems/belt.js:drawSingleEntity!
+ const animationIndex = Math.floor(
+ ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) *
+ globalConfig.itemSpacingOnBelts
+ );
+ parameters.context.translate(x, y);
+ parameters.context.rotate(angleRadians);
+ this.underlayBeltSprites[
+ animationIndex % this.underlayBeltSprites.length
+ ].drawCachedWithClipRect(
+ parameters,
+ -globalConfig.halfTileSize,
+ -globalConfig.halfTileSize,
+ globalConfig.tileSize,
+ globalConfig.tileSize,
+ clipRect
+ );
+ parameters.context.rotate(-angleRadians);
+ parameters.context.translate(-x, -y);
+ }
+ }
+ }
+}
diff --git a/src/js/game/systems/constant_signal.js b/src/js/game/systems/constant_signal.js
index 93417ef5..aaf31a19 100644
--- a/src/js/game/systems/constant_signal.js
+++ b/src/js/game/systems/constant_signal.js
@@ -1,6 +1,9 @@
import trim from "trim";
+import { THIRDPARTY_URLS } from "../../core/config";
import { DialogWithForm } from "../../core/modal_dialog_elements";
-import { FormElementInput } from "../../core/modal_dialog_forms";
+import { FormElementInput, FormElementItemChooser } from "../../core/modal_dialog_forms";
+import { fillInLinkIntoTranslation } from "../../core/utils";
+import { T } from "../../translations";
import { BaseItem } from "../base_item";
import { enumColors } from "../colors";
import { ConstantSignalComponent } from "../components/constant_signal";
@@ -41,23 +44,43 @@ export class ConstantSignalSystem extends GameSystemWithFilter {
const signalValueInput = new FormElementInput({
id: "signalValue",
- label: null,
+ label: fillInLinkIntoTranslation(T.dialogs.editSignal.descShortKey, THIRDPARTY_URLS.shapeViewer),
placeholder: "",
defaultValue: "",
validator: val => this.parseSignalCode(val),
});
+
+ const itemInput = new FormElementItemChooser({
+ id: "signalItem",
+ label: null,
+ items: [
+ BOOL_FALSE_SINGLETON,
+ BOOL_TRUE_SINGLETON,
+ ...Object.values(COLOR_ITEM_SINGLETONS),
+ this.root.shapeDefinitionMgr.getShapeItemFromDefinition(
+ this.root.hubGoals.currentGoal.definition
+ ),
+ this.root.shapeDefinitionMgr.getShapeItemFromShortKey(
+ this.root.gameMode.getBlueprintShapeKey()
+ ),
+ ...this.root.hud.parts.pinnedShapes.pinnedShapes.map(key =>
+ this.root.shapeDefinitionMgr.getShapeItemFromShortKey(key)
+ ),
+ ],
+ });
+
const dialog = new DialogWithForm({
app: this.root.app,
- title: "Set Signal",
- desc: "Enter a shape code, color or '0' or '1'",
- formElements: [signalValueInput],
+ title: T.dialogs.editSignal.title,
+ desc: T.dialogs.editSignal.descItems,
+ formElements: [itemInput, signalValueInput],
buttons: ["cancel:bad:escape", "ok:good:enter"],
closeButton: false,
});
this.root.hud.parts.dialogs.internalShowDialog(dialog);
// When confirmed, set the signal
- dialog.buttonSignals.ok.add(() => {
+ const closeHandler = () => {
if (!this.root || !this.root.entityMgr) {
// Game got stopped
return;
@@ -75,8 +98,16 @@ export class ConstantSignalSystem extends GameSystemWithFilter {
return;
}
- constantComp.signal = this.parseSignalCode(signalValueInput.getValue());
- });
+ if (itemInput.chosenItem) {
+ console.log(itemInput.chosenItem);
+ constantComp.signal = itemInput.chosenItem;
+ } else {
+ constantComp.signal = this.parseSignalCode(signalValueInput.getValue());
+ }
+ };
+
+ dialog.buttonSignals.ok.add(closeHandler);
+ dialog.valueChosen.add(closeHandler);
// When cancelled, destroy the entity again
dialog.buttonSignals.cancel.add(() => {
diff --git a/src/js/game/systems/display.js b/src/js/game/systems/display.js
index 2ad551f0..f11091b9 100644
--- a/src/js/game/systems/display.js
+++ b/src/js/game/systems/display.js
@@ -65,7 +65,7 @@ export class DisplaySystem extends GameSystemWithFilter {
const pinsComp = entity.components.WiredPins;
const network = pinsComp.slots[0].linkedNetwork;
- if (!network || !network.currentValue) {
+ if (!network || !network.hasValue()) {
continue;
}
diff --git a/src/js/game/systems/filter.js b/src/js/game/systems/filter.js
new file mode 100644
index 00000000..a6442b41
--- /dev/null
+++ b/src/js/game/systems/filter.js
@@ -0,0 +1,85 @@
+import { globalConfig } from "../../core/config";
+import { BaseItem } from "../base_item";
+import { FilterComponent } from "../components/filter";
+import { Entity } from "../entity";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+import { BOOL_TRUE_SINGLETON } from "../items/boolean_item";
+
+const MAX_ITEMS_IN_QUEUE = 2;
+
+export class FilterSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [FilterComponent]);
+ }
+
+ update() {
+ const progress =
+ this.root.dynamicTickrate.deltaSeconds *
+ this.root.hubGoals.getBeltBaseSpeed() *
+ globalConfig.itemSpacingOnBelts;
+
+ const requiredProgress = 1 - progress;
+
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ const filterComp = entity.components.Filter;
+ const ejectorComp = entity.components.ItemEjector;
+
+ // Process payloads
+ const slotsAndLists = [filterComp.pendingItemsToLeaveThrough, filterComp.pendingItemsToReject];
+ for (let slotIndex = 0; slotIndex < slotsAndLists.length; ++slotIndex) {
+ const pendingItems = slotsAndLists[slotIndex];
+
+ for (let j = 0; j < pendingItems.length; ++j) {
+ const nextItem = pendingItems[j];
+ // Advance next item
+ nextItem.progress = Math.min(requiredProgress, nextItem.progress + progress);
+ // Check if it's ready to eject
+ if (nextItem.progress >= requiredProgress - 1e-5) {
+ if (ejectorComp.tryEject(slotIndex, nextItem.item)) {
+ pendingItems.shift();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ * @param {number} slot
+ * @param {BaseItem} item
+ */
+ tryAcceptItem(entity, slot, item) {
+ const network = entity.components.WiredPins.slots[0].linkedNetwork;
+ if (!network || !network.hasValue()) {
+ // Filter is not connected
+ return false;
+ }
+
+ const value = network.currentValue;
+ const filterComp = entity.components.Filter;
+ assert(filterComp, "entity is no filter");
+
+ // Figure out which list we have to check
+ let listToCheck;
+ if (value.equals(BOOL_TRUE_SINGLETON) || value.equals(item)) {
+ listToCheck = filterComp.pendingItemsToLeaveThrough;
+ } else {
+ listToCheck = filterComp.pendingItemsToReject;
+ }
+
+ if (listToCheck.length >= MAX_ITEMS_IN_QUEUE) {
+ // Busy
+ return false;
+ }
+
+ // Actually accept item
+ listToCheck.push({
+ item,
+ progress: 0.0,
+ });
+ return true;
+ }
+}
diff --git a/src/js/game/systems/hub.js b/src/js/game/systems/hub.js
index 2270f941..2002b66e 100644
--- a/src/js/game/systems/hub.js
+++ b/src/js/game/systems/hub.js
@@ -1,172 +1,196 @@
-import { DrawParameters } from "../../core/draw_parameters";
-import { Loader } from "../../core/loader";
-import { formatBigNumber } from "../../core/utils";
-import { T } from "../../translations";
-import { HubComponent } from "../components/hub";
-import { Entity } from "../entity";
-import { GameSystemWithFilter } from "../game_system_with_filter";
-import { globalConfig } from "../../core/config";
-import { smoothenDpi } from "../../core/dpi_manager";
-import { drawSpriteClipped } from "../../core/draw_utils";
-import { Rectangle } from "../../core/rectangle";
-import { ORIGINAL_SPRITE_SCALE } from "../../core/sprites";
-
-const HUB_SIZE_TILES = 4;
-const HUB_SIZE_PIXELS = HUB_SIZE_TILES * globalConfig.tileSize;
-
-export class HubSystem extends GameSystemWithFilter {
- constructor(root) {
- super(root, [HubComponent]);
-
- this.hubSprite = Loader.getSprite("sprites/buildings/hub.png");
- }
-
- /**
- * @param {DrawParameters} parameters
- */
- draw(parameters) {
- for (let i = 0; i < this.allEntities.length; ++i) {
- this.drawEntity(parameters, this.allEntities[i]);
- }
- }
-
- update() {
- for (let i = 0; i < this.allEntities.length; ++i) {
- // Set hub goal
- const entity = this.allEntities[i];
- const pinsComp = entity.components.WiredPins;
- pinsComp.slots[0].value = this.root.shapeDefinitionMgr.getShapeItemFromDefinition(
- this.root.hubGoals.currentGoal.definition
- );
- }
- }
- /**
- *
- * @param {HTMLCanvasElement} canvas
- * @param {CanvasRenderingContext2D} context
- * @param {number} w
- * @param {number} h
- * @param {number} dpi
- */
- redrawHubBaseTexture(canvas, context, w, h, dpi) {
- // This method is quite ugly, please ignore it!
-
- context.scale(dpi, dpi);
-
- const parameters = new DrawParameters({
- context,
- visibleRect: new Rectangle(0, 0, w, h),
- desiredAtlasScale: ORIGINAL_SPRITE_SCALE,
- zoomLevel: dpi * 0.75,
- root: this.root,
- });
-
- context.clearRect(0, 0, w, h);
-
- this.hubSprite.draw(context, 0, 0, w, h);
-
- const definition = this.root.hubGoals.currentGoal.definition;
- definition.drawCentered(45, 58, parameters, 36);
-
- const goals = this.root.hubGoals.currentGoal;
-
- const textOffsetX = 70;
- const textOffsetY = 61;
-
- // Deliver count
- const delivered = this.root.hubGoals.getCurrentGoalDelivered();
- const deliveredText = "" + formatBigNumber(delivered);
-
- if (delivered > 9999) {
- context.font = "bold 16px GameFont";
- } else if (delivered > 999) {
- context.font = "bold 20px GameFont";
- } else {
- context.font = "bold 25px GameFont";
- }
- context.fillStyle = "#64666e";
- context.textAlign = "left";
- context.fillText(deliveredText, textOffsetX, textOffsetY);
-
- // Required
- context.font = "13px GameFont";
- context.fillStyle = "#a4a6b0";
- context.fillText("/ " + formatBigNumber(goals.required), textOffsetX, textOffsetY + 13);
-
- // Reward
- const rewardText = T.storyRewards[goals.reward].title.toUpperCase();
- if (rewardText.length > 12) {
- context.font = "bold 8px GameFont";
- } else {
- context.font = "bold 10px GameFont";
- }
- context.fillStyle = "#fd0752";
- context.textAlign = "center";
-
- context.fillText(rewardText, HUB_SIZE_PIXELS / 2, 105);
-
- // Level "8"
- context.font = "bold 10px GameFont";
- context.fillStyle = "#fff";
- context.fillText("" + this.root.hubGoals.level, 27, 32);
-
- // "LVL"
- context.textAlign = "center";
- context.fillStyle = "#fff";
- context.font = "bold 6px GameFont";
- context.fillText(T.buildings.hub.levelShortcut, 27, 22);
-
- // "Deliver"
- context.fillStyle = "#64666e";
- context.font = "bold 10px GameFont";
- context.fillText(T.buildings.hub.deliver.toUpperCase(), HUB_SIZE_PIXELS / 2, 30);
-
- // "To unlock"
- const unlockText = T.buildings.hub.toUnlock.toUpperCase();
- if (unlockText.length > 15) {
- context.font = "bold 8px GameFont";
- } else {
- context.font = "bold 10px GameFont";
- }
- context.fillText(T.buildings.hub.toUnlock.toUpperCase(), HUB_SIZE_PIXELS / 2, 92);
-
- context.textAlign = "left";
- }
-
- /**
- * @param {DrawParameters} parameters
- * @param {Entity} entity
- */
- drawEntity(parameters, entity) {
- const staticComp = entity.components.StaticMapEntity;
- if (!staticComp.shouldBeDrawn(parameters)) {
- return;
- }
-
- // Deliver count
- const delivered = this.root.hubGoals.getCurrentGoalDelivered();
- const deliveredText = "" + formatBigNumber(delivered);
-
- const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
- const canvas = parameters.root.buffers.getForKey({
- key: "hub",
- subKey: dpi + "/" + this.root.hubGoals.level + "/" + deliveredText,
- w: globalConfig.tileSize * 4,
- h: globalConfig.tileSize * 4,
- dpi,
- redrawMethod: this.redrawHubBaseTexture.bind(this),
- });
-
- const extrude = 8;
- drawSpriteClipped({
- parameters,
- sprite: canvas,
- x: staticComp.origin.x * globalConfig.tileSize - extrude,
- y: staticComp.origin.y * globalConfig.tileSize - extrude,
- w: HUB_SIZE_PIXELS + 2 * extrude,
- h: HUB_SIZE_PIXELS + 2 * extrude,
- originalW: HUB_SIZE_PIXELS * dpi,
- originalH: HUB_SIZE_PIXELS * dpi,
- });
- }
-}
+import { globalConfig } from "../../core/config";
+import { smoothenDpi } from "../../core/dpi_manager";
+import { DrawParameters } from "../../core/draw_parameters";
+import { drawSpriteClipped } from "../../core/draw_utils";
+import { Loader } from "../../core/loader";
+import { Rectangle } from "../../core/rectangle";
+import { ORIGINAL_SPRITE_SCALE } from "../../core/sprites";
+import { formatBigNumber } from "../../core/utils";
+import { T } from "../../translations";
+import { HubComponent } from "../components/hub";
+import { Entity } from "../entity";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+
+const HUB_SIZE_TILES = 4;
+const HUB_SIZE_PIXELS = HUB_SIZE_TILES * globalConfig.tileSize;
+
+export class HubSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [HubComponent]);
+
+ this.hubSprite = Loader.getSprite("sprites/buildings/hub.png");
+ }
+
+ /**
+ * @param {DrawParameters} parameters
+ */
+ draw(parameters) {
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ this.drawEntity(parameters, this.allEntities[i]);
+ }
+ }
+
+ update() {
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ // Set hub goal
+ const entity = this.allEntities[i];
+ const pinsComp = entity.components.WiredPins;
+ pinsComp.slots[0].value = this.root.shapeDefinitionMgr.getShapeItemFromDefinition(
+ this.root.hubGoals.currentGoal.definition
+ );
+ }
+ }
+ /**
+ *
+ * @param {HTMLCanvasElement} canvas
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} w
+ * @param {number} h
+ * @param {number} dpi
+ */
+ redrawHubBaseTexture(canvas, context, w, h, dpi) {
+ // This method is quite ugly, please ignore it!
+
+ context.scale(dpi, dpi);
+
+ const parameters = new DrawParameters({
+ context,
+ visibleRect: new Rectangle(0, 0, w, h),
+ desiredAtlasScale: ORIGINAL_SPRITE_SCALE,
+ zoomLevel: dpi * 0.75,
+ root: this.root,
+ });
+
+ context.clearRect(0, 0, w, h);
+
+ this.hubSprite.draw(context, 0, 0, w, h);
+
+ if (this.root.hubGoals.isEndOfDemoReached()) {
+ // End of demo
+ context.font = "bold 12px GameFont";
+ context.fillStyle = "#fd0752";
+ context.textAlign = "center";
+ context.fillText(T.buildings.hub.endOfDemo.toUpperCase(), w / 2, h / 2 + 6);
+ context.textAlign = "left";
+
+ return;
+ }
+
+ const definition = this.root.hubGoals.currentGoal.definition;
+ definition.drawCentered(45, 58, parameters, 36);
+
+ const goals = this.root.hubGoals.currentGoal;
+
+ const textOffsetX = 70;
+ const textOffsetY = 61;
+
+ if (goals.throughputOnly) {
+ // Throughput
+ const deliveredText = T.ingame.statistics.shapesDisplayUnits.second.replace(
+ "",
+ formatBigNumber(goals.required)
+ );
+
+ context.font = "bold 12px GameFont";
+ context.fillStyle = "#64666e";
+ context.textAlign = "left";
+ context.fillText(deliveredText, textOffsetX, textOffsetY);
+ } else {
+ // Deliver count
+ const delivered = this.root.hubGoals.getCurrentGoalDelivered();
+ const deliveredText = "" + formatBigNumber(delivered);
+
+ if (delivered > 9999) {
+ context.font = "bold 16px GameFont";
+ } else if (delivered > 999) {
+ context.font = "bold 20px GameFont";
+ } else {
+ context.font = "bold 25px GameFont";
+ }
+ context.fillStyle = "#64666e";
+ context.textAlign = "left";
+ context.fillText(deliveredText, textOffsetX, textOffsetY);
+
+ // Required
+ context.font = "13px GameFont";
+ context.fillStyle = "#a4a6b0";
+ context.fillText("/ " + formatBigNumber(goals.required), textOffsetX, textOffsetY + 13);
+ }
+
+ // Reward
+ const rewardText = T.storyRewards[goals.reward].title.toUpperCase();
+ if (rewardText.length > 12) {
+ context.font = "bold 8px GameFont";
+ } else {
+ context.font = "bold 10px GameFont";
+ }
+ context.fillStyle = "#fd0752";
+ context.textAlign = "center";
+
+ context.fillText(rewardText, HUB_SIZE_PIXELS / 2, 105);
+
+ // Level "8"
+ context.font = "bold 10px GameFont";
+ context.fillStyle = "#fff";
+ context.fillText("" + this.root.hubGoals.level, 27, 32);
+
+ // "LVL"
+ context.textAlign = "center";
+ context.fillStyle = "#fff";
+ context.font = "bold 6px GameFont";
+ context.fillText(T.buildings.hub.levelShortcut, 27, 22);
+
+ // "Deliver"
+ context.fillStyle = "#64666e";
+ context.font = "bold 10px GameFont";
+ context.fillText(T.buildings.hub.deliver.toUpperCase(), HUB_SIZE_PIXELS / 2, 30);
+
+ // "To unlock"
+ const unlockText = T.buildings.hub.toUnlock.toUpperCase();
+ if (unlockText.length > 15) {
+ context.font = "bold 8px GameFont";
+ } else {
+ context.font = "bold 10px GameFont";
+ }
+ context.fillText(T.buildings.hub.toUnlock.toUpperCase(), HUB_SIZE_PIXELS / 2, 92);
+
+ context.textAlign = "left";
+ }
+
+ /**
+ * @param {DrawParameters} parameters
+ * @param {Entity} entity
+ */
+ drawEntity(parameters, entity) {
+ const staticComp = entity.components.StaticMapEntity;
+ if (!staticComp.shouldBeDrawn(parameters)) {
+ return;
+ }
+
+ // Deliver count
+ const delivered = this.root.hubGoals.getCurrentGoalDelivered();
+ const deliveredText = "" + formatBigNumber(delivered);
+
+ const dpi = smoothenDpi(globalConfig.shapesSharpness * parameters.zoomLevel);
+ const canvas = parameters.root.buffers.getForKey({
+ key: "hub",
+ subKey: dpi + "/" + this.root.hubGoals.level + "/" + deliveredText,
+ w: globalConfig.tileSize * 4,
+ h: globalConfig.tileSize * 4,
+ dpi,
+ redrawMethod: this.redrawHubBaseTexture.bind(this),
+ });
+
+ const extrude = 8;
+ drawSpriteClipped({
+ parameters,
+ sprite: canvas,
+ x: staticComp.origin.x * globalConfig.tileSize - extrude,
+ y: staticComp.origin.y * globalConfig.tileSize - extrude,
+ w: HUB_SIZE_PIXELS + 2 * extrude,
+ h: HUB_SIZE_PIXELS + 2 * extrude,
+ originalW: HUB_SIZE_PIXELS * dpi,
+ originalH: HUB_SIZE_PIXELS * dpi,
+ });
+ }
+}
diff --git a/src/js/game/systems/item_acceptor.js b/src/js/game/systems/item_acceptor.js
index 6d6fec77..780b4abd 100644
--- a/src/js/game/systems/item_acceptor.js
+++ b/src/js/game/systems/item_acceptor.js
@@ -9,14 +9,35 @@ import { MapChunkView } from "../map_chunk_view";
export class ItemAcceptorSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [ItemAcceptorComponent]);
+
+ // Well ... it's better to be verbose I guess?
+ this.accumulatedTicksWhileInMapOverview = 0;
}
update() {
+ if (this.root.app.settings.getAllSettings().simplifiedBelts) {
+ // Disabled in potato mode
+ return;
+ }
+
+ // This system doesn't render anything while in map overview,
+ // so simply accumulate ticks
+ if (this.root.camera.getIsMapOverlayActive()) {
+ ++this.accumulatedTicksWhileInMapOverview;
+ return;
+ }
+
+ // Compute how much ticks we missed
+ const numTicks = 1 + this.accumulatedTicksWhileInMapOverview;
const progress =
this.root.dynamicTickrate.deltaSeconds *
2 *
this.root.hubGoals.getBeltBaseSpeed() *
- globalConfig.itemSpacingOnBelts; // * 2 because its only a half tile
+ globalConfig.itemSpacingOnBelts * // * 2 because its only a half tile
+ numTicks;
+
+ // Reset accumulated ticks
+ this.accumulatedTicksWhileInMapOverview = 0;
for (let i = 0; i < this.allEntities.length; ++i) {
const entity = this.allEntities[i];
@@ -40,6 +61,11 @@ export class ItemAcceptorSystem extends GameSystemWithFilter {
* @param {MapChunkView} chunk
*/
drawChunk(parameters, chunk) {
+ if (this.root.app.settings.getAllSettings().simplifiedBelts) {
+ // Disabled in potato mode
+ return;
+ }
+
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js
index 925dcc2e..56535111 100644
--- a/src/js/game/systems/item_ejector.js
+++ b/src/js/game/systems/item_ejector.js
@@ -2,8 +2,11 @@ import { globalConfig } from "../../core/config";
import { DrawParameters } from "../../core/draw_parameters";
import { createLogger } from "../../core/logging";
import { Rectangle } from "../../core/rectangle";
+import { StaleAreaDetector } from "../../core/stale_area_detector";
import { enumDirection, enumDirectionToVector } from "../../core/vector";
import { BaseItem } from "../base_item";
+import { BeltComponent } from "../components/belt";
+import { ItemAcceptorComponent } from "../components/item_acceptor";
import { ItemEjectorComponent } from "../components/item_ejector";
import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
@@ -15,102 +18,52 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [ItemEjectorComponent]);
- this.root.signals.entityAdded.add(this.checkForCacheInvalidation, this);
- this.root.signals.entityDestroyed.add(this.checkForCacheInvalidation, this);
- this.root.signals.postLoadHook.add(this.recomputeCache, this);
+ this.staleAreaDetector = new StaleAreaDetector({
+ root: this.root,
+ name: "item-ejector",
+ recomputeMethod: this.recomputeArea.bind(this),
+ });
- /**
- * @type {Rectangle}
- */
- this.areaToRecompute = null;
+ this.staleAreaDetector.recomputeOnComponentsChanged(
+ [ItemEjectorComponent, ItemAcceptorComponent, BeltComponent],
+ 1
+ );
+
+ this.root.signals.postLoadHook.add(this.recomputeCacheFull, this);
}
/**
- *
- * @param {Entity} entity
+ * Recomputes an area after it changed
+ * @param {Rectangle} area
*/
- checkForCacheInvalidation(entity) {
- if (!this.root.gameInitialized) {
- return;
- }
- if (!entity.components.StaticMapEntity) {
- return;
- }
-
- // Optimize for the common case: adding or removing one building at a time. Clicking
- // and dragging can cause up to 4 add/remove signals.
- const staticComp = entity.components.StaticMapEntity;
- const bounds = staticComp.getTileSpaceBounds();
- const expandedBounds = bounds.expandedInAllDirections(2);
-
- if (this.areaToRecompute) {
- this.areaToRecompute = this.areaToRecompute.getUnion(expandedBounds);
- } else {
- this.areaToRecompute = expandedBounds;
- }
- }
-
- /**
- * Precomputes the cache, which makes up for a huge performance improvement
- */
- recomputeCache() {
- if (this.areaToRecompute) {
- logger.log("Recomputing cache using rectangle");
- if (G_IS_DEV && globalConfig.debug.renderChanges) {
- this.root.hud.parts.changesDebugger.renderChange(
- "ejector-area",
- this.areaToRecompute,
- "#fe50a6"
- );
- }
- this.recomputeAreaCache();
- this.areaToRecompute = null;
- } else {
- logger.log("Full cache recompute");
- if (G_IS_DEV && globalConfig.debug.renderChanges) {
- this.root.hud.parts.changesDebugger.renderChange(
- "ejector-full",
- new Rectangle(-1000, -1000, 2000, 2000),
- "#fe50a6"
- );
- }
-
- // Try to find acceptors for every ejector
- for (let i = 0; i < this.allEntities.length; ++i) {
- const entity = this.allEntities[i];
- this.recomputeSingleEntityCache(entity);
- }
- }
- }
-
- /**
- * Recomputes the cache in the given area
- */
- recomputeAreaCache() {
- const area = this.areaToRecompute;
- let entryCount = 0;
-
- logger.log("Recomputing area:", area.x, area.y, "/", area.w, area.h);
-
- // Store the entities we already recomputed, so we don't do work twice
- const recomputedEntities = new Set();
-
- for (let x = area.x; x < area.right(); ++x) {
- for (let y = area.y; y < area.bottom(); ++y) {
- const entities = this.root.map.getLayersContentsMultipleXY(x, y);
- for (let i = 0; i < entities.length; ++i) {
- const entity = entities[i];
-
- // Recompute the entity in case its relevant for this system and it
- // hasn't already been computed
- if (!recomputedEntities.has(entity.uid) && entity.components.ItemEjector) {
- recomputedEntities.add(entity.uid);
- this.recomputeSingleEntityCache(entity);
+ recomputeArea(area) {
+ /** @type {Set} */
+ const seenUids = new Set();
+ for (let x = 0; x < area.w; ++x) {
+ for (let y = 0; y < area.h; ++y) {
+ const tileX = area.x + x;
+ const tileY = area.y + y;
+ // @NOTICE: Item ejector currently only supports regular layer
+ const contents = this.root.map.getLayerContentXY(tileX, tileY, "regular");
+ if (contents && contents.components.ItemEjector) {
+ if (!seenUids.has(contents.uid)) {
+ seenUids.add(contents.uid);
+ this.recomputeSingleEntityCache(contents);
}
}
}
}
- return entryCount;
+ }
+
+ /**
+ * Recomputes the whole cache after the game has loaded
+ */
+ recomputeCacheFull() {
+ logger.log("Full cache recompute in post load hook");
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ this.recomputeSingleEntityCache(entity);
+ }
}
/**
@@ -183,9 +136,7 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
}
update() {
- if (this.areaToRecompute) {
- this.recomputeCache();
- }
+ this.staleAreaDetector.update();
// Precompute effective belt speed
let progressGrowth = 2 * this.root.dynamicTickrate.deltaSeconds;
@@ -198,9 +149,6 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
for (let i = 0; i < this.allEntities.length; ++i) {
const sourceEntity = this.allEntities[i];
const sourceEjectorComp = sourceEntity.components.ItemEjector;
- if (!sourceEjectorComp.enabled) {
- continue;
- }
const slots = sourceEjectorComp.slots;
for (let j = 0; j < slots.length; ++j) {
@@ -211,8 +159,6 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
continue;
}
- const targetEntity = sourceSlot.cachedTargetEntity;
-
// Advance items on the slot
sourceSlot.progress = Math.min(
1,
@@ -245,17 +191,24 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
}
// Check if the target acceptor can actually accept this item
+ const destEntity = sourceSlot.cachedTargetEntity;
const destSlot = sourceSlot.cachedDestSlot;
if (destSlot) {
- const targetAcceptorComp = targetEntity.components.ItemAcceptor;
+ const targetAcceptorComp = destEntity.components.ItemAcceptor;
if (!targetAcceptorComp.canAcceptItem(destSlot.index, item)) {
continue;
}
// Try to hand over the item
- if (this.tryPassOverItem(item, targetEntity, destSlot.index)) {
+ if (this.tryPassOverItem(item, destEntity, destSlot.index)) {
// Handover successful, clear slot
- targetAcceptorComp.onItemAccepted(destSlot.index, destSlot.acceptedDirection, item);
+ if (!this.root.app.settings.getAllSettings().simplifiedBelts) {
+ targetAcceptorComp.onItemAccepted(
+ destSlot.index,
+ destSlot.acceptedDirection,
+ item
+ );
+ }
sourceSlot.item = null;
continue;
}
@@ -272,8 +225,7 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
*/
tryPassOverItem(item, receiver, slotIndex) {
// Try figuring out how what to do with the item
- // TODO: Kinda hacky. How to solve this properly? Don't want to go through inheritance hell.
- // Also its just a few cases (hope it stays like this .. :x).
+ // @TODO: Kinda hacky. How to solve this properly? Don't want to go through inheritance hell.
const beltComp = receiver.components.Belt;
if (beltComp) {
@@ -329,6 +281,15 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
return false;
}
+ const filterComp = receiver.components.Filter;
+ if (filterComp) {
+ // It's a filter! Unfortunately the filter has to know a lot about it's
+ // surrounding state and components, so it can't be within the component itself.
+ if (this.root.systemMgr.systems.filter.tryAcceptItem(receiver, slotIndex, item)) {
+ return true;
+ }
+ }
+
return false;
}
@@ -337,6 +298,11 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
* @param {MapChunkView} chunk
*/
drawChunk(parameters, chunk) {
+ if (this.root.app.settings.getAllSettings().simplifiedBelts) {
+ // Disabled in potato mode
+ return;
+ }
+
const contents = chunk.containedEntitiesByLayer.regular;
for (let i = 0; i < contents.length; ++i) {
@@ -357,6 +323,11 @@ export class ItemEjectorSystem extends GameSystemWithFilter {
continue;
}
+ if (!ejectorComp.renderFloatingItems && !slot.cachedTargetEntity) {
+ // Not connected to any building
+ continue;
+ }
+
const realPosition = staticComp.localTileToWorld(slot.pos);
if (!chunk.tileSpaceRectangle.containsPoint(realPosition.x, realPosition.y)) {
// Not within this chunk
diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js
index d58aa697..9775afde 100644
--- a/src/js/game/systems/item_processor.js
+++ b/src/js/game/systems/item_processor.js
@@ -16,9 +16,55 @@ import { ShapeItem } from "../items/shape_item";
*/
const MAX_QUEUED_CHARGES = 2;
+/**
+ * Whole data for a produced item
+ *
+ * @typedef {{
+ * item: BaseItem,
+ * preferredSlot?: number,
+ * requiredSlot?: number,
+ * doNotTrack?: boolean
+ * }} ProducedItem
+ */
+
+/**
+ * Type of a processor implementation
+ * @typedef {{
+ * entity: Entity,
+ * items: Array<{ item: BaseItem, sourceSlot: number }>,
+ * itemsBySlot: Object,
+ * outItems: Array
+ * }} ProcessorImplementationPayload
+ */
+
export class ItemProcessorSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [ItemProcessorComponent]);
+
+ /**
+ * @type {Object}
+ */
+ this.handlers = {
+ [enumItemProcessorTypes.balancer]: this.process_BALANCER,
+ [enumItemProcessorTypes.cutter]: this.process_CUTTER,
+ [enumItemProcessorTypes.cutterQuad]: this.process_CUTTER_QUAD,
+ [enumItemProcessorTypes.rotater]: this.process_ROTATER,
+ [enumItemProcessorTypes.rotaterCCW]: this.process_ROTATER_CCW,
+ [enumItemProcessorTypes.rotater180]: this.process_ROTATER_180,
+ [enumItemProcessorTypes.stacker]: this.process_STACKER,
+ [enumItemProcessorTypes.trash]: this.process_TRASH,
+ [enumItemProcessorTypes.mixer]: this.process_MIXER,
+ [enumItemProcessorTypes.painter]: this.process_PAINTER,
+ [enumItemProcessorTypes.painterDouble]: this.process_PAINTER_DOUBLE,
+ [enumItemProcessorTypes.painterQuad]: this.process_PAINTER_QUAD,
+ [enumItemProcessorTypes.hub]: this.process_HUB,
+ [enumItemProcessorTypes.reader]: this.process_READER,
+ };
+
+ // Bind all handlers
+ for (const key in this.handlers) {
+ this.handlers[key] = this.handlers[key].bind(this);
+ }
}
update() {
@@ -48,6 +94,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
for (let j = 0; j < itemsToEject.length; ++j) {
const { item, requiredSlot, preferredSlot } = itemsToEject[j];
+ assert(ejectorComp, "To eject items, the building needs to have an ejector");
+
let slot = null;
if (requiredSlot !== null && requiredSlot !== undefined) {
// We have a slot override, check if that is free
@@ -115,24 +163,13 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
// Check the network value at the given slot
const network = pinsComp.slots[slotIndex - 1].linkedNetwork;
- const slotIsEnabled = network && isTruthyItem(network.currentValue);
+ const slotIsEnabled = network && network.hasValue() && isTruthyItem(network.currentValue);
if (!slotIsEnabled) {
return false;
}
return true;
}
- case enumItemProcessorRequirements.filter: {
- const network = pinsComp.slots[0].linkedNetwork;
- if (!network || !network.currentValue) {
- // Item filter is not connected
- return false;
- }
-
- // Otherwise, all good
- return true;
- }
-
// By default, everything is accepted
default:
return true;
@@ -175,9 +212,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
// Check which slots are enabled
for (let i = 0; i < 4; ++i) {
// Extract the network value on the Nth pin
- const networkValue = pinsComp.slots[i].linkedNetwork
- ? pinsComp.slots[i].linkedNetwork.currentValue
- : null;
+ const network = pinsComp.slots[i].linkedNetwork;
+ const networkValue = network && network.hasValue() ? network.currentValue : null;
// If there is no "1" on that slot, don't paint there
if (!isTruthyItem(networkValue)) {
@@ -210,18 +246,6 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
return true;
}
- // FILTER
- // Double check with linked network
- case enumItemProcessorRequirements.filter: {
- const network = entity.components.WiredPins.slots[0].linkedNetwork;
- if (!network || !network.currentValue) {
- // Item filter is not connected
- return false;
- }
-
- return processorComp.inputSlots.length >= processorComp.inputsPerCharge;
- }
-
default:
assertAlways(false, "Unknown requirement for " + processorComp.processingRequirement);
}
@@ -238,310 +262,30 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
const items = processorComp.inputSlots;
processorComp.inputSlots = [];
- /** @type {Object.} */
+ /** @type {Object} */
const itemsBySlot = {};
for (let i = 0; i < items.length; ++i) {
- itemsBySlot[items[i].sourceSlot] = items[i];
+ itemsBySlot[items[i].sourceSlot] = items[i].item;
}
- /** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */
+ /** @type {Array} */
const outItems = [];
- // Whether to track the production towards the analytics
- let trackProduction = true;
+ /** @type {function(ProcessorImplementationPayload) : void} */
+ const handler = this.handlers[processorComp.type];
+ assert(handler, "No handler for processor type defined: " + processorComp.type);
- // DO SOME MAGIC
-
- switch (processorComp.type) {
- // SPLITTER
- case enumItemProcessorTypes.splitterWires:
- case enumItemProcessorTypes.splitter: {
- trackProduction = false;
- const availableSlots = entity.components.ItemEjector.slots.length;
-
- let nextSlot = processorComp.nextOutputSlot++ % availableSlots;
- for (let i = 0; i < items.length; ++i) {
- outItems.push({
- item: items[i].item,
- preferredSlot: (nextSlot + i) % availableSlots,
- });
- }
- break;
- }
-
- // CUTTER
- case enumItemProcessorTypes.cutter: {
- const inputItem = /** @type {ShapeItem} */ (items[0].item);
- assert(inputItem instanceof ShapeItem, "Input for cut is not a shape");
- const inputDefinition = inputItem.definition;
-
- const cutDefinitions = this.root.shapeDefinitionMgr.shapeActionCutHalf(inputDefinition);
-
- for (let i = 0; i < cutDefinitions.length; ++i) {
- const definition = cutDefinitions[i];
- if (!definition.isEntirelyEmpty()) {
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(definition),
- requiredSlot: i,
- });
- }
- }
-
- break;
- }
-
- // CUTTER (Quad)
- case enumItemProcessorTypes.cutterQuad: {
- const inputItem = /** @type {ShapeItem} */ (items[0].item);
- assert(inputItem instanceof ShapeItem, "Input for cut is not a shape");
- const inputDefinition = inputItem.definition;
-
- const cutDefinitions = this.root.shapeDefinitionMgr.shapeActionCutQuad(inputDefinition);
-
- for (let i = 0; i < cutDefinitions.length; ++i) {
- const definition = cutDefinitions[i];
- if (!definition.isEntirelyEmpty()) {
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(definition),
- requiredSlot: i,
- });
- }
- }
-
- break;
- }
-
- // ROTATER
- case enumItemProcessorTypes.rotater: {
- const inputItem = /** @type {ShapeItem} */ (items[0].item);
- assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
- const inputDefinition = inputItem.definition;
-
- const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(inputDefinition);
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
- });
- break;
- }
-
- // ROTATER (CCW)
- case enumItemProcessorTypes.rotaterCCW: {
- const inputItem = /** @type {ShapeItem} */ (items[0].item);
- assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
- const inputDefinition = inputItem.definition;
-
- const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCCW(inputDefinition);
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
- });
- break;
- }
-
- // ROTATER (FL)
- case enumItemProcessorTypes.rotaterFL: {
- const inputItem = /** @type {ShapeItem} */ (items[0].item);
- assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
- const inputDefinition = inputItem.definition;
-
- const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateFL(inputDefinition);
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
- });
- break;
- }
-
- // STACKER
-
- case enumItemProcessorTypes.stacker: {
- const lowerItem = /** @type {ShapeItem} */ (itemsBySlot[0].item);
- const upperItem = /** @type {ShapeItem} */ (itemsBySlot[1].item);
-
- assert(lowerItem instanceof ShapeItem, "Input for lower stack is not a shape");
- assert(upperItem instanceof ShapeItem, "Input for upper stack is not a shape");
-
- const stackedDefinition = this.root.shapeDefinitionMgr.shapeActionStack(
- lowerItem.definition,
- upperItem.definition
- );
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(stackedDefinition),
- });
- break;
- }
-
- // TRASH
-
- case enumItemProcessorTypes.trash: {
- // Well this one is easy .. simply do nothing with the item
- break;
- }
-
- // MIXER
-
- case enumItemProcessorTypes.mixer: {
- // Find both colors and combine them
- const item1 = /** @type {ColorItem} */ (items[0].item);
- const item2 = /** @type {ColorItem} */ (items[1].item);
- assert(item1 instanceof ColorItem, "Input for color mixer is not a color");
- assert(item2 instanceof ColorItem, "Input for color mixer is not a color");
-
- const color1 = item1.color;
- const color2 = item2.color;
-
- // Try finding mixer color, and if we can't mix it we simply return the same color
- const mixedColor = enumColorMixingResults[color1][color2];
- let resultColor = color1;
- if (mixedColor) {
- resultColor = mixedColor;
- }
- outItems.push({
- item: COLOR_ITEM_SINGLETONS[resultColor],
- });
-
- break;
- }
-
- // PAINTER
-
- case enumItemProcessorTypes.painter: {
- const shapeItem = /** @type {ShapeItem} */ (itemsBySlot[0].item);
- const colorItem = /** @type {ColorItem} */ (itemsBySlot[1].item);
-
- const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith(
- shapeItem.definition,
- colorItem.color
- );
-
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition),
- });
-
- break;
- }
-
- // PAINTER (DOUBLE)
-
- case enumItemProcessorTypes.painterDouble: {
- const shapeItem1 = /** @type {ShapeItem} */ (itemsBySlot[0].item);
- const shapeItem2 = /** @type {ShapeItem} */ (itemsBySlot[1].item);
- const colorItem = /** @type {ColorItem} */ (itemsBySlot[2].item);
-
- assert(shapeItem1 instanceof ShapeItem, "Input for painter is not a shape");
- assert(shapeItem2 instanceof ShapeItem, "Input for painter is not a shape");
- assert(colorItem instanceof ColorItem, "Input for painter is not a color");
-
- const colorizedDefinition1 = this.root.shapeDefinitionMgr.shapeActionPaintWith(
- shapeItem1.definition,
- colorItem.color
- );
-
- const colorizedDefinition2 = this.root.shapeDefinitionMgr.shapeActionPaintWith(
- shapeItem2.definition,
- colorItem.color
- );
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition1),
- });
-
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition2),
- });
-
- break;
- }
-
- // PAINTER (QUAD)
-
- case enumItemProcessorTypes.painterQuad: {
- const shapeItem = /** @type {ShapeItem} */ (itemsBySlot[0].item);
- assert(shapeItem instanceof ShapeItem, "Input for painter is not a shape");
-
- /** @type {Array} */
- const colors = [null, null, null, null];
- for (let i = 0; i < 4; ++i) {
- if (itemsBySlot[i + 1]) {
- colors[i] = /** @type {ColorItem} */ (itemsBySlot[i + 1].item).color;
- }
- }
-
- const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith4Colors(
- shapeItem.definition,
- /** @type {[string, string, string, string]} */ (colors)
- );
-
- outItems.push({
- item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition),
- });
- break;
- }
-
- // FILTER
- case enumItemProcessorTypes.filter: {
- // TODO
- trackProduction = false;
-
- const item = itemsBySlot[0].item;
-
- const network = entity.components.WiredPins.slots[0].linkedNetwork;
- if (!network || !network.currentValue) {
- outItems.push({
- item,
- requiredSlot: 1,
- });
- break;
- }
-
- const value = network.currentValue;
- if (value.equals(BOOL_TRUE_SINGLETON) || value.equals(item)) {
- outItems.push({
- item,
- requiredSlot: 0,
- });
- } else {
- outItems.push({
- item,
- requiredSlot: 1,
- });
- }
-
- break;
- }
-
- // READER
- case enumItemProcessorTypes.reader: {
- // Pass through the item
- const item = itemsBySlot[0].item;
- outItems.push({ item });
-
- // Track the item
- const readerComp = entity.components.BeltReader;
- readerComp.lastItemTimes.push(this.root.time.now());
- readerComp.lastItem = item;
- break;
- }
-
- // HUB
- case enumItemProcessorTypes.hub: {
- trackProduction = false;
-
- const hubComponent = entity.components.Hub;
- assert(hubComponent, "Hub item processor has no hub component");
-
- for (let i = 0; i < items.length; ++i) {
- const item = /** @type {ShapeItem} */ (items[i].item);
- this.root.hubGoals.handleDefinitionDelivered(item.definition);
- }
-
- break;
- }
-
- default:
- assertAlways(false, "Unkown item processor type: " + processorComp.type);
- }
+ // Call implementation
+ handler({
+ entity,
+ items,
+ itemsBySlot,
+ outItems,
+ });
// Track produced items
- if (trackProduction) {
- for (let i = 0; i < outItems.length; ++i) {
+ for (let i = 0; i < outItems.length; ++i) {
+ if (!outItems[i].doNotTrack) {
this.root.signals.itemProduced.dispatch(outItems[i].item);
}
}
@@ -553,28 +297,269 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
const bonusTimeToApply = Math.min(originalTime, processorComp.bonusTime);
const timeToProcess = originalTime - bonusTimeToApply;
- // Substract one tick because we already process it this frame
- // if (processorComp.bonusTime > originalTime) {
- // if (processorComp.type === enumItemProcessorTypes.reader) {
- // console.log(
- // "Bonus time",
- // round4Digits(processorComp.bonusTime),
- // "Original time",
- // round4Digits(originalTime),
- // "Overcomit by",
- // round4Digits(processorComp.bonusTime - originalTime),
- // "->",
- // round4Digits(timeToProcess),
- // "reduced by",
- // round4Digits(bonusTimeToApply)
- // );
- // }
- // }
processorComp.bonusTime -= bonusTimeToApply;
-
processorComp.ongoingCharges.push({
items: outItems,
remainingTime: timeToProcess,
});
}
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_BALANCER(payload) {
+ assert(
+ payload.entity.components.ItemEjector,
+ "To be a balancer, the building needs to have an ejector"
+ );
+ const availableSlots = payload.entity.components.ItemEjector.slots.length;
+ const processorComp = payload.entity.components.ItemProcessor;
+
+ const nextSlot = processorComp.nextOutputSlot++ % availableSlots;
+
+ for (let i = 0; i < payload.items.length; ++i) {
+ payload.outItems.push({
+ item: payload.items[i].item,
+ preferredSlot: (nextSlot + i) % availableSlots,
+ doNotTrack: true,
+ });
+ }
+ return true;
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_CUTTER(payload) {
+ const inputItem = /** @type {ShapeItem} */ (payload.items[0].item);
+ assert(inputItem instanceof ShapeItem, "Input for cut is not a shape");
+ const inputDefinition = inputItem.definition;
+
+ const cutDefinitions = this.root.shapeDefinitionMgr.shapeActionCutHalf(inputDefinition);
+
+ for (let i = 0; i < cutDefinitions.length; ++i) {
+ const definition = cutDefinitions[i];
+ if (!definition.isEntirelyEmpty()) {
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(definition),
+ requiredSlot: i,
+ });
+ }
+ }
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_CUTTER_QUAD(payload) {
+ const inputItem = /** @type {ShapeItem} */ (payload.items[0].item);
+ assert(inputItem instanceof ShapeItem, "Input for cut is not a shape");
+ const inputDefinition = inputItem.definition;
+
+ const cutDefinitions = this.root.shapeDefinitionMgr.shapeActionCutQuad(inputDefinition);
+
+ for (let i = 0; i < cutDefinitions.length; ++i) {
+ const definition = cutDefinitions[i];
+ if (!definition.isEntirelyEmpty()) {
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(definition),
+ requiredSlot: i,
+ });
+ }
+ }
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_ROTATER(payload) {
+ const inputItem = /** @type {ShapeItem} */ (payload.items[0].item);
+ assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
+ const inputDefinition = inputItem.definition;
+
+ const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(inputDefinition);
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_ROTATER_CCW(payload) {
+ const inputItem = /** @type {ShapeItem} */ (payload.items[0].item);
+ assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
+ const inputDefinition = inputItem.definition;
+
+ const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCCW(inputDefinition);
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_ROTATER_180(payload) {
+ const inputItem = /** @type {ShapeItem} */ (payload.items[0].item);
+ assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape");
+ const inputDefinition = inputItem.definition;
+
+ const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotate180(inputDefinition);
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_STACKER(payload) {
+ const lowerItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]);
+ const upperItem = /** @type {ShapeItem} */ (payload.itemsBySlot[1]);
+
+ assert(lowerItem instanceof ShapeItem, "Input for lower stack is not a shape");
+ assert(upperItem instanceof ShapeItem, "Input for upper stack is not a shape");
+
+ const stackedDefinition = this.root.shapeDefinitionMgr.shapeActionStack(
+ lowerItem.definition,
+ upperItem.definition
+ );
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(stackedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_TRASH(payload) {
+ // Do nothing ..
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_MIXER(payload) {
+ // Find both colors and combine them
+ const item1 = /** @type {ColorItem} */ (payload.items[0].item);
+ const item2 = /** @type {ColorItem} */ (payload.items[1].item);
+ assert(item1 instanceof ColorItem, "Input for color mixer is not a color");
+ assert(item2 instanceof ColorItem, "Input for color mixer is not a color");
+
+ const color1 = item1.color;
+ const color2 = item2.color;
+
+ // Try finding mixer color, and if we can't mix it we simply return the same color
+ const mixedColor = enumColorMixingResults[color1][color2];
+ let resultColor = color1;
+ if (mixedColor) {
+ resultColor = mixedColor;
+ }
+ payload.outItems.push({
+ item: COLOR_ITEM_SINGLETONS[resultColor],
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_PAINTER(payload) {
+ const shapeItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]);
+ const colorItem = /** @type {ColorItem} */ (payload.itemsBySlot[1]);
+
+ const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith(
+ shapeItem.definition,
+ colorItem.color
+ );
+
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_PAINTER_DOUBLE(payload) {
+ const shapeItem1 = /** @type {ShapeItem} */ (payload.itemsBySlot[0]);
+ const shapeItem2 = /** @type {ShapeItem} */ (payload.itemsBySlot[1]);
+ const colorItem = /** @type {ColorItem} */ (payload.itemsBySlot[2]);
+
+ assert(shapeItem1 instanceof ShapeItem, "Input for painter is not a shape");
+ assert(shapeItem2 instanceof ShapeItem, "Input for painter is not a shape");
+ assert(colorItem instanceof ColorItem, "Input for painter is not a color");
+
+ const colorizedDefinition1 = this.root.shapeDefinitionMgr.shapeActionPaintWith(
+ shapeItem1.definition,
+ colorItem.color
+ );
+
+ const colorizedDefinition2 = this.root.shapeDefinitionMgr.shapeActionPaintWith(
+ shapeItem2.definition,
+ colorItem.color
+ );
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition1),
+ });
+
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition2),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_PAINTER_QUAD(payload) {
+ const shapeItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]);
+ assert(shapeItem instanceof ShapeItem, "Input for painter is not a shape");
+
+ /** @type {Array} */
+ const colors = [null, null, null, null];
+ for (let i = 0; i < 4; ++i) {
+ if (payload.itemsBySlot[i + 1]) {
+ colors[i] = /** @type {ColorItem} */ (payload.itemsBySlot[i + 1]).color;
+ }
+ }
+
+ const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith4Colors(
+ shapeItem.definition,
+ /** @type {[string, string, string, string]} */ (colors)
+ );
+
+ payload.outItems.push({
+ item: this.root.shapeDefinitionMgr.getShapeItemFromDefinition(colorizedDefinition),
+ });
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_READER(payload) {
+ // Pass through the item
+ const item = payload.itemsBySlot[0];
+ payload.outItems.push({
+ item,
+ doNotTrack: true,
+ });
+
+ // Track the item
+ const readerComp = payload.entity.components.BeltReader;
+ readerComp.lastItemTimes.push(this.root.time.now());
+ readerComp.lastItem = item;
+ }
+
+ /**
+ * @param {ProcessorImplementationPayload} payload
+ */
+ process_HUB(payload) {
+ const hubComponent = payload.entity.components.Hub;
+ assert(hubComponent, "Hub item processor has no hub component");
+
+ for (let i = 0; i < payload.items.length; ++i) {
+ const item = /** @type {ShapeItem} */ (payload.items[i].item);
+ this.root.hubGoals.handleDefinitionDelivered(item.definition);
+ }
+ }
}
diff --git a/src/js/game/systems/item_processor_overlays.js b/src/js/game/systems/item_processor_overlays.js
index 2ec91b88..0377f779 100644
--- a/src/js/game/systems/item_processor_overlays.js
+++ b/src/js/game/systems/item_processor_overlays.js
@@ -1,6 +1,6 @@
import { globalConfig } from "../../core/config";
import { Loader } from "../../core/loader";
-import { smoothPulse, round4Digits } from "../../core/utils";
+import { round1DigitLocalized, smoothPulse } from "../../core/utils";
import { enumItemProcessorRequirements, enumItemProcessorTypes } from "../components/item_processor";
import { Entity } from "../entity";
import { GameSystem } from "../game_system";
@@ -17,7 +17,6 @@ export class ItemProcessorOverlaysSystem extends GameSystem {
this.readerOverlaySprite = Loader.getSprite("sprites/misc/reader_overlay.png");
this.drawnUids = new Set();
-
this.root.signals.gameFrameStarted.add(this.clearDrawnUids, this);
}
@@ -35,35 +34,40 @@ export class ItemProcessorOverlaysSystem extends GameSystem {
for (let i = 0; i < contents.length; ++i) {
const entity = contents[i];
const processorComp = entity.components.ItemProcessor;
- if (!processorComp) {
- continue;
- }
+ const filterComp = entity.components.Filter;
- const requirement = processorComp.processingRequirement;
-
- if (!requirement && processorComp.type !== enumItemProcessorTypes.reader) {
- continue;
- }
-
- if (this.drawnUids.has(entity.uid)) {
- continue;
- }
-
- this.drawnUids.add(entity.uid);
-
- switch (requirement) {
- case enumItemProcessorRequirements.painterQuad: {
- this.drawConnectedSlotRequirement(parameters, entity, { drawIfFalse: true });
- break;
+ // Draw processor overlays
+ if (processorComp) {
+ const requirement = processorComp.processingRequirement;
+ if (!requirement && processorComp.type !== enumItemProcessorTypes.reader) {
+ continue;
}
- case enumItemProcessorRequirements.filter: {
- this.drawConnectedSlotRequirement(parameters, entity, { drawIfFalse: false });
- break;
+
+ if (this.drawnUids.has(entity.uid)) {
+ continue;
+ }
+ this.drawnUids.add(entity.uid);
+
+ switch (requirement) {
+ case enumItemProcessorRequirements.painterQuad: {
+ this.drawConnectedSlotRequirement(parameters, entity, { drawIfFalse: true });
+ break;
+ }
+ }
+
+ if (processorComp.type === enumItemProcessorTypes.reader) {
+ this.drawReaderOverlays(parameters, entity);
}
}
- if (processorComp.type === enumItemProcessorTypes.reader) {
- this.drawReaderOverlays(parameters, entity);
+ // Draw filter overlays
+ else if (filterComp) {
+ if (this.drawnUids.has(entity.uid)) {
+ continue;
+ }
+ this.drawnUids.add(entity.uid);
+
+ this.drawConnectedSlotRequirement(parameters, entity, { drawIfFalse: false });
}
}
}
@@ -88,7 +92,7 @@ export class ItemProcessorOverlaysSystem extends GameSystem {
parameters.context.textAlign = "center";
parameters.context.font = "bold 10px GameFont";
parameters.context.fillText(
- "" + Math.round(readerComp.lastThroughput * 10) / 10,
+ round1DigitLocalized(readerComp.lastThroughput),
(staticComp.origin.x + 0.5) * globalConfig.tileSize,
(staticComp.origin.y + 0.62) * globalConfig.tileSize
);
@@ -113,7 +117,7 @@ export class ItemProcessorOverlaysSystem extends GameSystem {
for (let i = 0; i < pinsComp.slots.length; ++i) {
const slot = pinsComp.slots[i];
const network = slot.linkedNetwork;
- if (network && network.currentValue) {
+ if (network && network.hasValue()) {
anySlotConnected = true;
if (isTruthyItem(network.currentValue) || !drawIfFalse) {
diff --git a/src/js/game/systems/item_producer.js b/src/js/game/systems/item_producer.js
new file mode 100644
index 00000000..52edf5d1
--- /dev/null
+++ b/src/js/game/systems/item_producer.js
@@ -0,0 +1,24 @@
+import { ItemProducerComponent } from "../components/item_producer";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+
+export class ItemProducerSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [ItemProducerComponent]);
+ }
+
+ update() {
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ const pinsComp = entity.components.WiredPins;
+ const pin = pinsComp.slots[0];
+ const network = pin.linkedNetwork;
+
+ if (!network || !network.hasValue()) {
+ continue;
+ }
+
+ const ejectorComp = entity.components.ItemEjector;
+ ejectorComp.tryEject(0, network.currentValue);
+ }
+ }
+}
diff --git a/src/js/game/systems/logic_gate.js b/src/js/game/systems/logic_gate.js
index 3bfc20cd..4545a331 100644
--- a/src/js/game/systems/logic_gate.js
+++ b/src/js/game/systems/logic_gate.js
@@ -3,10 +3,10 @@ import { enumColors } from "../colors";
import { enumLogicGateType, LogicGateComponent } from "../components/logic_gate";
import { enumPinSlotType } from "../components/wired_pins";
import { GameSystemWithFilter } from "../game_system_with_filter";
-import { BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON, isTruthyItem, BooleanItem } from "../items/boolean_item";
-import { COLOR_ITEM_SINGLETONS, ColorItem } from "../items/color_item";
-import { ShapeDefinition } from "../shape_definition";
+import { BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON, BooleanItem, isTruthyItem } from "../items/boolean_item";
+import { ColorItem, COLOR_ITEM_SINGLETONS } from "../items/color_item";
import { ShapeItem } from "../items/shape_item";
+import { ShapeDefinition } from "../shape_definition";
export class LogicGateSystem extends GameSystemWithFilter {
constructor(root) {
@@ -23,7 +23,9 @@ export class LogicGateSystem extends GameSystemWithFilter {
[enumLogicGateType.analyzer]: this.compute_ANALYZE.bind(this),
[enumLogicGateType.cutter]: this.compute_CUT.bind(this),
[enumLogicGateType.unstacker]: this.compute_UNSTACK.bind(this),
- [enumLogicGateType.shapecompare]: this.compute_SHAPECOMPARE.bind(this),
+ [enumLogicGateType.compare]: this.compute_COMPARE.bind(this),
+ [enumLogicGateType.stacker]: this.compute_STACKER.bind(this),
+ [enumLogicGateType.painter]: this.compute_PAINTER.bind(this),
};
}
@@ -44,13 +46,13 @@ export class LogicGateSystem extends GameSystemWithFilter {
if (slot.type !== enumPinSlotType.logicalAcceptor) {
continue;
}
- if (slot.linkedNetwork) {
- if (slot.linkedNetwork.valueConflict) {
+ const network = slot.linkedNetwork;
+ if (network) {
+ if (network.valueConflict) {
anyConflict = true;
break;
}
-
- slotValues.push(slot.linkedNetwork.currentValue);
+ slotValues.push(network.currentValue);
} else {
slotValues.push(null);
}
@@ -162,8 +164,8 @@ export class LogicGateSystem extends GameSystemWithFilter {
}
const definition = /** @type {ShapeItem} */ (item).definition;
- const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(definition);
- return this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinition);
+ const rotatedDefinitionCW = this.root.shapeDefinitionMgr.shapeActionRotateCW(definition);
+ return this.root.shapeDefinitionMgr.getShapeItemFromDefinition(rotatedDefinitionCW);
}
/**
@@ -263,13 +265,65 @@ export class LogicGateSystem extends GameSystemWithFilter {
* @param {Array} parameters
* @returns {BaseItem}
*/
- compute_SHAPECOMPARE(parameters) {
+ compute_STACKER(parameters) {
+ const lowerItem = parameters[0];
+ const upperItem = parameters[1];
+
+ if (!lowerItem || !upperItem) {
+ // Empty
+ return null;
+ }
+
+ if (lowerItem.getItemType() !== "shape" || upperItem.getItemType() !== "shape") {
+ // Bad type
+ return null;
+ }
+
+ const stackedShape = this.root.shapeDefinitionMgr.shapeActionStack(
+ /** @type {ShapeItem} */ (lowerItem).definition,
+ /** @type {ShapeItem} */ (upperItem).definition
+ );
+
+ return this.root.shapeDefinitionMgr.getShapeItemFromDefinition(stackedShape);
+ }
+
+ /**
+ * @param {Array} parameters
+ * @returns {BaseItem}
+ */
+ compute_PAINTER(parameters) {
+ const shape = parameters[0];
+ const color = parameters[1];
+
+ if (!shape || !color) {
+ // Empty
+ return null;
+ }
+
+ if (shape.getItemType() !== "shape" || color.getItemType() !== "color") {
+ // Bad type
+ return null;
+ }
+
+ const coloredShape = this.root.shapeDefinitionMgr.shapeActionPaintWith(
+ /** @type {ShapeItem} */ (shape).definition,
+ /** @type {ColorItem} */ (color).color
+ );
+
+ return this.root.shapeDefinitionMgr.getShapeItemFromDefinition(coloredShape);
+ }
+
+ /**
+ * @param {Array} parameters
+ * @returns {BaseItem}
+ */
+ compute_COMPARE(parameters) {
const itemA = parameters[0];
const itemB = parameters[1];
if (!itemA || !itemB) {
// Empty
- return BOOL_FALSE_SINGLETON;
+ return null;
}
if (itemA.getItemType() !== itemB.getItemType()) {
diff --git a/src/js/game/systems/map_resources.js b/src/js/game/systems/map_resources.js
index c368e684..807afb36 100644
--- a/src/js/game/systems/map_resources.js
+++ b/src/js/game/systems/map_resources.js
@@ -49,11 +49,20 @@ export class MapResourcesSystem extends GameSystem {
} else {
// HIGH QUALITY: Draw all items
const layer = chunk.lowerLayer;
+ const layerEntities = chunk.contents;
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
const row = layer[x];
+ const rowEntities = layerEntities[x];
const worldX = (chunk.tileX + x) * globalConfig.tileSize;
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
const lowerItem = row[y];
+
+ const entity = rowEntities[y];
+ if (entity) {
+ // Don't draw if there is an entity above
+ continue;
+ }
+
if (lowerItem) {
const worldY = (chunk.tileY + y) * globalConfig.tileSize;
diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js
index 94f2791e..cd478be3 100644
--- a/src/js/game/systems/miner.js
+++ b/src/js/game/systems/miner.js
@@ -46,7 +46,6 @@ export class MinerSystem extends GameSystemWithFilter {
}
// Check if miner is above an actual tile
-
if (!minerComp.cachedMinedItem) {
const staticComp = entity.components.StaticMapEntity;
const tileBelow = this.root.map.getLowerLayerContentXY(
@@ -94,6 +93,11 @@ export class MinerSystem extends GameSystemWithFilter {
findChainedMiner(entity) {
const ejectComp = entity.components.ItemEjector;
const staticComp = entity.components.StaticMapEntity;
+ const contentsBelow = this.root.map.getLowerLayerContentXY(staticComp.origin.x, staticComp.origin.y);
+ if (!contentsBelow) {
+ // This miner has no contents
+ return null;
+ }
const ejectingSlot = ejectComp.slots[0];
const ejectingPos = staticComp.localTileToWorld(ejectingSlot.pos);
@@ -106,7 +110,10 @@ export class MinerSystem extends GameSystemWithFilter {
if (targetContents) {
const targetMinerComp = targetContents.components.Miner;
if (targetMinerComp && targetMinerComp.chainable) {
- return targetContents;
+ const targetLowerLayer = this.root.map.getLowerLayerContentXY(targetTile.x, targetTile.y);
+ if (targetLowerLayer) {
+ return targetContents;
+ }
}
}
@@ -171,7 +178,7 @@ export class MinerSystem extends GameSystemWithFilter {
}
// Draw the item background - this is to hide the ejected item animation from
- // the item ejecto
+ // the item ejector
const padding = 3;
const destX = staticComp.origin.x * globalConfig.tileSize + padding;
diff --git a/src/js/game/systems/storage.js b/src/js/game/systems/storage.js
index 5a2b57bb..80affac9 100644
--- a/src/js/game/systems/storage.js
+++ b/src/js/game/systems/storage.js
@@ -1,101 +1,101 @@
-import { GameSystemWithFilter } from "../game_system_with_filter";
-import { StorageComponent } from "../components/storage";
-import { DrawParameters } from "../../core/draw_parameters";
-import { formatBigNumber, lerp } from "../../core/utils";
-import { Loader } from "../../core/loader";
-import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "../items/boolean_item";
-import { MapChunkView } from "../map_chunk_view";
-
-export class StorageSystem extends GameSystemWithFilter {
- constructor(root) {
- super(root, [StorageComponent]);
-
- this.storageOverlaySprite = Loader.getSprite("sprites/misc/storage_overlay.png");
-
- /**
- * Stores which uids were already drawn to avoid drawing entities twice
- * @type {Set}
- */
- this.drawnUids = new Set();
-
- this.root.signals.gameFrameStarted.add(this.clearDrawnUids, this);
- }
-
- clearDrawnUids() {
- this.drawnUids.clear();
- }
-
- update() {
- for (let i = 0; i < this.allEntities.length; ++i) {
- const entity = this.allEntities[i];
- const storageComp = entity.components.Storage;
- const pinsComp = entity.components.WiredPins;
-
- // Eject from storage
- if (storageComp.storedItem && storageComp.storedCount > 0) {
- const ejectorComp = entity.components.ItemEjector;
-
- const nextSlot = ejectorComp.getFirstFreeSlot();
- if (nextSlot !== null) {
- if (ejectorComp.tryEject(nextSlot, storageComp.storedItem)) {
- storageComp.storedCount--;
-
- if (storageComp.storedCount === 0) {
- storageComp.storedItem = null;
- }
- }
- }
- }
-
- let targetAlpha = storageComp.storedCount > 0 ? 1 : 0;
- storageComp.overlayOpacity = lerp(storageComp.overlayOpacity, targetAlpha, 0.05);
-
- pinsComp.slots[0].value = storageComp.storedItem;
- pinsComp.slots[1].value = storageComp.getIsFull() ? BOOL_TRUE_SINGLETON : BOOL_FALSE_SINGLETON;
- }
- }
-
- /**
- * @param {DrawParameters} parameters
- * @param {MapChunkView} chunk
- */
- drawChunk(parameters, chunk) {
- const contents = chunk.containedEntitiesByLayer.regular;
- for (let i = 0; i < contents.length; ++i) {
- const entity = contents[i];
- const storageComp = entity.components.Storage;
- if (!storageComp) {
- continue;
- }
-
- const storedItem = storageComp.storedItem;
- if (!storedItem) {
- continue;
- }
-
- if (this.drawnUids.has(entity.uid)) {
- continue;
- }
-
- this.drawnUids.add(entity.uid);
-
- const staticComp = entity.components.StaticMapEntity;
-
- const context = parameters.context;
- context.globalAlpha = storageComp.overlayOpacity;
- const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
- storedItem.drawItemCenteredClipped(center.x, center.y, parameters, 30);
-
- this.storageOverlaySprite.drawCached(parameters, center.x - 15, center.y + 15, 30, 15);
-
- if (parameters.visibleRect.containsCircle(center.x, center.y + 25, 20)) {
- context.font = "bold 10px GameFont";
- context.textAlign = "center";
- context.fillStyle = "#64666e";
- context.fillText(formatBigNumber(storageComp.storedCount), center.x, center.y + 25.5);
- context.textAlign = "left";
- }
- context.globalAlpha = 1;
- }
- }
-}
+import { GameSystemWithFilter } from "../game_system_with_filter";
+import { StorageComponent } from "../components/storage";
+import { DrawParameters } from "../../core/draw_parameters";
+import { formatBigNumber, lerp } from "../../core/utils";
+import { Loader } from "../../core/loader";
+import { BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "../items/boolean_item";
+import { MapChunkView } from "../map_chunk_view";
+
+export class StorageSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [StorageComponent]);
+
+ this.storageOverlaySprite = Loader.getSprite("sprites/misc/storage_overlay.png");
+
+ /**
+ * Stores which uids were already drawn to avoid drawing entities twice
+ * @type {Set}
+ */
+ this.drawnUids = new Set();
+
+ this.root.signals.gameFrameStarted.add(this.clearDrawnUids, this);
+ }
+
+ clearDrawnUids() {
+ this.drawnUids.clear();
+ }
+
+ update() {
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ const storageComp = entity.components.Storage;
+ const pinsComp = entity.components.WiredPins;
+
+ // Eject from storage
+ if (storageComp.storedItem && storageComp.storedCount > 0) {
+ const ejectorComp = entity.components.ItemEjector;
+
+ const nextSlot = ejectorComp.getFirstFreeSlot();
+ if (nextSlot !== null) {
+ if (ejectorComp.tryEject(nextSlot, storageComp.storedItem)) {
+ storageComp.storedCount--;
+
+ if (storageComp.storedCount === 0) {
+ storageComp.storedItem = null;
+ }
+ }
+ }
+ }
+
+ let targetAlpha = storageComp.storedCount > 0 ? 1 : 0;
+ storageComp.overlayOpacity = lerp(storageComp.overlayOpacity, targetAlpha, 0.05);
+
+ pinsComp.slots[0].value = storageComp.storedItem;
+ pinsComp.slots[1].value = storageComp.getIsFull() ? BOOL_TRUE_SINGLETON : BOOL_FALSE_SINGLETON;
+ }
+ }
+
+ /**
+ * @param {DrawParameters} parameters
+ * @param {MapChunkView} chunk
+ */
+ drawChunk(parameters, chunk) {
+ const contents = chunk.containedEntitiesByLayer.regular;
+ for (let i = 0; i < contents.length; ++i) {
+ const entity = contents[i];
+ const storageComp = entity.components.Storage;
+ if (!storageComp) {
+ continue;
+ }
+
+ const storedItem = storageComp.storedItem;
+ if (!storedItem) {
+ continue;
+ }
+
+ if (this.drawnUids.has(entity.uid)) {
+ continue;
+ }
+
+ this.drawnUids.add(entity.uid);
+
+ const staticComp = entity.components.StaticMapEntity;
+
+ const context = parameters.context;
+ context.globalAlpha = storageComp.overlayOpacity;
+ const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
+ storedItem.drawItemCenteredClipped(center.x, center.y, parameters, 30);
+
+ this.storageOverlaySprite.drawCached(parameters, center.x - 15, center.y + 15, 30, 15);
+
+ if (parameters.visibleRect.containsCircle(center.x, center.y + 25, 20)) {
+ context.font = "bold 10px GameFont";
+ context.textAlign = "center";
+ context.fillStyle = "#64666e";
+ context.fillText(formatBigNumber(storageComp.storedCount), center.x, center.y + 25.5);
+ context.textAlign = "left";
+ }
+ context.globalAlpha = 1;
+ }
+ }
+}
diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js
index 90d29e50..7a7609f8 100644
--- a/src/js/game/systems/underground_belt.js
+++ b/src/js/game/systems/underground_belt.js
@@ -1,406 +1,349 @@
-import { globalConfig } from "../../core/config";
-import { Loader } from "../../core/loader";
-import { createLogger } from "../../core/logging";
-import { Rectangle } from "../../core/rectangle";
-import {
- enumAngleToDirection,
- enumDirection,
- enumDirectionToAngle,
- enumDirectionToVector,
- enumInvertedDirections,
-} from "../../core/vector";
-import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt";
-import { Entity } from "../entity";
-import { GameSystemWithFilter } from "../game_system_with_filter";
-import { fastArrayDelete } from "../../core/utils";
-
-const logger = createLogger("tunnels");
-
-export class UndergroundBeltSystem extends GameSystemWithFilter {
- constructor(root) {
- super(root, [UndergroundBeltComponent]);
-
- this.beltSprites = {
- [enumUndergroundBeltMode.sender]: Loader.getSprite(
- "sprites/buildings/underground_belt_entry.png"
- ),
- [enumUndergroundBeltMode.receiver]: Loader.getSprite(
- "sprites/buildings/underground_belt_exit.png"
- ),
- };
-
- this.root.signals.entityManuallyPlaced.add(this.onEntityManuallyPlaced, this);
-
- /**
- * @type {Rectangle}
- */
- this.areaToRecompute = null;
-
- this.root.signals.entityAdded.add(this.onEntityChanged, this);
- this.root.signals.entityDestroyed.add(this.onEntityChanged, this);
- }
-
- /**
- * Called when an entity got added or removed
- * @param {Entity} entity
- */
- onEntityChanged(entity) {
- if (!this.root.gameInitialized) {
- return;
- }
- const undergroundComp = entity.components.UndergroundBelt;
- if (!undergroundComp) {
- return;
- }
-
- const affectedArea = entity.components.StaticMapEntity.getTileSpaceBounds().expandedInAllDirections(
- globalConfig.undergroundBeltMaxTilesByTier[
- globalConfig.undergroundBeltMaxTilesByTier.length - 1
- ] + 1
- );
-
- if (this.areaToRecompute) {
- this.areaToRecompute = this.areaToRecompute.getUnion(affectedArea);
- } else {
- this.areaToRecompute = affectedArea;
- }
- }
-
- /**
- * Callback when an entity got placed, used to remove belts between underground belts
- * @param {Entity} entity
- */
- onEntityManuallyPlaced(entity) {
- if (!this.root.app.settings.getAllSettings().enableTunnelSmartplace) {
- // Smart-place disabled
- return;
- }
-
- const undergroundComp = entity.components.UndergroundBelt;
- if (undergroundComp && undergroundComp.mode === enumUndergroundBeltMode.receiver) {
- const staticComp = entity.components.StaticMapEntity;
- const tile = staticComp.origin;
-
- const direction = enumAngleToDirection[staticComp.rotation];
- const inverseDirection = enumInvertedDirections[direction];
- const offset = enumDirectionToVector[inverseDirection];
-
- let currentPos = tile.copy();
-
- const tier = undergroundComp.tier;
- const range = globalConfig.undergroundBeltMaxTilesByTier[tier];
-
- // FIND ENTRANCE
- // Search for the entrance which is furthes apart (this is why we can't reuse logic here)
- let matchingEntrance = null;
- for (let i = 0; i < range; ++i) {
- currentPos.addInplace(offset);
- const contents = this.root.map.getTileContent(currentPos, entity.layer);
- if (!contents) {
- continue;
- }
-
- const contentsUndergroundComp = contents.components.UndergroundBelt;
- const contentsStaticComp = contents.components.StaticMapEntity;
- if (
- contentsUndergroundComp &&
- contentsUndergroundComp.tier === undergroundComp.tier &&
- contentsUndergroundComp.mode === enumUndergroundBeltMode.sender &&
- enumAngleToDirection[contentsStaticComp.rotation] === direction
- ) {
- matchingEntrance = {
- entity: contents,
- range: i,
- };
- }
- }
-
- if (!matchingEntrance) {
- // Nothing found
- return;
- }
-
- // DETECT OBSOLETE BELTS BETWEEN
- // Remove any belts between entrance and exit which have the same direction,
- // but only if they *all* have the right direction
- currentPos = tile.copy();
- let allBeltsMatch = true;
- for (let i = 0; i < matchingEntrance.range; ++i) {
- currentPos.addInplace(offset);
-
- const contents = this.root.map.getTileContent(currentPos, entity.layer);
- if (!contents) {
- allBeltsMatch = false;
- break;
- }
-
- const contentsStaticComp = contents.components.StaticMapEntity;
- const contentsBeltComp = contents.components.Belt;
- if (!contentsBeltComp) {
- allBeltsMatch = false;
- break;
- }
-
- // It's a belt
- if (
- contentsBeltComp.direction !== enumDirection.top ||
- enumAngleToDirection[contentsStaticComp.rotation] !== direction
- ) {
- allBeltsMatch = false;
- break;
- }
- }
-
- currentPos = tile.copy();
- if (allBeltsMatch) {
- // All belts between this are obsolete, so drop them
- for (let i = 0; i < matchingEntrance.range; ++i) {
- currentPos.addInplace(offset);
- const contents = this.root.map.getTileContent(currentPos, entity.layer);
- assert(contents, "Invalid smart underground belt logic");
- this.root.logic.tryDeleteBuilding(contents);
- }
- }
-
- // REMOVE OBSOLETE TUNNELS
- // Remove any double tunnels, by checking the tile plus the tile above
- currentPos = tile.copy().add(offset);
- for (let i = 0; i < matchingEntrance.range - 1; ++i) {
- const posBefore = currentPos.copy();
- currentPos.addInplace(offset);
-
- const entityBefore = this.root.map.getTileContent(posBefore, entity.layer);
- const entityAfter = this.root.map.getTileContent(currentPos, entity.layer);
-
- if (!entityBefore || !entityAfter) {
- continue;
- }
-
- const undergroundBefore = entityBefore.components.UndergroundBelt;
- const undergroundAfter = entityAfter.components.UndergroundBelt;
-
- if (!undergroundBefore || !undergroundAfter) {
- // Not an underground belt
- continue;
- }
-
- if (
- // Both same tier
- undergroundBefore.tier !== undergroundAfter.tier ||
- // And same tier as our original entity
- undergroundBefore.tier !== undergroundComp.tier
- ) {
- // Mismatching tier
- continue;
- }
-
- if (
- undergroundBefore.mode !== enumUndergroundBeltMode.sender ||
- undergroundAfter.mode !== enumUndergroundBeltMode.receiver
- ) {
- // Not the right mode
- continue;
- }
-
- // Check rotations
- const staticBefore = entityBefore.components.StaticMapEntity;
- const staticAfter = entityAfter.components.StaticMapEntity;
-
- if (
- enumAngleToDirection[staticBefore.rotation] !== direction ||
- enumAngleToDirection[staticAfter.rotation] !== direction
- ) {
- // Wrong rotation
- continue;
- }
-
- // All good, can remove
- this.root.logic.tryDeleteBuilding(entityBefore);
- this.root.logic.tryDeleteBuilding(entityAfter);
- }
- }
- }
-
- /**
- * Recomputes the cache in the given area, invalidating all entries there
- */
- recomputeArea() {
- const area = this.areaToRecompute;
- logger.log("Recomputing area:", area.x, area.y, "/", area.w, area.h);
- if (G_IS_DEV && globalConfig.debug.renderChanges) {
- this.root.hud.parts.changesDebugger.renderChange("tunnels", this.areaToRecompute, "#fc03be");
- }
-
- for (let x = area.x; x < area.right(); ++x) {
- for (let y = area.y; y < area.bottom(); ++y) {
- const entities = this.root.map.getLayersContentsMultipleXY(x, y);
- for (let i = 0; i < entities.length; ++i) {
- const entity = entities[i];
- const undergroundComp = entity.components.UndergroundBelt;
- if (!undergroundComp) {
- continue;
- }
-
- undergroundComp.cachedLinkedEntity = null;
- }
- }
- }
- }
-
- update() {
- if (this.areaToRecompute) {
- this.recomputeArea();
- this.areaToRecompute = null;
- }
-
- const delta = this.root.dynamicTickrate.deltaSeconds;
-
- for (let i = 0; i < this.allEntities.length; ++i) {
- const entity = this.allEntities[i];
- const undergroundComp = entity.components.UndergroundBelt;
- const pendingItems = undergroundComp.pendingItems;
-
- // Decrease remaining time of all items in belt
- for (let k = 0; k < pendingItems.length; ++k) {
- const item = pendingItems[k];
- item[1] = Math.max(0, item[1] - delta);
- if (G_IS_DEV && globalConfig.debug.instantBelts) {
- item[1] = 0;
- }
- }
- if (undergroundComp.mode === enumUndergroundBeltMode.sender) {
- this.handleSender(entity);
- } else {
- this.handleReceiver(entity);
- }
- }
- }
-
- /**
- * Finds the receiver for a given sender
- * @param {Entity} entity
- * @returns {import("../components/underground_belt").LinkedUndergroundBelt}
- */
- findRecieverForSender(entity) {
- const staticComp = entity.components.StaticMapEntity;
- const undergroundComp = entity.components.UndergroundBelt;
- const searchDirection = staticComp.localDirectionToWorld(enumDirection.top);
- const searchVector = enumDirectionToVector[searchDirection];
- const targetRotation = enumDirectionToAngle[searchDirection];
- let currentTile = staticComp.origin;
-
- // Search in the direction of the tunnel
- for (
- let searchOffset = 0;
- searchOffset < globalConfig.undergroundBeltMaxTilesByTier[undergroundComp.tier];
- ++searchOffset
- ) {
- currentTile = currentTile.add(searchVector);
-
- const potentialReceiver = this.root.map.getTileContent(currentTile, "regular");
- if (!potentialReceiver) {
- // Empty tile
- continue;
- }
- const receiverUndergroundComp = potentialReceiver.components.UndergroundBelt;
- if (!receiverUndergroundComp || receiverUndergroundComp.tier !== undergroundComp.tier) {
- // Not a tunnel, or not on the same tier
- continue;
- }
-
- const receiverStaticComp = potentialReceiver.components.StaticMapEntity;
- if (receiverStaticComp.rotation !== targetRotation) {
- // Wrong rotation
- continue;
- }
-
- if (receiverUndergroundComp.mode !== enumUndergroundBeltMode.receiver) {
- // Not a receiver, but a sender -> Abort to make sure we don't deliver double
- break;
- }
-
- return { entity: potentialReceiver, distance: searchOffset };
- }
-
- // None found
- return { entity: null, distance: 0 };
- }
-
- /**
- *
- * @param {Entity} entity
- */
- handleSender(entity) {
- const undergroundComp = entity.components.UndergroundBelt;
-
- // Find the current receiver
- let receiver = undergroundComp.cachedLinkedEntity;
- if (!receiver) {
- // We don't have a receiver, compute it
- receiver = undergroundComp.cachedLinkedEntity = this.findRecieverForSender(entity);
-
- if (G_IS_DEV && globalConfig.debug.renderChanges) {
- this.root.hud.parts.changesDebugger.renderChange(
- "sender",
- entity.components.StaticMapEntity.getTileSpaceBounds(),
- "#fc03be"
- );
- }
- }
-
- if (!receiver.entity) {
- // If there is no connection to a receiver, ignore this one
- return;
- }
-
- // Check if we have any item
- if (undergroundComp.pendingItems.length > 0) {
- assert(undergroundComp.pendingItems.length === 1, "more than 1 pending");
- const nextItemAndDuration = undergroundComp.pendingItems[0];
- const remainingTime = nextItemAndDuration[1];
- const nextItem = nextItemAndDuration[0];
-
- // Check if the item is ready to be emitted
- if (remainingTime === 0) {
- // Check if the receiver can accept it
- if (
- receiver.entity.components.UndergroundBelt.tryAcceptTunneledItem(
- nextItem,
- receiver.distance,
- this.root.hubGoals.getUndergroundBeltBaseSpeed()
- )
- ) {
- // Drop this item
- fastArrayDelete(undergroundComp.pendingItems, 0);
- }
- }
- }
- }
-
- /**
- *
- * @param {Entity} entity
- */
- handleReceiver(entity) {
- const undergroundComp = entity.components.UndergroundBelt;
-
- // Try to eject items, we only check the first one because it is sorted by remaining time
- const items = undergroundComp.pendingItems;
- if (items.length > 0) {
- const nextItemAndDuration = undergroundComp.pendingItems[0];
- const remainingTime = nextItemAndDuration[1];
- const nextItem = nextItemAndDuration[0];
-
- if (remainingTime <= 0) {
- const ejectorComp = entity.components.ItemEjector;
-
- const nextSlotIndex = ejectorComp.getFirstFreeSlot();
- if (nextSlotIndex !== null) {
- if (ejectorComp.tryEject(nextSlotIndex, nextItem)) {
- items.shift();
- }
- }
- }
- }
- }
-}
+import { globalConfig } from "../../core/config";
+import { Loader } from "../../core/loader";
+import { createLogger } from "../../core/logging";
+import { Rectangle } from "../../core/rectangle";
+import { StaleAreaDetector } from "../../core/stale_area_detector";
+import { fastArrayDelete } from "../../core/utils";
+import {
+ enumAngleToDirection,
+ enumDirection,
+ enumDirectionToAngle,
+ enumDirectionToVector,
+ enumInvertedDirections,
+} from "../../core/vector";
+import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt";
+import { Entity } from "../entity";
+import { GameSystemWithFilter } from "../game_system_with_filter";
+
+const logger = createLogger("tunnels");
+
+export class UndergroundBeltSystem extends GameSystemWithFilter {
+ constructor(root) {
+ super(root, [UndergroundBeltComponent]);
+
+ this.beltSprites = {
+ [enumUndergroundBeltMode.sender]: Loader.getSprite(
+ "sprites/buildings/underground_belt_entry.png"
+ ),
+ [enumUndergroundBeltMode.receiver]: Loader.getSprite(
+ "sprites/buildings/underground_belt_exit.png"
+ ),
+ };
+
+ this.staleAreaWatcher = new StaleAreaDetector({
+ root: this.root,
+ name: "underground-belt",
+ recomputeMethod: this.recomputeArea.bind(this),
+ });
+
+ this.root.signals.entityManuallyPlaced.add(this.onEntityManuallyPlaced, this);
+
+ // NOTICE: Once we remove a tunnel, we need to update the whole area to
+ // clear outdated handles
+ this.staleAreaWatcher.recomputeOnComponentsChanged(
+ [UndergroundBeltComponent],
+ globalConfig.undergroundBeltMaxTilesByTier[globalConfig.undergroundBeltMaxTilesByTier.length - 1]
+ );
+ }
+
+ /**
+ * Callback when an entity got placed, used to remove belts between underground belts
+ * @param {Entity} entity
+ */
+ onEntityManuallyPlaced(entity) {
+ if (!this.root.app.settings.getAllSettings().enableTunnelSmartplace) {
+ // Smart-place disabled
+ return;
+ }
+
+ const undergroundComp = entity.components.UndergroundBelt;
+ if (undergroundComp && undergroundComp.mode === enumUndergroundBeltMode.receiver) {
+ const staticComp = entity.components.StaticMapEntity;
+ const tile = staticComp.origin;
+
+ const direction = enumAngleToDirection[staticComp.rotation];
+ const inverseDirection = enumInvertedDirections[direction];
+ const offset = enumDirectionToVector[inverseDirection];
+
+ let currentPos = tile.copy();
+
+ const tier = undergroundComp.tier;
+ const range = globalConfig.undergroundBeltMaxTilesByTier[tier];
+
+ // FIND ENTRANCE
+ // Search for the entrance which is farthest apart (this is why we can't reuse logic here)
+ let matchingEntrance = null;
+ for (let i = 0; i < range; ++i) {
+ currentPos.addInplace(offset);
+ const contents = this.root.map.getTileContent(currentPos, entity.layer);
+ if (!contents) {
+ continue;
+ }
+
+ const contentsUndergroundComp = contents.components.UndergroundBelt;
+ const contentsStaticComp = contents.components.StaticMapEntity;
+ if (
+ contentsUndergroundComp &&
+ contentsUndergroundComp.tier === undergroundComp.tier &&
+ contentsUndergroundComp.mode === enumUndergroundBeltMode.sender &&
+ enumAngleToDirection[contentsStaticComp.rotation] === direction
+ ) {
+ matchingEntrance = {
+ entity: contents,
+ range: i,
+ };
+ }
+ }
+
+ if (!matchingEntrance) {
+ // Nothing found
+ return;
+ }
+
+ // DETECT OBSOLETE BELTS BETWEEN
+ // Remove any belts between entrance and exit which have the same direction,
+ // but only if they *all* have the right direction
+ currentPos = tile.copy();
+ let allBeltsMatch = true;
+ for (let i = 0; i < matchingEntrance.range; ++i) {
+ currentPos.addInplace(offset);
+
+ const contents = this.root.map.getTileContent(currentPos, entity.layer);
+ if (!contents) {
+ allBeltsMatch = false;
+ break;
+ }
+
+ const contentsStaticComp = contents.components.StaticMapEntity;
+ const contentsBeltComp = contents.components.Belt;
+ if (!contentsBeltComp) {
+ allBeltsMatch = false;
+ break;
+ }
+
+ // It's a belt
+ if (
+ contentsBeltComp.direction !== enumDirection.top ||
+ enumAngleToDirection[contentsStaticComp.rotation] !== direction
+ ) {
+ allBeltsMatch = false;
+ break;
+ }
+ }
+
+ currentPos = tile.copy();
+ if (allBeltsMatch) {
+ // All belts between this are obsolete, so drop them
+ for (let i = 0; i < matchingEntrance.range; ++i) {
+ currentPos.addInplace(offset);
+ const contents = this.root.map.getTileContent(currentPos, entity.layer);
+ assert(contents, "Invalid smart underground belt logic");
+ this.root.logic.tryDeleteBuilding(contents);
+ }
+ }
+
+ // REMOVE OBSOLETE TUNNELS
+ // Remove any double tunnels, by checking the tile plus the tile above
+ currentPos = tile.copy().add(offset);
+ for (let i = 0; i < matchingEntrance.range - 1; ++i) {
+ const posBefore = currentPos.copy();
+ currentPos.addInplace(offset);
+
+ const entityBefore = this.root.map.getTileContent(posBefore, entity.layer);
+ const entityAfter = this.root.map.getTileContent(currentPos, entity.layer);
+
+ if (!entityBefore || !entityAfter) {
+ continue;
+ }
+
+ const undergroundBefore = entityBefore.components.UndergroundBelt;
+ const undergroundAfter = entityAfter.components.UndergroundBelt;
+
+ if (!undergroundBefore || !undergroundAfter) {
+ // Not an underground belt
+ continue;
+ }
+
+ if (
+ // Both same tier
+ undergroundBefore.tier !== undergroundAfter.tier ||
+ // And same tier as our original entity
+ undergroundBefore.tier !== undergroundComp.tier
+ ) {
+ // Mismatching tier
+ continue;
+ }
+
+ if (
+ undergroundBefore.mode !== enumUndergroundBeltMode.sender ||
+ undergroundAfter.mode !== enumUndergroundBeltMode.receiver
+ ) {
+ // Not the right mode
+ continue;
+ }
+
+ // Check rotations
+ const staticBefore = entityBefore.components.StaticMapEntity;
+ const staticAfter = entityAfter.components.StaticMapEntity;
+
+ if (
+ enumAngleToDirection[staticBefore.rotation] !== direction ||
+ enumAngleToDirection[staticAfter.rotation] !== direction
+ ) {
+ // Wrong rotation
+ continue;
+ }
+
+ // All good, can remove
+ this.root.logic.tryDeleteBuilding(entityBefore);
+ this.root.logic.tryDeleteBuilding(entityAfter);
+ }
+ }
+ }
+
+ /**
+ * Recomputes the cache in the given area, invalidating all entries there
+ * @param {Rectangle} area
+ */
+ recomputeArea(area) {
+ for (let x = area.x; x < area.right(); ++x) {
+ for (let y = area.y; y < area.bottom(); ++y) {
+ const entities = this.root.map.getLayersContentsMultipleXY(x, y);
+ for (let i = 0; i < entities.length; ++i) {
+ const entity = entities[i];
+ const undergroundComp = entity.components.UndergroundBelt;
+ if (!undergroundComp) {
+ continue;
+ }
+ undergroundComp.cachedLinkedEntity = null;
+ }
+ }
+ }
+ }
+
+ update() {
+ this.staleAreaWatcher.update();
+
+ for (let i = 0; i < this.allEntities.length; ++i) {
+ const entity = this.allEntities[i];
+ const undergroundComp = entity.components.UndergroundBelt;
+ if (undergroundComp.mode === enumUndergroundBeltMode.sender) {
+ this.handleSender(entity);
+ } else {
+ this.handleReceiver(entity);
+ }
+ }
+ }
+
+ /**
+ * Finds the receiver for a given sender
+ * @param {Entity} entity
+ * @returns {import("../components/underground_belt").LinkedUndergroundBelt}
+ */
+ findRecieverForSender(entity) {
+ const staticComp = entity.components.StaticMapEntity;
+ const undergroundComp = entity.components.UndergroundBelt;
+ const searchDirection = staticComp.localDirectionToWorld(enumDirection.top);
+ const searchVector = enumDirectionToVector[searchDirection];
+ const targetRotation = enumDirectionToAngle[searchDirection];
+ let currentTile = staticComp.origin;
+
+ // Search in the direction of the tunnel
+ for (
+ let searchOffset = 0;
+ searchOffset < globalConfig.undergroundBeltMaxTilesByTier[undergroundComp.tier];
+ ++searchOffset
+ ) {
+ currentTile = currentTile.add(searchVector);
+
+ const potentialReceiver = this.root.map.getTileContent(currentTile, "regular");
+ if (!potentialReceiver) {
+ // Empty tile
+ continue;
+ }
+ const receiverUndergroundComp = potentialReceiver.components.UndergroundBelt;
+ if (!receiverUndergroundComp || receiverUndergroundComp.tier !== undergroundComp.tier) {
+ // Not a tunnel, or not on the same tier
+ continue;
+ }
+
+ const receiverStaticComp = potentialReceiver.components.StaticMapEntity;
+ if (receiverStaticComp.rotation !== targetRotation) {
+ // Wrong rotation
+ continue;
+ }
+
+ if (receiverUndergroundComp.mode !== enumUndergroundBeltMode.receiver) {
+ // Not a receiver, but a sender -> Abort to make sure we don't deliver double
+ break;
+ }
+
+ return { entity: potentialReceiver, distance: searchOffset };
+ }
+
+ // None found
+ return { entity: null, distance: 0 };
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ handleSender(entity) {
+ const undergroundComp = entity.components.UndergroundBelt;
+
+ // Find the current receiver
+ let cacheEntry = undergroundComp.cachedLinkedEntity;
+ if (!cacheEntry) {
+ // Need to recompute cache
+ cacheEntry = undergroundComp.cachedLinkedEntity = this.findRecieverForSender(entity);
+ }
+
+ if (!cacheEntry.entity) {
+ // If there is no connection to a receiver, ignore this one
+ return;
+ }
+
+ // Check if we have any items to eject
+ const nextItemAndDuration = undergroundComp.pendingItems[0];
+ if (nextItemAndDuration) {
+ assert(undergroundComp.pendingItems.length === 1, "more than 1 pending");
+
+ // Check if the receiver can accept it
+ if (
+ cacheEntry.entity.components.UndergroundBelt.tryAcceptTunneledItem(
+ nextItemAndDuration[0],
+ cacheEntry.distance,
+ this.root.hubGoals.getUndergroundBeltBaseSpeed(),
+ this.root.time.now()
+ )
+ ) {
+ // Drop this item
+ fastArrayDelete(undergroundComp.pendingItems, 0);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ handleReceiver(entity) {
+ const undergroundComp = entity.components.UndergroundBelt;
+
+ // Try to eject items, we only check the first one because it is sorted by remaining time
+ const nextItemAndDuration = undergroundComp.pendingItems[0];
+ if (nextItemAndDuration) {
+ if (this.root.time.now() > nextItemAndDuration[1]) {
+ const ejectorComp = entity.components.ItemEjector;
+
+ const nextSlotIndex = ejectorComp.getFirstFreeSlot();
+ if (nextSlotIndex !== null) {
+ if (ejectorComp.tryEject(nextSlotIndex, nextItemAndDuration[0])) {
+ undergroundComp.pendingItems.shift();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/js/game/systems/wire.js b/src/js/game/systems/wire.js
index fa9287e1..4d0e6de4 100644
--- a/src/js/game/systems/wire.js
+++ b/src/js/game/systems/wire.js
@@ -3,6 +3,7 @@ import { gMetaBuildingRegistry } from "../../core/global_registries";
import { Loader } from "../../core/loader";
import { createLogger } from "../../core/logging";
import { Rectangle } from "../../core/rectangle";
+import { AtlasSprite } from "../../core/sprites";
import { StaleAreaDetector } from "../../core/stale_area_detector";
import { fastArrayDeleteValueIfContained } from "../../core/utils";
import {
@@ -13,16 +14,15 @@ import {
Vector,
} from "../../core/vector";
import { BaseItem } from "../base_item";
-import { isTrueItem } from "../items/boolean_item";
import { arrayWireRotationVariantToType, MetaWireBuilding } from "../buildings/wire";
import { getCodeFromBuildingData } from "../building_codes";
-import { enumWireType, WireComponent } from "../components/wire";
+import { enumWireType, enumWireVariant, WireComponent } from "../components/wire";
import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
import { WireTunnelComponent } from "../components/wire_tunnel";
import { Entity } from "../entity";
import { GameSystemWithFilter } from "../game_system_with_filter";
+import { isTruthyItem } from "../items/boolean_item";
import { MapChunkView } from "../map_chunk_view";
-import { defaultBuildingVariant } from "../meta_building";
const logger = createLogger("wires");
@@ -79,38 +79,36 @@ export class WireNetwork {
*/
this.uid = ++networkUidCounter;
}
+
+ /**
+ * Returns whether this network currently has a value
+ * @returns {boolean}
+ */
+ hasValue() {
+ return !!this.currentValue && !this.valueConflict;
+ }
}
export class WireSystem extends GameSystemWithFilter {
constructor(root) {
super(root, [WireComponent]);
- this.wireSprites = {
- regular: {
- [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/regular_forward.png"),
- [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/regular_turn.png"),
- [enumWireType.split]: Loader.getSprite("sprites/wires/sets/regular_split.png"),
- [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/regular_cross.png"),
- },
- conflict: {
- [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/conflict_forward.png"),
- [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/conflict_turn.png"),
- [enumWireType.split]: Loader.getSprite("sprites/wires/sets/conflict_split.png"),
- [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/conflict_cross.png"),
- },
- shape: {
- [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/shape_forward.png"),
- [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/shape_turn.png"),
- [enumWireType.split]: Loader.getSprite("sprites/wires/sets/shape_split.png"),
- [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/shape_cross.png"),
- },
- color: {
- [enumWireType.regular]: Loader.getSprite("sprites/wires/sets/color_forward.png"),
- [enumWireType.turn]: Loader.getSprite("sprites/wires/sets/color_turn.png"),
- [enumWireType.split]: Loader.getSprite("sprites/wires/sets/color_split.png"),
- [enumWireType.cross]: Loader.getSprite("sprites/wires/sets/color_cross.png"),
- },
- };
+ /**
+ * @type {Object>}
+ */
+ this.wireSprites = {};
+
+ const variants = ["conflict", ...Object.keys(enumWireVariant)];
+ for (let i = 0; i < variants.length; ++i) {
+ const wireVariant = variants[i];
+ const sprites = {};
+ for (const wireType in enumWireType) {
+ sprites[wireType] = Loader.getSprite(
+ "sprites/wires/sets/" + wireVariant + "_" + wireType + ".png"
+ );
+ }
+ this.wireSprites[wireVariant] = sprites;
+ }
this.root.signals.entityDestroyed.add(this.queuePlacementUpdate, this);
this.root.signals.entityAdded.add(this.queuePlacementUpdate, this);
@@ -162,7 +160,7 @@ export class WireSystem extends GameSystemWithFilter {
const tunnelEntities = this.root.entityMgr.getAllWithComponent(WireTunnelComponent);
const pinEntities = this.root.entityMgr.getAllWithComponent(WiredPinsComponent);
- // Clear all network references, but not on the first update since thats the deserializing one
+ // Clear all network references, but not on the first update since that's the deserializing one
if (!this.isFirstRecompute) {
for (let i = 0; i < wireEntities.length; ++i) {
wireEntities[i].components.Wire.linkedNetwork = null;
@@ -222,6 +220,13 @@ export class WireSystem extends GameSystemWithFilter {
},
];
+ /**
+ * Once we occur a wire, we store its variant so we don't connect to
+ * mismatching ones
+ * @type {enumWireVariant}
+ */
+ let variantMask = null;
+
while (entitiesToVisit.length > 0) {
const nextData = entitiesToVisit.pop();
const nextEntity = nextData.entity;
@@ -249,13 +254,18 @@ export class WireSystem extends GameSystemWithFilter {
);
if (!wireComp.linkedNetwork) {
- // This one is new! :D
- VERBOSE_WIRES && logger.log(" Visited new wire:", staticComp.origin.toString());
- wireComp.linkedNetwork = currentNetwork;
- currentNetwork.wires.push(nextEntity);
+ if (variantMask && wireComp.variant !== variantMask) {
+ // Mismatching variant
+ } else {
+ // This one is new! :D
+ VERBOSE_WIRES && logger.log(" Visited new wire:", staticComp.origin.toString());
+ wireComp.linkedNetwork = currentNetwork;
+ currentNetwork.wires.push(nextEntity);
- newSearchDirections = arrayAllDirections;
- newSearchTile = nextEntity.components.StaticMapEntity.origin;
+ newSearchDirections = arrayAllDirections;
+ newSearchTile = nextEntity.components.StaticMapEntity.origin;
+ variantMask = wireComp.variant;
+ }
}
}
@@ -311,7 +321,8 @@ export class WireSystem extends GameSystemWithFilter {
const newTargets = this.findSurroundingWireTargets(
newSearchTile,
newSearchDirections,
- currentNetwork
+ currentNetwork,
+ variantMask
);
VERBOSE_WIRES && logger.log(" Found", newTargets, "new targets to visit!");
@@ -353,13 +364,21 @@ export class WireSystem extends GameSystemWithFilter {
* @param {Vector} initialTile
* @param {Array} directions
* @param {WireNetwork} network
+ * @param {enumWireVariant=} variantMask Only accept connections to this mask
* @returns {Array}
*/
- findSurroundingWireTargets(initialTile, directions, network) {
+ findSurroundingWireTargets(initialTile, directions, network, variantMask = null) {
let result = [];
VERBOSE_WIRES &&
- logger.log(" Searching for new targets at", initialTile.toString(), "and d=", directions);
+ logger.log(
+ " Searching for new targets at",
+ initialTile.toString(),
+ "and d=",
+ directions,
+ "with mask=",
+ variantMask
+ );
// Go over all directions we should search for
for (let i = 0; i < directions.length; ++i) {
@@ -391,7 +410,11 @@ export class WireSystem extends GameSystemWithFilter {
const wireComp = entity.components.Wire;
// Check for wire
- if (wireComp && !wireComp.linkedNetwork) {
+ if (
+ wireComp &&
+ !wireComp.linkedNetwork &&
+ (!variantMask || wireComp.variant === variantMask)
+ ) {
// Wires accept connections from everywhere
result.push({
entity,
@@ -432,7 +455,7 @@ export class WireSystem extends GameSystemWithFilter {
continue;
}
- // Check if its a tunnel, if so, go to the forwarded item
+ // Check if it's a tunnel, if so, go to the forwarded item
const tunnelComp = entity.components.WireTunnel;
if (tunnelComp) {
if (visitedTunnels.has(entity.uid)) {
@@ -441,17 +464,6 @@ export class WireSystem extends GameSystemWithFilter {
const staticComp = entity.components.StaticMapEntity;
- if (
- !tunnelComp.multipleDirections &&
- !(
- direction === staticComp.localDirectionToWorld(enumDirection.top) ||
- direction === staticComp.localDirectionToWorld(enumDirection.bottom)
- )
- ) {
- // It's a coating, and it doesn't connect here
- continue;
- }
-
// Compute where this tunnel connects to
const forwardedTile = staticComp.origin.add(offset);
VERBOSE_WIRES &&
@@ -562,8 +574,8 @@ export class WireSystem extends GameSystemWithFilter {
if (!wireComp.linkedNetwork) {
// There is no network, it's empty
return {
- spriteSet: this.wireSprites.regular,
- opacity: 0.3,
+ spriteSet: this.wireSprites[wireComp.variant],
+ opacity: 0.5,
};
}
@@ -576,38 +588,9 @@ export class WireSystem extends GameSystemWithFilter {
};
}
- const value = network.currentValue;
- if (!value) {
- // There is no value stored
- return {
- spriteSet: this.wireSprites.regular,
- opacity: 0.3,
- };
- }
-
- const valueType = value.getItemType();
- if (valueType === "shape") {
- return {
- spriteSet: this.wireSprites.shape,
- opacity: 1,
- };
- } else if (valueType === "color") {
- return {
- spriteSet: this.wireSprites.color,
- opacity: 1,
- };
- } else if (valueType === "boolean") {
- return {
- spriteSet: this.wireSprites.regular,
- opacity: isTrueItem(value) ? 1 : 0.5,
- };
- } else {
- assertAlways(false, "Unknown item type: " + valueType);
- }
-
return {
- spriteSet: this.wireSprites.regular,
- opacity: 1,
+ spriteSet: this.wireSprites[wireComp.variant],
+ opacity: isTruthyItem(network.currentValue) ? 1 : 0.5,
};
}
@@ -633,9 +616,10 @@ export class WireSystem extends GameSystemWithFilter {
const staticComp = entity.components.StaticMapEntity;
parameters.context.globalAlpha = opacity;
staticComp.drawSpriteOnBoundsClipped(parameters, sprite, 0);
- parameters.context.globalAlpha = 1;
+ // DEBUG Rendering
if (G_IS_DEV && globalConfig.debug.renderWireRotations) {
+ parameters.context.globalAlpha = 1;
parameters.context.fillStyle = "red";
parameters.context.font = "5px Tahoma";
parameters.context.fillText(
@@ -683,6 +667,8 @@ export class WireSystem extends GameSystemWithFilter {
}
}
}
+
+ parameters.context.globalAlpha = 1;
}
/**
@@ -738,6 +724,8 @@ export class WireSystem extends GameSystemWithFilter {
continue;
}
+ const variant = targetStaticComp.getVariant();
+
const {
rotation,
rotationVariant,
@@ -745,7 +733,7 @@ export class WireSystem extends GameSystemWithFilter {
root: this.root,
tile: new Vector(x, y),
rotation: targetStaticComp.originalRotation,
- variant: defaultBuildingVariant,
+ variant,
layer: targetEntity.layer,
});
@@ -755,14 +743,10 @@ export class WireSystem extends GameSystemWithFilter {
if (targetStaticComp.rotation !== rotation || newType !== targetWireComp.type) {
// Change stuff
targetStaticComp.rotation = rotation;
- metaWire.updateVariants(targetEntity, rotationVariant, defaultBuildingVariant);
+ metaWire.updateVariants(targetEntity, rotationVariant, variant);
// Update code as well
- targetStaticComp.code = getCodeFromBuildingData(
- metaWire,
- defaultBuildingVariant,
- rotationVariant
- );
+ targetStaticComp.code = getCodeFromBuildingData(metaWire, variant, rotationVariant);
// Make sure the chunks know about the update
this.root.signals.entityChanged.dispatch(targetEntity);
diff --git a/src/js/game/systems/wired_pins.js b/src/js/game/systems/wired_pins.js
index 202691b8..e8bc1882 100644
--- a/src/js/game/systems/wired_pins.js
+++ b/src/js/game/systems/wired_pins.js
@@ -149,8 +149,6 @@ export class WiredPinsSystem extends GameSystemWithFilter {
}
}
- update() {}
-
/**
* Draws a given entity
* @param {DrawParameters} parameters
diff --git a/src/js/game/themes/dark.json b/src/js/game/themes/dark.json
index 7466201f..733b7682 100644
--- a/src/js/game/themes/dark.json
+++ b/src/js/game/themes/dark.json
@@ -1,7 +1,7 @@
{
"uiStyle": "dark",
"map": {
- "background": "#2e2f37",
+ "background": "#3e3f47",
"grid": "rgba(255, 255, 255, 0.02)",
"gridLineWidth": 0.5,
@@ -17,22 +17,23 @@
"background": "rgba(74, 237, 134, 0.2)"
},
"wires": {
- "color": "rgb(209, 107, 203)",
- "background": "rgba(209, 107, 203, 0.2)"
+ "color": "rgb(74, 237, 134)",
+ "background": "rgba(74, 237, 134, 0.2)"
}
},
"colorBlindPickerTile": "rgba(255, 255, 255, 0.5)",
"resources": {
- "shape": "#3d3f4a",
- "red": "#4a3d3f",
- "green": "#3e4a3d",
- "blue": "#35384a"
+ "shape": "#5d5f6a",
+ "red": "#854f56",
+ "green": "#667964",
+ "blue": "#5e7ca4"
},
"chunkOverview": {
"empty": "#444856",
- "filled": "#646b7d"
+ "filled": "#646b7d",
+ "beltColor": "#9096a3"
},
"wires": {
diff --git a/src/js/game/themes/light.json b/src/js/game/themes/light.json
index 728135ab..0c793c26 100644
--- a/src/js/game/themes/light.json
+++ b/src/js/game/themes/light.json
@@ -17,8 +17,8 @@
"background": "rgba(74, 237, 134, 0.2)"
},
"wires": {
- "color": "rgb(209, 107, 203)",
- "background": "rgba(209, 107, 203, 0.2)"
+ "color": "rgb(74, 237, 134)",
+ "background": "rgba(74, 237, 134, 0.2)"
}
},
@@ -33,7 +33,8 @@
"chunkOverview": {
"empty": "#a6afbb",
- "filled": "#c5ccd6"
+ "filled": "#c5ccd6",
+ "beltColor": "#777"
},
"wires": {
diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js
index 9084f508..84634b0a 100644
--- a/src/js/game/tutorial_goals.js
+++ b/src/js/game/tutorial_goals.js
@@ -1,6 +1,3 @@
-import { ShapeDefinition } from "./shape_definition";
-import { finalGameShape } from "./upgrades";
-
/**
* Don't forget to also update tutorial_goals_mappings.js as well as the translations!
* @enum {string}
@@ -11,21 +8,27 @@ export const enumHubGoalRewards = {
reward_painter: "reward_painter",
reward_mixer: "reward_mixer",
reward_stacker: "reward_stacker",
- reward_splitter: "reward_splitter",
+ reward_balancer: "reward_balancer",
reward_tunnel: "reward_tunnel",
reward_rotater_ccw: "reward_rotater_ccw",
- reward_rotater_fl: "reward_rotater_fl",
+ reward_rotater_180: "reward_rotater_180",
reward_miner_chainable: "reward_miner_chainable",
reward_underground_belt_tier_2: "reward_underground_belt_tier_2",
- reward_splitter_compact: "reward_splitter_compact",
+ reward_belt_reader: "reward_belt_reader",
+ reward_splitter: "reward_splitter",
reward_cutter_quad: "reward_cutter_quad",
reward_painter_double: "reward_painter_double",
- reward_painter_quad: "reward_painter_quad",
reward_storage: "reward_storage",
+ reward_merger: "reward_merger",
+ reward_wires_painter_and_levers: "reward_wires_painter_and_levers",
+ reward_display: "reward_display",
+ reward_constant_signal: "reward_constant_signal",
+ reward_logic_gates: "reward_logic_gates",
+ reward_virtual_processing: "reward_virtual_processing",
+ reward_filter: "reward_filter",
- // @todo: unlock
- reward_merger_compact: "reward_compact_merger",
+ reward_demo_end: "reward_demo_end",
reward_blueprints: "reward_blueprints",
reward_freeplay: "reward_freeplay",
@@ -33,150 +36,3 @@ export const enumHubGoalRewards = {
no_reward: "no_reward",
no_reward_freeplay: "no_reward_freeplay",
};
-
-export const tutorialGoals = [
- // 1
- // Circle
- {
- shape: "CuCuCuCu", // belts t1
- required: 40,
- reward: enumHubGoalRewards.reward_cutter_and_trash,
- },
-
- // 2
- // Cutter
- {
- shape: "----CuCu", //
- required: 40,
- reward: enumHubGoalRewards.no_reward,
- },
-
- // 3
- // Rectangle
- {
- shape: "RuRuRuRu", // miners t1
- required: 100,
- reward: enumHubGoalRewards.reward_splitter,
- },
-
- // 4
- {
- shape: "RuRu----", // processors t2
- required: 120,
- reward: enumHubGoalRewards.reward_rotater,
- },
-
- // 5
- // Rotater
- {
- shape: "Cu----Cu", // belts t2
- required: 200,
- reward: enumHubGoalRewards.reward_tunnel,
- },
-
- // 6
- {
- shape: "Cu------", // miners t2
- required: 400,
- reward: enumHubGoalRewards.reward_painter,
- },
-
- // 7
- // Painter
- {
- shape: "CrCrCrCr", // unused
- required: 800,
- reward: enumHubGoalRewards.reward_rotater_ccw,
- },
-
- // 8
- {
- shape: "RbRb----", // painter t2
- required: 1000,
- reward: enumHubGoalRewards.reward_mixer,
- },
-
- // 9
- // Mixing (purple)
- {
- shape: "CpCpCpCp", // belts t3
- required: 1400,
- reward: enumHubGoalRewards.reward_splitter_compact,
- },
-
- // 10
- // Star shape + cyan
- {
- shape: "ScScScSc", // miners t3
- required: 1600,
- reward: enumHubGoalRewards.reward_stacker,
- },
-
- // 11
- // Stacker
- {
- shape: "CgScScCg", // processors t3
- required: 1800,
- reward: enumHubGoalRewards.reward_miner_chainable,
- },
-
- // 12
- // Blueprints
- {
- shape: "CbCbCbRb:CwCwCwCw",
- required: 2000,
- reward: enumHubGoalRewards.reward_blueprints,
- },
-
- // 13
- {
- shape: "RpRpRpRp:CwCwCwCw", // painting t3
- required: 12000,
- reward: enumHubGoalRewards.reward_underground_belt_tier_2,
- },
-
- // 14
- {
- shape: "SrSrSrSr:CyCyCyCy", // unused
- required: 16000,
- reward: enumHubGoalRewards.reward_storage,
- },
-
- // 15
- {
- shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
- required: 25000,
- reward: enumHubGoalRewards.reward_cutter_quad,
- },
-
- // 16
- {
- shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
- required: 50000,
- reward: enumHubGoalRewards.reward_painter_double,
- },
-
- // 17
- {
- shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two variants)
- required: 120000,
- reward: enumHubGoalRewards.reward_painter_quad,
- },
-
- // 18
- {
- shape: finalGameShape,
- required: 250000,
- reward: enumHubGoalRewards.reward_freeplay,
- },
-];
-
-if (G_IS_DEV) {
- tutorialGoals.forEach(({ shape }) => {
- try {
- ShapeDefinition.fromShortKey(shape);
- } catch (ex) {
- throw new Error("Invalid tutorial goal: '" + ex + "' for shape" + shape);
- }
- });
-}
diff --git a/src/js/game/tutorial_goals_mappings.js b/src/js/game/tutorial_goals_mappings.js
index 923c2814..e0d17cbc 100644
--- a/src/js/game/tutorial_goals_mappings.js
+++ b/src/js/game/tutorial_goals_mappings.js
@@ -1,52 +1,87 @@
-import { MetaBuilding, defaultBuildingVariant } from "./meta_building";
-import { MetaCutterBuilding, enumCutterVariants } from "./buildings/cutter";
-import { MetaRotaterBuilding, enumRotaterVariants } from "./buildings/rotater";
-import { MetaPainterBuilding, enumPainterVariants } from "./buildings/painter";
-import { MetaMixerBuilding } from "./buildings/mixer";
-import { MetaStackerBuilding } from "./buildings/stacker";
-import { MetaSplitterBuilding, enumSplitterVariants } from "./buildings/splitter";
-import { MetaUndergroundBeltBuilding, enumUndergroundBeltVariants } from "./buildings/underground_belt";
-import { MetaMinerBuilding, enumMinerVariants } from "./buildings/miner";
-import { MetaTrashBuilding, enumTrashVariants } from "./buildings/trash";
-
-/** @typedef {Array<[typeof MetaBuilding, string]>} TutorialGoalReward */
-
-import { enumHubGoalRewards } from "./tutorial_goals";
-
-/**
- * Helper method for proper types
- * @returns {TutorialGoalReward}
- */
-const typed = x => x;
-
-/**
- * Stores which reward unlocks what
- * @enum {TutorialGoalReward?}
- */
-export const enumHubGoalRewardsToContentUnlocked = {
- [enumHubGoalRewards.reward_cutter_and_trash]: typed([[MetaCutterBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_rotater]: typed([[MetaRotaterBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_painter]: typed([[MetaPainterBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_mixer]: typed([[MetaMixerBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_stacker]: typed([[MetaStackerBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_splitter]: typed([[MetaSplitterBuilding, defaultBuildingVariant]]),
- [enumHubGoalRewards.reward_tunnel]: typed([[MetaUndergroundBeltBuilding, defaultBuildingVariant]]),
-
- [enumHubGoalRewards.reward_rotater_ccw]: typed([[MetaRotaterBuilding, enumRotaterVariants.ccw]]),
- [enumHubGoalRewards.reward_rotater_fl]: typed([[MetaRotaterBuilding, enumRotaterVariants.fl]]),
- [enumHubGoalRewards.reward_miner_chainable]: typed([[MetaMinerBuilding, enumMinerVariants.chainable]]),
- [enumHubGoalRewards.reward_underground_belt_tier_2]: typed([
- [MetaUndergroundBeltBuilding, enumUndergroundBeltVariants.tier2],
- ]),
- [enumHubGoalRewards.reward_splitter_compact]: typed([
- [MetaSplitterBuilding, enumSplitterVariants.compact],
- ]),
- [enumHubGoalRewards.reward_cutter_quad]: typed([[MetaCutterBuilding, enumCutterVariants.quad]]),
- [enumHubGoalRewards.reward_painter_double]: typed([[MetaPainterBuilding, enumPainterVariants.double]]),
- [enumHubGoalRewards.reward_painter_quad]: typed([[MetaPainterBuilding, enumPainterVariants.quad]]),
- [enumHubGoalRewards.reward_storage]: typed([[MetaTrashBuilding, enumTrashVariants.storage]]),
-
- [enumHubGoalRewards.reward_freeplay]: null,
- [enumHubGoalRewards.no_reward]: null,
- [enumHubGoalRewards.no_reward_freeplay]: null,
-};
+import { T } from "../translations";
+import { enumBalancerVariants, MetaBalancerBuilding } from "./buildings/balancer";
+import { MetaConstantSignalBuilding } from "./buildings/constant_signal";
+import { enumCutterVariants, MetaCutterBuilding } from "./buildings/cutter";
+import { MetaDisplayBuilding } from "./buildings/display";
+import { MetaFilterBuilding } from "./buildings/filter";
+import { MetaLogicGateBuilding } from "./buildings/logic_gate";
+import { enumMinerVariants, MetaMinerBuilding } from "./buildings/miner";
+import { MetaMixerBuilding } from "./buildings/mixer";
+import { enumPainterVariants, MetaPainterBuilding } from "./buildings/painter";
+import { MetaReaderBuilding } from "./buildings/reader";
+import { enumRotaterVariants, MetaRotaterBuilding } from "./buildings/rotater";
+import { MetaStackerBuilding } from "./buildings/stacker";
+import { MetaStorageBuilding } from "./buildings/storage";
+import { enumUndergroundBeltVariants, MetaUndergroundBeltBuilding } from "./buildings/underground_belt";
+import { defaultBuildingVariant, MetaBuilding } from "./meta_building";
+/** @typedef {Array<[typeof MetaBuilding, string]>} TutorialGoalReward */
+import { enumHubGoalRewards } from "./tutorial_goals";
+
+/**
+ * Helper method for proper types
+ * @returns {TutorialGoalReward}
+ */
+const typed = x => x;
+
+/**
+ * Stores which reward unlocks what
+ * @enum {TutorialGoalReward?}
+ */
+export const enumHubGoalRewardsToContentUnlocked = {
+ [enumHubGoalRewards.reward_cutter_and_trash]: typed([[MetaCutterBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_rotater]: typed([[MetaRotaterBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_painter]: typed([[MetaPainterBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_mixer]: typed([[MetaMixerBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_stacker]: typed([[MetaStackerBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_balancer]: typed([[MetaBalancerBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_tunnel]: typed([[MetaUndergroundBeltBuilding, defaultBuildingVariant]]),
+
+ [enumHubGoalRewards.reward_rotater_ccw]: typed([[MetaRotaterBuilding, enumRotaterVariants.ccw]]),
+ [enumHubGoalRewards.reward_rotater_180]: typed([[MetaRotaterBuilding, enumRotaterVariants.rotate180]]),
+ [enumHubGoalRewards.reward_miner_chainable]: typed([[MetaMinerBuilding, enumMinerVariants.chainable]]),
+ [enumHubGoalRewards.reward_underground_belt_tier_2]: typed([
+ [MetaUndergroundBeltBuilding, enumUndergroundBeltVariants.tier2],
+ ]),
+ [enumHubGoalRewards.reward_splitter]: typed([[MetaBalancerBuilding, enumBalancerVariants.splitter]]),
+ [enumHubGoalRewards.reward_merger]: typed([[MetaBalancerBuilding, enumBalancerVariants.merger]]),
+ [enumHubGoalRewards.reward_cutter_quad]: typed([[MetaCutterBuilding, enumCutterVariants.quad]]),
+ [enumHubGoalRewards.reward_painter_double]: typed([[MetaPainterBuilding, enumPainterVariants.double]]),
+ [enumHubGoalRewards.reward_storage]: typed([[MetaStorageBuilding, defaultBuildingVariant]]),
+
+ [enumHubGoalRewards.reward_belt_reader]: typed([[MetaReaderBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_display]: typed([[MetaDisplayBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_constant_signal]: typed([
+ [MetaConstantSignalBuilding, defaultBuildingVariant],
+ ]),
+ [enumHubGoalRewards.reward_logic_gates]: typed([[MetaLogicGateBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_filter]: typed([[MetaFilterBuilding, defaultBuildingVariant]]),
+ [enumHubGoalRewards.reward_virtual_processing]: null,
+
+ [enumHubGoalRewards.reward_wires_painter_and_levers]: typed([
+ [MetaPainterBuilding, enumPainterVariants.quad],
+ ]),
+ [enumHubGoalRewards.reward_freeplay]: null,
+ [enumHubGoalRewards.reward_blueprints]: null,
+ [enumHubGoalRewards.no_reward]: null,
+ [enumHubGoalRewards.no_reward_freeplay]: null,
+ [enumHubGoalRewards.reward_demo_end]: null,
+};
+
+if (G_IS_DEV) {
+ // Sanity check
+ for (const rewardId in enumHubGoalRewards) {
+ const mapping = enumHubGoalRewardsToContentUnlocked[rewardId];
+
+ if (typeof mapping === "undefined") {
+ assertAlways(
+ false,
+ "Please define a mapping for the reward " + rewardId + " in tutorial_goals_mappings.js"
+ );
+ }
+
+ const translation = T.storyRewards[rewardId];
+ if (!translation || !translation.title || !translation.desc) {
+ assertAlways(false, "Translation for reward " + rewardId + "missing");
+ }
+ }
+}
diff --git a/src/js/game/upgrades.js b/src/js/game/upgrades.js
deleted file mode 100644
index 6e0c7c64..00000000
--- a/src/js/game/upgrades.js
+++ /dev/null
@@ -1,175 +0,0 @@
-import { findNiceIntegerValue } from "../core/utils";
-import { ShapeDefinition } from "./shape_definition";
-
-export const finalGameShape = "RuCw--Cw:----Ru--";
-export const blueprintShape = "CbCbCbRb:CwCwCwCw";
-
-export const UPGRADES = {
- belt: {
- tiers: [
- {
- required: [{ shape: "CuCuCuCu", amount: 150 }],
- improvement: 1,
- },
- {
- required: [{ shape: "--CuCu--", amount: 1200 }],
- improvement: 2,
- },
- {
- required: [{ shape: "CpCpCpCp", amount: 15000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: finalGameShape, amount: 150000 }],
- improvement: 5,
- excludePrevious: true,
- },
- ],
- },
-
- miner: {
- tiers: [
- {
- required: [{ shape: "RuRuRuRu", amount: 400 }],
- improvement: 1,
- },
- {
- required: [{ shape: "Cu------", amount: 4000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "ScScScSc", amount: 20000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: finalGameShape, amount: 150000 }],
- improvement: 5,
- excludePrevious: true,
- },
- ],
- },
-
- processors: {
- tiers: [
- {
- required: [{ shape: "SuSuSuSu", amount: 1000 }],
- improvement: 1,
- },
- {
- required: [{ shape: "RuRu----", amount: 2000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "CgScScCg", amount: 25000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: finalGameShape, amount: 150000 }],
- improvement: 5,
- excludePrevious: true,
- },
- ],
- },
-
- painting: {
- tiers: [
- {
- required: [{ shape: "RbRb----", amount: 1500 }],
- improvement: 2,
- },
- {
- required: [{ shape: "WrWrWrWr", amount: 4000 }],
- improvement: 1,
- },
- {
- required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 40000 }],
- improvement: 2,
- },
- {
- required: [{ shape: finalGameShape, amount: 150000 }],
- improvement: 5,
- excludePrevious: true,
- },
- ],
- },
-};
-
-// Tiers need % of the previous tier as requirement too
-const tierGrowth = 2.5;
-
-// Automatically generate tier levels
-for (const upgradeId in UPGRADES) {
- const upgrade = UPGRADES[upgradeId];
-
- let currentTierRequirements = [];
- for (let i = 0; i < upgrade.tiers.length; ++i) {
- const tierHandle = upgrade.tiers[i];
- const originalRequired = tierHandle.required.slice();
-
- for (let k = currentTierRequirements.length - 1; k >= 0; --k) {
- const oldTierRequirement = currentTierRequirements[k];
- if (!tierHandle.excludePrevious) {
- tierHandle.required.unshift({
- shape: oldTierRequirement.shape,
- amount: oldTierRequirement.amount,
- });
- }
- }
- currentTierRequirements.push(
- ...originalRequired.map(req => ({
- amount: req.amount,
- shape: req.shape,
- }))
- );
- currentTierRequirements.forEach(tier => {
- tier.amount = findNiceIntegerValue(tier.amount * tierGrowth);
- });
- }
-}
-
-if (G_IS_DEV) {
- for (const upgradeId in UPGRADES) {
- const upgrade = UPGRADES[upgradeId];
- upgrade.tiers.forEach(tier => {
- tier.required.forEach(({ shape }) => {
- try {
- ShapeDefinition.fromShortKey(shape);
- } catch (ex) {
- throw new Error("Invalid upgrade goal: '" + ex + "' for shape" + shape);
- }
- });
- });
- }
-}
diff --git a/src/js/globals.d.ts b/src/js/globals.d.ts
index 51e4a2c3..642745ca 100644
--- a/src/js/globals.d.ts
+++ b/src/js/globals.d.ts
@@ -19,9 +19,6 @@ declare const G_BUILD_VERSION: string;
declare const G_ALL_UI_IMAGES: Array;
declare const G_IS_RELEASE: boolean;
-// Node require
-declare function require(...args): any;
-
// Polyfills
declare interface String {
replaceAll(search: string, replacement: string): string;
diff --git a/src/js/jsconfig.json b/src/js/jsconfig.json
index e28a1c04..99d65145 100644
--- a/src/js/jsconfig.json
+++ b/src/js/jsconfig.json
@@ -2,5 +2,6 @@
"compilerOptions": {
"target": "es6",
"checkJs": true
- }
+ },
+ "include": ["./**/*.js"]
}
diff --git a/src/js/languages.js b/src/js/languages.js
index c46c3e88..4cc39f9b 100644
--- a/src/js/languages.js
+++ b/src/js/languages.js
@@ -1,113 +1,127 @@
-/**
- * @type {Object}
- */
-export const LANGUAGES = {
- "en": {
- name: "English",
- data: null,
- code: "en",
- region: "",
- },
- "de": {
- name: "Deutsch",
- data: require("./built-temp/base-de.json"),
- code: "de",
- region: "",
- },
- "fr": {
- name: "Français",
- data: require("./built-temp/base-fr.json"),
- code: "fr",
- region: "",
- },
- "ja": {
- name: "日本語",
- data: require("./built-temp/base-ja.json"),
- code: "ja",
- region: "",
- },
- "pt-PT": {
- name: "Português (Portugal)",
- data: require("./built-temp/base-pt-PT.json"),
- code: "pt",
- region: "PT",
- },
- "pt-BR": {
- name: "Português (Brasil)",
- data: require("./built-temp/base-pt-BR.json"),
- code: "pt",
- region: "BR",
- },
- "ru": {
- name: "Русский",
- data: require("./built-temp/base-ru.json"),
- code: "ru",
- region: "",
- },
- "cs": {
- name: "Čeština",
- data: require("./built-temp/base-cz.json"),
- code: "cs",
- region: "",
- },
- "es-419": {
- name: "Español",
- data: require("./built-temp/base-es.json"),
- code: "es",
- region: "",
- },
- "pl": {
- name: "Polski",
- data: require("./built-temp/base-pl.json"),
- code: "pl",
- region: "",
- },
- "kor": {
- name: "한국어",
- data: require("./built-temp/base-kor.json"),
- code: "kor",
- region: "",
- },
- "nl": {
- name: "Nederlands",
- data: require("./built-temp/base-nl.json"),
- code: "nl",
- region: "",
- },
- "no": {
- name: "Norsk",
- data: require("./built-temp/base-no.json"),
- code: "no",
- region: "",
- },
-
- "tr": {
- name: "Türkçe",
- data: require("./built-temp/base-tr.json"),
- code: "tr",
- region: "",
- },
-
- "zh-CN": {
- // simplified
- name: "中文简体",
- data: require("./built-temp/base-zh-CN.json"),
- code: "zh",
- region: "CN",
- },
-
- "zh-TW": {
- // traditional
- name: "中文繁體",
- data: require("./built-temp/base-zh-TW.json"),
- code: "zh",
- region: "TW",
- },
-
- "sv": {
- name: "Svenska",
- data: require("./built-temp/base-sv.json"),
- code: "sv",
- region: "",
- },
-};
+/**
+ * @type {Object}
+ */
+export const LANGUAGES = {
+ "en": {
+ name: "English",
+ data: null,
+ code: "en",
+ region: "",
+ },
+ "de": {
+ name: "Deutsch",
+ data: require("./built-temp/base-de.json"),
+ code: "de",
+ region: "",
+ },
+ "fr": {
+ name: "Français",
+ data: require("./built-temp/base-fr.json"),
+ code: "fr",
+ region: "",
+ },
+ "ja": {
+ name: "日本語",
+ data: require("./built-temp/base-ja.json"),
+ code: "ja",
+ region: "",
+ },
+ "pt-PT": {
+ name: "Português (Portugal)",
+ data: require("./built-temp/base-pt-PT.json"),
+ code: "pt",
+ region: "PT",
+ },
+ "pt-BR": {
+ name: "Português (Brasil)",
+ data: require("./built-temp/base-pt-BR.json"),
+ code: "pt",
+ region: "BR",
+ },
+ "ru": {
+ name: "Русский",
+ data: require("./built-temp/base-ru.json"),
+ code: "ru",
+ region: "",
+ },
+ "cs": {
+ name: "Čeština",
+ data: require("./built-temp/base-cz.json"),
+ code: "cs",
+ region: "",
+ },
+ "es-419": {
+ name: "Español",
+ data: require("./built-temp/base-es.json"),
+ code: "es",
+ region: "",
+ },
+ "pl": {
+ name: "Polski",
+ data: require("./built-temp/base-pl.json"),
+ code: "pl",
+ region: "",
+ },
+ "kor": {
+ name: "한국어",
+ data: require("./built-temp/base-kor.json"),
+ code: "kor",
+ region: "",
+ },
+ "nl": {
+ name: "Nederlands",
+ data: require("./built-temp/base-nl.json"),
+ code: "nl",
+ region: "",
+ },
+ "no": {
+ name: "Norsk",
+ data: require("./built-temp/base-no.json"),
+ code: "no",
+ region: "",
+ },
+
+ "tr": {
+ name: "Türkçe",
+ data: require("./built-temp/base-tr.json"),
+ code: "tr",
+ region: "",
+ },
+
+ "zh-CN": {
+ // simplified
+ name: "中文简体",
+ data: require("./built-temp/base-zh-CN.json"),
+ code: "zh",
+ region: "CN",
+ },
+
+ "zh-TW": {
+ // traditional
+ name: "中文繁體",
+ data: require("./built-temp/base-zh-TW.json"),
+ code: "zh",
+ region: "TW",
+ },
+
+ "sv": {
+ name: "Svenska",
+ data: require("./built-temp/base-sv.json"),
+ code: "sv",
+ region: "",
+ },
+
+ "da": {
+ name: "Dansk",
+ data: require("./built-temp/base-da.json"),
+ code: "da",
+ region: "",
+ },
+
+ "hu": {
+ name: "Magyar",
+ data: require("./built-temp/base-hu.json"),
+ code: "hu",
+ region: "",
+ },
+};
diff --git a/src/js/platform/browser/game_analytics.js b/src/js/platform/browser/game_analytics.js
index 7336ffd9..a3947be6 100644
--- a/src/js/platform/browser/game_analytics.js
+++ b/src/js/platform/browser/game_analytics.js
@@ -1,261 +1,277 @@
-import { globalConfig } from "../../core/config";
-import { createLogger } from "../../core/logging";
-import { GameRoot } from "../../game/root";
-import { InGameState } from "../../states/ingame";
-import { GameAnalyticsInterface } from "../game_analytics";
-import { FILE_NOT_FOUND } from "../storage";
-import { blueprintShape, UPGRADES } from "../../game/upgrades";
-import { tutorialGoals } from "../../game/tutorial_goals";
-import { BeltComponent } from "../../game/components/belt";
-import { StaticMapEntityComponent } from "../../game/components/static_map_entity";
-
-const logger = createLogger("game_analytics");
-
-const analyticsUrl = G_IS_DEV ? "http://localhost:8001" : "https://analytics.shapez.io";
-
-// Be sure to increment the ID whenever it changes to make sure all
-// users are tracked
-const analyticsLocalFile = "shapez_token_123.bin";
-
-export class ShapezGameAnalytics extends GameAnalyticsInterface {
- get environment() {
- if (G_IS_DEV) {
- return "dev";
- }
-
- if (G_IS_STANDALONE) {
- return "steam";
- }
-
- if (G_IS_RELEASE) {
- return "prod";
- }
-
- return "beta";
- }
-
- /**
- * @returns {Promise}
- */
- initialize() {
- this.syncKey = null;
-
- setInterval(() => this.sendTimePoints(), 60 * 1000);
-
- // Retrieve sync key from player
- return this.app.storage.readFileAsync(analyticsLocalFile).then(
- syncKey => {
- this.syncKey = syncKey;
- logger.log("Player sync key read:", this.syncKey);
- },
- error => {
- // File was not found, retrieve new key
- if (error === FILE_NOT_FOUND) {
- logger.log("Retrieving new player key");
-
- // Perform call to get a new key from the API
- this.sendToApi("/v1/register", {
- environment: this.environment,
- })
- .then(res => {
- // Try to read and parse the key from the api
- if (res.key && typeof res.key === "string" && res.key.length === 40) {
- this.syncKey = res.key;
- logger.log("Key retrieved:", this.syncKey);
- this.app.storage.writeFileAsync(analyticsLocalFile, res.key);
- } else {
- throw new Error("Bad response from analytics server: " + res);
- }
- })
- .catch(err => {
- logger.error("Failed to register on analytics api:", err);
- });
- } else {
- logger.error("Failed to read ga key:", error);
- }
- return;
- }
- );
- }
-
- /**
- * Sends a request to the api
- * @param {string} endpoint Endpoint without base url
- * @param {object} data payload
- * @returns {Promise}
- */
- sendToApi(endpoint, data) {
- return new Promise((resolve, reject) => {
- const timeout = setTimeout(() => reject("Request to " + endpoint + " timed out"), 20000);
-
- fetch(analyticsUrl + endpoint, {
- method: "POST",
- mode: "cors",
- cache: "no-cache",
- referrer: "no-referrer",
- credentials: "omit",
- headers: {
- "Content-Type": "application/json",
- "Accept": "application/json",
- "x-api-key": globalConfig.info.analyticsApiKey,
- },
- body: JSON.stringify(data),
- })
- .then(res => {
- clearTimeout(timeout);
- if (!res.ok || res.status !== 200) {
- reject("Fetch error: Bad status " + res.status);
- } else {
- return res.json();
- }
- })
- .then(resolve)
- .catch(reason => {
- clearTimeout(timeout);
- reject(reason);
- });
- });
- }
-
- /**
- * Sends a game event to the analytics
- * @param {string} category
- * @param {string} value
- */
- sendGameEvent(category, value) {
- if (!this.syncKey) {
- logger.warn("Can not send event due to missing sync key");
- return;
- }
-
- const gameState = this.app.stateMgr.currentState;
- if (!(gameState instanceof InGameState)) {
- logger.warn("Trying to send analytics event outside of ingame state");
- return;
- }
-
- const savegame = gameState.savegame;
- if (!savegame) {
- logger.warn("Ingame state has empty savegame");
- return;
- }
-
- const savegameId = savegame.internalId;
- if (!gameState.core) {
- logger.warn("Game state has no core");
- return;
- }
- const root = gameState.core.root;
- if (!root) {
- logger.warn("Root is not initialized");
- return;
- }
-
- logger.log("Sending event", category, value);
-
- this.sendToApi("/v1/game-event", {
- playerKey: this.syncKey,
- gameKey: savegameId,
- ingameTime: root.time.now(),
- environment: this.environment,
- category,
- value,
- version: G_BUILD_VERSION,
- level: root.hubGoals.level,
- gameDump: this.generateGameDump(root),
- });
- }
-
- sendTimePoints() {
- const gameState = this.app.stateMgr.currentState;
- if (gameState instanceof InGameState) {
- logger.log("Syncing analytics");
- this.sendGameEvent("sync", "");
- }
- }
-
- /**
- * Returns true if the shape is interesting
- * @param {string} key
- */
- isInterestingShape(key) {
- if (key === blueprintShape) {
- return true;
- }
-
- // Check if its a story goal
- for (let i = 0; i < tutorialGoals.length; ++i) {
- if (key === tutorialGoals[i].shape) {
- return true;
- }
- }
-
- // Check if its required to unlock an upgrade
- for (const upgradeKey in UPGRADES) {
- const handle = UPGRADES[upgradeKey];
- const tiers = handle.tiers;
- for (let i = 0; i < tiers.length; ++i) {
- const tier = tiers[i];
- const required = tier.required;
- for (let k = 0; k < required.length; ++k) {
- if (required[k].shape === key) {
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
- /**
- * Generates a game dump
- * @param {GameRoot} root
- */
- generateGameDump(root) {
- const shapeIds = Object.keys(root.hubGoals.storedShapes).filter(this.isInterestingShape.bind(this));
- let shapes = {};
- for (let i = 0; i < shapeIds.length; ++i) {
- shapes[shapeIds[i]] = root.hubGoals.storedShapes[shapeIds[i]];
- }
- return {
- shapes,
- upgrades: root.hubGoals.upgradeLevels,
- belts: root.entityMgr.getAllWithComponent(BeltComponent).length,
- buildings:
- root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
- root.entityMgr.getAllWithComponent(BeltComponent).length,
- };
- }
-
- /**
- */
- handleGameStarted() {
- this.sendGameEvent("game_start", "");
- }
-
- /**
- */
- handleGameResumed() {
- this.sendTimePoints();
- }
-
- /**
- * Handles the given level completed
- * @param {number} level
- */
- handleLevelCompleted(level) {
- logger.log("Complete level", level);
- this.sendGameEvent("level_complete", "" + level);
- }
-
- /**
- * Handles the given upgrade completed
- * @param {string} id
- * @param {number} level
- */
- handleUpgradeUnlocked(id, level) {
- logger.log("Unlock upgrade", id, level);
- this.sendGameEvent("upgrade_unlock", id + "@" + level);
- }
-}
+import { globalConfig } from "../../core/config";
+import { createLogger } from "../../core/logging";
+import { queryParamOptions } from "../../core/query_parameters";
+import { BeltComponent } from "../../game/components/belt";
+import { StaticMapEntityComponent } from "../../game/components/static_map_entity";
+import { GameRoot } from "../../game/root";
+import { InGameState } from "../../states/ingame";
+import { GameAnalyticsInterface } from "../game_analytics";
+import { FILE_NOT_FOUND } from "../storage";
+
+const logger = createLogger("game_analytics");
+
+const analyticsUrl = G_IS_DEV ? "http://localhost:8001" : "https://analytics.shapez.io";
+
+// Be sure to increment the ID whenever it changes to make sure all
+// users are tracked
+const analyticsLocalFile = "shapez_token_123.bin";
+
+export class ShapezGameAnalytics extends GameAnalyticsInterface {
+ get environment() {
+ if (G_IS_DEV) {
+ return "dev";
+ }
+
+ if (G_IS_STANDALONE) {
+ if (queryParamOptions.sandboxMode) {
+ return "steam-sandbox";
+ }
+ return "steam";
+ }
+
+ if (G_IS_RELEASE) {
+ return "prod";
+ }
+
+ if (window.location.host.indexOf("alpha") >= 0) {
+ if (queryParamOptions.sandboxMode) {
+ return "alpha-sandbox";
+ }
+ return "alpha";
+ } else {
+ if (queryParamOptions.sandboxMode) {
+ return "beta-sandbox";
+ }
+ return "beta";
+ }
+ }
+
+ /**
+ * @returns {Promise}
+ */
+ initialize() {
+ this.syncKey = null;
+
+ setInterval(() => this.sendTimePoints(), 60 * 1000);
+
+ // Retrieve sync key from player
+ return this.app.storage.readFileAsync(analyticsLocalFile).then(
+ syncKey => {
+ this.syncKey = syncKey;
+ logger.log("Player sync key read:", this.syncKey);
+ },
+ error => {
+ // File was not found, retrieve new key
+ if (error === FILE_NOT_FOUND) {
+ logger.log("Retrieving new player key");
+
+ // Perform call to get a new key from the API
+ this.sendToApi("/v1/register", {
+ environment: this.environment,
+ })
+ .then(res => {
+ // Try to read and parse the key from the api
+ if (res.key && typeof res.key === "string" && res.key.length === 40) {
+ this.syncKey = res.key;
+ logger.log("Key retrieved:", this.syncKey);
+ this.app.storage.writeFileAsync(analyticsLocalFile, res.key);
+ } else {
+ throw new Error("Bad response from analytics server: " + res);
+ }
+ })
+ .catch(err => {
+ logger.error("Failed to register on analytics api:", err);
+ });
+ } else {
+ logger.error("Failed to read ga key:", error);
+ }
+ return;
+ }
+ );
+ }
+
+ /**
+ * Sends a request to the api
+ * @param {string} endpoint Endpoint without base url
+ * @param {object} data payload
+ * @returns {Promise}
+ */
+ sendToApi(endpoint, data) {
+ return new Promise((resolve, reject) => {
+ const timeout = setTimeout(() => reject("Request to " + endpoint + " timed out"), 20000);
+
+ fetch(analyticsUrl + endpoint, {
+ method: "POST",
+ mode: "cors",
+ cache: "no-cache",
+ referrer: "no-referrer",
+ credentials: "omit",
+ headers: {
+ "Content-Type": "application/json",
+ "Accept": "application/json",
+ "x-api-key": globalConfig.info.analyticsApiKey,
+ },
+ body: JSON.stringify(data),
+ })
+ .then(res => {
+ clearTimeout(timeout);
+ if (!res.ok || res.status !== 200) {
+ reject("Fetch error: Bad status " + res.status);
+ } else {
+ return res.json();
+ }
+ })
+ .then(resolve)
+ .catch(reason => {
+ clearTimeout(timeout);
+ reject(reason);
+ });
+ });
+ }
+
+ /**
+ * Sends a game event to the analytics
+ * @param {string} category
+ * @param {string} value
+ */
+ sendGameEvent(category, value) {
+ if (!this.syncKey) {
+ logger.warn("Can not send event due to missing sync key");
+ return;
+ }
+
+ const gameState = this.app.stateMgr.currentState;
+ if (!(gameState instanceof InGameState)) {
+ logger.warn("Trying to send analytics event outside of ingame state");
+ return;
+ }
+
+ const savegame = gameState.savegame;
+ if (!savegame) {
+ logger.warn("Ingame state has empty savegame");
+ return;
+ }
+
+ const savegameId = savegame.internalId;
+ if (!gameState.core) {
+ logger.warn("Game state has no core");
+ return;
+ }
+ const root = gameState.core.root;
+ if (!root) {
+ logger.warn("Root is not initialized");
+ return;
+ }
+
+ logger.log("Sending event", category, value);
+
+ this.sendToApi("/v1/game-event", {
+ playerKey: this.syncKey,
+ gameKey: savegameId,
+ ingameTime: root.time.now(),
+ environment: this.environment,
+ category,
+ value,
+ version: G_BUILD_VERSION,
+ level: root.hubGoals.level,
+ gameDump: this.generateGameDump(root),
+ });
+ }
+
+ sendTimePoints() {
+ const gameState = this.app.stateMgr.currentState;
+ if (gameState instanceof InGameState) {
+ logger.log("Syncing analytics");
+ this.sendGameEvent("sync", "");
+ }
+ }
+
+ /**
+ * Returns true if the shape is interesting
+ * @param {GameRoot} root
+ * @param {string} key
+ */
+ isInterestingShape(root, key) {
+ if (key === root.gameMode.getBlueprintShapeKey()) {
+ return true;
+ }
+
+ // Check if its a story goal
+ const levels = root.gameMode.getLevelDefinitions();
+ for (let i = 0; i < levels.length; ++i) {
+ if (key === levels[i].shape) {
+ return true;
+ }
+ }
+
+ // Check if its required to unlock an upgrade
+ const upgrades = root.gameMode.getUpgrades();
+ for (const upgradeKey in upgrades) {
+ const upgradeTiers = upgrades[upgradeKey];
+ for (let i = 0; i < upgradeTiers.length; ++i) {
+ const tier = upgradeTiers[i];
+ const required = tier.required;
+ for (let k = 0; k < required.length; ++k) {
+ if (required[k].shape === key) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Generates a game dump
+ * @param {GameRoot} root
+ */
+ generateGameDump(root) {
+ const shapeIds = Object.keys(root.hubGoals.storedShapes).filter(key =>
+ this.isInterestingShape(root, key)
+ );
+ let shapes = {};
+ for (let i = 0; i < shapeIds.length; ++i) {
+ shapes[shapeIds[i]] = root.hubGoals.storedShapes[shapeIds[i]];
+ }
+ return {
+ shapes,
+ upgrades: root.hubGoals.upgradeLevels,
+ belts: root.entityMgr.getAllWithComponent(BeltComponent).length,
+ buildings:
+ root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
+ root.entityMgr.getAllWithComponent(BeltComponent).length,
+ };
+ }
+
+ /**
+ */
+ handleGameStarted() {
+ this.sendGameEvent("game_start", "");
+ }
+
+ /**
+ */
+ handleGameResumed() {
+ this.sendTimePoints();
+ }
+
+ /**
+ * Handles the given level completed
+ * @param {number} level
+ */
+ handleLevelCompleted(level) {
+ logger.log("Complete level", level);
+ this.sendGameEvent("level_complete", "" + level);
+ }
+
+ /**
+ * Handles the given upgrade completed
+ * @param {string} id
+ * @param {number} level
+ */
+ handleUpgradeUnlocked(id, level) {
+ logger.log("Unlock upgrade", id, level);
+ this.sendGameEvent("upgrade_unlock", id + "@" + level);
+ }
+}
diff --git a/src/js/platform/browser/wrapper.js b/src/js/platform/browser/wrapper.js
index 56705025..232a743b 100644
--- a/src/js/platform/browser/wrapper.js
+++ b/src/js/platform/browser/wrapper.js
@@ -1,214 +1,202 @@
-import { globalConfig, IS_DEMO, IS_MOBILE } from "../../core/config";
-import { createLogger } from "../../core/logging";
-import { queryParamOptions } from "../../core/query_parameters";
-import { clamp } from "../../core/utils";
-import { GamedistributionAdProvider } from "../ad_providers/gamedistribution";
-import { NoAdProvider } from "../ad_providers/no_ad_provider";
-import { PlatformWrapperInterface } from "../wrapper";
-import { StorageImplBrowser } from "./storage";
-import { StorageImplBrowserIndexedDB } from "./storage_indexed_db";
-
-const logger = createLogger("platform/browser");
-
-export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
- initialize() {
- this.recaptchaTokenCallback = null;
-
- this.embedProvider = {
- id: "shapezio-website",
- adProvider: NoAdProvider,
- iframed: false,
- externalLinks: true,
- iogLink: true,
- unlimitedSavegames: IS_DEMO ? false : true,
- showDemoBadge: IS_DEMO,
- };
-
- if (!G_IS_STANDALONE && queryParamOptions.embedProvider) {
- const providerId = queryParamOptions.embedProvider;
- this.embedProvider.iframed = true;
- this.embedProvider.iogLink = false;
-
- switch (providerId) {
- case "armorgames": {
- this.embedProvider.id = "armorgames";
- break;
- }
-
- case "iogames.space": {
- this.embedProvider.id = "iogames.space";
- this.embedProvider.iogLink = true;
- this.embedProvider.unlimitedSavegames = true;
- this.embedProvider.showDemoBadge = false;
- break;
- }
-
- case "miniclip": {
- this.embedProvider.id = "miniclip";
- break;
- }
-
- case "gamedistribution": {
- this.embedProvider.id = "gamedistribution";
- this.embedProvider.externalLinks = false;
- this.embedProvider.adProvider = GamedistributionAdProvider;
- break;
- }
-
- case "kongregate": {
- this.embedProvider.id = "kongregate";
- break;
- }
-
- case "crazygames": {
- this.embedProvider.id = "crazygames";
- break;
- }
-
- default: {
- logger.error("Got unsupported embed provider:", providerId);
- }
- }
- }
-
- logger.log("Embed provider:", this.embedProvider.id);
-
- return this.detectStorageImplementation()
- .then(() => this.initializeAdProvider())
- .then(() => super.initialize());
- }
-
- detectStorageImplementation() {
- return new Promise(resolve => {
- logger.log("Detecting storage");
-
- if (!window.indexedDB) {
- logger.log("Indexed DB not supported");
- this.app.storage = new StorageImplBrowser(this.app);
- resolve();
- return;
- }
-
- // Try accessing the indexedb
- let request;
- try {
- request = window.indexedDB.open("indexeddb_feature_detection", 1);
- } catch (ex) {
- logger.warn("Error while opening indexed db:", ex);
- this.app.storage = new StorageImplBrowser(this.app);
- resolve();
- return;
- }
- request.onerror = err => {
- logger.log("Indexed DB can *not* be accessed: ", err);
- logger.log("Using fallback to local storage");
- this.app.storage = new StorageImplBrowser(this.app);
- resolve();
- };
- request.onsuccess = () => {
- logger.log("Indexed DB *can* be accessed");
- this.app.storage = new StorageImplBrowserIndexedDB(this.app);
- resolve();
- };
- });
- }
-
- getHasUnlimitedSavegames() {
- return this.embedProvider.unlimitedSavegames;
- }
-
- getShowDemoBadges() {
- return this.embedProvider.showDemoBadge;
- }
-
- getId() {
- return "browser@" + this.embedProvider.id;
- }
-
- getUiScale() {
- if (IS_MOBILE) {
- return 1;
- }
-
- const avgDims = Math.min(this.app.screenWidth, this.app.screenHeight);
- return clamp((avgDims / 1000.0) * 1.9, 0.1, 10);
- }
-
- getSupportsRestart() {
- return true;
- }
-
- getTouchPanStrength() {
- return IS_MOBILE ? 1 : 0.5;
- }
-
- openExternalLink(url, force = false) {
- logger.log("Opening external:", url);
- if (force || this.embedProvider.externalLinks) {
- window.open(url);
- } else {
- // Do nothing
- alert(
- "This platform does not allow opening external links. You can play on https://shapez.io directly to open them.\n\nClicked Link: " +
- url
- );
- }
- }
-
- performRestart() {
- logger.log("Performing restart");
- window.location.reload(true);
- }
-
- /**
- * Detects if there is an adblocker installed
- * @returns {Promise}
- */
- detectAdblock() {
- return Promise.race([
- new Promise(resolve => {
- // If the request wasn't blocked within a very short period of time, this means
- // the adblocker is not active and the request was actually made -> ignore it then
- setTimeout(() => resolve(false), 30);
- }),
- new Promise(resolve => {
- fetch("https://googleads.g.doubleclick.net/pagead/id", {
- method: "HEAD",
- mode: "no-cors",
- })
- .then(res => {
- resolve(false);
- })
- .catch(err => {
- resolve(true);
- });
- }),
- ]);
- }
-
- initializeAdProvider() {
- if (G_IS_DEV && !globalConfig.debug.testAds) {
- logger.log("Ads disabled in local environment");
- return Promise.resolve();
- }
-
- // First, detect adblocker
- return this.detectAdblock().then(hasAdblocker => {
- if (hasAdblocker) {
- logger.log("Adblock detected");
- return;
- }
-
- const adProvider = this.embedProvider.adProvider;
- this.app.adProvider = new adProvider(this.app);
- return this.app.adProvider.initialize().catch(err => {
- logger.error("Failed to initialize ad provider, disabling ads:", err);
- this.app.adProvider = new NoAdProvider(this.app);
- });
- });
- }
-
- exitApp() {
- // Can not exit app
- }
-}
+import { globalConfig, IS_MOBILE } from "../../core/config";
+import { createLogger } from "../../core/logging";
+import { queryParamOptions } from "../../core/query_parameters";
+import { clamp } from "../../core/utils";
+import { GamedistributionAdProvider } from "../ad_providers/gamedistribution";
+import { NoAdProvider } from "../ad_providers/no_ad_provider";
+import { PlatformWrapperInterface } from "../wrapper";
+import { StorageImplBrowser } from "./storage";
+import { StorageImplBrowserIndexedDB } from "./storage_indexed_db";
+
+const logger = createLogger("platform/browser");
+
+export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
+ initialize() {
+ this.recaptchaTokenCallback = null;
+
+ this.embedProvider = {
+ id: "shapezio-website",
+ adProvider: NoAdProvider,
+ iframed: false,
+ externalLinks: true,
+ iogLink: true,
+ };
+
+ if (!G_IS_STANDALONE && queryParamOptions.embedProvider) {
+ const providerId = queryParamOptions.embedProvider;
+ this.embedProvider.iframed = true;
+ this.embedProvider.iogLink = false;
+
+ switch (providerId) {
+ case "armorgames": {
+ this.embedProvider.id = "armorgames";
+ break;
+ }
+
+ case "iogames.space": {
+ this.embedProvider.id = "iogames.space";
+ this.embedProvider.iogLink = true;
+ break;
+ }
+
+ case "miniclip": {
+ this.embedProvider.id = "miniclip";
+ break;
+ }
+
+ case "gamedistribution": {
+ this.embedProvider.id = "gamedistribution";
+ this.embedProvider.externalLinks = false;
+ this.embedProvider.adProvider = GamedistributionAdProvider;
+ break;
+ }
+
+ case "kongregate": {
+ this.embedProvider.id = "kongregate";
+ break;
+ }
+
+ case "crazygames": {
+ this.embedProvider.id = "crazygames";
+ break;
+ }
+
+ default: {
+ logger.error("Got unsupported embed provider:", providerId);
+ }
+ }
+ }
+
+ logger.log("Embed provider:", this.embedProvider.id);
+
+ return this.detectStorageImplementation()
+ .then(() => this.initializeAdProvider())
+ .then(() => super.initialize());
+ }
+
+ detectStorageImplementation() {
+ return new Promise(resolve => {
+ logger.log("Detecting storage");
+
+ if (!window.indexedDB) {
+ logger.log("Indexed DB not supported");
+ this.app.storage = new StorageImplBrowser(this.app);
+ resolve();
+ return;
+ }
+
+ // Try accessing the indexedb
+ let request;
+ try {
+ request = window.indexedDB.open("indexeddb_feature_detection", 1);
+ } catch (ex) {
+ logger.warn("Error while opening indexed db:", ex);
+ this.app.storage = new StorageImplBrowser(this.app);
+ resolve();
+ return;
+ }
+ request.onerror = err => {
+ logger.log("Indexed DB can *not* be accessed: ", err);
+ logger.log("Using fallback to local storage");
+ this.app.storage = new StorageImplBrowser(this.app);
+ resolve();
+ };
+ request.onsuccess = () => {
+ logger.log("Indexed DB *can* be accessed");
+ this.app.storage = new StorageImplBrowserIndexedDB(this.app);
+ resolve();
+ };
+ });
+ }
+
+ getId() {
+ return "browser@" + this.embedProvider.id;
+ }
+
+ getUiScale() {
+ if (IS_MOBILE) {
+ return 1;
+ }
+
+ const avgDims = Math.min(this.app.screenWidth, this.app.screenHeight);
+ return clamp((avgDims / 1000.0) * 1.9, 0.1, 10);
+ }
+
+ getSupportsRestart() {
+ return true;
+ }
+
+ getTouchPanStrength() {
+ return IS_MOBILE ? 1 : 0.5;
+ }
+
+ openExternalLink(url, force = false) {
+ logger.log("Opening external:", url);
+ if (force || this.embedProvider.externalLinks) {
+ window.open(url);
+ } else {
+ // Do nothing
+ alert(
+ "This platform does not allow opening external links. You can play on https://shapez.io directly to open them.\n\nClicked Link: " +
+ url
+ );
+ }
+ }
+
+ performRestart() {
+ logger.log("Performing restart");
+ window.location.reload(true);
+ }
+
+ /**
+ * Detects if there is an adblocker installed
+ * @returns {Promise}
+ */
+ detectAdblock() {
+ return Promise.race([
+ new Promise(resolve => {
+ // If the request wasn't blocked within a very short period of time, this means
+ // the adblocker is not active and the request was actually made -> ignore it then
+ setTimeout(() => resolve(false), 30);
+ }),
+ new Promise(resolve => {
+ fetch("https://googleads.g.doubleclick.net/pagead/id", {
+ method: "HEAD",
+ mode: "no-cors",
+ })
+ .then(res => {
+ resolve(false);
+ })
+ .catch(err => {
+ resolve(true);
+ });
+ }),
+ ]);
+ }
+
+ initializeAdProvider() {
+ if (G_IS_DEV && !globalConfig.debug.testAds) {
+ logger.log("Ads disabled in local environment");
+ return Promise.resolve();
+ }
+
+ // First, detect adblocker
+ return this.detectAdblock().then(hasAdblocker => {
+ if (hasAdblocker) {
+ logger.log("Adblock detected");
+ return;
+ }
+
+ const adProvider = this.embedProvider.adProvider;
+ this.app.adProvider = new adProvider(this.app);
+ return this.app.adProvider.initialize().catch(err => {
+ logger.error("Failed to initialize ad provider, disabling ads:", err);
+ this.app.adProvider = new NoAdProvider(this.app);
+ });
+ });
+ }
+
+ exitApp() {
+ // Can not exit app
+ }
+}
diff --git a/src/js/platform/electron/wrapper.js b/src/js/platform/electron/wrapper.js
index 69bc9695..941aff44 100644
--- a/src/js/platform/electron/wrapper.js
+++ b/src/js/platform/electron/wrapper.js
@@ -1,65 +1,57 @@
-import { PlatformWrapperImplBrowser } from "../browser/wrapper";
-import { getIPCRenderer } from "../../core/utils";
-import { createLogger } from "../../core/logging";
-import { StorageImplElectron } from "./storage";
-import { PlatformWrapperInterface } from "../wrapper";
-
-const logger = createLogger("electron-wrapper");
-
-export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser {
- initialize() {
- this.app.storage = new StorageImplElectron(this);
- return PlatformWrapperInterface.prototype.initialize.call(this);
- }
-
- getId() {
- return "electron";
- }
-
- getSupportsRestart() {
- return true;
- }
-
- openExternalLink(url) {
- logger.log(this, "Opening external:", url);
- window.open(url, "about:blank");
- }
-
- getSupportsAds() {
- return false;
- }
-
- getHasUnlimitedSavegames() {
- return true;
- }
-
- getShowDemoBadges() {
- return false;
- }
-
- performRestart() {
- logger.log(this, "Performing restart");
- window.location.reload(true);
- }
-
- initializeAdProvider() {
- return Promise.resolve();
- }
-
- getSupportsFullscreen() {
- return true;
- }
-
- setFullscreen(flag) {
- getIPCRenderer().send("set-fullscreen", flag);
- }
-
- getSupportsAppExit() {
- return true;
- }
-
- exitApp() {
- logger.log(this, "Sending app exit signal");
- getIPCRenderer().send("exit-app");
- }
-}
+import { PlatformWrapperImplBrowser } from "../browser/wrapper";
+import { getIPCRenderer } from "../../core/utils";
+import { createLogger } from "../../core/logging";
+import { StorageImplElectron } from "./storage";
+import { PlatformWrapperInterface } from "../wrapper";
+
+const logger = createLogger("electron-wrapper");
+
+export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser {
+ initialize() {
+ this.app.storage = new StorageImplElectron(this);
+ return PlatformWrapperInterface.prototype.initialize.call(this);
+ }
+
+ getId() {
+ return "electron";
+ }
+
+ getSupportsRestart() {
+ return true;
+ }
+
+ openExternalLink(url) {
+ logger.log(this, "Opening external:", url);
+ window.open(url, "about:blank");
+ }
+
+ getSupportsAds() {
+ return false;
+ }
+
+ performRestart() {
+ logger.log(this, "Performing restart");
+ window.location.reload(true);
+ }
+
+ initializeAdProvider() {
+ return Promise.resolve();
+ }
+
+ getSupportsFullscreen() {
+ return true;
+ }
+
+ setFullscreen(flag) {
+ getIPCRenderer().send("set-fullscreen", flag);
+ }
+
+ getSupportsAppExit() {
+ return true;
+ }
+
+ exitApp() {
+ logger.log(this, "Sending app exit signal");
+ getIPCRenderer().send("exit-app");
+ }
+}
diff --git a/src/js/platform/sound.js b/src/js/platform/sound.js
index 0678abcf..9d5a8461 100644
--- a/src/js/platform/sound.js
+++ b/src/js/platform/sound.js
@@ -25,9 +25,12 @@ export const SOUNDS = {
destroyBuilding: "destroy_building",
placeBuilding: "place_building",
placeBelt: "place_belt",
+ copy: "copy",
};
export const MUSIC = {
+ // The theme always depends on the standalone only, even if running the full
+ // version in the browser
theme: G_IS_STANDALONE ? "theme-full" : "theme-short",
menu: "menu",
};
diff --git a/src/js/platform/wrapper.js b/src/js/platform/wrapper.js
index 9c35a8e4..f80c2fd6 100644
--- a/src/js/platform/wrapper.js
+++ b/src/js/platform/wrapper.js
@@ -1,142 +1,131 @@
-/* typehints:start */
-import { Application } from "../application";
-/* typehints:end */
-
-import { IS_MOBILE } from "../core/config";
-
-export class PlatformWrapperInterface {
- constructor(app) {
- /** @type {Application} */
- this.app = app;
- }
-
- /** @returns {string} */
- getId() {
- abstract;
- return "unknown-platform";
- }
-
- /**
- * Returns the UI scale, called on every resize
- * @returns {number} */
- getUiScale() {
- return 1;
- }
-
- /** @returns {boolean} */
- getSupportsRestart() {
- abstract;
- return false;
- }
-
- /**
- * Whether the user has unlimited savegames
- */
- getHasUnlimitedSavegames() {
- return true;
- }
-
- getShowDemoBadges() {
- return false;
- }
-
- /**
- * Returns the strength of touch pans with the mouse
- */
- getTouchPanStrength() {
- return 1;
- }
-
- /** @returns {Promise} */
- initialize() {
- document.documentElement.classList.add("p-" + this.getId());
- return Promise.resolve();
- }
-
- /**
- * Should initialize the apps ad provider in case supported
- * @returns {Promise}
- */
- initializeAdProvider() {
- return Promise.resolve();
- }
-
- /**
- * Should return the minimum supported zoom level
- * @returns {number}
- */
- getMinimumZoom() {
- return 0.1 * this.getScreenScale();
- }
-
- /**
- * Should return the maximum supported zoom level
- * @returns {number}
- */
- getMaximumZoom() {
- return 3.5 * this.getScreenScale();
- }
-
- getScreenScale() {
- return Math.min(window.innerWidth, window.innerHeight) / 1024.0;
- }
-
- /**
- * Should return if this platform supports ads at all
- */
- getSupportsAds() {
- return false;
- }
-
- /**
- * Attempt to open an external url
- * @param {string} url
- * @param {boolean=} force Whether to always open the url even if not allowed
- */
- openExternalLink(url, force = false) {
- abstract;
- }
-
- /**
- * Attempt to restart the app
- */
- performRestart() {
- abstract;
- }
-
- /**
- * Returns whether this platform supports a toggleable fullscreen
- */
- getSupportsFullscreen() {
- return false;
- }
-
- /**
- * Should set the apps fullscreen state to the desired state
- * @param {boolean} flag
- */
- setFullscreen(flag) {
- abstract;
- }
-
- /**
- * Returns whether this platform supports quitting the app
- */
- getSupportsAppExit() {
- return false;
- }
-
- /**
- * Attempts to quit the app
- */
- exitApp() {
- abstract;
- }
-
- /**
- * Whether this platform supports a keyboard
- */
- getSupportsKeyboard() {
- return !IS_MOBILE;
- }
-}
+/* typehints:start */
+import { Application } from "../application";
+/* typehints:end */
+
+import { IS_MOBILE } from "../core/config";
+
+export class PlatformWrapperInterface {
+ constructor(app) {
+ /** @type {Application} */
+ this.app = app;
+ }
+
+ /** @returns {string} */
+ getId() {
+ abstract;
+ return "unknown-platform";
+ }
+
+ /**
+ * Returns the UI scale, called on every resize
+ * @returns {number} */
+ getUiScale() {
+ return 1;
+ }
+
+ /** @returns {boolean} */
+ getSupportsRestart() {
+ abstract;
+ return false;
+ }
+
+ /**
+ * Returns the strength of touch pans with the mouse
+ */
+ getTouchPanStrength() {
+ return 1;
+ }
+
+ /** @returns {Promise} */
+ initialize() {
+ document.documentElement.classList.add("p-" + this.getId());
+ return Promise.resolve();
+ }
+
+ /**
+ * Should initialize the apps ad provider in case supported
+ * @returns {Promise}
+ */
+ initializeAdProvider() {
+ return Promise.resolve();
+ }
+
+ /**
+ * Should return the minimum supported zoom level
+ * @returns {number}
+ */
+ getMinimumZoom() {
+ return 0.1 * this.getScreenScale();
+ }
+
+ /**
+ * Should return the maximum supported zoom level
+ * @returns {number}
+ */
+ getMaximumZoom() {
+ return 3.5 * this.getScreenScale();
+ }
+
+ getScreenScale() {
+ return Math.min(window.innerWidth, window.innerHeight) / 1024.0;
+ }
+
+ /**
+ * Should return if this platform supports ads at all
+ */
+ getSupportsAds() {
+ return false;
+ }
+
+ /**
+ * Attempt to open an external url
+ * @param {string} url
+ * @param {boolean=} force Whether to always open the url even if not allowed
+ */
+ openExternalLink(url, force = false) {
+ abstract;
+ }
+
+ /**
+ * Attempt to restart the app
+ */
+ performRestart() {
+ abstract;
+ }
+
+ /**
+ * Returns whether this platform supports a toggleable fullscreen
+ */
+ getSupportsFullscreen() {
+ return false;
+ }
+
+ /**
+ * Should set the apps fullscreen state to the desired state
+ * @param {boolean} flag
+ */
+ setFullscreen(flag) {
+ abstract;
+ }
+
+ /**
+ * Returns whether this platform supports quitting the app
+ */
+ getSupportsAppExit() {
+ return false;
+ }
+
+ /**
+ * Attempts to quit the app
+ */
+ exitApp() {
+ abstract;
+ }
+
+ /**
+ * Whether this platform supports a keyboard
+ */
+ getSupportsKeyboard() {
+ return !IS_MOBILE;
+ }
+}
diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js
index 084a6fe7..68abf5bb 100644
--- a/src/js/profile/application_settings.js
+++ b/src/js/profile/application_settings.js
@@ -6,8 +6,7 @@ import { ReadWriteProxy } from "../core/read_write_proxy";
import { BoolSetting, EnumSetting, RangeSetting, BaseSetting } from "./setting_types";
import { createLogger } from "../core/logging";
import { ExplainedResult } from "../core/explained_result";
-import { THEMES, THEME, applyGameTheme } from "../game/theme";
-import { IS_DEMO } from "../core/config";
+import { THEMES, applyGameTheme } from "../game/theme";
import { T } from "../translations";
import { LANGUAGES } from "../languages";
@@ -187,7 +186,9 @@ export const allApplicationSettings = [
app.platformWrapper.setFullscreen(value);
}
},
- !IS_DEMO
+ /**
+ * @param {Application} app
+ */ app => app.restrictionMgr.getHasExtendedSettings()
),
new BoolSetting(
@@ -215,7 +216,9 @@ export const allApplicationSettings = [
applyGameTheme(id);
document.documentElement.setAttribute("data-theme", id);
},
- enabled: !IS_DEMO,
+ enabledCb: /**
+ * @param {Application} app
+ */ app => app.restrictionMgr.getHasExtendedSettings(),
}),
new EnumSetting("autosaveInterval", {
@@ -253,7 +256,9 @@ export const allApplicationSettings = [
changeCb: (app, id) => {},
}),
+ new BoolSetting("enableMousePan", enumCategories.advanced, (app, value) => {}),
new BoolSetting("alwaysMultiplace", enumCategories.advanced, (app, value) => {}),
+ new BoolSetting("zoomToCursor", enumCategories.advanced, (app, value) => {}),
new BoolSetting("clearCursorOnDeleteWhilePlacing", enumCategories.advanced, (app, value) => {}),
new BoolSetting("enableTunnelSmartplace", enumCategories.advanced, (app, value) => {}),
new BoolSetting("vignette", enumCategories.userInterface, (app, value) => {}),
@@ -262,6 +267,7 @@ export const allApplicationSettings = [
new BoolSetting("rotationByBuilding", enumCategories.advanced, (app, value) => {}),
new BoolSetting("displayChunkBorders", enumCategories.advanced, (app, value) => {}),
new BoolSetting("pickMinerOnPatch", enumCategories.advanced, (app, value) => {}),
+ new RangeSetting("mapResourcesScale", enumCategories.advanced, () => null),
new EnumSetting("refreshRate", {
options: refreshRateOptions,
@@ -270,12 +276,15 @@ export const allApplicationSettings = [
category: enumCategories.performance,
restartRequired: false,
changeCb: (app, id) => {},
- enabled: !IS_DEMO,
+ enabledCb: /**
+ * @param {Application} app
+ */ app => app.restrictionMgr.getHasExtendedSettings(),
}),
new BoolSetting("lowQualityMapResources", enumCategories.performance, (app, value) => {}),
new BoolSetting("disableTileGrid", enumCategories.performance, (app, value) => {}),
new BoolSetting("lowQualityTextures", enumCategories.performance, (app, value) => {}),
+ new BoolSetting("simplifiedBelts", enumCategories.performance, (app, value) => {}),
];
export function getApplicationSettingById(id) {
@@ -307,12 +316,16 @@ class SettingsStorage {
this.clearCursorOnDeleteWhilePlacing = true;
this.displayChunkBorders = false;
this.pickMinerOnPatch = true;
+ this.enableMousePan = true;
this.enableColorBlindHelper = false;
this.lowQualityMapResources = false;
this.disableTileGrid = false;
this.lowQualityTextures = false;
+ this.simplifiedBelts = false;
+ this.zoomToCursor = true;
+ this.mapResourcesScale = 0.5;
/**
* @type {Object.}
@@ -351,7 +364,7 @@ export class ApplicationSettings extends ReadWriteProxy {
* @returns {SettingsStorage}
*/
getAllSettings() {
- return this.getCurrentData().settings;
+ return this.currentData.settings;
}
/**
@@ -523,7 +536,7 @@ export class ApplicationSettings extends ReadWriteProxy {
}
getCurrentVersion() {
- return 26;
+ return 30;
}
/** @param {{settings: SettingsStorage, version: number}} data */
@@ -646,6 +659,30 @@ export class ApplicationSettings extends ReadWriteProxy {
data.version = 26;
}
+ if (data.version < 27) {
+ data.settings.simplifiedBelts = false;
+ data.version = 27;
+ }
+
+ if (data.version < 28) {
+ data.settings.enableMousePan = true;
+ data.version = 28;
+ }
+
+ if (data.version < 29) {
+ data.settings.zoomToCursor = true;
+ data.version = 29;
+ }
+
+ if (data.version < 30) {
+ data.settings.mapResourcesScale = 0.5;
+
+ // Re-enable hints as well
+ data.settings.offerHints = true;
+
+ data.version = 30;
+ }
+
return ExplainedResult.good();
}
}
diff --git a/src/js/profile/setting_types.js b/src/js/profile/setting_types.js
index 7d07ca99..4df02892 100644
--- a/src/js/profile/setting_types.js
+++ b/src/js/profile/setting_types.js
@@ -7,19 +7,30 @@ import { T } from "../translations";
const logger = createLogger("setting_types");
+/*
+ * ***************************************************
+ *
+ * LEGACY CODE WARNING
+ *
+ * This is old code from yorg3.io and needs to be refactored
+ * @TODO
+ *
+ * ***************************************************
+ */
+
export class BaseSetting {
/**
*
* @param {string} id
* @param {string} categoryId
* @param {function(Application, any):void} changeCb
- * @param {boolean} enabled
+ * @param {function(Application) : boolean=} enabledCb
*/
- constructor(id, categoryId, changeCb, enabled) {
+ constructor(id, categoryId, changeCb, enabledCb = null) {
this.id = id;
this.categoryId = categoryId;
this.changeCb = changeCb;
- this.enabled = enabled;
+ this.enabledCb = enabledCb;
/** @type {Application} */
this.app = null;
@@ -39,6 +50,7 @@ export class BaseSetting {
}
/**
+ * Binds all parameters
* @param {Application} app
* @param {HTMLElement} element
* @param {any} dialogs
@@ -49,19 +61,37 @@ export class BaseSetting {
this.dialogs = dialogs;
}
- getHtml() {
+ /**
+ * Returns the HTML for this setting
+ * @param {Application} app
+ */
+ getHtml(app) {
abstract;
return "";
}
+ /**
+ * Returns whether this setting is enabled and available
+ * @param {Application} app
+ */
+ getIsAvailable(app) {
+ return this.enabledCb ? this.enabledCb(app) : true;
+ }
+
syncValueToElement() {
abstract;
}
+ /**
+ * Attempts to modify the setting
+ */
modify() {
abstract;
}
+ /**
+ * Shows the dialog that a restart is required
+ */
showRestartRequiredDialog() {
const { restart } = this.dialogs.showInfo(
T.dialogs.restartRequired.title,
@@ -74,6 +104,7 @@ export class BaseSetting {
}
/**
+ * Validates the set value
* @param {any} value
* @returns {boolean}
*/
@@ -96,10 +127,10 @@ export class EnumSetting extends BaseSetting {
iconPrefix = null,
changeCb = null,
magicValue = null,
- enabled = true,
+ enabledCb = null,
}
) {
- super(id, category, changeCb, enabled);
+ super(id, category, changeCb, enabledCb);
this.options = options;
this.valueGetter = valueGetter;
@@ -110,10 +141,14 @@ export class EnumSetting extends BaseSetting {
this.magicValue = magicValue;
}
- getHtml() {
+ /**
+ * @param {Application} app
+ */
+ getHtml(app) {
+ const available = this.getIsAvailable(app);
return `
-
- ${this.enabled ? "" : `
${T.demo.settingNotAvailable} `}
+
+ ${available ? "" : `
${T.demo.settingNotAvailable} `}
${T.settings.labels[this.id].title}
@@ -180,14 +215,18 @@ export class EnumSetting extends BaseSetting {
}
export class BoolSetting extends BaseSetting {
- constructor(id, category, changeCb = null, enabled = true) {
- super(id, category, changeCb, enabled);
+ constructor(id, category, changeCb = null, enabledCb = null) {
+ super(id, category, changeCb, enabledCb);
}
- getHtml() {
+ /**
+ * @param {Application} app
+ */
+ getHtml(app) {
+ const available = this.getIsAvailable(app);
return `
-
- ${this.enabled ? "" : `
${T.demo.settingNotAvailable} `}
+
+ ${available ? "" : `
${T.demo.settingNotAvailable} `}
${T.settings.labels[this.id].title}
@@ -226,13 +265,13 @@ export class RangeSetting extends BaseSetting {
id,
category,
changeCb = null,
- enabled = true,
defaultValue = 1.0,
minValue = 0,
maxValue = 1.0,
- stepSize = 0.0001
+ stepSize = 0.0001,
+ enabledCb = null
) {
- super(id, category, changeCb, enabled);
+ super(id, category, changeCb, enabledCb);
this.defaultValue = defaultValue;
this.minValue = minValue;
@@ -240,10 +279,14 @@ export class RangeSetting extends BaseSetting {
this.stepSize = stepSize;
}
- getHtml() {
+ /**
+ * @param {Application} app
+ */
+ getHtml(app) {
+ const available = this.getIsAvailable(app);
return `
-
- ${this.enabled ? "" : `
${T.demo.settingNotAvailable} `}
+
+ ${available ? "" : `
${T.demo.settingNotAvailable} `}
${T.settings.labels[this.id].title}
diff --git a/src/js/savegame/savegame.js b/src/js/savegame/savegame.js
index 2a7102a9..0ad630f6 100644
--- a/src/js/savegame/savegame.js
+++ b/src/js/savegame/savegame.js
@@ -1,273 +1,279 @@
-import { ReadWriteProxy } from "../core/read_write_proxy";
-import { ExplainedResult } from "../core/explained_result";
-import { SavegameSerializer } from "./savegame_serializer";
-import { BaseSavegameInterface } from "./savegame_interface";
-import { createLogger } from "../core/logging";
-import { globalConfig } from "../core/config";
-import { getSavegameInterface, savegameInterfaces } from "./savegame_interface_registry";
-import { SavegameInterface_V1001 } from "./schemas/1001";
-import { SavegameInterface_V1002 } from "./schemas/1002";
-import { SavegameInterface_V1003 } from "./schemas/1003";
-import { SavegameInterface_V1004 } from "./schemas/1004";
-import { SavegameInterface_V1005 } from "./schemas/1005";
-
-const logger = createLogger("savegame");
-
-/**
- * @typedef {import("../application").Application} Application
- * @typedef {import("../game/root").GameRoot} GameRoot
- * @typedef {import("./savegame_typedefs").SavegameData} SavegameData
- * @typedef {import("./savegame_typedefs").SavegameMetadata} SavegameMetadata
- * @typedef {import("./savegame_typedefs").SavegameStats} SavegameStats
- * @typedef {import("./savegame_typedefs").SerializedGame} SerializedGame
- */
-
-export class Savegame extends ReadWriteProxy {
- /**
- *
- * @param {Application} app
- * @param {object} param0
- * @param {string} param0.internalId
- * @param {SavegameMetadata} param0.metaDataRef Handle to the meta data
- */
- constructor(app, { internalId, metaDataRef }) {
- super(app, "savegame-" + internalId + ".bin");
- this.internalId = internalId;
- this.metaDataRef = metaDataRef;
-
- /** @type {SavegameData} */
- this.currentData = this.getDefaultData();
-
- assert(
- savegameInterfaces[Savegame.getCurrentVersion()],
- "Savegame interface not defined: " + Savegame.getCurrentVersion()
- );
- }
-
- //////// RW Proxy Impl //////////
-
- /**
- * @returns {number}
- */
- static getCurrentVersion() {
- return 1005;
- }
-
- /**
- * @returns {typeof BaseSavegameInterface}
- */
- static getReaderClass() {
- return savegameInterfaces[Savegame.getCurrentVersion()];
- }
-
- /**
- * @returns {number}
- */
- getCurrentVersion() {
- return /** @type {typeof Savegame} */ (this.constructor).getCurrentVersion();
- }
-
- /**
- * Returns the savegames default data
- * @returns {SavegameData}
- */
- getDefaultData() {
- return {
- version: this.getCurrentVersion(),
- dump: null,
- stats: {},
- lastUpdate: Date.now(),
- };
- }
-
- /**
- * Migrates the savegames data
- * @param {SavegameData} data
- */
- migrate(data) {
- if (data.version < 1000) {
- return ExplainedResult.bad("Can not migrate savegame, too old");
- }
-
- if (data.version === 1000) {
- SavegameInterface_V1001.migrate1000to1001(data);
- data.version = 1001;
- }
-
- if (data.version === 1001) {
- SavegameInterface_V1002.migrate1001to1002(data);
- data.version = 1002;
- }
-
- if (data.version === 1002) {
- SavegameInterface_V1003.migrate1002to1003(data);
- data.version = 1003;
- }
-
- if (data.version === 1003) {
- SavegameInterface_V1004.migrate1003to1004(data);
- data.version = 1004;
- }
-
- if (data.version === 1004) {
- SavegameInterface_V1005.migrate1004to1005(data);
- data.version = 1005;
- }
-
- return ExplainedResult.good();
- }
-
- /**
- * Verifies the savegames data
- * @param {SavegameData} data
- */
- verify(data) {
- if (!data.dump) {
- // Well, guess that works
- return ExplainedResult.good();
- }
-
- if (!this.getDumpReaderForExternalData(data).validate()) {
- return ExplainedResult.bad("dump-reader-failed-validation");
- }
- return ExplainedResult.good();
- }
-
- //////// Subclasses interface ////////
-
- /**
- * Returns if this game can be saved on disc
- * @returns {boolean}
- */
- isSaveable() {
- return true;
- }
- /**
- * Returns the statistics of the savegame
- * @returns {SavegameStats}
- */
- getStatistics() {
- return this.currentData.stats;
- }
-
- /**
- * Returns the *real* last update of the savegame, not the one of the metadata
- * which could also be the servers one
- */
- getRealLastUpdate() {
- return this.currentData.lastUpdate;
- }
-
- /**
- * Returns if this game has a serialized game dump
- */
- hasGameDump() {
- return !!this.currentData.dump && this.currentData.dump.entities.length > 0;
- }
-
- /**
- * Returns the current game dump
- * @returns {SerializedGame}
- */
- getCurrentDump() {
- return this.currentData.dump;
- }
-
- /**
- * Returns a reader to access the data
- * @returns {BaseSavegameInterface}
- */
- getDumpReader() {
- if (!this.currentData.dump) {
- logger.warn("Getting reader on null-savegame dump");
- }
-
- const cls = /** @type {typeof Savegame} */ (this.constructor).getReaderClass();
- return new cls(this.currentData);
- }
-
- /**
- * Returns a reader to access external data
- * @returns {BaseSavegameInterface}
- */
- getDumpReaderForExternalData(data) {
- assert(data.version, "External data contains no version");
- return getSavegameInterface(data);
- }
-
- ///////// Public Interface ///////////
-
- /**
- * Updates the last update field so we can send the savegame to the server,
- * WITHOUT Saving!
- */
- setLastUpdate(time) {
- this.currentData.lastUpdate = time;
- }
-
- /**
- *
- * @param {GameRoot} root
- */
- updateData(root) {
- // Construct a new serializer
- const serializer = new SavegameSerializer();
-
- // let timer = performance.now();
- const dump = serializer.generateDumpFromGameRoot(root);
- if (!dump) {
- return false;
- }
-
- const shadowData = Object.assign({}, this.currentData);
- shadowData.dump = dump;
- shadowData.lastUpdate = new Date().getTime();
- shadowData.version = this.getCurrentVersion();
-
- const reader = this.getDumpReaderForExternalData(shadowData);
-
- // Validate (not in prod though)
- if (!G_IS_RELEASE) {
- const validationResult = reader.validate();
- if (!validationResult) {
- return false;
- }
- }
-
- // Save data
- this.currentData = shadowData;
- }
-
- /**
- * Writes the savegame as well as its metadata
- */
- writeSavegameAndMetadata() {
- return this.writeAsync().then(() => this.saveMetadata());
- }
-
- /**
- * Updates the savegames metadata
- */
- saveMetadata() {
- this.metaDataRef.lastUpdate = new Date().getTime();
- this.metaDataRef.version = this.getCurrentVersion();
- if (!this.hasGameDump()) {
- this.metaDataRef.level = 0;
- } else {
- this.metaDataRef.level = this.currentData.dump.hubGoals.level;
- }
-
- return this.app.savegameMgr.writeAsync();
- }
-
- /**
- * @see ReadWriteProxy.writeAsync
- * @returns {Promise
}
- */
- writeAsync() {
- if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) {
- return Promise.resolve();
- }
- return super.writeAsync();
- }
-}
+import { ReadWriteProxy } from "../core/read_write_proxy";
+import { ExplainedResult } from "../core/explained_result";
+import { SavegameSerializer } from "./savegame_serializer";
+import { BaseSavegameInterface } from "./savegame_interface";
+import { createLogger } from "../core/logging";
+import { globalConfig } from "../core/config";
+import { getSavegameInterface, savegameInterfaces } from "./savegame_interface_registry";
+import { SavegameInterface_V1001 } from "./schemas/1001";
+import { SavegameInterface_V1002 } from "./schemas/1002";
+import { SavegameInterface_V1003 } from "./schemas/1003";
+import { SavegameInterface_V1004 } from "./schemas/1004";
+import { SavegameInterface_V1005 } from "./schemas/1005";
+import { SavegameInterface_V1006 } from "./schemas/1006";
+
+const logger = createLogger("savegame");
+
+/**
+ * @typedef {import("../application").Application} Application
+ * @typedef {import("../game/root").GameRoot} GameRoot
+ * @typedef {import("./savegame_typedefs").SavegameData} SavegameData
+ * @typedef {import("./savegame_typedefs").SavegameMetadata} SavegameMetadata
+ * @typedef {import("./savegame_typedefs").SavegameStats} SavegameStats
+ * @typedef {import("./savegame_typedefs").SerializedGame} SerializedGame
+ */
+
+export class Savegame extends ReadWriteProxy {
+ /**
+ *
+ * @param {Application} app
+ * @param {object} param0
+ * @param {string} param0.internalId
+ * @param {SavegameMetadata} param0.metaDataRef Handle to the meta data
+ */
+ constructor(app, { internalId, metaDataRef }) {
+ super(app, "savegame-" + internalId + ".bin");
+ this.internalId = internalId;
+ this.metaDataRef = metaDataRef;
+
+ /** @type {SavegameData} */
+ this.currentData = this.getDefaultData();
+
+ assert(
+ savegameInterfaces[Savegame.getCurrentVersion()],
+ "Savegame interface not defined: " + Savegame.getCurrentVersion()
+ );
+ }
+
+ //////// RW Proxy Impl //////////
+
+ /**
+ * @returns {number}
+ */
+ static getCurrentVersion() {
+ return 1006;
+ }
+
+ /**
+ * @returns {typeof BaseSavegameInterface}
+ */
+ static getReaderClass() {
+ return savegameInterfaces[Savegame.getCurrentVersion()];
+ }
+
+ /**
+ * @returns {number}
+ */
+ getCurrentVersion() {
+ return /** @type {typeof Savegame} */ (this.constructor).getCurrentVersion();
+ }
+
+ /**
+ * Returns the savegames default data
+ * @returns {SavegameData}
+ */
+ getDefaultData() {
+ return {
+ version: this.getCurrentVersion(),
+ dump: null,
+ stats: {},
+ lastUpdate: Date.now(),
+ };
+ }
+
+ /**
+ * Migrates the savegames data
+ * @param {SavegameData} data
+ */
+ migrate(data) {
+ if (data.version < 1000) {
+ return ExplainedResult.bad("Can not migrate savegame, too old");
+ }
+
+ if (data.version === 1000) {
+ SavegameInterface_V1001.migrate1000to1001(data);
+ data.version = 1001;
+ }
+
+ if (data.version === 1001) {
+ SavegameInterface_V1002.migrate1001to1002(data);
+ data.version = 1002;
+ }
+
+ if (data.version === 1002) {
+ SavegameInterface_V1003.migrate1002to1003(data);
+ data.version = 1003;
+ }
+
+ if (data.version === 1003) {
+ SavegameInterface_V1004.migrate1003to1004(data);
+ data.version = 1004;
+ }
+
+ if (data.version === 1004) {
+ SavegameInterface_V1005.migrate1004to1005(data);
+ data.version = 1005;
+ }
+
+ if (data.version === 1005) {
+ SavegameInterface_V1006.migrate1005to1006(data);
+ data.version = 1006;
+ }
+
+ return ExplainedResult.good();
+ }
+
+ /**
+ * Verifies the savegames data
+ * @param {SavegameData} data
+ */
+ verify(data) {
+ if (!data.dump) {
+ // Well, guess that works
+ return ExplainedResult.good();
+ }
+
+ if (!this.getDumpReaderForExternalData(data).validate()) {
+ return ExplainedResult.bad("dump-reader-failed-validation");
+ }
+ return ExplainedResult.good();
+ }
+
+ //////// Subclasses interface ////////
+
+ /**
+ * Returns if this game can be saved on disc
+ * @returns {boolean}
+ */
+ isSaveable() {
+ return true;
+ }
+ /**
+ * Returns the statistics of the savegame
+ * @returns {SavegameStats}
+ */
+ getStatistics() {
+ return this.currentData.stats;
+ }
+
+ /**
+ * Returns the *real* last update of the savegame, not the one of the metadata
+ * which could also be the servers one
+ */
+ getRealLastUpdate() {
+ return this.currentData.lastUpdate;
+ }
+
+ /**
+ * Returns if this game has a serialized game dump
+ */
+ hasGameDump() {
+ return !!this.currentData.dump && this.currentData.dump.entities.length > 0;
+ }
+
+ /**
+ * Returns the current game dump
+ * @returns {SerializedGame}
+ */
+ getCurrentDump() {
+ return this.currentData.dump;
+ }
+
+ /**
+ * Returns a reader to access the data
+ * @returns {BaseSavegameInterface}
+ */
+ getDumpReader() {
+ if (!this.currentData.dump) {
+ logger.warn("Getting reader on null-savegame dump");
+ }
+
+ const cls = /** @type {typeof Savegame} */ (this.constructor).getReaderClass();
+ return new cls(this.currentData);
+ }
+
+ /**
+ * Returns a reader to access external data
+ * @returns {BaseSavegameInterface}
+ */
+ getDumpReaderForExternalData(data) {
+ assert(data.version, "External data contains no version");
+ return getSavegameInterface(data);
+ }
+
+ ///////// Public Interface ///////////
+
+ /**
+ * Updates the last update field so we can send the savegame to the server,
+ * WITHOUT Saving!
+ */
+ setLastUpdate(time) {
+ this.currentData.lastUpdate = time;
+ }
+
+ /**
+ *
+ * @param {GameRoot} root
+ */
+ updateData(root) {
+ // Construct a new serializer
+ const serializer = new SavegameSerializer();
+
+ // let timer = performance.now();
+ const dump = serializer.generateDumpFromGameRoot(root);
+ if (!dump) {
+ return false;
+ }
+
+ const shadowData = Object.assign({}, this.currentData);
+ shadowData.dump = dump;
+ shadowData.lastUpdate = new Date().getTime();
+ shadowData.version = this.getCurrentVersion();
+
+ const reader = this.getDumpReaderForExternalData(shadowData);
+
+ // Validate (not in prod though)
+ if (!G_IS_RELEASE) {
+ const validationResult = reader.validate();
+ if (!validationResult) {
+ return false;
+ }
+ }
+
+ // Save data
+ this.currentData = shadowData;
+ }
+
+ /**
+ * Writes the savegame as well as its metadata
+ */
+ writeSavegameAndMetadata() {
+ return this.writeAsync().then(() => this.saveMetadata());
+ }
+
+ /**
+ * Updates the savegames metadata
+ */
+ saveMetadata() {
+ this.metaDataRef.lastUpdate = new Date().getTime();
+ this.metaDataRef.version = this.getCurrentVersion();
+ if (!this.hasGameDump()) {
+ this.metaDataRef.level = 0;
+ } else {
+ this.metaDataRef.level = this.currentData.dump.hubGoals.level;
+ }
+
+ return this.app.savegameMgr.writeAsync();
+ }
+
+ /**
+ * @see ReadWriteProxy.writeAsync
+ * @returns {Promise}
+ */
+ writeAsync() {
+ if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) {
+ return Promise.resolve();
+ }
+ return super.writeAsync();
+ }
+}
diff --git a/src/js/savegame/savegame_compressor.js b/src/js/savegame/savegame_compressor.js
index bc14baf7..b0b92aa8 100644
--- a/src/js/savegame/savegame_compressor.js
+++ b/src/js/savegame/savegame_compressor.js
@@ -59,7 +59,13 @@ if (G_IS_DEV) {
}
}
-function compressObjectInternal(obj, keys = [], values = []) {
+/**
+ * @param {any} obj
+ * @param {Map} keys
+ * @param {Map} values
+ * @returns {any[]|object|number|string}
+ */
+function compressObjectInternal(obj, keys, values) {
if (Array.isArray(obj)) {
let result = [];
for (let i = 0; i < obj.length; ++i) {
@@ -69,37 +75,58 @@ function compressObjectInternal(obj, keys = [], values = []) {
} else if (typeof obj === "object" && obj !== null) {
let result = {};
for (const key in obj) {
- let index = keys.indexOf(key);
- if (index < 0) {
- keys.push(key);
- index = keys.length - 1;
+ let index = keys.get(key);
+ if (index === undefined) {
+ index = keys.size;
+ keys.set(key, index);
}
const value = obj[key];
result[compressInt(index)] = compressObjectInternal(value, keys, values);
}
return result;
} else if (typeof obj === "string") {
- let index = values.indexOf(obj);
- if (index < 0) {
- values.push(obj);
- index = values.length - 1;
+ let index = values.get(obj);
+ if (index === undefined) {
+ index = values.size;
+ values.set(obj, index);
}
return compressInt(index);
}
return obj;
}
+/**
+ * @param {Map} hashMap
+ * @returns {Array}
+ */
+function indexMapToArray(hashMap) {
+ const result = new Array(hashMap.size);
+ hashMap.forEach((index, key) => {
+ result[index] = key;
+ });
+ return result;
+}
+
+/**
+ * @param {object} obj
+ */
export function compressObject(obj) {
- const keys = [];
- const values = [];
+ const keys = new Map();
+ const values = new Map();
const data = compressObjectInternal(obj, keys, values);
return {
- keys,
- values,
+ keys: indexMapToArray(keys),
+ values: indexMapToArray(values),
data,
};
}
+/**
+ * @param {object} obj
+ * @param {string[]} keys
+ * @param {any[]} values
+ * @returns {object}
+ */
function decompressObjectInternal(obj, keys = [], values = []) {
if (Array.isArray(obj)) {
let result = [];
@@ -122,6 +149,9 @@ function decompressObjectInternal(obj, keys = [], values = []) {
return obj;
}
+/**
+ * @param {object} obj
+ */
export function decompressObject(obj) {
if (obj.keys && obj.values && obj.data) {
const keys = obj.keys;
diff --git a/src/js/savegame/savegame_interface_registry.js b/src/js/savegame/savegame_interface_registry.js
index fb1df52f..07b5353c 100644
--- a/src/js/savegame/savegame_interface_registry.js
+++ b/src/js/savegame/savegame_interface_registry.js
@@ -1,45 +1,47 @@
-import { BaseSavegameInterface } from "./savegame_interface";
-import { SavegameInterface_V1000 } from "./schemas/1000";
-import { createLogger } from "../core/logging";
-import { SavegameInterface_V1001 } from "./schemas/1001";
-import { SavegameInterface_V1002 } from "./schemas/1002";
-import { SavegameInterface_V1003 } from "./schemas/1003";
-import { SavegameInterface_V1004 } from "./schemas/1004";
-import { SavegameInterface_V1005 } from "./schemas/1005";
-
-/** @type {Object.} */
-export const savegameInterfaces = {
- 1000: SavegameInterface_V1000,
- 1001: SavegameInterface_V1001,
- 1002: SavegameInterface_V1002,
- 1003: SavegameInterface_V1003,
- 1004: SavegameInterface_V1004,
- 1005: SavegameInterface_V1005,
-};
-
-const logger = createLogger("savegame_interface_registry");
-
-/**
- * Returns if the given savegame has any supported interface
- * @param {any} savegame
- * @returns {BaseSavegameInterface|null}
- */
-export function getSavegameInterface(savegame) {
- if (!savegame || !savegame.version) {
- logger.warn("Savegame does not contain a valid version (undefined)");
- return null;
- }
- const version = savegame.version;
- if (!Number.isInteger(version)) {
- logger.warn("Savegame does not contain a valid version (non-integer):", version);
- return null;
- }
-
- const interfaceClass = savegameInterfaces[version];
- if (!interfaceClass) {
- logger.warn("Version", version, "has no implemented interface!");
- return null;
- }
-
- return new interfaceClass(savegame);
-}
+import { BaseSavegameInterface } from "./savegame_interface";
+import { SavegameInterface_V1000 } from "./schemas/1000";
+import { createLogger } from "../core/logging";
+import { SavegameInterface_V1001 } from "./schemas/1001";
+import { SavegameInterface_V1002 } from "./schemas/1002";
+import { SavegameInterface_V1003 } from "./schemas/1003";
+import { SavegameInterface_V1004 } from "./schemas/1004";
+import { SavegameInterface_V1005 } from "./schemas/1005";
+import { SavegameInterface_V1006 } from "./schemas/1006";
+
+/** @type {Object.} */
+export const savegameInterfaces = {
+ 1000: SavegameInterface_V1000,
+ 1001: SavegameInterface_V1001,
+ 1002: SavegameInterface_V1002,
+ 1003: SavegameInterface_V1003,
+ 1004: SavegameInterface_V1004,
+ 1005: SavegameInterface_V1005,
+ 1006: SavegameInterface_V1006,
+};
+
+const logger = createLogger("savegame_interface_registry");
+
+/**
+ * Returns if the given savegame has any supported interface
+ * @param {any} savegame
+ * @returns {BaseSavegameInterface|null}
+ */
+export function getSavegameInterface(savegame) {
+ if (!savegame || !savegame.version) {
+ logger.warn("Savegame does not contain a valid version (undefined)");
+ return null;
+ }
+ const version = savegame.version;
+ if (!Number.isInteger(version)) {
+ logger.warn("Savegame does not contain a valid version (non-integer):", version);
+ return null;
+ }
+
+ const interfaceClass = savegameInterfaces[version];
+ if (!interfaceClass) {
+ logger.warn("Version", version, "has no implemented interface!");
+ return null;
+ }
+
+ return new interfaceClass(savegame);
+}
diff --git a/src/js/savegame/savegame_manager.js b/src/js/savegame/savegame_manager.js
index 52f9dc14..eb0d53d0 100644
--- a/src/js/savegame/savegame_manager.js
+++ b/src/js/savegame/savegame_manager.js
@@ -40,15 +40,8 @@ export class SavegameManager extends ReadWriteProxy {
return 1002;
}
- /**
- * @returns {SavegamesData}
- */
- getCurrentData() {
- return super.getCurrentData();
- }
-
verify(data) {
- // TODO / FIXME!!!!
+ // @TODO
return ExplainedResult.good();
}
@@ -96,6 +89,14 @@ export class SavegameManager extends ReadWriteProxy {
return new Savegame(this.app, { internalId, metaDataRef: metadata });
}
+ /**
+ * Returns if this manager has any savegame of a 1.1.19 version, which
+ * enables all levels
+ */
+ getHasAnyLegacySavegames() {
+ return this.currentData.savegames.some(savegame => savegame.version === 1005 || savegame.level > 14);
+ }
+
/**
* Deletes a savegame
* @param {SavegameMetadata} game
@@ -149,7 +150,9 @@ export class SavegameManager extends ReadWriteProxy {
});
this.currentData.savegames.push(metaData);
- this.sortSavegames();
+
+ // Notice: This is async and happening in the background
+ this.updateAfterSavegamesChanged();
return new Savegame(this.app, {
internalId: id,
@@ -157,8 +160,16 @@ export class SavegameManager extends ReadWriteProxy {
});
}
+ /**
+ * Attempts to import a savegame
+ * @param {object} data
+ */
importSavegame(data) {
const savegame = this.createNewSavegame();
+
+ // Track legacy savegames
+ const isOldSavegame = data.version < 1006;
+
const migrationResult = savegame.migrate(data);
if (migrationResult.isBad()) {
return Promise.reject("Failed to migrate: " + migrationResult.reason);
@@ -170,7 +181,19 @@ export class SavegameManager extends ReadWriteProxy {
return Promise.reject("Verification failed: " + verification.result);
}
- return savegame.writeSavegameAndMetadata().then(() => this.sortSavegames());
+ return savegame
+ .writeSavegameAndMetadata()
+ .then(() => this.updateAfterSavegamesChanged())
+ .then(() => this.app.restrictionMgr.onHasLegacySavegamesChanged(isOldSavegame));
+ }
+
+ /**
+ * Hook after the savegames got changed
+ */
+ updateAfterSavegamesChanged() {
+ return this.sortSavegames()
+ .then(() => this.writeAsync())
+ .then(() => this.app.restrictionMgr.onHasLegacySavegamesChanged(this.getHasAnyLegacySavegames()));
}
/**
@@ -219,7 +242,7 @@ export class SavegameManager extends ReadWriteProxy {
if (G_IS_DEV && globalConfig.debug.disableSavegameWrite) {
return Promise.resolve();
}
- return this.sortSavegames().then(() => this.writeAsync());
+ return this.updateAfterSavegamesChanged();
});
}
}
diff --git a/src/js/savegame/savegame_serializer.js b/src/js/savegame/savegame_serializer.js
index 92db738b..c1247225 100644
--- a/src/js/savegame/savegame_serializer.js
+++ b/src/js/savegame/savegame_serializer.js
@@ -1,146 +1,146 @@
-import { ExplainedResult } from "../core/explained_result";
-import { createLogger } from "../core/logging";
-import { gComponentRegistry } from "../core/global_registries";
-import { SerializerInternal } from "./serializer_internal";
-
-/**
- * @typedef {import("../game/component").Component} Component
- * @typedef {import("../game/component").StaticComponent} StaticComponent
- * @typedef {import("../game/entity").Entity} Entity
- * @typedef {import("../game/root").GameRoot} GameRoot
- * @typedef {import("../savegame/savegame_typedefs").SerializedGame} SerializedGame
- */
-
-const logger = createLogger("savegame_serializer");
-
-/**
- * Serializes a savegame
- */
-export class SavegameSerializer {
- constructor() {
- this.internal = new SerializerInternal();
- }
-
- /**
- * Serializes the game root into a dump
- * @param {GameRoot} root
- * @param {boolean=} sanityChecks Whether to check for validity
- * @returns {object}
- */
- generateDumpFromGameRoot(root, sanityChecks = true) {
- /** @type {SerializedGame} */
- const data = {
- camera: root.camera.serialize(),
- time: root.time.serialize(),
- map: root.map.serialize(),
- entityMgr: root.entityMgr.serialize(),
- hubGoals: root.hubGoals.serialize(),
- pinnedShapes: root.hud.parts.pinnedShapes.serialize(),
- waypoints: root.hud.parts.waypoints.serialize(),
- entities: this.internal.serializeEntityArray(root.entityMgr.entities),
- beltPaths: root.systemMgr.systems.belt.serializePaths(),
- };
-
- if (!G_IS_RELEASE) {
- if (sanityChecks) {
- // Sanity check
- const sanity = this.verifyLogicalErrors(data);
- if (!sanity.result) {
- logger.error("Created invalid savegame:", sanity.reason, "savegame:", data);
- return null;
- }
- }
- }
- return data;
- }
-
- /**
- * Verifies if there are logical errors in the savegame
- * @param {SerializedGame} savegame
- * @returns {ExplainedResult}
- */
- verifyLogicalErrors(savegame) {
- if (!savegame.entities) {
- return ExplainedResult.bad("Savegame has no entities");
- }
-
- const seenUids = [];
-
- // Check for duplicate UIDS
- for (let i = 0; i < savegame.entities.length; ++i) {
- /** @type {Entity} */
- const entity = savegame.entities[i];
-
- const uid = entity.uid;
- if (!Number.isInteger(uid)) {
- return ExplainedResult.bad("Entity has invalid uid: " + uid);
- }
- if (seenUids.indexOf(uid) >= 0) {
- return ExplainedResult.bad("Duplicate uid " + uid);
- }
- seenUids.push(uid);
-
- // Verify components
- if (!entity.components) {
- return ExplainedResult.bad("Entity is missing key 'components': " + JSON.stringify(entity));
- }
-
- const components = entity.components;
- for (const componentId in components) {
- const componentClass = gComponentRegistry.findById(componentId);
-
- // Check component id is known
- if (!componentClass) {
- return ExplainedResult.bad("Unknown component id: " + componentId);
- }
-
- // Verify component data
- const componentData = components[componentId];
- const componentVerifyError = /** @type {StaticComponent} */ (componentClass).verify(
- componentData
- );
-
- // Check component data is ok
- if (componentVerifyError) {
- return ExplainedResult.bad(
- "Component " + componentId + " has invalid data: " + componentVerifyError
- );
- }
- }
- }
-
- return ExplainedResult.good();
- }
-
- /**
- * Tries to load the savegame from a given dump
- * @param {SerializedGame} savegame
- * @param {GameRoot} root
- * @returns {ExplainedResult}
- */
- deserialize(savegame, root) {
- // Sanity
- const verifyResult = this.verifyLogicalErrors(savegame);
- if (!verifyResult.result) {
- return ExplainedResult.bad(verifyResult.reason);
- }
- let errorReason = null;
-
- errorReason = errorReason || root.entityMgr.deserialize(savegame.entityMgr);
- errorReason = errorReason || root.time.deserialize(savegame.time);
- errorReason = errorReason || root.camera.deserialize(savegame.camera);
- errorReason = errorReason || root.map.deserialize(savegame.map);
- errorReason = errorReason || root.hubGoals.deserialize(savegame.hubGoals);
- errorReason = errorReason || root.hud.parts.pinnedShapes.deserialize(savegame.pinnedShapes);
- errorReason = errorReason || root.hud.parts.waypoints.deserialize(savegame.waypoints);
- errorReason = errorReason || this.internal.deserializeEntityArray(root, savegame.entities);
- errorReason = errorReason || root.systemMgr.systems.belt.deserializePaths(savegame.beltPaths);
-
- // Check for errors
- if (errorReason) {
- return ExplainedResult.bad(errorReason);
- }
-
- return ExplainedResult.good();
- }
-}
+import { ExplainedResult } from "../core/explained_result";
+import { createLogger } from "../core/logging";
+import { gComponentRegistry } from "../core/global_registries";
+import { SerializerInternal } from "./serializer_internal";
+
+/**
+ * @typedef {import("../game/component").Component} Component
+ * @typedef {import("../game/component").StaticComponent} StaticComponent
+ * @typedef {import("../game/entity").Entity} Entity
+ * @typedef {import("../game/root").GameRoot} GameRoot
+ * @typedef {import("../savegame/savegame_typedefs").SerializedGame} SerializedGame
+ */
+
+const logger = createLogger("savegame_serializer");
+
+/**
+ * Serializes a savegame
+ */
+export class SavegameSerializer {
+ constructor() {
+ this.internal = new SerializerInternal();
+ }
+
+ /**
+ * Serializes the game root into a dump
+ * @param {GameRoot} root
+ * @param {boolean=} sanityChecks Whether to check for validity
+ * @returns {object}
+ */
+ generateDumpFromGameRoot(root, sanityChecks = true) {
+ /** @type {SerializedGame} */
+ const data = {
+ camera: root.camera.serialize(),
+ time: root.time.serialize(),
+ map: root.map.serialize(),
+ entityMgr: root.entityMgr.serialize(),
+ hubGoals: root.hubGoals.serialize(),
+ pinnedShapes: root.hud.parts.pinnedShapes.serialize(),
+ waypoints: root.hud.parts.waypoints.serialize(),
+ entities: this.internal.serializeEntityArray(root.entityMgr.entities),
+ beltPaths: root.systemMgr.systems.belt.serializePaths(),
+ };
+
+ if (G_IS_DEV) {
+ if (sanityChecks) {
+ // Sanity check
+ const sanity = this.verifyLogicalErrors(data);
+ if (!sanity.result) {
+ logger.error("Created invalid savegame:", sanity.reason, "savegame:", data);
+ return null;
+ }
+ }
+ }
+ return data;
+ }
+
+ /**
+ * Verifies if there are logical errors in the savegame
+ * @param {SerializedGame} savegame
+ * @returns {ExplainedResult}
+ */
+ verifyLogicalErrors(savegame) {
+ if (!savegame.entities) {
+ return ExplainedResult.bad("Savegame has no entities");
+ }
+
+ const seenUids = new Set();
+
+ // Check for duplicate UIDS
+ for (let i = 0; i < savegame.entities.length; ++i) {
+ /** @type {Entity} */
+ const entity = savegame.entities[i];
+
+ const uid = entity.uid;
+ if (!Number.isInteger(uid)) {
+ return ExplainedResult.bad("Entity has invalid uid: " + uid);
+ }
+ if (seenUids.has(uid)) {
+ return ExplainedResult.bad("Duplicate uid " + uid);
+ }
+ seenUids.add(uid);
+
+ // Verify components
+ if (!entity.components) {
+ return ExplainedResult.bad("Entity is missing key 'components': " + JSON.stringify(entity));
+ }
+
+ const components = entity.components;
+ for (const componentId in components) {
+ const componentClass = gComponentRegistry.findById(componentId);
+
+ // Check component id is known
+ if (!componentClass) {
+ return ExplainedResult.bad("Unknown component id: " + componentId);
+ }
+
+ // Verify component data
+ const componentData = components[componentId];
+ const componentVerifyError = /** @type {StaticComponent} */ (componentClass).verify(
+ componentData
+ );
+
+ // Check component data is ok
+ if (componentVerifyError) {
+ return ExplainedResult.bad(
+ "Component " + componentId + " has invalid data: " + componentVerifyError
+ );
+ }
+ }
+ }
+
+ return ExplainedResult.good();
+ }
+
+ /**
+ * Tries to load the savegame from a given dump
+ * @param {SerializedGame} savegame
+ * @param {GameRoot} root
+ * @returns {ExplainedResult}
+ */
+ deserialize(savegame, root) {
+ // Sanity
+ const verifyResult = this.verifyLogicalErrors(savegame);
+ if (!verifyResult.result) {
+ return ExplainedResult.bad(verifyResult.reason);
+ }
+ let errorReason = null;
+
+ errorReason = errorReason || root.entityMgr.deserialize(savegame.entityMgr);
+ errorReason = errorReason || root.time.deserialize(savegame.time);
+ errorReason = errorReason || root.camera.deserialize(savegame.camera);
+ errorReason = errorReason || root.map.deserialize(savegame.map);
+ errorReason = errorReason || root.hubGoals.deserialize(savegame.hubGoals, root);
+ errorReason = errorReason || root.hud.parts.pinnedShapes.deserialize(savegame.pinnedShapes);
+ errorReason = errorReason || root.hud.parts.waypoints.deserialize(savegame.waypoints);
+ errorReason = errorReason || this.internal.deserializeEntityArray(root, savegame.entities);
+ errorReason = errorReason || root.systemMgr.systems.belt.deserializePaths(savegame.beltPaths);
+
+ // Check for errors
+ if (errorReason) {
+ return ExplainedResult.bad(errorReason);
+ }
+
+ return ExplainedResult.good();
+ }
+}
diff --git a/src/js/savegame/schemas/1006.js b/src/js/savegame/schemas/1006.js
new file mode 100644
index 00000000..79226772
--- /dev/null
+++ b/src/js/savegame/schemas/1006.js
@@ -0,0 +1,304 @@
+import { gMetaBuildingRegistry } from "../../core/global_registries.js";
+import { createLogger } from "../../core/logging.js";
+import { enumBalancerVariants, MetaBalancerBuilding } from "../../game/buildings/balancer.js";
+import { MetaBeltBuilding } from "../../game/buildings/belt.js";
+import { enumCutterVariants, MetaCutterBuilding } from "../../game/buildings/cutter.js";
+import { MetaHubBuilding } from "../../game/buildings/hub.js";
+import { enumMinerVariants, MetaMinerBuilding } from "../../game/buildings/miner.js";
+import { MetaMixerBuilding } from "../../game/buildings/mixer.js";
+import { enumPainterVariants, MetaPainterBuilding } from "../../game/buildings/painter.js";
+import { enumRotaterVariants, MetaRotaterBuilding } from "../../game/buildings/rotater.js";
+import { MetaStackerBuilding } from "../../game/buildings/stacker.js";
+import { MetaStorageBuilding } from "../../game/buildings/storage.js";
+import { MetaTrashBuilding } from "../../game/buildings/trash.js";
+import {
+ enumUndergroundBeltVariants,
+ MetaUndergroundBeltBuilding,
+} from "../../game/buildings/underground_belt.js";
+import { getCodeFromBuildingData } from "../../game/building_codes.js";
+import { StaticMapEntityComponent } from "../../game/components/static_map_entity.js";
+import { Entity } from "../../game/entity.js";
+import { defaultBuildingVariant, MetaBuilding } from "../../game/meta_building.js";
+import { SavegameInterface_V1005 } from "./1005.js";
+
+const schema = require("./1006.json");
+const logger = createLogger("savegame_interface/1006");
+
+/**
+ *
+ * @param {typeof MetaBuilding} metaBuilding
+ * @param {string=} variant
+ * @param {number=} rotationVariant
+ */
+function findCode(metaBuilding, variant = defaultBuildingVariant, rotationVariant = 0) {
+ return getCodeFromBuildingData(gMetaBuildingRegistry.findByClass(metaBuilding), variant, rotationVariant);
+}
+
+/**
+ * Rebalances a value from the old balancing to the new one
+ * @param {number} value
+ * @returns {number}
+ */
+function rebalance(value) {
+ return Math.round(Math.pow(value, 0.75));
+}
+
+export class SavegameInterface_V1006 extends SavegameInterface_V1005 {
+ getVersion() {
+ return 1006;
+ }
+
+ getSchemaUncached() {
+ return schema;
+ }
+
+ static computeSpriteMapping() {
+ return {
+ // Belt
+ "sprites/blueprints/belt_top.png": findCode(MetaBeltBuilding, defaultBuildingVariant, 0),
+ "sprites/blueprints/belt_left.png": findCode(MetaBeltBuilding, defaultBuildingVariant, 1),
+ "sprites/blueprints/belt_right.png": findCode(MetaBeltBuilding, defaultBuildingVariant, 2),
+
+ // Splitter (=Balancer)
+ "sprites/blueprints/splitter.png": findCode(MetaBalancerBuilding),
+ "sprites/blueprints/splitter-compact.png": findCode(
+ MetaBalancerBuilding,
+ enumBalancerVariants.merger
+ ),
+ "sprites/blueprints/splitter-compact-inverse.png": findCode(
+ MetaBalancerBuilding,
+ enumBalancerVariants.mergerInverse
+ ),
+
+ // Underground belt
+ "sprites/blueprints/underground_belt_entry.png": findCode(
+ MetaUndergroundBeltBuilding,
+ defaultBuildingVariant,
+ 0
+ ),
+ "sprites/blueprints/underground_belt_exit.png": findCode(
+ MetaUndergroundBeltBuilding,
+ defaultBuildingVariant,
+ 1
+ ),
+
+ "sprites/blueprints/underground_belt_entry-tier2.png": findCode(
+ MetaUndergroundBeltBuilding,
+ enumUndergroundBeltVariants.tier2,
+ 0
+ ),
+ "sprites/blueprints/underground_belt_exit-tier2.png": findCode(
+ MetaUndergroundBeltBuilding,
+ enumUndergroundBeltVariants.tier2,
+ 1
+ ),
+
+ // Miner
+ "sprites/blueprints/miner.png": findCode(MetaMinerBuilding),
+ "sprites/blueprints/miner-chainable.png": findCode(
+ MetaMinerBuilding,
+ enumMinerVariants.chainable,
+ 0
+ ),
+
+ // Cutter
+ "sprites/blueprints/cutter.png": findCode(MetaCutterBuilding),
+ "sprites/blueprints/cutter-quad.png": findCode(MetaCutterBuilding, enumCutterVariants.quad),
+
+ // Rotater
+ "sprites/blueprints/rotater.png": findCode(MetaRotaterBuilding),
+ "sprites/blueprints/rotater-ccw.png": findCode(MetaRotaterBuilding, enumRotaterVariants.ccw),
+
+ // Stacker
+ "sprites/blueprints/stacker.png": findCode(MetaStackerBuilding),
+
+ // Mixer
+ "sprites/blueprints/mixer.png": findCode(MetaMixerBuilding),
+
+ // Painter
+ "sprites/blueprints/painter.png": findCode(MetaPainterBuilding),
+ "sprites/blueprints/painter-mirrored.png": findCode(
+ MetaPainterBuilding,
+ enumPainterVariants.mirrored
+ ),
+ "sprites/blueprints/painter-double.png": findCode(
+ MetaPainterBuilding,
+ enumPainterVariants.double
+ ),
+ "sprites/blueprints/painter-quad.png": findCode(MetaPainterBuilding, enumPainterVariants.quad),
+
+ // Trash
+ "sprites/blueprints/trash.png": findCode(MetaTrashBuilding),
+
+ // Storage
+ "sprites/blueprints/trash-storage.png": findCode(MetaStorageBuilding),
+ };
+ }
+
+ /**
+ * @param {import("../savegame_typedefs.js").SavegameData} data
+ */
+ static migrate1005to1006(data) {
+ logger.log("Migrating 1005 to 1006");
+ const dump = data.dump;
+ if (!dump) {
+ return true;
+ }
+
+ // Reduce stored shapes
+ const stored = dump.hubGoals.storedShapes;
+ for (const shapeKey in stored) {
+ stored[shapeKey] = rebalance(stored[shapeKey]);
+ }
+
+ // Reset final game shape
+ stored["RuCw--Cw:----Ru--"] = 0;
+
+ // Reduce goals
+ if (dump.hubGoals.currentGoal) {
+ dump.hubGoals.currentGoal.required = rebalance(dump.hubGoals.currentGoal.required);
+ }
+
+ let level = Math.min(19, dump.hubGoals.level);
+
+ const levelMapping = {
+ 14: 15,
+ 15: 16,
+ 16: 17,
+ 17: 18,
+ 18: 19,
+ 19: 20,
+ };
+
+ dump.hubGoals.level = levelMapping[level] || level;
+
+ // Update entities
+ const entities = dump.entities;
+ for (let i = 0; i < entities.length; ++i) {
+ const entity = entities[i];
+ const components = entity.components;
+ this.migrateStaticComp1005to1006(entity);
+
+ // HUB
+ if (components.Hub) {
+ // @ts-ignore
+ components.Hub = {};
+ }
+
+ // Item Processor
+ if (components.ItemProcessor) {
+ // @ts-ignore
+ components.ItemProcessor = {
+ nextOutputSlot: 0,
+ };
+ }
+
+ // OLD: Unremovable component
+ // @ts-ignore
+ if (components.Unremovable) {
+ // @ts-ignore
+ delete components.Unremovable;
+ }
+
+ // OLD: ReplaceableMapEntity
+ // @ts-ignore
+ if (components.ReplaceableMapEntity) {
+ // @ts-ignore
+ delete components.ReplaceableMapEntity;
+ }
+
+ // ItemAcceptor
+ if (components.ItemAcceptor) {
+ // @ts-ignore
+ components.ItemAcceptor = {};
+ }
+
+ // Belt
+ if (components.Belt) {
+ // @ts-ignore
+ components.Belt = {};
+ }
+
+ // Item Ejector
+ if (components.ItemEjector) {
+ // @ts-ignore
+ components.ItemEjector = {
+ slots: [],
+ };
+ }
+
+ // UndergroundBelt
+ if (components.UndergroundBelt) {
+ // @ts-ignore
+ components.UndergroundBelt = {
+ pendingItems: [],
+ };
+ }
+
+ // Miner
+ if (components.Miner) {
+ // @ts-ignore
+ delete components.Miner.chainable;
+
+ components.Miner.lastMiningTime = 0;
+ components.Miner.itemChainBuffer = [];
+ }
+
+ // Storage
+ if (components.Storage) {
+ // @ts-ignore
+ components.Storage = {
+ storedCount: rebalance(components.Storage.storedCount),
+ storedItem: null,
+ };
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {Entity} entity
+ */
+ static migrateStaticComp1005to1006(entity) {
+ const spriteMapping = this.computeSpriteMapping();
+ const staticComp = entity.components.StaticMapEntity;
+
+ /** @type {StaticMapEntityComponent} */
+ const newStaticComp = {};
+ newStaticComp.origin = staticComp.origin;
+ newStaticComp.originalRotation = staticComp.originalRotation;
+ newStaticComp.rotation = staticComp.rotation;
+
+ // @ts-ignore
+ newStaticComp.code = spriteMapping[staticComp.blueprintSpriteKey];
+
+ // Hub special case
+ if (entity.components.Hub) {
+ newStaticComp.code = findCode(MetaHubBuilding);
+ }
+
+ // Belt special case
+ if (entity.components.Belt) {
+ const actualCode = {
+ top: findCode(MetaBeltBuilding, defaultBuildingVariant, 0),
+ left: findCode(MetaBeltBuilding, defaultBuildingVariant, 1),
+ right: findCode(MetaBeltBuilding, defaultBuildingVariant, 2),
+ }[entity.components.Belt.direction];
+ if (actualCode !== newStaticComp.code) {
+ if (G_IS_DEV) {
+ console.warn("Belt mismatch");
+ }
+ newStaticComp.code = actualCode;
+ }
+ }
+
+ if (!newStaticComp.code) {
+ throw new Error(
+ // @ts-ignore
+ "1006 Migration: Could not reconstruct code for " + staticComp.blueprintSpriteKey
+ );
+ }
+
+ entity.components.StaticMapEntity = newStaticComp;
+ }
+}
diff --git a/src/js/savegame/schemas/1006.json b/src/js/savegame/schemas/1006.json
new file mode 100644
index 00000000..b0916986
--- /dev/null
+++ b/src/js/savegame/schemas/1006.json
@@ -0,0 +1,5 @@
+{
+ "type": "object",
+ "required": [],
+ "additionalProperties": true
+}
diff --git a/src/js/savegame/serialization.js b/src/js/savegame/serialization.js
index 9f998a0f..801b26ab 100644
--- a/src/js/savegame/serialization.js
+++ b/src/js/savegame/serialization.js
@@ -1,344 +1,351 @@
-import { createLogger } from "../core/logging";
-import {
- BaseDataType,
- TypeArray,
- TypeBoolean,
- TypeClass,
- TypeClassData,
- TypeClassFromMetaclass,
- TypeClassId,
- TypeEntity,
- TypeEntityWeakref,
- TypeEnum,
- TypeFixedClass,
- TypeInteger,
- TypeKeyValueMap,
- TypeMetaClass,
- TypeNullable,
- TypeNumber,
- TypePair,
- TypePositiveInteger,
- TypePositiveNumber,
- TypeString,
- TypeStructuredObject,
- TypeVector,
-} from "./serialization_data_types";
-
-const logger = createLogger("serialization");
-
-// Schema declarations
-export const types = {
- int: new TypeInteger(),
- uint: new TypePositiveInteger(),
- float: new TypeNumber(),
- ufloat: new TypePositiveNumber(),
- string: new TypeString(),
- entity: new TypeEntity(),
- weakEntityRef: new TypeEntityWeakref(),
- vector: new TypeVector(),
- tileVector: new TypeVector(),
- bool: new TypeBoolean(),
-
- /**
- * @param {BaseDataType} wrapped
- */
- nullable(wrapped) {
- return new TypeNullable(wrapped);
- },
-
- /**
- * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry
- */
- classId(registry) {
- return new TypeClassId(registry);
- },
- /**
- * @param {BaseDataType} valueType
- * @param {boolean=} includeEmptyValues
- */
- keyValueMap(valueType, includeEmptyValues = true) {
- return new TypeKeyValueMap(valueType, includeEmptyValues);
- },
-
- /**
- * @param {Object} values
- */
- enum(values) {
- return new TypeEnum(values);
- },
-
- /**
- * @param {FactoryTemplate<*>} registry
- * @param {(GameRoot, any) => object=} resolver
- */
- obj(registry, resolver = null) {
- return new TypeClass(registry, resolver);
- },
-
- /**
- * @param {FactoryTemplate<*>} registry
- */
- objData(registry) {
- return new TypeClassData(registry);
- },
-
- /**
- * @param {typeof BasicSerializableObject} cls
- */
- knownType(cls) {
- return new TypeFixedClass(cls);
- },
-
- /**
- * @param {BaseDataType} innerType
- */
- array(innerType) {
- return new TypeArray(innerType);
- },
-
- /**
- * @param {SingletonFactoryTemplate<*>} innerType
- */
- classRef(registry) {
- return new TypeMetaClass(registry);
- },
-
- /**
- * @param {Object.} descriptor
- */
- structured(descriptor) {
- return new TypeStructuredObject(descriptor);
- },
-
- /**
- * @param {BaseDataType} a
- * @param {BaseDataType} b
- */
- pair(a, b) {
- return new TypePair(a, b);
- },
-
- /**
- * @param {typeof BasicSerializableObject} classHandle
- * @param {SingletonFactoryTemplate<*>} registry
- */
- classWithMetaclass(classHandle, registry) {
- return new TypeClassFromMetaclass(classHandle, registry);
- },
-};
-
-/**
- * A full schema declaration
- * @typedef {Object.} Schema
- */
-
-const globalSchemaCache = {};
-
-/* dev:start */
-const classnamesCache = {};
-/* dev:end*/
-
-export class BasicSerializableObject {
- /* dev:start */
- /**
- * Fixes typeof DerivedComponent is not assignable to typeof Component, compiled out
- * in non-dev builds
- */
- constructor(...args) {}
-
- /* dev:end */
-
- static getId() {
- abstract;
- }
-
- /**
- * Should return the serialization schema
- * @returns {Schema}
- */
- static getSchema() {
- return {};
- }
-
- // Implementation
- /** @returns {Schema} */
- static getCachedSchema() {
- const id = this.getId();
-
- /* dev:start */
- assert(
- classnamesCache[id] === this || classnamesCache[id] === undefined,
- "Class name taken twice: " + id + " (from " + this.name + ")"
- );
- classnamesCache[id] = this;
- /* dev:end */
-
- const entry = globalSchemaCache[id];
- if (entry) {
- return entry;
- }
-
- const schema = this.getSchema();
- globalSchemaCache[id] = schema;
- return schema;
- }
-
- /** @returns {object} */
- serialize() {
- return serializeSchema(
- this,
- /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema()
- );
- }
-
- /**
- * @param {any} data
- * @param {import("./savegame_serializer").GameRoot} root
- * @returns {string|void}
- */
- deserialize(data, root = null) {
- return deserializeSchema(
- this,
- /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema(),
- data,
- null,
- root
- );
- }
-
- /** @returns {string|void} */
- static verify(data) {
- return verifySchema(this.getCachedSchema(), data);
- }
-}
-
-/**
- * Serializes an object using the given schema, mergin with the given properties
- * @param {object} obj The object to serialize
- * @param {Schema} schema The schema to use
- * @param {object=} mergeWith Any additional properties to merge with the schema, useful for super calls
- * @returns {object} Serialized data object
- */
-export function serializeSchema(obj, schema, mergeWith = {}) {
- for (const key in schema) {
- if (!obj.hasOwnProperty(key)) {
- logger.error("Invalid schema, property", key, "does not exist on", obj, "(schema=", schema, ")");
- assert(
- obj.hasOwnProperty(key),
- "serialization: invalid schema, property does not exist on object: " + key
- );
- }
- if (!schema[key]) {
- assert(false, "Invalid schema (bad key '" + key + "'): " + JSON.stringify(schema));
- }
-
- if (G_IS_DEV) {
- try {
- mergeWith[key] = schema[key].serialize(obj[key]);
- } catch (ex) {
- logger.error(
- "Serialization of",
- obj,
- "failed on key '" + key + "' ->",
- ex,
- "(schema was",
- schema,
- ")"
- );
- throw ex;
- }
- } else {
- mergeWith[key] = schema[key].serialize(obj[key]);
- }
- }
- return mergeWith;
-}
-
-/**
- * Deserializes data into an object
- * @param {object} obj The object to store the deserialized data into
- * @param {Schema} schema The schema to use
- * @param {object} data The serialized data
- * @param {string|void|null=} baseclassErrorResult Convenience, if this is a string error code, do nothing and return it
- * @param {import("../game/root").GameRoot=} root Optional game root reference
- * @returns {string|void} String error code or nothing on success
- */
-export function deserializeSchema(obj, schema, data, baseclassErrorResult = null, root) {
- if (baseclassErrorResult) {
- return baseclassErrorResult;
- }
-
- if (!data) {
- logger.error("Got 'NULL' data for", obj, "and schema", schema, "!");
- return "Got null data";
- }
-
- for (const key in schema) {
- if (!data.hasOwnProperty(key)) {
- logger.error("Data", data, "does not contain", key, "(schema:", schema, ")");
- return "Missing key in schema: " + key + " of class " + obj.constructor.name;
- }
- if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) {
- logger.error("Data", data, "has null value for", key, "(schema:", schema, ")");
- return "Non-nullable entry is null: " + key + " of class " + obj.constructor.name;
- }
-
- const errorStatus = schema[key].deserializeWithVerify(data[key], obj, key, obj.root || root);
- if (errorStatus) {
- logger.error(
- "Deserialization failed with error '" + errorStatus + "' on object",
- obj,
- "and key",
- key,
- "(root? =",
- obj.root ? "y" : "n",
- ")"
- );
- return errorStatus;
- }
- }
-}
-
-/**
- * Verifies stored data using the given schema
- * @param {Schema} schema The schema to use
- * @param {object} data The data to verify
- * @returns {string|void} String error code or nothing on success
- */
-export function verifySchema(schema, data) {
- for (const key in schema) {
- if (!data.hasOwnProperty(key)) {
- logger.error("Data", data, "does not contain", key, "(schema:", schema, ")");
- return "verify: missing key required by schema in stored data: " + key;
- }
- if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) {
- logger.error("Data", data, "has null value for", key, "(schema:", schema, ")");
- return "verify: non-nullable entry is null: " + key;
- }
-
- const errorStatus = schema[key].verifySerializedValue(data[key]);
- if (errorStatus) {
- logger.error(errorStatus);
- return "verify: " + errorStatus;
- }
- }
-}
-
-/**
- * Extends a schema by adding the properties from the new schema to the existing base schema
- * @param {Schema} base
- * @param {Schema} newOne
- * @returns {Schema}
- */
-export function extendSchema(base, newOne) {
- /** @type {Schema} */
- const result = Object.assign({}, base);
- for (const key in newOne) {
- if (result.hasOwnProperty(key)) {
- logger.error("Extend schema got duplicate key:", key);
- continue;
- }
- result[key] = newOne[key];
- }
- return result;
-}
+import { createLogger } from "../core/logging";
+import {
+ BaseDataType,
+ TypeArray,
+ TypeBoolean,
+ TypeClass,
+ TypeClassData,
+ TypeClassFromMetaclass,
+ TypeClassId,
+ TypeEntity,
+ TypeEntityWeakref,
+ TypeEnum,
+ TypeFixedClass,
+ TypeInteger,
+ TypeKeyValueMap,
+ TypeMetaClass,
+ TypeNullable,
+ TypeNumber,
+ TypePair,
+ TypePositiveInteger,
+ TypePositiveNumber,
+ TypeString,
+ TypeStructuredObject,
+ TypeVector,
+} from "./serialization_data_types";
+
+const logger = createLogger("serialization");
+
+// Schema declarations
+export const types = {
+ int: new TypeInteger(),
+ uint: new TypePositiveInteger(),
+ float: new TypeNumber(),
+ ufloat: new TypePositiveNumber(),
+ string: new TypeString(),
+ entity: new TypeEntity(),
+ weakEntityRef: new TypeEntityWeakref(),
+ vector: new TypeVector(),
+ tileVector: new TypeVector(),
+ bool: new TypeBoolean(),
+
+ /**
+ * @param {BaseDataType} wrapped
+ */
+ nullable(wrapped) {
+ return new TypeNullable(wrapped);
+ },
+
+ /**
+ * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry
+ */
+ classId(registry) {
+ return new TypeClassId(registry);
+ },
+ /**
+ * @param {BaseDataType} valueType
+ * @param {boolean=} includeEmptyValues
+ */
+ keyValueMap(valueType, includeEmptyValues = true) {
+ return new TypeKeyValueMap(valueType, includeEmptyValues);
+ },
+
+ /**
+ * @param {Object} values
+ */
+ enum(values) {
+ return new TypeEnum(values);
+ },
+
+ /**
+ * @param {FactoryTemplate<*>} registry
+ * @param {(GameRoot, any) => object=} resolver
+ */
+ obj(registry, resolver = null) {
+ return new TypeClass(registry, resolver);
+ },
+
+ /**
+ * @param {FactoryTemplate<*>} registry
+ */
+ objData(registry) {
+ return new TypeClassData(registry);
+ },
+
+ /**
+ * @param {typeof BasicSerializableObject} cls
+ */
+ knownType(cls) {
+ return new TypeFixedClass(cls);
+ },
+
+ /**
+ * @param {BaseDataType} innerType
+ */
+ array(innerType) {
+ return new TypeArray(innerType);
+ },
+
+ /**
+ * @param {BaseDataType} innerType
+ */
+ fixedSizeArray(innerType) {
+ return new TypeArray(innerType, true);
+ },
+
+ /**
+ * @param {SingletonFactoryTemplate<*>} innerType
+ */
+ classRef(registry) {
+ return new TypeMetaClass(registry);
+ },
+
+ /**
+ * @param {Object.} descriptor
+ */
+ structured(descriptor) {
+ return new TypeStructuredObject(descriptor);
+ },
+
+ /**
+ * @param {BaseDataType} a
+ * @param {BaseDataType} b
+ */
+ pair(a, b) {
+ return new TypePair(a, b);
+ },
+
+ /**
+ * @param {typeof BasicSerializableObject} classHandle
+ * @param {SingletonFactoryTemplate<*>} registry
+ */
+ classWithMetaclass(classHandle, registry) {
+ return new TypeClassFromMetaclass(classHandle, registry);
+ },
+};
+
+/**
+ * A full schema declaration
+ * @typedef {Object.} Schema
+ */
+
+const globalSchemaCache = {};
+
+/* dev:start */
+const classnamesCache = {};
+/* dev:end*/
+
+export class BasicSerializableObject {
+ /* dev:start */
+ /**
+ * Fixes typeof DerivedComponent is not assignable to typeof Component, compiled out
+ * in non-dev builds
+ */
+ constructor(...args) {}
+
+ /* dev:end */
+
+ static getId() {
+ abstract;
+ }
+
+ /**
+ * Should return the serialization schema
+ * @returns {Schema}
+ */
+ static getSchema() {
+ return {};
+ }
+
+ // Implementation
+ /** @returns {Schema} */
+ static getCachedSchema() {
+ const id = this.getId();
+
+ /* dev:start */
+ assert(
+ classnamesCache[id] === this || classnamesCache[id] === undefined,
+ "Class name taken twice: " + id + " (from " + this.name + ")"
+ );
+ classnamesCache[id] = this;
+ /* dev:end */
+
+ const entry = globalSchemaCache[id];
+ if (entry) {
+ return entry;
+ }
+
+ const schema = this.getSchema();
+ globalSchemaCache[id] = schema;
+ return schema;
+ }
+
+ /** @returns {object} */
+ serialize() {
+ return serializeSchema(
+ this,
+ /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema()
+ );
+ }
+
+ /**
+ * @param {any} data
+ * @param {import("./savegame_serializer").GameRoot} root
+ * @returns {string|void}
+ */
+ deserialize(data, root = null) {
+ return deserializeSchema(
+ this,
+ /** @type {typeof BasicSerializableObject} */ (this.constructor).getCachedSchema(),
+ data,
+ null,
+ root
+ );
+ }
+
+ /** @returns {string|void} */
+ static verify(data) {
+ return verifySchema(this.getCachedSchema(), data);
+ }
+}
+
+/**
+ * Serializes an object using the given schema, mergin with the given properties
+ * @param {object} obj The object to serialize
+ * @param {Schema} schema The schema to use
+ * @param {object=} mergeWith Any additional properties to merge with the schema, useful for super calls
+ * @returns {object} Serialized data object
+ */
+export function serializeSchema(obj, schema, mergeWith = {}) {
+ for (const key in schema) {
+ if (!obj.hasOwnProperty(key)) {
+ logger.error("Invalid schema, property", key, "does not exist on", obj, "(schema=", schema, ")");
+ assert(
+ obj.hasOwnProperty(key),
+ "serialization: invalid schema, property does not exist on object: " + key
+ );
+ }
+ if (!schema[key]) {
+ assert(false, "Invalid schema (bad key '" + key + "'): " + JSON.stringify(schema));
+ }
+
+ if (G_IS_DEV) {
+ try {
+ mergeWith[key] = schema[key].serialize(obj[key]);
+ } catch (ex) {
+ logger.error(
+ "Serialization of",
+ obj,
+ "failed on key '" + key + "' ->",
+ ex,
+ "(schema was",
+ schema,
+ ")"
+ );
+ throw ex;
+ }
+ } else {
+ mergeWith[key] = schema[key].serialize(obj[key]);
+ }
+ }
+ return mergeWith;
+}
+
+/**
+ * Deserializes data into an object
+ * @param {object} obj The object to store the deserialized data into
+ * @param {Schema} schema The schema to use
+ * @param {object} data The serialized data
+ * @param {string|void|null=} baseclassErrorResult Convenience, if this is a string error code, do nothing and return it
+ * @param {import("../game/root").GameRoot=} root Optional game root reference
+ * @returns {string|void} String error code or nothing on success
+ */
+export function deserializeSchema(obj, schema, data, baseclassErrorResult = null, root) {
+ if (baseclassErrorResult) {
+ return baseclassErrorResult;
+ }
+
+ if (!data) {
+ logger.error("Got 'NULL' data for", obj, "and schema", schema, "!");
+ return "Got null data";
+ }
+
+ for (const key in schema) {
+ if (!data.hasOwnProperty(key)) {
+ logger.error("Data", data, "does not contain", key, "(schema:", schema, ")");
+ return "Missing key in schema: " + key + " of class " + obj.constructor.name;
+ }
+ if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) {
+ logger.error("Data", data, "has null value for", key, "(schema:", schema, ")");
+ return "Non-nullable entry is null: " + key + " of class " + obj.constructor.name;
+ }
+
+ const errorStatus = schema[key].deserializeWithVerify(data[key], obj, key, obj.root || root);
+ if (errorStatus) {
+ logger.error(
+ "Deserialization failed with error '" + errorStatus + "' on object",
+ obj,
+ "and key",
+ key,
+ "(root? =",
+ obj.root ? "y" : "n",
+ ")"
+ );
+ return errorStatus;
+ }
+ }
+}
+
+/**
+ * Verifies stored data using the given schema
+ * @param {Schema} schema The schema to use
+ * @param {object} data The data to verify
+ * @returns {string|void} String error code or nothing on success
+ */
+export function verifySchema(schema, data) {
+ for (const key in schema) {
+ if (!data.hasOwnProperty(key)) {
+ logger.error("Data", data, "does not contain", key, "(schema:", schema, ")");
+ return "verify: missing key required by schema in stored data: " + key;
+ }
+ if (!schema[key].allowNull() && (data[key] === null || data[key] === undefined)) {
+ logger.error("Data", data, "has null value for", key, "(schema:", schema, ")");
+ return "verify: non-nullable entry is null: " + key;
+ }
+
+ const errorStatus = schema[key].verifySerializedValue(data[key]);
+ if (errorStatus) {
+ logger.error(errorStatus);
+ return "verify: " + errorStatus;
+ }
+ }
+}
+
+/**
+ * Extends a schema by adding the properties from the new schema to the existing base schema
+ * @param {Schema} base
+ * @param {Schema} newOne
+ * @returns {Schema}
+ */
+export function extendSchema(base, newOne) {
+ /** @type {Schema} */
+ const result = Object.assign({}, base);
+ for (const key in newOne) {
+ if (result.hasOwnProperty(key)) {
+ logger.error("Extend schema got duplicate key:", key);
+ continue;
+ }
+ result[key] = newOne[key];
+ }
+ return result;
+}
diff --git a/src/js/savegame/serialization_data_types.js b/src/js/savegame/serialization_data_types.js
index 9fb53bb8..9d3b689f 100644
--- a/src/js/savegame/serialization_data_types.js
+++ b/src/js/savegame/serialization_data_types.js
@@ -1,1292 +1,1295 @@
-/* typehints:start */
-import { GameRoot } from "../game/root";
-import { BasicSerializableObject } from "./serialization";
-/* typehints:end */
-
-import { Vector } from "../core/vector";
-import { round4Digits } from "../core/utils";
-export const globalJsonSchemaDefs = {};
-
-/**
- *
- * @param {import("./serialization").Schema} schema
- */
-export function schemaToJsonSchema(schema) {
- const jsonSchema = {
- type: "object",
- additionalProperties: false,
- required: [],
- properties: {},
- };
-
- for (const key in schema) {
- const subSchema = schema[key].getAsJsonSchema();
- jsonSchema.required.push(key);
- jsonSchema.properties[key] = subSchema;
- }
-
- return jsonSchema;
-}
-
-/**
- * Helper function to create a json schema object
- * @param {any} properties
- */
-function schemaObject(properties) {
- return {
- type: "object",
- required: Object.keys(properties).slice(),
- additionalProperties: false,
- properties,
- };
-}
-
-/**
- * Base serialization data type
- */
-export class BaseDataType {
- /**
- * Serializes a given raw value
- * @param {any} value
- */
- serialize(value) {
- abstract;
- return {};
- }
-
- /**
- * Verifies a given serialized value
- * @param {any} value
- * @returns {string|void} String error code or null on success
- */
- verifySerializedValue(value) {}
-
- /**
- * Deserializes a serialized value into the target object under the given key
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- abstract;
- }
-
- /**
- * Returns the json schema
- */
- getAsJsonSchema() {
- const key = this.getCacheKey();
- const schema = this.getAsJsonSchemaUncached();
-
- if (!globalJsonSchemaDefs[key]) {
- // schema.$id = key;
- globalJsonSchemaDefs[key] = schema;
- }
-
- return {
- $ref: "#/definitions/" + key,
- };
- }
-
- /**
- * INTERNAL Should return the json schema representation
- */
- getAsJsonSchemaUncached() {
- abstract;
- }
-
- /**
- * Returns whether null values are okay
- * @returns {boolean}
- */
- allowNull() {
- return false;
- }
-
- // Helper methods
-
- /**
- * Deserializes a serialized value, but performs integrity checks before
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserializeWithVerify(value, targetObject, targetKey, root) {
- const errorCode = this.verifySerializedValue(value);
- if (errorCode) {
- return (
- "serialization verify failed: " +
- errorCode +
- " [value " +
- JSON.stringify(value).substr(0, 100) +
- "]"
- );
- }
- return this.deserialize(value, targetObject, targetKey, root);
- }
-
- /**
- * Should return a cacheable key
- */
- getCacheKey() {
- abstract;
- return "";
- }
-}
-
-export class TypeInteger extends BaseDataType {
- serialize(value) {
- assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value);
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "integer",
- };
- }
-
- verifySerializedValue(value) {
- if (!Number.isInteger(value)) {
- return "Not a valid number";
- }
- }
-
- getCacheKey() {
- return "int";
- }
-}
-
-export class TypePositiveInteger extends BaseDataType {
- serialize(value) {
- assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value);
- assert(value >= 0, "value < 0: " + value);
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "integer",
- minimum: 0,
- };
- }
-
- verifySerializedValue(value) {
- if (!Number.isInteger(value)) {
- return "Not a valid number";
- }
- if (value < 0) {
- return "Negative value for positive integer";
- }
- }
-
- getCacheKey() {
- return "uint";
- }
-}
-
-export class TypeBoolean extends BaseDataType {
- serialize(value) {
- assert(value === true || value === false, "Type bool got non bool for serialize: " + value);
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "boolean",
- };
- }
-
- verifySerializedValue(value) {
- if (value !== true && value !== false) {
- return "Not a boolean";
- }
- }
-
- getCacheKey() {
- return "bool";
- }
-}
-
-export class TypeString extends BaseDataType {
- serialize(value) {
- assert(typeof value === "string", "Type string got non string for serialize: " + value);
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
- getAsJsonSchemaUncached() {
- return {
- type: "string",
- };
- }
-
- verifySerializedValue(value) {
- if (typeof value !== "string") {
- return "Not a valid string";
- }
- }
-
- getCacheKey() {
- return "string";
- }
-}
-
-export class TypeVector extends BaseDataType {
- serialize(value) {
- assert(value instanceof Vector, "Type vector got non vector for serialize: " + value);
- return {
- x: round4Digits(value.x),
- y: round4Digits(value.y),
- };
- }
-
- getAsJsonSchemaUncached() {
- return schemaObject({
- x: {
- type: "number",
- },
- y: {
- type: "number",
- },
- });
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = new Vector(value.x, value.y);
- }
-
- verifySerializedValue(value) {
- if (!Number.isFinite(value.x) || !Number.isFinite(value.y)) {
- return "Not a valid vector, missing x/y or bad data type";
- }
- }
-
- getCacheKey() {
- return "vector";
- }
-}
-
-export class TypeTileVector extends BaseDataType {
- serialize(value) {
- assert(value instanceof Vector, "Type vector got non vector for serialize: " + value);
- assert(Number.isInteger(value.x) && value.x > 0, "Invalid tile x:" + value.x);
- assert(Number.isInteger(value.y) && value.y > 0, "Invalid tile x:" + value.y);
- return { x: value.x, y: value.y };
- }
-
- getAsJsonSchemaUncached() {
- return schemaObject({
- x: {
- type: "integer",
- minimum: 0,
- maximum: 256,
- },
- y: {
- type: "integer",
- minimum: 0,
- maximum: 256,
- },
- });
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = new Vector(value.x, value.y);
- }
-
- verifySerializedValue(value) {
- if (!Number.isInteger(value.x) || !Number.isInteger(value.y)) {
- return "Not a valid tile vector, missing x/y or bad data type";
- }
- if (value.x < 0 || value.y < 0) {
- return "Invalid tile vector, x or y < 0";
- }
- }
-
- getCacheKey() {
- return "tilevector";
- }
-}
-
-export class TypeNumber extends BaseDataType {
- serialize(value) {
- assert(Number.isFinite(value), "Type number got non number for serialize: " + value);
- assert(!Number.isNaN(value), "Value is nan: " + value);
- return round4Digits(value);
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "number",
- };
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- verifySerializedValue(value) {
- if (!Number.isFinite(value)) {
- return "Not a valid number: " + value;
- }
- }
-
- getCacheKey() {
- return "float";
- }
-}
-
-export class TypePositiveNumber extends BaseDataType {
- serialize(value) {
- assert(Number.isFinite(value), "Type number got non number for serialize: " + value);
- assert(value >= 0, "Postitive number got negative value: " + value);
- return round4Digits(value);
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "number",
- minimum: 0,
- };
- }
-
- verifySerializedValue(value) {
- if (!Number.isFinite(value)) {
- return "Not a valid number: " + value;
- }
- if (value < 0) {
- return "Positive number got negative value: " + value;
- }
- }
-
- getCacheKey() {
- return "ufloat";
- }
-}
-
-export class TypeEnum extends BaseDataType {
- /**
- * @param {Object.} enumeration
- */
- constructor(enumeration = {}) {
- super();
- this.availableValues = Object.values(enumeration);
- }
-
- serialize(value) {
- assert(this.availableValues.indexOf(value) >= 0, "Unknown value: " + value);
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "string",
- enum: this.availableValues,
- };
- }
-
- verifySerializedValue(value) {
- if (this.availableValues.indexOf(value) < 0) {
- return "Unknown enum value: " + value;
- }
- }
-
- getCacheKey() {
- return "enum." + this.availableValues.join(",");
- }
-}
-
-export class TypeEntity extends BaseDataType {
- serialize(value) {
- // assert(value instanceof Entity, "Not a valid entity ref: " + value);
- assert(value.uid, "Entity has no uid yet");
- assert(!value.destroyed, "Entity already destroyed");
- assert(!value.queuedForDestroy, "Entity queued for destroy");
-
- return value.uid;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "integer",
- minimum: 0,
- };
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- const entity = root.entityMgr.findByUid(value);
- if (!entity) {
- return "Entity not found by uid: " + value;
- }
- targetObject[targetKey] = entity;
- }
-
- verifySerializedValue(value) {
- if (!Number.isFinite(value)) {
- return "Not a valid uuid: " + value;
- }
- }
-
- getCacheKey() {
- return "entity";
- }
-}
-
-export class TypeEntityWeakref extends BaseDataType {
- serialize(value) {
- if (value === null) {
- return null;
- }
-
- // assert(value instanceof Entity, "Not a valid entity ref (weak): " + value);
- assert(value.uid, "Entity has no uid yet");
- if (value.destroyed || value.queuedForDestroy) {
- return null;
- }
- return value.uid;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- if (value === null) {
- targetObject[targetKey] = null;
- return;
- }
- const entity = root.entityMgr.findByUid(value, false);
- targetObject[targetKey] = entity;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: ["null", "integer"],
- minimum: 0,
- };
- }
-
- allowNull() {
- return true;
- }
-
- verifySerializedValue(value) {
- if (value !== null && !Number.isFinite(value)) {
- return "Not a valid uuid: " + value;
- }
- }
-
- getCacheKey() {
- return "entity-weakref";
- }
-}
-
-export class TypeClass extends BaseDataType {
- /**
- *
- * @param {FactoryTemplate<*>} registry
- * @param {(GameRoot, object) => object} customResolver
- */
- constructor(registry, customResolver = null) {
- super();
- this.registry = registry;
- this.customResolver = customResolver;
- }
-
- serialize(value) {
- assert(typeof value === "object", "Not a class instance: " + value);
- return {
- $: value.constructor.getId(),
- data: value.serialize(),
- };
- }
-
- getAsJsonSchemaUncached() {
- const options = [];
- const entries = this.registry.getEntries();
- for (let i = 0; i < entries.length; ++i) {
- const entry = entries[i];
-
- options.push(
- schemaObject({
- $: {
- type: "string",
- // @ts-ignore
- enum: [entry.getId()],
- },
- // @ts-ignore
- data: schemaToJsonSchema(entry.getCachedSchema()),
- })
- );
- }
-
- return { oneOf: options };
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- let instance;
-
- if (this.customResolver) {
- instance = this.customResolver(root, value);
- if (!instance) {
- return "Failed to call custom resolver";
- }
- } else {
- const instanceClass = this.registry.findById(value.$);
- if (!instanceClass || !instanceClass.prototype) {
- return "Invalid class id (runtime-err): " + value.$ + "->" + instanceClass;
- }
- instance = Object.create(instanceClass.prototype);
- const errorState = instance.deserialize(value.data);
- if (errorState) {
- return errorState;
- }
- }
- targetObject[targetKey] = instance;
- }
-
- verifySerializedValue(value) {
- if (!value) {
- return "Got null data";
- }
-
- if (!this.registry.hasId(value.$)) {
- return "Invalid class id: " + value.$ + " (factory is " + this.registry.getId() + ")";
- }
- }
-
- getCacheKey() {
- return "class." + this.registry.getId();
- }
-}
-
-export class TypeClassData extends BaseDataType {
- /**
- *
- * @param {FactoryTemplate<*>} registry
- */
- constructor(registry) {
- super();
- this.registry = registry;
- }
-
- serialize(value) {
- assert(typeof value === "object", "Not a class instance: " + value);
- return value.serialize();
- }
-
- getAsJsonSchemaUncached() {
- const options = [];
- const entries = this.registry.getEntries();
- for (let i = 0; i < entries.length; ++i) {
- const entry = entries[i];
- options.push(
- schemaToJsonSchema(/** @type {typeof BasicSerializableObject} */ (entry).getCachedSchema())
- );
- }
- return { oneOf: options };
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- assert(false, "can not deserialize class data of type " + this.registry.getId());
- }
-
- verifySerializedValue(value) {
- if (!value) {
- return "Got null data";
- }
- }
-
- getCacheKey() {
- return "class." + this.registry.getId();
- }
-}
-
-export class TypeClassFromMetaclass extends BaseDataType {
- /**
- *
- * @param {typeof BasicSerializableObject} classHandle
- * @param {SingletonFactoryTemplate<*>} registry
- */
- constructor(classHandle, registry) {
- super();
- this.registry = registry;
- this.classHandle = classHandle;
- }
-
- serialize(value) {
- assert(typeof value === "object", "Not a class instance: " + value);
- return {
- $: value.getMetaclass().getId(),
- data: value.serialize(),
- };
- }
-
- getAsJsonSchemaUncached() {
- // const options = [];
- const ids = this.registry.getAllIds();
-
- return {
- $: {
- type: "string",
- enum: ids,
- },
- data: schemaToJsonSchema(this.classHandle.getCachedSchema()),
- };
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- const metaClassInstance = this.registry.findById(value.$);
- if (!metaClassInstance || !metaClassInstance.prototype) {
- return "Invalid meta class id (runtime-err): " + value.$ + "->" + metaClassInstance;
- }
-
- const instanceClass = metaClassInstance.getInstanceClass();
- const instance = Object.create(instanceClass.prototype);
- const errorState = instance.deserialize(value.data);
- if (errorState) {
- return errorState;
- }
- targetObject[targetKey] = instance;
- }
-
- verifySerializedValue(value) {
- if (!value) {
- return "Got null data";
- }
-
- if (!this.registry.hasId(value.$)) {
- return "Invalid class id: " + value.$ + " (factory is " + this.registry.getId() + ")";
- }
- }
-
- getCacheKey() {
- return "classofmetaclass." + this.registry.getId();
- }
-}
-
-export class TypeMetaClass extends BaseDataType {
- /**
- *
- * @param {SingletonFactoryTemplate<*>} registry
- */
- constructor(registry) {
- super();
- this.registry = registry;
- }
-
- serialize(value) {
- return value.getId();
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- const instanceClass = this.registry.findById(value);
- if (!instanceClass) {
- return "Invalid class id (runtime-err): " + value;
- }
- targetObject[targetKey] = instanceClass;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "string",
- enum: this.registry.getAllIds(),
- };
- }
-
- verifySerializedValue(value) {
- if (!value) {
- return "Got null data";
- }
-
- if (typeof value !== "string") {
- return "Got non string data";
- }
-
- if (!this.registry.hasId(value)) {
- return "Invalid class id: " + value + " (factory is " + this.registry.getId() + ")";
- }
- }
-
- getCacheKey() {
- return "metaclass." + this.registry.getId();
- }
-}
-
-export class TypeArray extends BaseDataType {
- /**
- * @param {BaseDataType} innerType
- */
- constructor(innerType) {
- super();
- this.innerType = innerType;
- }
-
- serialize(value) {
- assert(Array.isArray(value), "Not an array");
- const result = new Array(value.length);
- for (let i = 0; i < value.length; ++i) {
- result[i] = this.innerType.serialize(value[i]);
- }
- return result;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- let destination = targetObject[targetKey];
- if (!destination) {
- targetObject[targetKey] = destination = new Array(value.length);
- }
-
- for (let i = 0; i < value.length; ++i) {
- const errorStatus = this.innerType.deserializeWithVerify(value[i], destination, i, root);
- if (errorStatus) {
- return errorStatus;
- }
- }
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "array",
- items: this.innerType.getAsJsonSchema(),
- };
- }
-
- verifySerializedValue(value) {
- if (!Array.isArray(value)) {
- return "Not an array: " + value;
- }
- }
-
- getCacheKey() {
- return "array." + this.innerType.getCacheKey();
- }
-}
-
-export class TypeFixedClass extends BaseDataType {
- /**
- *
- * @param {typeof BasicSerializableObject} baseclass
- */
- constructor(baseclass) {
- super();
- this.baseclass = baseclass;
- }
-
- serialize(value) {
- assert(value instanceof this.baseclass, "Not a valid class instance");
- return value.serialize();
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- const instance = Object.create(this.baseclass.prototype);
- const errorState = instance.deserialize(value);
- if (errorState) {
- return "Failed to deserialize class: " + errorState;
- }
- targetObject[targetKey] = instance;
- }
-
- getAsJsonSchemaUncached() {
- this.baseclass.getSchema();
- this.baseclass.getCachedSchema();
- return schemaToJsonSchema(this.baseclass.getCachedSchema());
- }
-
- verifySerializedValue(value) {
- if (!value) {
- return "Got null data";
- }
- }
-
- getCacheKey() {
- return "fixedclass." + this.baseclass.getId();
- }
-}
-
-export class TypeKeyValueMap extends BaseDataType {
- /**
- * @param {BaseDataType} valueType
- * @param {boolean=} includeEmptyValues
- */
- constructor(valueType, includeEmptyValues = true) {
- super();
- this.valueType = valueType;
- this.includeEmptyValues = includeEmptyValues;
- }
-
- serialize(value) {
- assert(typeof value === "object", "not an object");
- let result = {};
- for (const key in value) {
- const serialized = this.valueType.serialize(value[key]);
- if (!this.includeEmptyValues && typeof serialized === "object") {
- if (
- serialized.$ &&
- typeof serialized.data === "object" &&
- Object.keys(serialized.data).length === 0
- ) {
- continue;
- } else if (Object.keys(serialized).length === 0) {
- continue;
- }
- }
-
- result[key] = serialized;
- }
- return result;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- let result = {};
- for (const key in value) {
- const errorCode = this.valueType.deserializeWithVerify(value[key], result, key, root);
- if (errorCode) {
- return errorCode;
- }
- }
- targetObject[targetKey] = result;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "object",
- additionalProperties: this.valueType.getAsJsonSchema(),
- };
- }
-
- verifySerializedValue(value) {
- if (typeof value !== "object") {
- return "KV map is not an object";
- }
- }
-
- getCacheKey() {
- return "kvmap." + this.valueType.getCacheKey();
- }
-}
-
-export class TypeClassId extends BaseDataType {
- /**
- * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry
- */
- constructor(registry) {
- super();
- this.registry = registry;
- }
-
- serialize(value) {
- assert(typeof value === "string", "Not a valid string");
- assert(this.registry.hasId(value), "Id " + value + " not found in registry");
- return value;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- targetObject[targetKey] = value;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "string",
- enum: this.registry.getAllIds(),
- };
- }
-
- verifySerializedValue(value) {
- if (typeof value !== "string") {
- return "Not a valid registry id key: " + value;
- }
- if (!this.registry.hasId(value)) {
- return "Id " + value + " not known to registry";
- }
- }
-
- getCacheKey() {
- return "classid." + this.registry.getId();
- }
-}
-
-export class TypePair extends BaseDataType {
- /**
- * @param {BaseDataType} type1
- * @param {BaseDataType} type2
- */
- constructor(type1, type2) {
- super();
- assert(type1 && type1 instanceof BaseDataType, "bad first type given for pair");
- assert(type2 && type2 instanceof BaseDataType, "bad second type given for pair");
- this.type1 = type1;
- this.type2 = type2;
- }
-
- serialize(value) {
- assert(Array.isArray(value), "pair: not an array");
- assert(value.length === 2, "pair: length != 2");
- return [this.type1.serialize(value[0]), this.type2.serialize(value[1])];
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- const result = [undefined, undefined];
-
- let errorCode = this.type1.deserialize(value[0], result, 0, root);
- if (errorCode) {
- return errorCode;
- }
- errorCode = this.type2.deserialize(value[1], result, 1, root);
- if (errorCode) {
- return errorCode;
- }
-
- targetObject[targetKey] = result;
- }
-
- getAsJsonSchemaUncached() {
- return {
- type: "array",
- minLength: 2,
- maxLength: 2,
- items: [this.type1.getAsJsonSchema(), this.type2.getAsJsonSchema()],
- };
- }
-
- verifySerializedValue(value) {
- if (!Array.isArray(value)) {
- return "Pair is not an array";
- }
- if (value.length !== 2) {
- return "Pair length != 2";
- }
- let errorCode = this.type1.verifySerializedValue(value[0]);
- if (errorCode) {
- return errorCode;
- }
- errorCode = this.type2.verifySerializedValue(value[1]);
- if (errorCode) {
- return errorCode;
- }
- }
-
- getCacheKey() {
- return "pair.(" + this.type1.getCacheKey() + "," + this.type2.getCacheKey + ")";
- }
-}
-
-export class TypeNullable extends BaseDataType {
- /**
- * @param {BaseDataType} wrapped
- */
- constructor(wrapped) {
- super();
- this.wrapped = wrapped;
- }
-
- serialize(value) {
- if (value === null || value === undefined) {
- return null;
- }
- return this.wrapped.serialize(value);
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- if (value === null || value === undefined) {
- targetObject[targetKey] = null;
- return;
- }
- return this.wrapped.deserialize(value, targetObject, targetKey, root);
- }
-
- verifySerializedValue(value) {
- if (value === null) {
- return;
- }
- return this.wrapped.verifySerializedValue(value);
- }
-
- getAsJsonSchemaUncached() {
- return {
- oneOf: [
- {
- type: "null",
- },
- this.wrapped.getAsJsonSchema(),
- ],
- };
- }
-
- allowNull() {
- return true;
- }
-
- getCacheKey() {
- return "nullable." + this.wrapped.getCacheKey();
- }
-}
-
-export class TypeStructuredObject extends BaseDataType {
- /**
- * @param {Object.} descriptor
- */
- constructor(descriptor) {
- super();
- this.descriptor = descriptor;
- }
-
- serialize(value) {
- assert(typeof value === "object", "not an object");
- let result = {};
- for (const key in this.descriptor) {
- // assert(value.hasOwnProperty(key), "Serialization: Object does not have", key, "property!");
- result[key] = this.descriptor[key].serialize(value[key]);
- }
- return result;
- }
-
- /**
- * @see BaseDataType.deserialize
- * @param {any} value
- * @param {GameRoot} root
- * @param {object} targetObject
- * @param {string|number} targetKey
- * @returns {string|void} String error code or null on success
- */
- deserialize(value, targetObject, targetKey, root) {
- let target = targetObject[targetKey];
- if (!target) {
- targetObject[targetKey] = target = {};
- }
-
- for (const key in value) {
- const valueType = this.descriptor[key];
- const errorCode = valueType.deserializeWithVerify(value[key], target, key, root);
- if (errorCode) {
- return errorCode;
- }
- }
- }
-
- getAsJsonSchemaUncached() {
- let properties = {};
- for (const key in this.descriptor) {
- properties[key] = this.descriptor[key].getAsJsonSchema();
- }
-
- return {
- type: "object",
- required: Object.keys(this.descriptor),
- properties,
- };
- }
-
- verifySerializedValue(value) {
- if (typeof value !== "object") {
- return "structured object is not an object";
- }
- for (const key in this.descriptor) {
- if (!value.hasOwnProperty(key)) {
- return "structured object is missing key " + key;
- }
- const subError = this.descriptor[key].verifySerializedValue(value[key]);
- if (subError) {
- return "structured object::" + subError;
- }
- }
- }
-
- getCacheKey() {
- let props = [];
- for (const key in this.descriptor) {
- props.push(key + "=" + this.descriptor[key].getCacheKey());
- }
- return "structured[" + props.join(",") + "]";
- }
-}
+/* typehints:start */
+import { GameRoot } from "../game/root";
+import { BasicSerializableObject } from "./serialization";
+/* typehints:end */
+
+import { Vector } from "../core/vector";
+import { round4Digits } from "../core/utils";
+export const globalJsonSchemaDefs = {};
+
+/**
+ *
+ * @param {import("./serialization").Schema} schema
+ */
+export function schemaToJsonSchema(schema) {
+ const jsonSchema = {
+ type: "object",
+ additionalProperties: false,
+ required: [],
+ properties: {},
+ };
+
+ for (const key in schema) {
+ const subSchema = schema[key].getAsJsonSchema();
+ jsonSchema.required.push(key);
+ jsonSchema.properties[key] = subSchema;
+ }
+
+ return jsonSchema;
+}
+
+/**
+ * Helper function to create a json schema object
+ * @param {any} properties
+ */
+function schemaObject(properties) {
+ return {
+ type: "object",
+ required: Object.keys(properties).slice(),
+ additionalProperties: false,
+ properties,
+ };
+}
+
+/**
+ * Base serialization data type
+ */
+export class BaseDataType {
+ /**
+ * Serializes a given raw value
+ * @param {any} value
+ */
+ serialize(value) {
+ abstract;
+ return {};
+ }
+
+ /**
+ * Verifies a given serialized value
+ * @param {any} value
+ * @returns {string|void} String error code or null on success
+ */
+ verifySerializedValue(value) {}
+
+ /**
+ * Deserializes a serialized value into the target object under the given key
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ abstract;
+ }
+
+ /**
+ * Returns the json schema
+ */
+ getAsJsonSchema() {
+ const key = this.getCacheKey();
+ const schema = this.getAsJsonSchemaUncached();
+
+ if (!globalJsonSchemaDefs[key]) {
+ // schema.$id = key;
+ globalJsonSchemaDefs[key] = schema;
+ }
+
+ return {
+ $ref: "#/definitions/" + key,
+ };
+ }
+
+ /**
+ * INTERNAL Should return the json schema representation
+ */
+ getAsJsonSchemaUncached() {
+ abstract;
+ }
+
+ /**
+ * Returns whether null values are okay
+ * @returns {boolean}
+ */
+ allowNull() {
+ return false;
+ }
+
+ // Helper methods
+
+ /**
+ * Deserializes a serialized value, but performs integrity checks before
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserializeWithVerify(value, targetObject, targetKey, root) {
+ const errorCode = this.verifySerializedValue(value);
+ if (errorCode) {
+ return (
+ "serialization verify failed: " +
+ errorCode +
+ " [value " +
+ (JSON.stringify(value) || "").substr(0, 100) +
+ "]"
+ );
+ }
+ return this.deserialize(value, targetObject, targetKey, root);
+ }
+
+ /**
+ * Should return a cacheable key
+ */
+ getCacheKey() {
+ abstract;
+ return "";
+ }
+}
+
+export class TypeInteger extends BaseDataType {
+ serialize(value) {
+ assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value);
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "integer",
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isInteger(value)) {
+ return "Not a valid number";
+ }
+ }
+
+ getCacheKey() {
+ return "int";
+ }
+}
+
+export class TypePositiveInteger extends BaseDataType {
+ serialize(value) {
+ assert(Number.isInteger(value), "Type integer got non integer for serialize: " + value);
+ assert(value >= 0, "value < 0: " + value);
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "integer",
+ minimum: 0,
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isInteger(value)) {
+ return "Not a valid number";
+ }
+ if (value < 0) {
+ return "Negative value for positive integer";
+ }
+ }
+
+ getCacheKey() {
+ return "uint";
+ }
+}
+
+export class TypeBoolean extends BaseDataType {
+ serialize(value) {
+ assert(value === true || value === false, "Type bool got non bool for serialize: " + value);
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "boolean",
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (value !== true && value !== false) {
+ return "Not a boolean";
+ }
+ }
+
+ getCacheKey() {
+ return "bool";
+ }
+}
+
+export class TypeString extends BaseDataType {
+ serialize(value) {
+ assert(typeof value === "string", "Type string got non string for serialize: " + value);
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+ getAsJsonSchemaUncached() {
+ return {
+ type: "string",
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (typeof value !== "string") {
+ return "Not a valid string";
+ }
+ }
+
+ getCacheKey() {
+ return "string";
+ }
+}
+
+export class TypeVector extends BaseDataType {
+ serialize(value) {
+ assert(value instanceof Vector, "Type vector got non vector for serialize: " + value);
+ return {
+ x: round4Digits(value.x),
+ y: round4Digits(value.y),
+ };
+ }
+
+ getAsJsonSchemaUncached() {
+ return schemaObject({
+ x: {
+ type: "number",
+ },
+ y: {
+ type: "number",
+ },
+ });
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = new Vector(value.x, value.y);
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isFinite(value.x) || !Number.isFinite(value.y)) {
+ return "Not a valid vector, missing x/y or bad data type";
+ }
+ }
+
+ getCacheKey() {
+ return "vector";
+ }
+}
+
+export class TypeTileVector extends BaseDataType {
+ serialize(value) {
+ assert(value instanceof Vector, "Type vector got non vector for serialize: " + value);
+ assert(Number.isInteger(value.x) && value.x > 0, "Invalid tile x:" + value.x);
+ assert(Number.isInteger(value.y) && value.y > 0, "Invalid tile x:" + value.y);
+ return { x: value.x, y: value.y };
+ }
+
+ getAsJsonSchemaUncached() {
+ return schemaObject({
+ x: {
+ type: "integer",
+ minimum: 0,
+ maximum: 256,
+ },
+ y: {
+ type: "integer",
+ minimum: 0,
+ maximum: 256,
+ },
+ });
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = new Vector(value.x, value.y);
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isInteger(value.x) || !Number.isInteger(value.y)) {
+ return "Not a valid tile vector, missing x/y or bad data type";
+ }
+ if (value.x < 0 || value.y < 0) {
+ return "Invalid tile vector, x or y < 0";
+ }
+ }
+
+ getCacheKey() {
+ return "tilevector";
+ }
+}
+
+export class TypeNumber extends BaseDataType {
+ serialize(value) {
+ assert(Number.isFinite(value), "Type number got non number for serialize: " + value);
+ assert(!Number.isNaN(value), "Value is nan: " + value);
+ return round4Digits(value);
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "number",
+ };
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isFinite(value)) {
+ return "Not a valid number: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "float";
+ }
+}
+
+export class TypePositiveNumber extends BaseDataType {
+ serialize(value) {
+ assert(Number.isFinite(value), "Type number got non number for serialize: " + value);
+ assert(value >= 0, "Postitive number got negative value: " + value);
+ return round4Digits(value);
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "number",
+ minimum: 0,
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isFinite(value)) {
+ return "Not a valid number: " + value;
+ }
+ if (value < 0) {
+ return "Positive number got negative value: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "ufloat";
+ }
+}
+
+export class TypeEnum extends BaseDataType {
+ /**
+ * @param {Object.} enumeration
+ */
+ constructor(enumeration = {}) {
+ super();
+ this.availableValues = Object.values(enumeration);
+ }
+
+ serialize(value) {
+ assert(this.availableValues.indexOf(value) >= 0, "Unknown value: " + value);
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "string",
+ enum: this.availableValues,
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (this.availableValues.indexOf(value) < 0) {
+ return "Unknown enum value: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "enum." + this.availableValues.join(",");
+ }
+}
+
+export class TypeEntity extends BaseDataType {
+ serialize(value) {
+ // assert(value instanceof Entity, "Not a valid entity ref: " + value);
+ assert(value.uid, "Entity has no uid yet");
+ assert(!value.destroyed, "Entity already destroyed");
+ assert(!value.queuedForDestroy, "Entity queued for destroy");
+
+ return value.uid;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "integer",
+ minimum: 0,
+ };
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ const entity = root.entityMgr.findByUid(value);
+ if (!entity) {
+ return "Entity not found by uid: " + value;
+ }
+ targetObject[targetKey] = entity;
+ }
+
+ verifySerializedValue(value) {
+ if (!Number.isFinite(value)) {
+ return "Not a valid uuid: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "entity";
+ }
+}
+
+export class TypeEntityWeakref extends BaseDataType {
+ serialize(value) {
+ if (value === null) {
+ return null;
+ }
+
+ // assert(value instanceof Entity, "Not a valid entity ref (weak): " + value);
+ assert(value.uid, "Entity has no uid yet");
+ if (value.destroyed || value.queuedForDestroy) {
+ return null;
+ }
+ return value.uid;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ if (value === null) {
+ targetObject[targetKey] = null;
+ return;
+ }
+ const entity = root.entityMgr.findByUid(value, false);
+ targetObject[targetKey] = entity;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: ["null", "integer"],
+ minimum: 0,
+ };
+ }
+
+ allowNull() {
+ return true;
+ }
+
+ verifySerializedValue(value) {
+ if (value !== null && !Number.isFinite(value)) {
+ return "Not a valid uuid: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "entity-weakref";
+ }
+}
+
+export class TypeClass extends BaseDataType {
+ /**
+ *
+ * @param {FactoryTemplate<*>} registry
+ * @param {(GameRoot, object) => object} customResolver
+ */
+ constructor(registry, customResolver = null) {
+ super();
+ this.registry = registry;
+ this.customResolver = customResolver;
+ }
+
+ serialize(value) {
+ assert(typeof value === "object", "Not a class instance: " + value);
+ return {
+ $: value.constructor.getId(),
+ data: value.serialize(),
+ };
+ }
+
+ getAsJsonSchemaUncached() {
+ const options = [];
+ const entries = this.registry.getEntries();
+ for (let i = 0; i < entries.length; ++i) {
+ const entry = entries[i];
+
+ options.push(
+ schemaObject({
+ $: {
+ type: "string",
+ // @ts-ignore
+ enum: [entry.getId()],
+ },
+ // @ts-ignore
+ data: schemaToJsonSchema(entry.getCachedSchema()),
+ })
+ );
+ }
+
+ return { oneOf: options };
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ let instance;
+
+ if (this.customResolver) {
+ instance = this.customResolver(root, value);
+ if (!instance) {
+ return "Failed to call custom resolver";
+ }
+ } else {
+ const instanceClass = this.registry.findById(value.$);
+ if (!instanceClass || !instanceClass.prototype) {
+ return "Invalid class id (runtime-err): " + value.$ + "->" + instanceClass;
+ }
+ instance = Object.create(instanceClass.prototype);
+ const errorState = instance.deserialize(value.data);
+ if (errorState) {
+ return errorState;
+ }
+ }
+ targetObject[targetKey] = instance;
+ }
+
+ verifySerializedValue(value) {
+ if (!value) {
+ return "Got null data";
+ }
+
+ if (!this.registry.hasId(value.$)) {
+ return "Invalid class id: " + value.$ + " (factory is " + this.registry.getId() + ")";
+ }
+ }
+
+ getCacheKey() {
+ return "class." + this.registry.getId();
+ }
+}
+
+export class TypeClassData extends BaseDataType {
+ /**
+ *
+ * @param {FactoryTemplate<*>} registry
+ */
+ constructor(registry) {
+ super();
+ this.registry = registry;
+ }
+
+ serialize(value) {
+ assert(typeof value === "object", "Not a class instance: " + value);
+ return value.serialize();
+ }
+
+ getAsJsonSchemaUncached() {
+ const options = [];
+ const entries = this.registry.getEntries();
+ for (let i = 0; i < entries.length; ++i) {
+ const entry = entries[i];
+ options.push(
+ schemaToJsonSchema(/** @type {typeof BasicSerializableObject} */ (entry).getCachedSchema())
+ );
+ }
+ return { oneOf: options };
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ assert(false, "can not deserialize class data of type " + this.registry.getId());
+ }
+
+ verifySerializedValue(value) {
+ if (!value) {
+ return "Got null data";
+ }
+ }
+
+ getCacheKey() {
+ return "class." + this.registry.getId();
+ }
+}
+
+export class TypeClassFromMetaclass extends BaseDataType {
+ /**
+ *
+ * @param {typeof BasicSerializableObject} classHandle
+ * @param {SingletonFactoryTemplate<*>} registry
+ */
+ constructor(classHandle, registry) {
+ super();
+ this.registry = registry;
+ this.classHandle = classHandle;
+ }
+
+ serialize(value) {
+ assert(typeof value === "object", "Not a class instance: " + value);
+ return {
+ $: value.getMetaclass().getId(),
+ data: value.serialize(),
+ };
+ }
+
+ getAsJsonSchemaUncached() {
+ // const options = [];
+ const ids = this.registry.getAllIds();
+
+ return {
+ $: {
+ type: "string",
+ enum: ids,
+ },
+ data: schemaToJsonSchema(this.classHandle.getCachedSchema()),
+ };
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ const metaClassInstance = this.registry.findById(value.$);
+ if (!metaClassInstance || !metaClassInstance.prototype) {
+ return "Invalid meta class id (runtime-err): " + value.$ + "->" + metaClassInstance;
+ }
+
+ const instanceClass = metaClassInstance.getInstanceClass();
+ const instance = Object.create(instanceClass.prototype);
+ const errorState = instance.deserialize(value.data);
+ if (errorState) {
+ return errorState;
+ }
+ targetObject[targetKey] = instance;
+ }
+
+ verifySerializedValue(value) {
+ if (!value) {
+ return "Got null data";
+ }
+
+ if (!this.registry.hasId(value.$)) {
+ return "Invalid class id: " + value.$ + " (factory is " + this.registry.getId() + ")";
+ }
+ }
+
+ getCacheKey() {
+ return "classofmetaclass." + this.registry.getId();
+ }
+}
+
+export class TypeMetaClass extends BaseDataType {
+ /**
+ *
+ * @param {SingletonFactoryTemplate<*>} registry
+ */
+ constructor(registry) {
+ super();
+ this.registry = registry;
+ }
+
+ serialize(value) {
+ return value.getId();
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ const instanceClass = this.registry.findById(value);
+ if (!instanceClass) {
+ return "Invalid class id (runtime-err): " + value;
+ }
+ targetObject[targetKey] = instanceClass;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "string",
+ enum: this.registry.getAllIds(),
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!value) {
+ return "Got null data";
+ }
+
+ if (typeof value !== "string") {
+ return "Got non string data";
+ }
+
+ if (!this.registry.hasId(value)) {
+ return "Invalid class id: " + value + " (factory is " + this.registry.getId() + ")";
+ }
+ }
+
+ getCacheKey() {
+ return "metaclass." + this.registry.getId();
+ }
+}
+
+export class TypeArray extends BaseDataType {
+ /**
+ * @param {BaseDataType} innerType
+ */
+ constructor(innerType, fixedSize = false) {
+ super();
+ this.fixedSize = fixedSize;
+ this.innerType = innerType;
+ }
+
+ serialize(value) {
+ assert(Array.isArray(value), "Not an array");
+ const result = new Array(value.length);
+ for (let i = 0; i < value.length; ++i) {
+ result[i] = this.innerType.serialize(value[i]);
+ }
+ return result;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ let destination = targetObject[targetKey];
+ if (!destination) {
+ targetObject[targetKey] = destination = new Array(value.length);
+ }
+
+ const size = this.fixedSize ? Math.min(value.length, destination.length) : value.length;
+
+ for (let i = 0; i < size; ++i) {
+ const errorStatus = this.innerType.deserializeWithVerify(value[i], destination, i, root);
+ if (errorStatus) {
+ return errorStatus;
+ }
+ }
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "array",
+ items: this.innerType.getAsJsonSchema(),
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!Array.isArray(value)) {
+ return "Not an array: " + value;
+ }
+ }
+
+ getCacheKey() {
+ return "array." + this.innerType.getCacheKey();
+ }
+}
+
+export class TypeFixedClass extends BaseDataType {
+ /**
+ *
+ * @param {typeof BasicSerializableObject} baseclass
+ */
+ constructor(baseclass) {
+ super();
+ this.baseclass = baseclass;
+ }
+
+ serialize(value) {
+ assert(value instanceof this.baseclass, "Not a valid class instance");
+ return value.serialize();
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ const instance = Object.create(this.baseclass.prototype);
+ const errorState = instance.deserialize(value);
+ if (errorState) {
+ return "Failed to deserialize class: " + errorState;
+ }
+ targetObject[targetKey] = instance;
+ }
+
+ getAsJsonSchemaUncached() {
+ this.baseclass.getSchema();
+ this.baseclass.getCachedSchema();
+ return schemaToJsonSchema(this.baseclass.getCachedSchema());
+ }
+
+ verifySerializedValue(value) {
+ if (!value) {
+ return "Got null data";
+ }
+ }
+
+ getCacheKey() {
+ return "fixedclass." + this.baseclass.getId();
+ }
+}
+
+export class TypeKeyValueMap extends BaseDataType {
+ /**
+ * @param {BaseDataType} valueType
+ * @param {boolean=} includeEmptyValues
+ */
+ constructor(valueType, includeEmptyValues = true) {
+ super();
+ this.valueType = valueType;
+ this.includeEmptyValues = includeEmptyValues;
+ }
+
+ serialize(value) {
+ assert(typeof value === "object", "not an object");
+ let result = {};
+ for (const key in value) {
+ const serialized = this.valueType.serialize(value[key]);
+ if (!this.includeEmptyValues && typeof serialized === "object") {
+ if (
+ serialized.$ &&
+ typeof serialized.data === "object" &&
+ Object.keys(serialized.data).length === 0
+ ) {
+ continue;
+ } else if (Object.keys(serialized).length === 0) {
+ continue;
+ }
+ }
+
+ result[key] = serialized;
+ }
+ return result;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ let result = {};
+ for (const key in value) {
+ const errorCode = this.valueType.deserializeWithVerify(value[key], result, key, root);
+ if (errorCode) {
+ return errorCode;
+ }
+ }
+ targetObject[targetKey] = result;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "object",
+ additionalProperties: this.valueType.getAsJsonSchema(),
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (typeof value !== "object") {
+ return "KV map is not an object";
+ }
+ }
+
+ getCacheKey() {
+ return "kvmap." + this.valueType.getCacheKey();
+ }
+}
+
+export class TypeClassId extends BaseDataType {
+ /**
+ * @param {FactoryTemplate<*>|SingletonFactoryTemplate<*>} registry
+ */
+ constructor(registry) {
+ super();
+ this.registry = registry;
+ }
+
+ serialize(value) {
+ assert(typeof value === "string", "Not a valid string");
+ assert(this.registry.hasId(value), "Id " + value + " not found in registry");
+ return value;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ targetObject[targetKey] = value;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "string",
+ enum: this.registry.getAllIds(),
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (typeof value !== "string") {
+ return "Not a valid registry id key: " + value;
+ }
+ if (!this.registry.hasId(value)) {
+ return "Id " + value + " not known to registry";
+ }
+ }
+
+ getCacheKey() {
+ return "classid." + this.registry.getId();
+ }
+}
+
+export class TypePair extends BaseDataType {
+ /**
+ * @param {BaseDataType} type1
+ * @param {BaseDataType} type2
+ */
+ constructor(type1, type2) {
+ super();
+ assert(type1 && type1 instanceof BaseDataType, "bad first type given for pair");
+ assert(type2 && type2 instanceof BaseDataType, "bad second type given for pair");
+ this.type1 = type1;
+ this.type2 = type2;
+ }
+
+ serialize(value) {
+ assert(Array.isArray(value), "pair: not an array");
+ assert(value.length === 2, "pair: length != 2");
+ return [this.type1.serialize(value[0]), this.type2.serialize(value[1])];
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ const result = [undefined, undefined];
+
+ let errorCode = this.type1.deserialize(value[0], result, 0, root);
+ if (errorCode) {
+ return errorCode;
+ }
+ errorCode = this.type2.deserialize(value[1], result, 1, root);
+ if (errorCode) {
+ return errorCode;
+ }
+
+ targetObject[targetKey] = result;
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ type: "array",
+ minLength: 2,
+ maxLength: 2,
+ items: [this.type1.getAsJsonSchema(), this.type2.getAsJsonSchema()],
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (!Array.isArray(value)) {
+ return "Pair is not an array";
+ }
+ if (value.length !== 2) {
+ return "Pair length != 2";
+ }
+ let errorCode = this.type1.verifySerializedValue(value[0]);
+ if (errorCode) {
+ return errorCode;
+ }
+ errorCode = this.type2.verifySerializedValue(value[1]);
+ if (errorCode) {
+ return errorCode;
+ }
+ }
+
+ getCacheKey() {
+ return "pair.(" + this.type1.getCacheKey() + "," + this.type2.getCacheKey + ")";
+ }
+}
+
+export class TypeNullable extends BaseDataType {
+ /**
+ * @param {BaseDataType} wrapped
+ */
+ constructor(wrapped) {
+ super();
+ this.wrapped = wrapped;
+ }
+
+ serialize(value) {
+ if (value === null || value === undefined) {
+ return null;
+ }
+ return this.wrapped.serialize(value);
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ if (value === null || value === undefined) {
+ targetObject[targetKey] = null;
+ return;
+ }
+ return this.wrapped.deserialize(value, targetObject, targetKey, root);
+ }
+
+ verifySerializedValue(value) {
+ if (value === null) {
+ return;
+ }
+ return this.wrapped.verifySerializedValue(value);
+ }
+
+ getAsJsonSchemaUncached() {
+ return {
+ oneOf: [
+ {
+ type: "null",
+ },
+ this.wrapped.getAsJsonSchema(),
+ ],
+ };
+ }
+
+ allowNull() {
+ return true;
+ }
+
+ getCacheKey() {
+ return "nullable." + this.wrapped.getCacheKey();
+ }
+}
+
+export class TypeStructuredObject extends BaseDataType {
+ /**
+ * @param {Object.} descriptor
+ */
+ constructor(descriptor) {
+ super();
+ this.descriptor = descriptor;
+ }
+
+ serialize(value) {
+ assert(typeof value === "object", "not an object");
+ let result = {};
+ for (const key in this.descriptor) {
+ // assert(value.hasOwnProperty(key), "Serialization: Object does not have", key, "property!");
+ result[key] = this.descriptor[key].serialize(value[key]);
+ }
+ return result;
+ }
+
+ /**
+ * @see BaseDataType.deserialize
+ * @param {any} value
+ * @param {GameRoot} root
+ * @param {object} targetObject
+ * @param {string|number} targetKey
+ * @returns {string|void} String error code or null on success
+ */
+ deserialize(value, targetObject, targetKey, root) {
+ let target = targetObject[targetKey];
+ if (!target) {
+ targetObject[targetKey] = target = {};
+ }
+
+ for (const key in value) {
+ const valueType = this.descriptor[key];
+ const errorCode = valueType.deserializeWithVerify(value[key], target, key, root);
+ if (errorCode) {
+ return errorCode;
+ }
+ }
+ }
+
+ getAsJsonSchemaUncached() {
+ let properties = {};
+ for (const key in this.descriptor) {
+ properties[key] = this.descriptor[key].getAsJsonSchema();
+ }
+
+ return {
+ type: "object",
+ required: Object.keys(this.descriptor),
+ properties,
+ };
+ }
+
+ verifySerializedValue(value) {
+ if (typeof value !== "object") {
+ return "structured object is not an object";
+ }
+ for (const key in this.descriptor) {
+ if (!value.hasOwnProperty(key)) {
+ return "structured object is missing key " + key;
+ }
+ const subError = this.descriptor[key].verifySerializedValue(value[key]);
+ if (subError) {
+ return "structured object::" + subError;
+ }
+ }
+ }
+
+ getCacheKey() {
+ let props = [];
+ for (const key in this.descriptor) {
+ props.push(key + "=" + this.descriptor[key].getCacheKey());
+ }
+ return "structured[" + props.join(",") + "]";
+ }
+}
diff --git a/src/js/savegame/serializer_internal.js b/src/js/savegame/serializer_internal.js
index 6e5dfbc2..c75cebad 100644
--- a/src/js/savegame/serializer_internal.js
+++ b/src/js/savegame/serializer_internal.js
@@ -1,3 +1,4 @@
+import { globalConfig } from "../core/config";
import { createLogger } from "../core/logging";
import { Vector } from "../core/vector";
import { getBuildingDataFromCode } from "../game/building_codes";
@@ -78,7 +79,12 @@ export class SerializerInternal {
deserializeComponents(root, entity, data) {
for (const componentId in data) {
if (!entity.components[componentId]) {
- logger.warn("Entity no longer has component:", componentId);
+ if (G_IS_DEV && !globalConfig.debug.disableSlowAsserts) {
+ // @ts-ignore
+ if (++window.componentWarningsShown < 100) {
+ logger.warn("Entity no longer has component:", componentId);
+ }
+ }
continue;
}
diff --git a/src/js/states/ingame.js b/src/js/states/ingame.js
index 3eea38b7..316c536c 100644
--- a/src/js/states/ingame.js
+++ b/src/js/states/ingame.js
@@ -1,438 +1,454 @@
-import { APPLICATION_ERROR_OCCURED } from "../core/error_handler";
-import { GameState } from "../core/game_state";
-import { logSection, createLogger } from "../core/logging";
-import { waitNextFrame } from "../core/utils";
-import { globalConfig } from "../core/config";
-import { GameLoadingOverlay } from "../game/game_loading_overlay";
-import { KeyActionMapper } from "../game/key_action_mapper";
-import { Savegame } from "../savegame/savegame";
-import { GameCore } from "../game/core";
-import { MUSIC } from "../platform/sound";
-
-const logger = createLogger("state/ingame");
-
-// Different sub-states
-const stages = {
- s3_createCore: "🌈 3: Create core",
- s4_A_initEmptyGame: "🌈 4/A: Init empty game",
- s4_B_resumeGame: "🌈 4/B: Resume game",
-
- s5_firstUpdate: "🌈 5: First game update",
- s6_postLoadHook: "🌈 6: Post load hook",
- s7_warmup: "🌈 7: Warmup",
-
- s10_gameRunning: "🌈 10: Game finally running",
-
- leaving: "🌈 Saving, then leaving the game",
- destroyed: "🌈 DESTROYED: Core is empty and waits for state leave",
- initFailed: "🌈 ERROR: Initialization failed!",
-};
-
-export const gameCreationAction = {
- new: "new-game",
- resume: "resume-game",
-};
-
-// Typehints
-export class GameCreationPayload {
- constructor() {
- /** @type {boolean|undefined} */
- this.fastEnter;
-
- /** @type {Savegame} */
- this.savegame;
- }
-}
-
-export class InGameState extends GameState {
- constructor() {
- super("InGameState");
-
- /** @type {GameCreationPayload} */
- this.creationPayload = null;
-
- // Stores current stage
- this.stage = "";
-
- /** @type {GameCore} */
- this.core = null;
-
- /** @type {KeyActionMapper} */
- this.keyActionMapper = null;
-
- /** @type {GameLoadingOverlay} */
- this.loadingOverlay = null;
-
- /** @type {Savegame} */
- this.savegame;
-
- this.boundInputFilter = this.filterInput.bind(this);
- }
-
- /**
- * Switches the game into another sub-state
- * @param {string} stage
- */
- switchStage(stage) {
- assert(stage, "Got empty stage");
- if (stage !== this.stage) {
- this.stage = stage;
- logger.log(this.stage);
- return true;
- } else {
- // log(this, "Re entering", stage);
- return false;
- }
- }
-
- // GameState implementation
- getInnerHTML() {
- return "";
- }
-
- getThemeMusic() {
- return MUSIC.theme;
- }
-
- onBeforeExit() {
- // logger.log("Saving before quitting");
- // return this.doSave().then(() => {
- // logger.log(this, "Successfully saved");
- // // this.stageDestroyed();
- // });
- }
-
- onAppPause() {
- // if (this.stage === stages.s10_gameRunning) {
- // logger.log("Saving because app got paused");
- // this.doSave();
- // }
- }
-
- getHasFadeIn() {
- return false;
- }
-
- getPauseOnFocusLost() {
- return false;
- }
-
- getHasUnloadConfirmation() {
- return true;
- }
-
- onLeave() {
- if (this.core) {
- this.stageDestroyed();
- }
- this.app.inputMgr.dismountFilter(this.boundInputFilter);
- }
-
- onResized(w, h) {
- super.onResized(w, h);
- if (this.stage === stages.s10_gameRunning) {
- this.core.resize(w, h);
- }
- }
-
- // ---- End of GameState implementation
-
- /**
- * Goes back to the menu state
- */
- goBackToMenu() {
- this.saveThenGoToState("MainMenuState");
- }
-
- /**
- * Goes back to the settings state
- */
- goToSettings() {
- this.saveThenGoToState("SettingsState", {
- backToStateId: this.key,
- backToStatePayload: this.creationPayload,
- });
- }
-
- /**
- * Goes back to the settings state
- */
- goToKeybindings() {
- this.saveThenGoToState("KeybindingsState", {
- backToStateId: this.key,
- backToStatePayload: this.creationPayload,
- });
- }
-
- /**
- * Moves to a state outside of the game
- * @param {string} stateId
- * @param {any=} payload
- */
- saveThenGoToState(stateId, payload) {
- if (this.stage === stages.leaving || this.stage === stages.destroyed) {
- logger.warn(
- "Tried to leave game twice or during destroy:",
- this.stage,
- "(attempted to move to",
- stateId,
- ")"
- );
- return;
- }
- this.stageLeavingGame();
- this.doSave().then(() => {
- this.stageDestroyed();
- this.moveToState(stateId, payload);
- });
- }
-
- onBackButton() {
- // do nothing
- }
-
- /**
- * Called when the game somehow failed to initialize. Resets everything to basic state and
- * then goes to the main menu, showing the error
- * @param {string} err
- */
- onInitializationFailure(err) {
- if (this.switchStage(stages.initFailed)) {
- logger.error("Init failure:", err);
- this.stageDestroyed();
- this.moveToState("MainMenuState", { loadError: err });
- }
- }
-
- // STAGES
-
- /**
- * Creates the game core instance, and thus the root
- */
- stage3CreateCore() {
- if (this.switchStage(stages.s3_createCore)) {
- logger.log("Creating new game core");
- this.core = new GameCore(this.app);
-
- this.core.initializeRoot(this, this.savegame);
-
- if (this.savegame.hasGameDump()) {
- this.stage4bResumeGame();
- } else {
- this.app.gameAnalytics.handleGameStarted();
- this.stage4aInitEmptyGame();
- }
- }
- }
-
- /**
- * Initializes a new empty game
- */
- stage4aInitEmptyGame() {
- if (this.switchStage(stages.s4_A_initEmptyGame)) {
- this.core.initNewGame();
- this.stage5FirstUpdate();
- }
- }
-
- /**
- * Resumes an existing game
- */
- stage4bResumeGame() {
- if (this.switchStage(stages.s4_B_resumeGame)) {
- if (!this.core.initExistingGame()) {
- this.onInitializationFailure("Savegame is corrupt and can not be restored.");
- return;
- }
- this.app.gameAnalytics.handleGameResumed();
- this.stage5FirstUpdate();
- }
- }
-
- /**
- * Performs the first game update on the game which initializes most caches
- */
- stage5FirstUpdate() {
- if (this.switchStage(stages.s5_firstUpdate)) {
- this.core.root.logicInitialized = true;
- this.core.updateLogic();
- this.stage6PostLoadHook();
- }
- }
-
- /**
- * Call the post load hook, this means that we have loaded the game, and all systems
- * can operate and start to work now.
- */
- stage6PostLoadHook() {
- if (this.switchStage(stages.s6_postLoadHook)) {
- logger.log("Post load hook");
- this.core.postLoadHook();
- this.stage7Warmup();
- }
- }
-
- /**
- * This makes the game idle and draw for a while, because we run most code this way
- * the V8 engine can already start to optimize it. Also this makes sure the resources
- * are in the VRAM and we have a smooth experience once we start.
- */
- stage7Warmup() {
- if (this.switchStage(stages.s7_warmup)) {
- if (G_IS_DEV && globalConfig.debug.noArtificialDelays) {
- this.warmupTimeSeconds = 0.05;
- } else {
- if (this.creationPayload.fastEnter) {
- this.warmupTimeSeconds = globalConfig.warmupTimeSecondsFast;
- } else {
- this.warmupTimeSeconds = globalConfig.warmupTimeSecondsRegular;
- }
- }
- }
- }
-
- /**
- * The final stage where this game is running and updating regulary.
- */
- stage10GameRunning() {
- if (this.switchStage(stages.s10_gameRunning)) {
- this.core.root.signals.readyToRender.dispatch();
-
- logSection("GAME STARTED", "#26a69a");
-
- // Initial resize, might have changed during loading (this is possible)
- this.core.resize(this.app.screenWidth, this.app.screenHeight);
- }
- }
-
- /**
- * This stage destroys the whole game, used to cleanup
- */
- stageDestroyed() {
- if (this.switchStage(stages.destroyed)) {
- // Cleanup all api calls
- this.cancelAllAsyncOperations();
-
- if (this.syncer) {
- this.syncer.cancelSync();
- this.syncer = null;
- }
-
- // Cleanup core
- if (this.core) {
- this.core.destruct();
- this.core = null;
- }
- }
- }
-
- /**
- * When leaving the game
- */
- stageLeavingGame() {
- if (this.switchStage(stages.leaving)) {
- // ...
- }
- }
-
- // END STAGES
-
- /**
- * Filters the input (keybindings)
- */
- filterInput() {
- return this.stage === stages.s10_gameRunning;
- }
-
- /**
- * @param {GameCreationPayload} payload
- */
- onEnter(payload) {
- this.app.inputMgr.installFilter(this.boundInputFilter);
-
- this.creationPayload = payload;
- this.savegame = payload.savegame;
-
- this.loadingOverlay = new GameLoadingOverlay(this.app, this.getDivElement());
- this.loadingOverlay.showBasic();
-
- // Remove unneded default element
- document.body.querySelector(".modalDialogParent").remove();
-
- this.asyncChannel.watch(waitNextFrame()).then(() => this.stage3CreateCore());
- }
-
- /**
- * Render callback
- * @param {number} dt
- */
- onRender(dt) {
- if (APPLICATION_ERROR_OCCURED) {
- // Application somehow crashed, do not do anything
- return;
- }
-
- if (this.stage === stages.s7_warmup) {
- this.core.draw();
- this.warmupTimeSeconds -= dt / 1000.0;
- if (this.warmupTimeSeconds < 0) {
- logger.log("Warmup completed");
- this.stage10GameRunning();
- }
- }
-
- if (this.stage === stages.s10_gameRunning) {
- this.core.tick(dt);
- }
-
- // If the stage is still active (This might not be the case if tick() moved us to game over)
- if (this.stage === stages.s10_gameRunning) {
- // Only draw if page visible
- if (this.app.pageVisible) {
- this.core.draw();
- }
-
- this.loadingOverlay.removeIfAttached();
- } else {
- if (!this.loadingOverlay.isAttached()) {
- this.loadingOverlay.showBasic();
- }
- }
- }
-
- onBackgroundTick(dt) {
- this.onRender(dt);
- }
-
- /**
- * Saves the game
- */
-
- doSave() {
- if (!this.savegame || !this.savegame.isSaveable()) {
- return Promise.resolve();
- }
-
- if (APPLICATION_ERROR_OCCURED) {
- logger.warn("skipping save because application crashed");
- return Promise.resolve();
- }
-
- if (
- this.stage !== stages.s10_gameRunning &&
- this.stage !== stages.s7_warmup &&
- this.stage !== stages.leaving
- ) {
- logger.warn("Skipping save because game is not ready");
- return Promise.resolve();
- }
-
- // First update the game data
- logger.log("Starting to save game ...");
- this.core.root.signals.gameSaved.dispatch();
- this.savegame.updateData(this.core.root);
- return this.savegame.writeSavegameAndMetadata().catch(err => {
- logger.warn("Failed to save:", err);
- });
- }
-}
+import { APPLICATION_ERROR_OCCURED } from "../core/error_handler";
+import { GameState } from "../core/game_state";
+import { logSection, createLogger } from "../core/logging";
+import { waitNextFrame } from "../core/utils";
+import { globalConfig } from "../core/config";
+import { GameLoadingOverlay } from "../game/game_loading_overlay";
+import { KeyActionMapper } from "../game/key_action_mapper";
+import { Savegame } from "../savegame/savegame";
+import { GameCore } from "../game/core";
+import { MUSIC } from "../platform/sound";
+
+const logger = createLogger("state/ingame");
+
+// Different sub-states
+const stages = {
+ s3_createCore: "🌈 3: Create core",
+ s4_A_initEmptyGame: "🌈 4/A: Init empty game",
+ s4_B_resumeGame: "🌈 4/B: Resume game",
+
+ s5_firstUpdate: "🌈 5: First game update",
+ s6_postLoadHook: "🌈 6: Post load hook",
+ s7_warmup: "🌈 7: Warmup",
+
+ s10_gameRunning: "🌈 10: Game finally running",
+
+ leaving: "🌈 Saving, then leaving the game",
+ destroyed: "🌈 DESTROYED: Core is empty and waits for state leave",
+ initFailed: "🌈 ERROR: Initialization failed!",
+};
+
+export const gameCreationAction = {
+ new: "new-game",
+ resume: "resume-game",
+};
+
+// Typehints
+export class GameCreationPayload {
+ constructor() {
+ /** @type {boolean|undefined} */
+ this.fastEnter;
+
+ /** @type {Savegame} */
+ this.savegame;
+ }
+}
+
+export class InGameState extends GameState {
+ constructor() {
+ super("InGameState");
+
+ /** @type {GameCreationPayload} */
+ this.creationPayload = null;
+
+ // Stores current stage
+ this.stage = "";
+
+ /** @type {GameCore} */
+ this.core = null;
+
+ /** @type {KeyActionMapper} */
+ this.keyActionMapper = null;
+
+ /** @type {GameLoadingOverlay} */
+ this.loadingOverlay = null;
+
+ /** @type {Savegame} */
+ this.savegame = null;
+
+ this.boundInputFilter = this.filterInput.bind(this);
+
+ /**
+ * Whether we are currently saving the game
+ * @TODO: This doesn't realy fit here
+ */
+ this.currentSavePromise = null;
+ }
+
+ /**
+ * Switches the game into another sub-state
+ * @param {string} stage
+ */
+ switchStage(stage) {
+ assert(stage, "Got empty stage");
+ if (stage !== this.stage) {
+ this.stage = stage;
+ logger.log(this.stage);
+ return true;
+ } else {
+ // log(this, "Re entering", stage);
+ return false;
+ }
+ }
+
+ // GameState implementation
+ getInnerHTML() {
+ return "";
+ }
+
+ getThemeMusic() {
+ return MUSIC.theme;
+ }
+
+ onBeforeExit() {
+ // logger.log("Saving before quitting");
+ // return this.doSave().then(() => {
+ // logger.log(this, "Successfully saved");
+ // // this.stageDestroyed();
+ // });
+ }
+
+ onAppPause() {
+ // if (this.stage === stages.s10_gameRunning) {
+ // logger.log("Saving because app got paused");
+ // this.doSave();
+ // }
+ }
+
+ getHasFadeIn() {
+ return false;
+ }
+
+ getPauseOnFocusLost() {
+ return false;
+ }
+
+ getHasUnloadConfirmation() {
+ return true;
+ }
+
+ onLeave() {
+ if (this.core) {
+ this.stageDestroyed();
+ }
+ this.app.inputMgr.dismountFilter(this.boundInputFilter);
+ }
+
+ onResized(w, h) {
+ super.onResized(w, h);
+ if (this.stage === stages.s10_gameRunning) {
+ this.core.resize(w, h);
+ }
+ }
+
+ // ---- End of GameState implementation
+
+ /**
+ * Goes back to the menu state
+ */
+ goBackToMenu() {
+ this.saveThenGoToState("MainMenuState");
+ }
+
+ /**
+ * Goes back to the settings state
+ */
+ goToSettings() {
+ this.saveThenGoToState("SettingsState", {
+ backToStateId: this.key,
+ backToStatePayload: this.creationPayload,
+ });
+ }
+
+ /**
+ * Goes back to the settings state
+ */
+ goToKeybindings() {
+ this.saveThenGoToState("KeybindingsState", {
+ backToStateId: this.key,
+ backToStatePayload: this.creationPayload,
+ });
+ }
+
+ /**
+ * Moves to a state outside of the game
+ * @param {string} stateId
+ * @param {any=} payload
+ */
+ saveThenGoToState(stateId, payload) {
+ if (this.stage === stages.leaving || this.stage === stages.destroyed) {
+ logger.warn(
+ "Tried to leave game twice or during destroy:",
+ this.stage,
+ "(attempted to move to",
+ stateId,
+ ")"
+ );
+ return;
+ }
+ this.stageLeavingGame();
+ this.doSave().then(() => {
+ this.stageDestroyed();
+ this.moveToState(stateId, payload);
+ });
+ }
+
+ onBackButton() {
+ // do nothing
+ }
+
+ /**
+ * Called when the game somehow failed to initialize. Resets everything to basic state and
+ * then goes to the main menu, showing the error
+ * @param {string} err
+ */
+ onInitializationFailure(err) {
+ if (this.switchStage(stages.initFailed)) {
+ logger.error("Init failure:", err);
+ this.stageDestroyed();
+ this.moveToState("MainMenuState", { loadError: err });
+ }
+ }
+
+ // STAGES
+
+ /**
+ * Creates the game core instance, and thus the root
+ */
+ stage3CreateCore() {
+ if (this.switchStage(stages.s3_createCore)) {
+ logger.log("Creating new game core");
+ this.core = new GameCore(this.app);
+
+ this.core.initializeRoot(this, this.savegame);
+
+ if (this.savegame.hasGameDump()) {
+ this.stage4bResumeGame();
+ } else {
+ this.app.gameAnalytics.handleGameStarted();
+ this.stage4aInitEmptyGame();
+ }
+ }
+ }
+
+ /**
+ * Initializes a new empty game
+ */
+ stage4aInitEmptyGame() {
+ if (this.switchStage(stages.s4_A_initEmptyGame)) {
+ this.core.initNewGame();
+ this.stage5FirstUpdate();
+ }
+ }
+
+ /**
+ * Resumes an existing game
+ */
+ stage4bResumeGame() {
+ if (this.switchStage(stages.s4_B_resumeGame)) {
+ if (!this.core.initExistingGame()) {
+ this.onInitializationFailure("Savegame is corrupt and can not be restored.");
+ return;
+ }
+ this.app.gameAnalytics.handleGameResumed();
+ this.stage5FirstUpdate();
+ }
+ }
+
+ /**
+ * Performs the first game update on the game which initializes most caches
+ */
+ stage5FirstUpdate() {
+ if (this.switchStage(stages.s5_firstUpdate)) {
+ this.core.root.logicInitialized = true;
+ this.core.updateLogic();
+ this.stage6PostLoadHook();
+ }
+ }
+
+ /**
+ * Call the post load hook, this means that we have loaded the game, and all systems
+ * can operate and start to work now.
+ */
+ stage6PostLoadHook() {
+ if (this.switchStage(stages.s6_postLoadHook)) {
+ logger.log("Post load hook");
+ this.core.postLoadHook();
+ this.stage7Warmup();
+ }
+ }
+
+ /**
+ * This makes the game idle and draw for a while, because we run most code this way
+ * the V8 engine can already start to optimize it. Also this makes sure the resources
+ * are in the VRAM and we have a smooth experience once we start.
+ */
+ stage7Warmup() {
+ if (this.switchStage(stages.s7_warmup)) {
+ if (this.creationPayload.fastEnter) {
+ this.warmupTimeSeconds = globalConfig.warmupTimeSecondsFast;
+ } else {
+ this.warmupTimeSeconds = globalConfig.warmupTimeSecondsRegular;
+ }
+ }
+ }
+
+ /**
+ * The final stage where this game is running and updating regulary.
+ */
+ stage10GameRunning() {
+ if (this.switchStage(stages.s10_gameRunning)) {
+ this.core.root.signals.readyToRender.dispatch();
+
+ logSection("GAME STARTED", "#26a69a");
+
+ // Initial resize, might have changed during loading (this is possible)
+ this.core.resize(this.app.screenWidth, this.app.screenHeight);
+ }
+ }
+
+ /**
+ * This stage destroys the whole game, used to cleanup
+ */
+ stageDestroyed() {
+ if (this.switchStage(stages.destroyed)) {
+ // Cleanup all api calls
+ this.cancelAllAsyncOperations();
+
+ if (this.syncer) {
+ this.syncer.cancelSync();
+ this.syncer = null;
+ }
+
+ // Cleanup core
+ if (this.core) {
+ this.core.destruct();
+ this.core = null;
+ }
+ }
+ }
+
+ /**
+ * When leaving the game
+ */
+ stageLeavingGame() {
+ if (this.switchStage(stages.leaving)) {
+ // ...
+ }
+ }
+
+ // END STAGES
+
+ /**
+ * Filters the input (keybindings)
+ */
+ filterInput() {
+ return this.stage === stages.s10_gameRunning;
+ }
+
+ /**
+ * @param {GameCreationPayload} payload
+ */
+ onEnter(payload) {
+ this.app.inputMgr.installFilter(this.boundInputFilter);
+
+ this.creationPayload = payload;
+ this.savegame = payload.savegame;
+
+ this.loadingOverlay = new GameLoadingOverlay(this.app, this.getDivElement());
+ this.loadingOverlay.showBasic();
+
+ // Remove unneded default element
+ document.body.querySelector(".modalDialogParent").remove();
+
+ this.asyncChannel.watch(waitNextFrame()).then(() => this.stage3CreateCore());
+ }
+
+ /**
+ * Render callback
+ * @param {number} dt
+ */
+ onRender(dt) {
+ if (APPLICATION_ERROR_OCCURED) {
+ // Application somehow crashed, do not do anything
+ return;
+ }
+
+ if (this.stage === stages.s7_warmup) {
+ this.core.draw();
+ this.warmupTimeSeconds -= dt / 1000.0;
+ if (this.warmupTimeSeconds < 0) {
+ logger.log("Warmup completed");
+ this.stage10GameRunning();
+ }
+ }
+
+ if (this.stage === stages.s10_gameRunning) {
+ this.core.tick(dt);
+ }
+
+ // If the stage is still active (This might not be the case if tick() moved us to game over)
+ if (this.stage === stages.s10_gameRunning) {
+ // Only draw if page visible
+ if (this.app.pageVisible) {
+ this.core.draw();
+ }
+
+ this.loadingOverlay.removeIfAttached();
+ } else {
+ if (!this.loadingOverlay.isAttached()) {
+ this.loadingOverlay.showBasic();
+ }
+ }
+ }
+
+ onBackgroundTick(dt) {
+ this.onRender(dt);
+ }
+
+ /**
+ * Saves the game
+ */
+
+ doSave() {
+ if (!this.savegame || !this.savegame.isSaveable()) {
+ return Promise.resolve();
+ }
+
+ if (APPLICATION_ERROR_OCCURED) {
+ logger.warn("skipping save because application crashed");
+ return Promise.resolve();
+ }
+
+ if (
+ this.stage !== stages.s10_gameRunning &&
+ this.stage !== stages.s7_warmup &&
+ this.stage !== stages.leaving
+ ) {
+ logger.warn("Skipping save because game is not ready");
+ return Promise.resolve();
+ }
+
+ if (this.currentSavePromise) {
+ logger.warn("Skipping double save and returning same promise");
+ return this.currentSavePromise;
+ }
+ logger.log("Starting to save game ...");
+ this.savegame.updateData(this.core.root);
+
+ this.currentSavePromise = this.savegame
+ .writeSavegameAndMetadata()
+ .catch(err => {
+ // Catch errors
+ logger.warn("Failed to save:", err);
+ })
+ .then(() => {
+ // Clear promise
+ logger.log("Saved!");
+ this.core.root.signals.gameSaved.dispatch();
+ this.currentSavePromise = null;
+ });
+
+ return this.currentSavePromise;
+ }
+}
diff --git a/src/js/states/keybindings.js b/src/js/states/keybindings.js
index b68626c7..a01629f1 100644
--- a/src/js/states/keybindings.js
+++ b/src/js/states/keybindings.js
@@ -1,179 +1,173 @@
-import { TextualGameState } from "../core/textual_game_state";
-import { SOUNDS } from "../platform/sound";
-import { T } from "../translations";
-import { KEYMAPPINGS, getStringForKeyCode } from "../game/key_action_mapper";
-import { Dialog } from "../core/modal_dialog_elements";
-import { IS_DEMO } from "../core/config";
-
-export class KeybindingsState extends TextualGameState {
- constructor() {
- super("KeybindingsState");
- }
-
- getStateHeaderTitle() {
- return T.keybindings.title;
- }
-
- getMainContentHTML() {
- return `
-
-
- ${T.keybindings.hint}
- ${T.keybindings.resetKeybindings}
-
-
-
-
-
-
- `;
- }
-
- onEnter() {
- const keybindingsElem = this.htmlElement.querySelector(".keybindings");
-
- this.trackClicks(this.htmlElement.querySelector(".resetBindings"), this.resetBindings);
-
- for (const category in KEYMAPPINGS) {
- const categoryDiv = document.createElement("div");
- categoryDiv.classList.add("category");
- keybindingsElem.appendChild(categoryDiv);
-
- const labelDiv = document.createElement("strong");
- labelDiv.innerText = T.keybindings.categoryLabels[category];
- labelDiv.classList.add("categoryLabel");
- categoryDiv.appendChild(labelDiv);
-
- for (const keybindingId in KEYMAPPINGS[category]) {
- const mapped = KEYMAPPINGS[category][keybindingId];
-
- const elem = document.createElement("div");
- elem.classList.add("entry");
- elem.setAttribute("data-keybinding", keybindingId);
- categoryDiv.appendChild(elem);
-
- const title = document.createElement("span");
- title.classList.add("title");
- title.innerText = T.keybindings.mappings[keybindingId];
- elem.appendChild(title);
-
- const mappingDiv = document.createElement("span");
- mappingDiv.classList.add("mapping");
- elem.appendChild(mappingDiv);
-
- const editBtn = document.createElement("button");
- editBtn.classList.add("styledButton", "editKeybinding");
-
- const resetBtn = document.createElement("button");
- resetBtn.classList.add("styledButton", "resetKeybinding");
-
- if (mapped.builtin) {
- editBtn.classList.add("disabled");
- resetBtn.classList.add("disabled");
- } else {
- this.trackClicks(editBtn, () => this.editKeybinding(keybindingId));
- this.trackClicks(resetBtn, () => this.resetKeybinding(keybindingId));
- }
- elem.appendChild(editBtn);
- elem.appendChild(resetBtn);
- }
- }
- this.updateKeybindings();
- }
-
- editKeybinding(id) {
- // if (IS_DEMO) {
- // this.dialogs.showFeatureRestrictionInfo(T.demo.features.customizeKeybindings);
- // return;
- // }
-
- const dialog = new Dialog({
- app: this.app,
- title: T.dialogs.editKeybinding.title,
- contentHTML: T.dialogs.editKeybinding.desc,
- buttons: ["cancel:good"],
- type: "info",
- });
-
- dialog.inputReciever.keydown.add(({ keyCode, shift, alt, event }) => {
- if (keyCode === 27) {
- this.dialogs.closeDialog(dialog);
- return;
- }
-
- if (event) {
- event.preventDefault();
- }
-
- if (event.target && event.target.tagName === "BUTTON" && keyCode === 1) {
- return;
- }
-
- if (
- // Enter
- keyCode === 13
- ) {
- // Ignore builtins
- return;
- }
-
- this.app.settings.updateKeybindingOverride(id, keyCode);
-
- this.dialogs.closeDialog(dialog);
- this.updateKeybindings();
- });
-
- dialog.inputReciever.backButton.add(() => {});
- this.dialogs.internalShowDialog(dialog);
-
- this.app.sound.playUiSound(SOUNDS.dialogOk);
- }
-
- updateKeybindings() {
- const overrides = this.app.settings.getKeybindingOverrides();
- for (const category in KEYMAPPINGS) {
- for (const keybindingId in KEYMAPPINGS[category]) {
- const mapped = KEYMAPPINGS[category][keybindingId];
-
- const container = this.htmlElement.querySelector("[data-keybinding='" + keybindingId + "']");
- assert(container, "Container for keybinding not found: " + keybindingId);
-
- let keyCode = mapped.keyCode;
- if (overrides[keybindingId]) {
- keyCode = overrides[keybindingId];
- }
-
- const mappingDiv = container.querySelector(".mapping");
- mappingDiv.innerHTML = getStringForKeyCode(keyCode);
- mappingDiv.classList.toggle("changed", !!overrides[keybindingId]);
-
- const resetBtn = container.querySelector("button.resetKeybinding");
- resetBtn.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId]);
- }
- }
- }
-
- resetKeybinding(id) {
- this.app.settings.resetKeybindingOverride(id);
- this.updateKeybindings();
- }
-
- resetBindings() {
- const { reset } = this.dialogs.showWarning(
- T.dialogs.resetKeybindingsConfirmation.title,
- T.dialogs.resetKeybindingsConfirmation.desc,
- ["cancel:good", "reset:bad"]
- );
-
- reset.add(() => {
- this.app.settings.resetKeybindingOverrides();
- this.updateKeybindings();
-
- this.dialogs.showInfo(T.dialogs.keybindingsResetOk.title, T.dialogs.keybindingsResetOk.desc);
- });
- }
-
- getDefaultPreviousState() {
- return "SettingsState";
- }
-}
+import { Dialog } from "../core/modal_dialog_elements";
+import { TextualGameState } from "../core/textual_game_state";
+import { getStringForKeyCode, KEYMAPPINGS } from "../game/key_action_mapper";
+import { SOUNDS } from "../platform/sound";
+import { T } from "../translations";
+
+export class KeybindingsState extends TextualGameState {
+ constructor() {
+ super("KeybindingsState");
+ }
+
+ getStateHeaderTitle() {
+ return T.keybindings.title;
+ }
+
+ getMainContentHTML() {
+ return `
+
+
+ ${T.keybindings.hint}
+ ${T.keybindings.resetKeybindings}
+
+
+
+
+
+
+ `;
+ }
+
+ onEnter() {
+ const keybindingsElem = this.htmlElement.querySelector(".keybindings");
+
+ this.trackClicks(this.htmlElement.querySelector(".resetBindings"), this.resetBindings);
+
+ for (const category in KEYMAPPINGS) {
+ const categoryDiv = document.createElement("div");
+ categoryDiv.classList.add("category");
+ keybindingsElem.appendChild(categoryDiv);
+
+ const labelDiv = document.createElement("strong");
+ labelDiv.innerText = T.keybindings.categoryLabels[category];
+ labelDiv.classList.add("categoryLabel");
+ categoryDiv.appendChild(labelDiv);
+
+ for (const keybindingId in KEYMAPPINGS[category]) {
+ const mapped = KEYMAPPINGS[category][keybindingId];
+
+ const elem = document.createElement("div");
+ elem.classList.add("entry");
+ elem.setAttribute("data-keybinding", keybindingId);
+ categoryDiv.appendChild(elem);
+
+ const title = document.createElement("span");
+ title.classList.add("title");
+ title.innerText = T.keybindings.mappings[keybindingId];
+ elem.appendChild(title);
+
+ const mappingDiv = document.createElement("span");
+ mappingDiv.classList.add("mapping");
+ elem.appendChild(mappingDiv);
+
+ const editBtn = document.createElement("button");
+ editBtn.classList.add("styledButton", "editKeybinding");
+
+ const resetBtn = document.createElement("button");
+ resetBtn.classList.add("styledButton", "resetKeybinding");
+
+ if (mapped.builtin) {
+ editBtn.classList.add("disabled");
+ resetBtn.classList.add("disabled");
+ } else {
+ this.trackClicks(editBtn, () => this.editKeybinding(keybindingId));
+ this.trackClicks(resetBtn, () => this.resetKeybinding(keybindingId));
+ }
+ elem.appendChild(editBtn);
+ elem.appendChild(resetBtn);
+ }
+ }
+ this.updateKeybindings();
+ }
+
+ editKeybinding(id) {
+ const dialog = new Dialog({
+ app: this.app,
+ title: T.dialogs.editKeybinding.title,
+ contentHTML: T.dialogs.editKeybinding.desc,
+ buttons: ["cancel:good"],
+ type: "info",
+ });
+
+ dialog.inputReciever.keydown.add(({ keyCode, shift, alt, event }) => {
+ if (keyCode === 27) {
+ this.dialogs.closeDialog(dialog);
+ return;
+ }
+
+ if (event) {
+ event.preventDefault();
+ }
+
+ if (event.target && event.target.tagName === "BUTTON" && keyCode === 1) {
+ return;
+ }
+
+ if (
+ // Enter
+ keyCode === 13
+ ) {
+ // Ignore builtins
+ return;
+ }
+
+ this.app.settings.updateKeybindingOverride(id, keyCode);
+
+ this.dialogs.closeDialog(dialog);
+ this.updateKeybindings();
+ });
+
+ dialog.inputReciever.backButton.add(() => {});
+ this.dialogs.internalShowDialog(dialog);
+
+ this.app.sound.playUiSound(SOUNDS.dialogOk);
+ }
+
+ updateKeybindings() {
+ const overrides = this.app.settings.getKeybindingOverrides();
+ for (const category in KEYMAPPINGS) {
+ for (const keybindingId in KEYMAPPINGS[category]) {
+ const mapped = KEYMAPPINGS[category][keybindingId];
+
+ const container = this.htmlElement.querySelector("[data-keybinding='" + keybindingId + "']");
+ assert(container, "Container for keybinding not found: " + keybindingId);
+
+ let keyCode = mapped.keyCode;
+ if (overrides[keybindingId]) {
+ keyCode = overrides[keybindingId];
+ }
+
+ const mappingDiv = container.querySelector(".mapping");
+ mappingDiv.innerHTML = getStringForKeyCode(keyCode);
+ mappingDiv.classList.toggle("changed", !!overrides[keybindingId]);
+
+ const resetBtn = container.querySelector("button.resetKeybinding");
+ resetBtn.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId]);
+ }
+ }
+ }
+
+ resetKeybinding(id) {
+ this.app.settings.resetKeybindingOverride(id);
+ this.updateKeybindings();
+ }
+
+ resetBindings() {
+ const { reset } = this.dialogs.showWarning(
+ T.dialogs.resetKeybindingsConfirmation.title,
+ T.dialogs.resetKeybindingsConfirmation.desc,
+ ["cancel:good", "reset:bad"]
+ );
+
+ reset.add(() => {
+ this.app.settings.resetKeybindingOverrides();
+ this.updateKeybindings();
+
+ this.dialogs.showInfo(T.dialogs.keybindingsResetOk.title, T.dialogs.keybindingsResetOk.desc);
+ });
+ }
+
+ getDefaultPreviousState() {
+ return "SettingsState";
+ }
+}
diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js
index bea209a8..fa177874 100644
--- a/src/js/states/main_menu.js
+++ b/src/js/states/main_menu.js
@@ -1,44 +1,31 @@
-import { GameState } from "../core/game_state";
import { cachebust } from "../core/cachebust";
-import { globalConfig, IS_DEMO, THIRDPARTY_URLS } from "../core/config";
+import { A_B_TESTING_LINK_TYPE, globalConfig, THIRDPARTY_URLS } from "../core/config";
+import { GameState } from "../core/game_state";
+import { DialogWithForm } from "../core/modal_dialog_elements";
+import { FormElementInput } from "../core/modal_dialog_forms";
+import { ReadWriteProxy } from "../core/read_write_proxy";
import {
- makeDiv,
- makeButtonElement,
formatSecondsToTimeAgo,
- waitNextFrame,
+ generateFileDownload,
isSupportedBrowser,
makeButton,
+ makeButtonElement,
+ makeDiv,
removeAllChildren,
+ startFileChoose,
+ waitNextFrame,
} from "../core/utils";
-import { ReadWriteProxy } from "../core/read_write_proxy";
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
-import { T } from "../translations";
import { getApplicationSettingById } from "../profile/application_settings";
-import { FormElementInput } from "../core/modal_dialog_forms";
-import { DialogWithForm } from "../core/modal_dialog_elements";
+import { T } from "../translations";
+
+const trim = require("trim");
/**
* @typedef {import("../savegame/savegame_typedefs").SavegameMetadata} SavegameMetadata
* @typedef {import("../profile/setting_types").EnumSetting} EnumSetting
*/
-/**
- * Generates a file download
- * @param {string} filename
- * @param {string} text
- */
-function generateFileDownload(filename, text) {
- var element = document.createElement("a");
- element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(text));
- element.setAttribute("download", filename);
-
- element.style.display = "none";
- document.body.appendChild(element);
-
- element.click();
- document.body.removeChild(element);
-}
-
export class MainMenuState extends GameState {
constructor() {
super("MainMenuState");
@@ -47,18 +34,16 @@ export class MainMenuState extends GameState {
getInnerHTML() {
const bannerHtml = `
${T.demoBanners.title}
-
${T.demoBanners.intro}
-
- Get the shapez.io standalone!
+ Get the shapez.io standalone!
`;
- return `
+ const showDemoBadges = this.app.restrictionMgr.getIsStandaloneMarketingActive();
+ return `
- `;
- }
-
- getThemeMusic() {
- return null;
- }
-
- getHasFadeIn() {
- return false;
- }
-
- onEnter() {
- this.htmlElement.classList.add("prefab_LoadingState");
-
- const elementsToRemove = ["#loadingPreload", "#fontPreload"];
- for (let i = 0; i < elementsToRemove.length; ++i) {
- const elem = document.querySelector(elementsToRemove[i]);
- if (elem) {
- elem.remove();
- }
- }
-
- this.dialogs = new HUDModalDialogs(null, this.app);
- const dialogsElement = document.body.querySelector(".modalDialogParent");
- this.dialogs.initializeToElement(dialogsElement);
-
- /** @type {HTMLElement} */
- this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc");
- /** @type {HTMLElement} */
- this.statusBar = this.htmlElement.querySelector(".loadingStatus > .bar > .inner");
- /** @type {HTMLElement} */
- this.statusBarText = this.htmlElement.querySelector(".loadingStatus > .bar > .status");
-
- this.currentStatus = "booting";
- this.currentIndex = 0;
-
- this.startLoading();
- }
-
- onLeave() {
- // this.dialogs.cleanup();
- }
-
- startLoading() {
- this.setStatus("Booting")
-
- .then(() => this.setStatus("Creating platform wrapper"))
- .then(() => this.app.platformWrapper.initialize())
-
- .then(() => this.setStatus("Initializing local storage"))
- .then(() => {
- const wrapper = this.app.platformWrapper;
- if (wrapper instanceof PlatformWrapperImplBrowser) {
- try {
- window.localStorage.setItem("local_storage_test", "1");
- window.localStorage.removeItem("local_storage_test");
- } catch (ex) {
- logger.error("Failed to read/write local storage:", ex);
- return new Promise(() => {
- alert(`Your brower does not support thirdparty cookies or you have disabled it in your security settings.\n\n
- In Chrome this setting is called "Block third-party cookies and site data".\n\n
- Please allow third party cookies and then reload the page.`);
- // Never return
- });
- }
- }
- })
-
- .then(() => this.setStatus("Creating storage"))
- .then(() => {
- return this.app.storage.initialize();
- })
-
- .then(() => this.setStatus("Initializing libraries"))
- .then(() => this.app.analytics.initialize())
- .then(() => this.app.gameAnalytics.initialize())
-
- .then(() => this.setStatus("Initializing settings"))
- .then(() => {
- return this.app.settings.initialize();
- })
-
- .then(() => {
- // Initialize fullscreen
- if (this.app.platformWrapper.getSupportsFullscreen()) {
- this.app.platformWrapper.setFullscreen(this.app.settings.getIsFullScreen());
- }
- })
-
- .then(() => this.setStatus("Initializing language"))
- .then(() => {
- if (this.app.settings.getLanguage() === "auto-detect") {
- const language = autoDetectLanguageId();
- logger.log("Setting language to", language);
- return this.app.settings.updateLanguage(language);
- }
- })
- .then(() => {
- const language = this.app.settings.getLanguage();
- updateApplicationLanguage(language);
- })
-
- .then(() => this.setStatus("Initializing sounds"))
- .then(() => {
- // Notice: We don't await the sounds loading itself
- return this.app.sound.initialize();
- })
-
- .then(() => {
- this.app.backgroundResourceLoader.startLoading();
- })
-
- .then(() => this.setStatus("Initializing savegame"))
- .then(() => {
- return this.app.savegameMgr.initialize().catch(err => {
- logger.error("Failed to initialize savegames:", err);
- alert(
- "Your savegames failed to load, it seems your data files got corrupted. I'm so sorry!\n\n(This can happen if your pc crashed while a game was saved).\n\nYou can try re-importing your savegames."
- );
- return this.app.savegameMgr.writeAsync();
- });
- })
-
- .then(() => this.setStatus("Downloading resources"))
- .then(() => {
- return this.app.backgroundResourceLoader.getPromiseForBareGame();
- })
-
- .then(() => this.setStatus("Checking changelog"))
- .then(() => {
- if (G_IS_DEV && globalConfig.debug.disableUpgradeNotification) {
- return;
- }
-
- return this.app.storage
- .readFileAsync("lastversion.bin")
- .catch(err => {
- logger.warn("Failed to read lastversion:", err);
- return G_BUILD_VERSION;
- })
- .then(version => {
- logger.log("Last version:", version, "App version:", G_BUILD_VERSION);
- this.app.storage.writeFileAsync("lastversion.bin", G_BUILD_VERSION);
- return version;
- })
- .then(version => {
- let changelogEntries = [];
- logger.log("Last seen version:", version);
-
- for (let i = 0; i < CHANGELOG.length; ++i) {
- if (CHANGELOG[i].version === version) {
- break;
- }
- changelogEntries.push(CHANGELOG[i]);
- }
- if (changelogEntries.length === 0) {
- return;
- }
-
- let dialogHtml = T.dialogs.updateSummary.desc;
- for (let i = 0; i < changelogEntries.length; ++i) {
- const entry = changelogEntries[i];
- dialogHtml += `
-
-
${entry.version}
-
${entry.date}
-
- ${entry.entries.map(text => `${text} `).join("")}
-
-
- `;
- }
-
- return new Promise(resolve => {
- this.dialogs.showInfo(T.dialogs.updateSummary.title, dialogHtml).ok.add(resolve);
- });
- });
- })
-
- .then(() => this.setStatus("Launching"))
- .then(
- () => {
- this.moveToState("MainMenuState");
- },
- err => {
- this.showFailMessage(err);
- }
- );
- }
-
- setStatus(text) {
- logger.log("✅ " + text);
- this.currentIndex += 1;
- this.currentStatus = text;
- this.statusText.innerText = text;
-
- const numSteps = 10; // FIXME
-
- const percentage = (this.currentIndex / numSteps) * 100.0;
- this.statusBar.style.width = percentage + "%";
- this.statusBarText.innerText = findNiceValue(percentage) + "%";
-
- return Promise.resolve();
- }
-
- showFailMessage(text) {
- logger.error("App init failed:", text);
-
- const email = "bugs@shapez.io";
-
- const subElement = document.createElement("div");
- subElement.classList.add("failureBox");
-
- subElement.innerHTML = `
-
-
-
-
-
-
- ${this.currentStatus} failed:
- ${text}
-
-
-
- Please send me an email with steps to reproduce and what you did before this happened:
-
${email}
-
-
-
- Reset App
- Build ${G_BUILD_VERSION} @ ${G_BUILD_COMMIT_HASH}
-
-
- `;
-
- this.htmlElement.classList.add("failure");
- this.htmlElement.appendChild(subElement);
-
- const resetBtn = subElement.querySelector("button.resetApp");
- this.trackClicks(resetBtn, this.showResetConfirm);
- }
-
- showResetConfirm() {
- if (confirm("Are you sure you want to reset the app? This will delete all your savegames")) {
- this.resetApp();
- }
- }
-
- resetApp() {
- this.app.settings
- .resetEverythingAsync()
- .then(() => {
- this.app.savegameMgr.resetEverythingAsync();
- })
- .then(() => {
- this.app.settings.resetEverythingAsync();
- })
- .then(() => {
- window.location.reload();
- });
- }
-}
+import { CHANGELOG } from "../changelog";
+import { cachebust } from "../core/cachebust";
+import { globalConfig } from "../core/config";
+import { GameState } from "../core/game_state";
+import { createLogger } from "../core/logging";
+import { findNiceValue } from "../core/utils";
+import { getRandomHint } from "../game/hints";
+import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
+import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
+import { autoDetectLanguageId, T, updateApplicationLanguage } from "../translations";
+
+const logger = createLogger("state/preload");
+
+export class PreloadState extends GameState {
+ constructor() {
+ super("PreloadState");
+ }
+
+ getInnerHTML() {
+ return `
+
+
+ Booting
+
+
+
+ `;
+ }
+
+ getThemeMusic() {
+ return null;
+ }
+
+ getHasFadeIn() {
+ return false;
+ }
+
+ onEnter() {
+ this.htmlElement.classList.add("prefab_LoadingState");
+
+ const elementsToRemove = ["#loadingPreload", "#fontPreload"];
+ for (let i = 0; i < elementsToRemove.length; ++i) {
+ const elem = document.querySelector(elementsToRemove[i]);
+ if (elem) {
+ elem.remove();
+ }
+ }
+
+ this.dialogs = new HUDModalDialogs(null, this.app);
+ const dialogsElement = document.body.querySelector(".modalDialogParent");
+ this.dialogs.initializeToElement(dialogsElement);
+
+ /** @type {HTMLElement} */
+ this.statusText = this.htmlElement.querySelector(".loadingStatus > .desc");
+
+ /** @type {HTMLElement} */
+ this.hintsText = this.htmlElement.querySelector(".prefab_GameHint");
+ this.lastHintShown = -1000;
+ this.nextHintDuration = 0;
+
+ this.currentStatus = "booting";
+
+ this.startLoading();
+ }
+
+ onLeave() {
+ // this.dialogs.cleanup();
+ }
+
+ startLoading() {
+ this.setStatus("Booting")
+
+ .then(() => this.setStatus("Creating platform wrapper"))
+ .then(() => this.app.platformWrapper.initialize())
+
+ .then(() => this.setStatus("Initializing local storage"))
+ .then(() => {
+ const wrapper = this.app.platformWrapper;
+ if (wrapper instanceof PlatformWrapperImplBrowser) {
+ try {
+ window.localStorage.setItem("local_storage_test", "1");
+ window.localStorage.removeItem("local_storage_test");
+ } catch (ex) {
+ logger.error("Failed to read/write local storage:", ex);
+ return new Promise(() => {
+ alert(`Your brower does not support thirdparty cookies or you have disabled it in your security settings.\n\n
+ In Chrome this setting is called "Block third-party cookies and site data".\n\n
+ Please allow third party cookies and then reload the page.`);
+ // Never return
+ });
+ }
+ }
+ })
+
+ .then(() => this.setStatus("Creating storage"))
+ .then(() => {
+ return this.app.storage.initialize();
+ })
+
+ .then(() => this.setStatus("Initializing libraries"))
+ .then(() => this.app.analytics.initialize())
+ .then(() => this.app.gameAnalytics.initialize())
+
+ .then(() => this.setStatus("Initializing settings"))
+ .then(() => {
+ return this.app.settings.initialize();
+ })
+
+ .then(() => {
+ // Initialize fullscreen
+ if (this.app.platformWrapper.getSupportsFullscreen()) {
+ this.app.platformWrapper.setFullscreen(this.app.settings.getIsFullScreen());
+ }
+ })
+
+ .then(() => this.setStatus("Initializing language"))
+ .then(() => {
+ if (this.app.settings.getLanguage() === "auto-detect") {
+ const language = autoDetectLanguageId();
+ logger.log("Setting language to", language);
+ return this.app.settings.updateLanguage(language);
+ }
+ })
+ .then(() => {
+ const language = this.app.settings.getLanguage();
+ updateApplicationLanguage(language);
+ })
+
+ .then(() => this.setStatus("Initializing sounds"))
+ .then(() => {
+ // Notice: We don't await the sounds loading itself
+ return this.app.sound.initialize();
+ })
+
+ .then(() => {
+ this.app.backgroundResourceLoader.startLoading();
+ })
+
+ .then(() => this.setStatus("Initializing restrictions"))
+ .then(() => {
+ return this.app.restrictionMgr.initialize();
+ })
+
+ .then(() => this.setStatus("Initializing savegame"))
+ .then(() => {
+ return this.app.savegameMgr.initialize().catch(err => {
+ logger.error("Failed to initialize savegames:", err);
+ alert(
+ "Your savegames failed to load, it seems your data files got corrupted. I'm so sorry!\n\n(This can happen if your pc crashed while a game was saved).\n\nYou can try re-importing your savegames."
+ );
+ return this.app.savegameMgr.writeAsync();
+ });
+ })
+
+ .then(() => this.setStatus("Downloading resources"))
+ .then(() => {
+ return this.app.backgroundResourceLoader.getPromiseForBareGame();
+ })
+
+ .then(() => this.setStatus("Checking changelog"))
+ .then(() => {
+ if (G_IS_DEV && globalConfig.debug.disableUpgradeNotification) {
+ return;
+ }
+
+ return this.app.storage
+ .readFileAsync("lastversion.bin")
+ .catch(err => {
+ logger.warn("Failed to read lastversion:", err);
+ return G_BUILD_VERSION;
+ })
+ .then(version => {
+ logger.log("Last version:", version, "App version:", G_BUILD_VERSION);
+ this.app.storage.writeFileAsync("lastversion.bin", G_BUILD_VERSION);
+ return version;
+ })
+ .then(version => {
+ let changelogEntries = [];
+ logger.log("Last seen version:", version);
+
+ for (let i = 0; i < CHANGELOG.length; ++i) {
+ if (CHANGELOG[i].version === version) {
+ break;
+ }
+ changelogEntries.push(CHANGELOG[i]);
+ }
+ if (changelogEntries.length === 0) {
+ return;
+ }
+
+ let dialogHtml = T.dialogs.updateSummary.desc;
+ for (let i = 0; i < changelogEntries.length; ++i) {
+ const entry = changelogEntries[i];
+ dialogHtml += `
+
+
${entry.version}
+
${entry.date}
+
+ ${entry.entries.map(text => `${text} `).join("")}
+
+
+ `;
+ }
+
+ return new Promise(resolve => {
+ this.dialogs.showInfo(T.dialogs.updateSummary.title, dialogHtml).ok.add(resolve);
+ });
+ });
+ })
+
+ .then(() => this.setStatus("Launching"))
+ .then(
+ () => {
+ this.moveToState("MainMenuState");
+ },
+ err => {
+ this.showFailMessage(err);
+ }
+ );
+ }
+
+ update() {
+ const now = performance.now();
+ if (now - this.lastHintShown > this.nextHintDuration) {
+ this.lastHintShown = now;
+ const hintText = getRandomHint();
+
+ this.hintsText.innerHTML = hintText;
+
+ /**
+ * Compute how long the user will need to read the hint.
+ * We calculate with 130 words per minute, with an average of 5 chars
+ * that is 650 characters / minute
+ */
+ this.nextHintDuration = Math.max(2500, (hintText.length / 650) * 60 * 1000);
+ }
+ }
+
+ onRender() {
+ this.update();
+ }
+
+ onBackgroundTick() {
+ this.update();
+ }
+
+ /**
+ *
+ * @param {string} text
+ */
+ setStatus(text) {
+ logger.log("✅ " + text);
+ this.currentStatus = text;
+ this.statusText.innerText = text;
+ return Promise.resolve();
+ }
+
+ showFailMessage(text) {
+ logger.error("App init failed:", text);
+
+ const email = "bugs@shapez.io";
+
+ const subElement = document.createElement("div");
+ subElement.classList.add("failureBox");
+
+ subElement.innerHTML = `
+
+
+
+
+
+
+ ${this.currentStatus} failed:
+ ${text}
+
+
+
+ Please send me an email with steps to reproduce and what you did before this happened:
+
${email}
+
+
+
+ Reset App
+ Build ${G_BUILD_VERSION} @ ${G_BUILD_COMMIT_HASH}
+
+
+ `;
+
+ this.htmlElement.classList.add("failure");
+ this.htmlElement.appendChild(subElement);
+
+ const resetBtn = subElement.querySelector("button.resetApp");
+ this.trackClicks(resetBtn, this.showResetConfirm);
+
+ this.hintsText.remove();
+ }
+
+ showResetConfirm() {
+ if (confirm("Are you sure you want to reset the app? This will delete all your savegames!")) {
+ this.resetApp();
+ }
+ }
+
+ resetApp() {
+ this.app.settings
+ .resetEverythingAsync()
+ .then(() => {
+ this.app.savegameMgr.resetEverythingAsync();
+ })
+ .then(() => {
+ this.app.settings.resetEverythingAsync();
+ })
+ .then(() => {
+ window.location.reload();
+ });
+ }
+}
diff --git a/src/js/states/settings.js b/src/js/states/settings.js
index 5e22492a..36dee5d8 100644
--- a/src/js/states/settings.js
+++ b/src/js/states/settings.js
@@ -1,169 +1,169 @@
-import { TextualGameState } from "../core/textual_game_state";
-import { formatSecondsToTimeAgo } from "../core/utils";
-import { allApplicationSettings, enumCategories } from "../profile/application_settings";
-import { T } from "../translations";
-
-export class SettingsState extends TextualGameState {
- constructor() {
- super("SettingsState");
- }
-
- getStateHeaderTitle() {
- return T.settings.title;
- }
-
- getMainContentHTML() {
- return `
-
-
-
-
- ${this.getSettingsHtml()}
-
-
- `;
- }
-
- getCategoryButtonsHtml() {
- return Object.keys(enumCategories)
- .map(key => enumCategories[key])
- .map(
- category =>
- `
-
- ${T.settings.categories[category]}
-
- `
- )
- .join("");
- }
-
- getSettingsHtml() {
- const categoriesHTML = {};
-
- Object.keys(enumCategories).forEach(key => {
- const catName = enumCategories[key];
- categoriesHTML[catName] = `
`;
- });
-
- for (let i = 0; i < allApplicationSettings.length; ++i) {
- const setting = allApplicationSettings[i];
-
- categoriesHTML[setting.categoryId] += setting.getHtml();
- }
-
- return Object.keys(categoriesHTML)
- .map(k => categoriesHTML[k] + "
")
- .join("");
- }
-
- renderBuildText() {
- const labelVersion = this.htmlElement.querySelector(".buildVersion");
- const lastBuildMs = new Date().getTime() - G_BUILD_TIME;
- const lastBuildText = formatSecondsToTimeAgo(lastBuildMs / 1000.0);
-
- const version = T.settings.versionBadges[G_APP_ENVIRONMENT];
-
- labelVersion.innerHTML = `
-
- ${G_BUILD_VERSION} @ ${version} @ ${G_BUILD_COMMIT_HASH}
-
-
- ${T.settings.buildDate.replace("", lastBuildText)}
- `;
- }
-
- onEnter(payload) {
- this.renderBuildText();
- this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
- preventDefault: false,
- });
-
- const keybindingsButton = this.htmlElement.querySelector(".editKeybindings");
-
- if (keybindingsButton) {
- this.trackClicks(keybindingsButton, this.onKeybindingsClicked, { preventDefault: false });
- }
-
- this.initSettings();
- this.initCategoryButtons();
-
- this.htmlElement.querySelector(".category").classList.add("active");
- this.htmlElement.querySelector(".categoryButton").classList.add("active");
- }
-
- setActiveCategory(category) {
- const previousCategory = this.htmlElement.querySelector(".category.active");
- const previousCategoryButton = this.htmlElement.querySelector(".categoryButton.active");
-
- if (previousCategory.getAttribute("data-category") == category) {
- return;
- }
-
- previousCategory.classList.remove("active");
- previousCategoryButton.classList.remove("active");
-
- const newCategory = this.htmlElement.querySelector("[data-category='" + category + "']");
- const newCategoryButton = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
-
- newCategory.classList.add("active");
- newCategoryButton.classList.add("active");
- }
-
- initSettings() {
- allApplicationSettings.forEach(setting => {
- /** @type {HTMLElement} */
- const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
- setting.bind(this.app, element, this.dialogs);
- setting.syncValueToElement();
- this.trackClicks(
- element,
- () => {
- setting.modify();
- },
- { preventDefault: false }
- );
- });
- }
-
- initCategoryButtons() {
- Object.keys(enumCategories).forEach(key => {
- const category = enumCategories[key];
- const button = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
- this.trackClicks(
- button,
- () => {
- this.setActiveCategory(category);
- },
- { preventDefault: false }
- );
- });
- }
-
- onAboutClicked() {
- this.moveToStateAddGoBack("AboutState");
- }
-
- onKeybindingsClicked() {
- this.moveToStateAddGoBack("KeybindingsState");
- }
-}
+import { TextualGameState } from "../core/textual_game_state";
+import { formatSecondsToTimeAgo } from "../core/utils";
+import { allApplicationSettings, enumCategories } from "../profile/application_settings";
+import { T } from "../translations";
+
+export class SettingsState extends TextualGameState {
+ constructor() {
+ super("SettingsState");
+ }
+
+ getStateHeaderTitle() {
+ return T.settings.title;
+ }
+
+ getMainContentHTML() {
+ return `
+
+
+
+
+ ${this.getSettingsHtml()}
+
+
+ `;
+ }
+
+ getCategoryButtonsHtml() {
+ return Object.keys(enumCategories)
+ .map(key => enumCategories[key])
+ .map(
+ category =>
+ `
+
+ ${T.settings.categories[category]}
+
+ `
+ )
+ .join("");
+ }
+
+ getSettingsHtml() {
+ const categoriesHTML = {};
+
+ Object.keys(enumCategories).forEach(key => {
+ const catName = enumCategories[key];
+ categoriesHTML[catName] = `
`;
+ });
+
+ for (let i = 0; i < allApplicationSettings.length; ++i) {
+ const setting = allApplicationSettings[i];
+
+ categoriesHTML[setting.categoryId] += setting.getHtml(this.app);
+ }
+
+ return Object.keys(categoriesHTML)
+ .map(k => categoriesHTML[k] + "
")
+ .join("");
+ }
+
+ renderBuildText() {
+ const labelVersion = this.htmlElement.querySelector(".buildVersion");
+ const lastBuildMs = new Date().getTime() - G_BUILD_TIME;
+ const lastBuildText = formatSecondsToTimeAgo(lastBuildMs / 1000.0);
+
+ const version = T.settings.versionBadges[G_APP_ENVIRONMENT];
+
+ labelVersion.innerHTML = `
+
+ ${G_BUILD_VERSION} @ ${version} @ ${G_BUILD_COMMIT_HASH}
+
+
+ ${T.settings.buildDate.replace("", lastBuildText)}
+ `;
+ }
+
+ onEnter(payload) {
+ this.renderBuildText();
+ this.trackClicks(this.htmlElement.querySelector(".about"), this.onAboutClicked, {
+ preventDefault: false,
+ });
+
+ const keybindingsButton = this.htmlElement.querySelector(".editKeybindings");
+
+ if (keybindingsButton) {
+ this.trackClicks(keybindingsButton, this.onKeybindingsClicked, { preventDefault: false });
+ }
+
+ this.initSettings();
+ this.initCategoryButtons();
+
+ this.htmlElement.querySelector(".category").classList.add("active");
+ this.htmlElement.querySelector(".categoryButton").classList.add("active");
+ }
+
+ setActiveCategory(category) {
+ const previousCategory = this.htmlElement.querySelector(".category.active");
+ const previousCategoryButton = this.htmlElement.querySelector(".categoryButton.active");
+
+ if (previousCategory.getAttribute("data-category") == category) {
+ return;
+ }
+
+ previousCategory.classList.remove("active");
+ previousCategoryButton.classList.remove("active");
+
+ const newCategory = this.htmlElement.querySelector("[data-category='" + category + "']");
+ const newCategoryButton = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
+
+ newCategory.classList.add("active");
+ newCategoryButton.classList.add("active");
+ }
+
+ initSettings() {
+ allApplicationSettings.forEach(setting => {
+ /** @type {HTMLElement} */
+ const element = this.htmlElement.querySelector("[data-setting='" + setting.id + "']");
+ setting.bind(this.app, element, this.dialogs);
+ setting.syncValueToElement();
+ this.trackClicks(
+ element,
+ () => {
+ setting.modify();
+ },
+ { preventDefault: false }
+ );
+ });
+ }
+
+ initCategoryButtons() {
+ Object.keys(enumCategories).forEach(key => {
+ const category = enumCategories[key];
+ const button = this.htmlElement.querySelector("[data-category-btn='" + category + "']");
+ this.trackClicks(
+ button,
+ () => {
+ this.setActiveCategory(category);
+ },
+ { preventDefault: false }
+ );
+ });
+ }
+
+ onAboutClicked() {
+ this.moveToStateAddGoBack("AboutState");
+ }
+
+ onKeybindingsClicked() {
+ this.moveToStateAddGoBack("KeybindingsState");
+ }
+}
diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json
index 8a151000..7ecc605a 100644
--- a/src/js/tsconfig.json
+++ b/src/js/tsconfig.json
@@ -3,7 +3,7 @@
/* Basic Options */
"target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
- "lib": ["DOM","ES2018"], /* Specify library files to be included in the compilation. */
+ "lib": ["DOM", "ES2018"] /* Specify library files to be included in the compilation. */,
"allowJs": true /* Allow javascript files to be compiled. */,
"checkJs": true /* Report errors in .js files. */,
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
diff --git a/sync-translations.js b/sync-translations.js
index d6b87278..356a4aba 100644
--- a/sync-translations.js
+++ b/sync-translations.js
@@ -1,82 +1,81 @@
-// Synchronizes all translations
-
-const fs = require("fs");
-const matchAll = require("match-all");
-const path = require("path");
-const YAWN = require("yawn-yaml/cjs");
-const YAML = require("yaml");
-
-const files = fs
- .readdirSync(path.join(__dirname, "translations"))
- .filter(x => x.endsWith(".yaml"))
- .filter(x => x.indexOf("base-en") < 0);
-
-const originalContents = fs
- .readFileSync(path.join(__dirname, "translations", "base-en.yaml"))
- .toString("utf-8");
-
-const original = YAML.parse(originalContents);
-
-const placeholderRegexp = /[[<]([a-zA-Z_0-9]+)[\]<]/gi;
-
-function match(originalObj, translatedObj, path = "/") {
- for (const key in originalObj) {
- if (!translatedObj.hasOwnProperty(key)) {
- console.warn(" | Missing key", path + key);
- translatedObj[key] = originalObj[key];
- continue;
- }
- const valueOriginal = originalObj[key];
- const valueMatching = translatedObj[key];
- if (typeof valueOriginal !== typeof valueMatching) {
- console.warn(" | MISMATCHING type (obj|non-obj) in", path + key);
- continue;
- }
-
- if (typeof valueOriginal === "object") {
- match(valueOriginal, valueMatching, path + key + "/");
- } else if (typeof valueOriginal === "string") {
- // todo
- const originalPlaceholders = matchAll(valueOriginal, placeholderRegexp).toArray();
- const translatedPlaceholders = matchAll(valueMatching, placeholderRegexp).toArray();
-
- if (originalPlaceholders.length !== translatedPlaceholders.length) {
- console.warn(
- " | Mismatching placeholders in",
- path + key,
- "->",
- originalPlaceholders,
- "vs",
- translatedPlaceholders
- );
- translatedObj[key] = originalObj[key];
- continue;
- }
- } else {
- console.warn(" | Unknown type: ", typeof valueOriginal);
- }
-
- // const matching = translatedObj[key];
- }
-
- for (const key in translatedObj) {
- if (!originalObj.hasOwnProperty(key)) {
- console.warn(" | Obsolete key", path + key);
- delete translatedObj[key];
- }
- }
-}
-
-for (let i = 0; i < files.length; ++i) {
- const filePath = path.join(__dirname, "translations", files[i]);
- console.log("Processing", files[i]);
- const translatedContents = fs.readFileSync(filePath).toString("utf-8");
- const translated = YAML.parse(translatedContents);
- const handle = new YAWN(translatedContents);
-
- const json = handle.json;
- match(original, json, "/");
- handle.json = json;
-
- fs.writeFileSync(filePath, handle.yaml, "utf-8");
-}
+// Synchronizes all translations
+
+const fs = require("fs");
+const matchAll = require("match-all");
+const path = require("path");
+const YAML = require("yaml");
+
+const files = fs
+ .readdirSync(path.join(__dirname, "translations"))
+ .filter(x => x.endsWith(".yaml"))
+ .filter(x => x.indexOf("base-en") < 0);
+
+const originalContents = fs
+ .readFileSync(path.join(__dirname, "translations", "base-en.yaml"))
+ .toString("utf-8");
+
+const original = YAML.parse(originalContents);
+
+const placeholderRegexp = /[[<]([a-zA-Z_0-9/-_]+?)[\]>]/gi;
+
+function match(originalObj, translatedObj, path = "/") {
+ for (const key in originalObj) {
+ if (!translatedObj.hasOwnProperty(key)) {
+ console.warn(" | Missing key", path + key);
+ translatedObj[key] = originalObj[key];
+ continue;
+ }
+ const valueOriginal = originalObj[key];
+ const valueMatching = translatedObj[key];
+ if (typeof valueOriginal !== typeof valueMatching) {
+ console.warn(" | MISMATCHING type (obj|non-obj) in", path + key);
+ translatedObj[key] = originalObj[key];
+ continue;
+ }
+
+ if (typeof valueOriginal === "object") {
+ match(valueOriginal, valueMatching, path + key + "/");
+ } else if (typeof valueOriginal === "string") {
+ // @todo
+ const originalPlaceholders = matchAll(valueOriginal, placeholderRegexp).toArray();
+ const translatedPlaceholders = matchAll(valueMatching, placeholderRegexp).toArray();
+
+ if (originalPlaceholders.length !== translatedPlaceholders.length) {
+ console.warn(
+ " | Mismatching placeholders in",
+ path + key,
+ "->",
+ originalPlaceholders,
+ "vs",
+ translatedPlaceholders
+ );
+ translatedObj[key] = originalObj[key];
+ continue;
+ }
+ } else {
+ console.warn(" | Unknown type: ", typeof valueOriginal);
+ }
+ }
+
+ for (const key in translatedObj) {
+ if (!originalObj.hasOwnProperty(key)) {
+ console.warn(" | Obsolete key", path + key);
+ delete translatedObj[key];
+ }
+ }
+}
+
+for (let i = 0; i < files.length; ++i) {
+ const filePath = path.join(__dirname, "translations", files[i]);
+ console.log("Processing", files[i]);
+ const translatedContents = fs.readFileSync(filePath).toString("utf-8");
+
+ const json = YAML.parse(translatedContents);
+ match(original, json, "/");
+
+ const stringified = YAML.stringify(json, {
+ indent: 4,
+ simpleKeys: true,
+ });
+ fs.writeFileSync(filePath, stringified, "utf-8");
+}
diff --git a/translations/.gitignore b/translations/.gitignore
new file mode 100644
index 00000000..6f7f420d
--- /dev/null
+++ b/translations/.gitignore
@@ -0,0 +1 @@
+tmp
diff --git a/translations/README.md b/translations/README.md
index 7695f022..020c7ca6 100644
--- a/translations/README.md
+++ b/translations/README.md
@@ -1,80 +1,83 @@
-# Translations
-
-The base language is English and can be found [here](base-en.yaml).
-
-## Languages
-
-- [German](base-de.yaml)
-- [French](base-fr.yaml)
-- [Korean](base-kor.yaml)
-- [Dutch](base-nl.yaml)
-- [Polish](base-pl.yaml)
-- [Portuguese (Brazil)](base-pt-BR.yaml)
-- [Portuguese (Portugal)](base-pt-PT.yaml)
-- [Russian](base-ru.yaml)
-- [Greek](base-el.yaml)
-- [Italian](base-it.yaml)
-- [Romanian](base-ro.yaml)
-- [Swedish](base-sv.yaml)
-- [Chinese (Simplified)](base-zh-CN.yaml)
-- [Chinese (Traditional)](base-zh-TW.yaml)
-- [Spanish](base-es.yaml)
-- [Hungarian](base-hu.yaml)
-- [Turkish](base-tr.yaml)
-- [Japanese](base-ja.yaml)
-- [Lithuanian](base-lt.yaml)
-- [Arabic](base-ar.yaml)
-- [Norwegian](base-no.yaml)
-- [Kroatian](base-hr.yaml)
-- [Danish](base-da.yaml)
-- [Finnish](base-fi.yaml)
-- [Catalan](base-cat.yaml)
-- [Slovenian](base-sl.yaml)
-- [Ukrainian](base-uk.yaml)
-- [Indonesian](base-ind.yaml)
-- [Serbian](base-sr.yaml)
-
-(If you want to translate into a new language, see below!)
-
-## Editing existing translations
-
-If you want to edit an existing translation (Fixing typos, Updating it to a newer version, etc), you can just use the github file editor to edit the file.
-
-- Click the language you want to edit from the list above
-- Click the small "edit" symbol on the top right
-
-
-
-- Do the changes you wish to do (Be sure **not** to translate placeholders! For example, `
minutes` should get ` Minuten` and **not** ` Minuten`!)
-
-- Click "Propose Changes"
-
-
-
-- Click "Create pull request"
-
-
-
-- I will review your changes and make comments, and eventually merge them so they will be in the next release! Be sure to regulary check the created pull request for comments.
-
-## Adding a new language
-
-Please DM me on Discord (tobspr#5407), so I can add the language template for you.
-
-Please use the following template:
-
-```
-Hey, could you add a new translation?
-
-Language:
-Short code:
-Local Name:
-```
-
-You can find the short code [here](https://www.science.co.il/language/Codes.php) (In column `Code 2`).
-
-PS: I'm super busy, but I'll give my best to do it quickly!
-
-## Updating a language to the latest version
-
-Run `yarn syncTranslations` in the root directory to synchronize all translations to the latest version! This will remove obsolete keys and add newly added keys. (Run `yarn` before to install packes).
+# Translations
+
+The base language is English and can be found [here](base-en.yaml).
+
+## Languages
+
+- [German](base-de.yaml)
+- [French](base-fr.yaml)
+- [Korean](base-kor.yaml)
+- [Dutch](base-nl.yaml)
+- [Polish](base-pl.yaml)
+- [Portuguese (Brazil)](base-pt-BR.yaml)
+- [Portuguese (Portugal)](base-pt-PT.yaml)
+- [Russian](base-ru.yaml)
+- [Greek](base-el.yaml)
+- [Italian](base-it.yaml)
+- [Romanian](base-ro.yaml)
+- [Swedish](base-sv.yaml)
+- [Chinese (Simplified)](base-zh-CN.yaml)
+- [Chinese (Traditional)](base-zh-TW.yaml)
+- [Spanish](base-es.yaml)
+- [Hungarian](base-hu.yaml)
+- [Turkish](base-tr.yaml)
+- [Japanese](base-ja.yaml)
+- [Lithuanian](base-lt.yaml)
+- [Arabic](base-ar.yaml)
+- [Norwegian](base-no.yaml)
+- [Kroatian](base-hr.yaml)
+- [Danish](base-da.yaml)
+- [Finnish](base-fi.yaml)
+- [Catalan](base-cat.yaml)
+- [Slovenian](base-sl.yaml)
+- [Ukrainian](base-uk.yaml)
+- [Indonesian](base-ind.yaml)
+- [Serbian](base-sr.yaml)
+- [Czech](base-cz.yaml)
+
+(If you want to translate into a new language, see below!)
+
+## Editing existing translations
+
+If you want to edit an existing translation (Fixing typos, updating it to a newer version, etc), you can just use the github file editor to edit the file.
+
+- Click the language you want to edit from the list above
+- Click the small "edit" symbol on the top right
+
+
+
+- Do the changes you wish to do (Be sure **not** to translate placeholders! For example, ` minutes` should get ` Minuten` and **not** ` Minuten`!)
+
+- Click "Propose Changes"
+
+
+
+- Click "Create pull request"
+
+
+
+- I will review your changes and make comments, and eventually merge them so they will be in the next release! Be sure to regulary check the created pull request for comments.
+
+## Adding a new language
+
+Please DM me on Discord (tobspr#5407), so I can add the language template for you.
+
+**Important: I am currently not accepting new languages until the wires update is out!**
+
+Please use the following template:
+
+```
+Hey, could you add a new translation?
+
+Language:
+Short code:
+Local Name:
+```
+
+You can find the short code [here](https://www.science.co.il/language/Codes.php) (In column `Code 2`).
+
+PS: I'm super busy, but I'll give my best to do it quickly!
+
+## Updating a language to the latest version
+
+Run `yarn syncTranslations` in the root directory to synchronize all translations to the latest version! This will remove obsolete keys and add newly added keys. (Run `yarn` before to install packages).
diff --git a/translations/base-ar.yaml b/translations/base-ar.yaml
index 17d822d9..305c9b88 100644
--- a/translations/base-ar.yaml
+++ b/translations/base-ar.yaml
@@ -1,114 +1,62 @@
-#
-# GAME TRANSLATIONS
-#
-# Contributing:
-#
-# If you want to contribute, please make a pull request on this respository
-# and I will have a look.
-#
-# Placeholders:
-#
-# Do *not* replace placeholders! Placeholders have a special syntax like
-# `Hotkey: `. They are encapsulated within angle brackets. The correct
-# translation for this one in German for example would be: `Taste: ` (notice
-# how the placeholder stayed '' and was not replaced!)
-#
-# Adding a new language:
-#
-# If you want to add a new language, ask me in the Discord and I will setup
-# the basic structure so the game also detects it.
-#
-
----
steamPage:
- # This is the short text appearing on the steam page
- shortText: shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
+ shortText: لعبة شيبز (أشكال) هي لعبة تدور حول بناء مصانع وتوصيلها حتى تقوم بشكل
+ .آلي بصناعة أشكال مختلفة تزداد تعقيدا في خريطة لانهائية.
+ discordLinkShort: Official Discord
+ intro: >-
+ لعبة شيبز (أشكال) هي لعبة مريحة تقوم فيها ببناء مصانع ووتشغيلها آليا
+ لصناعة أشكال هندسية.
- # This is the text shown above the Discord link
- discordLink: Official Discord - Chat with me!
+ مع التقدم في المستوى، تزداد الأشكال تعقيداً، فيتوجب عليك التوسع في الخريطة اللانهائية، وذلك ليس كافياً للتقدم في مستوى اللعبة حيث عليك صناعة المزيد بأضعاف مضاعفة لتلبية الطلب، الشيء
+ الوحيد الذي يمكنه مساعدتك هو التوسع.
- # This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
- # NOTICE:
- # - Do not translate the first line (This is the gif image at the start of the store)
- # - Please keep the markup (Stuff like [b], [list] etc) in the same format
- longText: >-
- [img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img]
+ بينما في البداية تقوم بصناعة أشكال مختلفة، تتطلب منك المراحل المتقدمة تلوين هذه الأشكال، حيث يتوجب عليك استخراج وخلط الألوان.
- shapez.io is a game about building factories to automate the creation and processing of increasingly complex shapes across an infinitely expanding map.
+ عند شراءك اللعبة على ستيم (Steam) تحصل على الإصدار الكامل للعبة، ولكن يمكن أيضاً لعبة نسخة تجريبية على موقع shapez.io ثم يمكنك القرار لاحقا
+ title_advantages: ميزات نسخة الحاسوب
+ advantages:
+ - 12 New Level for a total of 26 levels
+ - 18 New Buildings for a fully automated factory!
+ - Unlimited Upgrade Tiers for many hours of fun!
+ - Wires Update for an entirely new dimension!
+ - Dark Mode !
+ - Unlimited Savegames
+ - Unlimited Markers
+ - Support me! ❤️
+ title_future: Planned Content
+ planned:
+ - Blueprint Library (Standalone Exclusive)
+ - Steam Achievements
+ - Puzzle Mode
+ - Minimap
+ - Mods
+ - Sandbox mode
+ - ... and a lot more!
+ title_open_source: This game is open source!
+ title_links: Links
+ links:
+ discord: Official Discord
+ roadmap: Roadmap
+ subreddit: Subreddit
+ source_code: Source code (GitHub)
+ translate: Help translate
+ text_open_source: >-
+ Anybody can contribute, I'm actively involved in the community and
+ attempt to review all suggestions and take feedback into consideration
+ where possible.
- Upon delivering the requested shapes you'll progress within the game and unlock upgrades to speed up your factory.
-
- As the demand for shapes increases, you'll have to scale up your factory to meet the demand - Don't forget about resources though, you'll have to expand across the [b]infinite map[/b]!
-
- Soon you'll have to mix colors and paint your shapes with them - Combine red, green and blue color resources to produce different colors and paint shapes with them to satisfy the demand.
-
- This game features 18 progressive levels (Which should already keep you busy for hours!) but I'm constantly adding new content - There's a lot planned!
-
- Purchasing the game gives you access to the standalone version which has additional features, and you'll also receive access to newly developed features.
-
- [b]Standalone Advantages[/b]
-
- [list]
- [*] Dark Mode
- [*] Unlimited Waypoints
- [*] Unlimited Savegames
- [*] Additional settings
- [*] Coming soon: Wires & Energy! Aiming for (roughly) end of July 2020.
- [*] Coming soon: More Levels
- [*] Allows me to further develop shapez.io ❤️
- [/list]
-
- [b]Future Updates[/b]
-
- I am updating the game often and trying to push an update at least once every week!
-
- [list]
- [*] Different maps and challenges (e.g. maps with obstacles)
- [*] Puzzles (Deliver the requested shape with a restricted area / set of buildings)
- [*] A story mode where buildings have a cost
- [*] Configurable map generator (Configure resource/shape size/density, seed and more)
- [*] Additional types of shapes
- [*] Performance improvements (The game already runs pretty well!)
- [*] And much more!
- [/list]
-
- [b]This game is open source![/b]
-
- Anybody can contribute, I'm actively involved in the community and attempt to review all suggestions and take feedback into consideration where possible.
Be sure to check out my trello board for the full roadmap!
-
- [b]Links[/b]
-
- [list]
- [*] [url=https://discord.com/invite/HN7EVzV]Official Discord[/url]
- [*] [url=https://trello.com/b/ISQncpJP/shapezio]Roadmap[/url]
- [*] [url=https://www.reddit.com/r/shapezio]Subreddit[/url]
- [*] [url=https://github.com/tobspr/shapez.io]Source code (GitHub)[/url]
- [*] [url=https://github.com/tobspr/shapez.io/blob/master/translations/README.md]Help translate[/url]
- [/list]
-
global:
loading: Loading
error: Error
-
- # How big numbers are rendered, e.g. "10,000"
thousandsDivider: ","
-
- # What symbol to use to seperate the integer part from the fractional part of a number, e.g. "0.4"
- decimalSeparator: "."
-
- # The suffix for large numbers, e.g. 1.3k, 400.2M, etc.
+ decimalSeparator: .
suffix:
thousands: k
millions: M
billions: B
trillions: T
-
- # Shown for infinitely big numbers
infinite: inf
-
time:
- # Used for formatting past time dates
oneSecondAgo: one second ago
xSecondsAgo: seconds ago
oneMinuteAgo: one minute ago
@@ -117,14 +65,10 @@ global:
xHoursAgo: hours ago
oneDayAgo: one day ago
xDaysAgo: days ago
-
- # Short formats for times, e.g. '5h 23m'
secondsShort: s
minutesAndSecondsShort: m s
hoursAndMinutesShort: h m
-
xMinutes: minutes
-
keys:
tab: TAB
control: CTRL
@@ -132,13 +76,9 @@ global:
escape: ESC
shift: SHIFT
space: SPACE
-
demoBanners:
- # This is the "advertisement" shown in the main menu and other various places
title: Demo Version
- intro: >-
- Get the standalone to unlock all features!
-
+ intro: Get the standalone to unlock all features!
mainMenu:
play: Play
continue: Continue
@@ -150,14 +90,11 @@ mainMenu:
discordLink: Official Discord Server
helpTranslate: Help translate!
madeBy: Made by
-
- # This is shown when using firefox and other browsers which are not supported.
- browserWarning: >-
- Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience.
-
+ browserWarning: Sorry, but the game is known to run slow on your browser! Get
+ the standalone version or download chrome for the full experience.
savegameLevel: Level
savegameLevelUnknown: Unknown Level
-
+ savegameUnnamed: Unnamed
dialogs:
buttons:
ok: OK
@@ -171,112 +108,104 @@ dialogs:
viewUpdate: View Update
showUpgrades: Show Upgrades
showKeybindings: Show Keybindings
-
importSavegameError:
title: Import Error
- text: >-
- Failed to import your savegame:
-
+ text: "Failed to import your savegame:"
importSavegameSuccess:
title: Savegame Imported
- text: >-
- Your savegame has been successfully imported.
-
+ text: Your savegame has been successfully imported.
gameLoadFailure:
title: Game is broken
- text: >-
- Failed to load your savegame:
-
+ text: "Failed to load your savegame:"
confirmSavegameDelete:
title: Confirm deletion
- text: >-
- Are you sure you want to delete the game?
-
+ text: Are you sure you want to delete the following game?
+ '' at level This can not be
+ undone!
savegameDeletionError:
title: Failed to delete
- text: >-
- Failed to delete the savegame:
-
+ text: "Failed to delete the savegame:"
restartRequired:
title: Restart required
- text: >-
- You need to restart the game to apply the settings.
-
+ text: You need to restart the game to apply the settings.
editKeybinding:
title: Change Keybinding
desc: Press the key or mouse button you want to assign, or escape to cancel.
-
resetKeybindingsConfirmation:
title: Reset keybindings
desc: This will reset all keybindings to their default values. Please confirm.
-
keybindingsResetOk:
title: Keybindings reset
desc: The keybindings have been reset to their respective defaults!
-
featureRestriction:
title: Demo Version
- desc: You tried to access a feature () which is not available in the demo. Consider getting the standalone version for the full experience!
-
+ desc: You tried to access a feature () which is not available in the
+ demo. Consider getting the standalone version for the full
+ experience!
oneSavegameLimit:
title: Limited savegames
- desc: You can only have one savegame at a time in the demo version. Please remove the existing one or get the standalone version!
-
+ desc: You can only have one savegame at a time in the demo version. Please
+ remove the existing one or get the standalone version!
updateSummary:
title: New update!
- desc: >-
- Here are the changes since you last played:
-
+ desc: "Here are the changes since you last played:"
upgradesIntroduction:
title: Unlock Upgrades
- desc: >-
- All shapes you produce can be used to unlock upgrades - Don't destroy your old factories!
- The upgrades tab can be found on the top right corner of the screen.
-
+ desc: All shapes you produce can be used to unlock upgrades - Don't
+ destroy your old factories! The upgrades tab can be found
+ on the top right corner of the screen.
massDeleteConfirm:
title: Confirm delete
- desc: >-
- You are deleting a lot of buildings ( to be exact)! Are you sure you want to do this?
-
+ desc: You are deleting a lot of buildings ( to be exact)! Are you sure
+ you want to do this?
massCutConfirm:
title: Confirm cut
- desc: >-
- You are cutting a lot of buildings ( to be exact)! Are you sure you want to do this?
-
+ desc: You are cutting a lot of buildings ( to be exact)! Are you sure you
+ want to do this?
massCutInsufficientConfirm:
title: Confirm cut
- desc: >-
- You can not afford to paste this area! Are you sure you want to cut it?
-
+ desc: You can not afford to paste this area! Are you sure you want to cut it?
blueprintsNotUnlocked:
title: Not unlocked yet
- desc: >-
- Complete level 12 to unlock Blueprints!
-
+ desc: Complete level 12 to unlock Blueprints!
keybindingsIntroduction:
title: Useful keybindings
- desc: >-
- This game has a lot of keybindings which make it easier to build big factories.
- Here are a few, but be sure to check out the keybindings !
- CTRL + Drag: Select an area.
- SHIFT: Hold to place multiple of one building.
- ALT: Invert orientation of placed belts.
-
+ desc: "This game has a lot of keybindings which make it easier to build big
+ factories. Here are a few, but be sure to check out the
+ keybindings ! CTRL +
+ Drag: Select an area. SHIFT:
+ Hold to place multiple of one building. ALT: Invert orientation of placed
+ belts. "
createMarker:
title: New Marker
titleEdit: Edit Marker
- desc: Give it a meaningful name, you can also include a short key of a shape (Which you can generate here )
-
+ desc: Give it a meaningful name, you can also include a short
+ key of a shape (Which you can generate here)
markerDemoLimit:
- desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers!
-
+ desc: You can only create two custom markers in the demo. Get the standalone for
+ unlimited markers!
exportScreenshotWarning:
title: Export screenshot
- desc: You requested to export your base as a screenshot. Please note that this can be quite slow for a big base and even crash your game!
-
+ desc: You requested to export your base as a screenshot. Please note that this
+ can be quite slow for a big base and even crash your game!
+ editSignal:
+ title: Set Signal
+ descItems: "Choose a pre-defined item:"
+ descShortKey: ... or enter the short key of a shape (Which you
+ can generate here)
+ renameSavegame:
+ title: Rename Savegame
+ desc: You can rename your savegame here.
+ tutorialVideoAvailable:
+ title: Tutorial Available
+ desc: There is a tutorial video available for this level! Would you like to
+ watch it?
+ tutorialVideoAvailableForeignLanguage:
+ title: Tutorial Available
+ desc: There is a tutorial video available for this level, but it is only
+ available in English. Would you like to watch it?
ingame:
- # This is shown in the top left corner and displays useful keybindings in
- # every situation
keybindingsOverlay:
moveMap: Move
selectBuildings: Select area
@@ -297,8 +226,6 @@ ingame:
clearSelection: Clear selection
pipette: Pipette
switchLayers: Switch layers
-
- # Names of the colors, used for the color blind mode
colors:
red: Red
green: Green
@@ -309,18 +236,9 @@ ingame:
white: White
black: Black
uncolored: Gray
-
- # Everything related to placing buildings (I.e. as soon as you selected a building
- # from the toolbar)
buildingPlacement:
- # Buildings can have different variants which are unlocked at later levels,
- # and this is the hint shown when there are multiple variants available.
cycleBuildingVariants: Press to cycle variants.
-
- # Shows the hotkey in the ui, e.g. "Hotkey: Q"
- hotkeyLabel: >-
- Hotkey:
-
+ hotkeyLabel: "Hotkey: "
infoTexts:
speed: Speed
range: Range
@@ -328,36 +246,21 @@ ingame:
oneItemPerSecond: 1 item / second
itemsPerSecond: items / s
itemsPerSecondDouble: (x2)
-
tiles: tiles
-
- # The notification when completing a level
levelCompleteNotification:
- # is replaced by the actual level, so this gets 'Level 03' for example.
levelTitle: Level
completed: Completed
unlockText: Unlocked !
buttonNextLevel: Next Level
-
- # Notifications on the lower right
notifications:
newUpgrade: A new upgrade is available!
gameSaved: Your game has been saved.
-
- # The "Upgrades" window
+ freeplayLevelComplete: Level has been completed!
shop:
title: Upgrades
buttonUnlock: Upgrade
-
- # Gets replaced to e.g. "Tier IX"
tier: Tier
-
- # The roman number for each tier
- tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
-
maximumLevel: MAXIMUM LEVEL (Speed x)
-
- # The "Statistics" window
statistics:
title: Statistics
dataSources:
@@ -366,62 +269,110 @@ ingame:
description: Displaying amount of stored shapes in your central building.
produced:
title: Produced
- description: Displaying all shapes your whole factory produces, including intermediate products.
+ description: Displaying all shapes your whole factory produces, including
+ intermediate products.
delivered:
title: Delivered
description: Displaying shapes which are delivered to your central building.
noShapesProduced: No shapes have been produced so far.
-
- # Displays the shapes per minute, e.g. '523 / m'
- shapesPerMinute: / m
-
- # Settings menu, when you press "ESC"
+ shapesDisplayUnits:
+ second: / s
+ minute: / m
+ hour: / h
settingsMenu:
playtime: Playtime
-
buildingsPlaced: Buildings
beltsPlaced: Belts
-
- buttons:
- continue: Continue
- settings: Settings
- menu: Return to menu
-
- # Bottom left tutorial hints
tutorialHints:
title: Need help?
showHint: Show hint
hideHint: Close
-
- # When placing a blueprint
blueprintPlacer:
cost: Cost
-
- # Map markers
waypoints:
waypoints: Markers
hub: HUB
- description: Left-click a marker to jump to it, right-click to delete it. Press to create a marker from the current view, or right-click to create a marker at the selected location.
+ description: Left-click a marker to jump to it, right-click to delete
+ it. Press to create a marker from the current
+ view, or right-click to create a marker at the
+ selected location.
creationSuccessNotification: Marker has been created.
-
- # Shape viewer
shapeViewer:
title: Layers
empty: Empty
copyKey: Copy Key
-
- # Interactive tutorial
interactiveTutorial:
title: Tutorial
hints:
- 1_1_extractor: Place an extractor on top of a circle shape to extract it!
- 1_2_conveyor: >-
- Connect the extractor with a conveyor belt to your hub! Tip: Click and drag the belt with your mouse!
-
- 1_3_expand: >-
- This is NOT an idle game! Build more extractors and belts to finish the goal quicker. Tip: Hold SHIFT to place multiple extractors, and use R to rotate them.
-
-# All shop upgrades
+ 1_1_extractor: Place an extractor on top of a circle
+ shape to extract it!
+ 1_2_conveyor: "Connect the extractor with a conveyor belt to
+ your hub! Tip: Click and drag the belt
+ with your mouse!"
+ 1_3_expand: "This is NOT an idle game! Build more extractors
+ and belts to finish the goal quicker. Tip: Hold
+ SHIFT to place multiple extractors, and use
+ R to rotate them."
+ 2_1_place_cutter: "Now place a Cutter to cut the circles in two
+ halves! PS: The cutter always cuts from top to
+ bottom regardless of its orientation."
+ 2_2_place_trash: The cutter can clog and stall ! Use a
+ trash to get rid of the currently (!) not
+ needed waste.
+ 2_3_more_cutters: "Good job! Now place 2 more cutters to speed
+ up this slow process! PS: Use the 0-9
+ hotkeys to access buildings faster!"
+ 3_1_rectangles: "Now let's extract some rectangles! Build 4
+ extractors and connect them to the hub. PS:
+ Hold SHIFT while dragging a belt to activate
+ the belt planner!"
+ 21_1_place_quad_painter: Place the quad painter and get some
+ circles , white and
+ red color!
+ 21_2_switch_to_wires: Switch to the wires layer by pressing
+ E ! Then connect all four
+ inputs of the painter with cables!
+ 21_3_place_button: Awesome! Now place a Switch and connect it
+ with wires!
+ 21_4_press_button: "Press the switch to make it emit a truthy
+ signal and thus activate the painter. PS: You
+ don't have to connect all inputs! Try wiring only two."
+ connectedMiners:
+ one_miner: 1 Miner
+ n_miners: Miners
+ limited_items: Limited to
+ watermark:
+ title: Demo version
+ desc: Click here to see the Steam version advantages!
+ get_on_steam: Get on steam
+ standaloneAdvantages:
+ title: Get the full version!
+ no_thanks: No, thanks!
+ points:
+ levels:
+ title: 12 New Levels
+ desc: For a total of 26 levels!
+ buildings:
+ title: 18 New Buildings
+ desc: Fully automate your factory!
+ savegames:
+ title: ∞ Savegames
+ desc: As many as your heart desires!
+ upgrades:
+ title: ∞ Upgrade Tiers
+ desc: This demo version has only 5!
+ markers:
+ title: ∞ Markers
+ desc: Never get lost in your factory!
+ wires:
+ title: Wires
+ desc: An entirely new dimension!
+ darkmode:
+ title: Dark Mode
+ desc: Stop hurting your eyes!
+ support:
+ title: Support me
+ desc: I develop it in my spare time!
shopUpgrades:
belt:
name: Belts, Distributor & Tunnels
@@ -435,249 +386,386 @@ shopUpgrades:
painting:
name: Mixing & Painting
description: Speed x